docker-volume-backup/cmd/backup/config.go

155 lines
4.5 KiB
Go
Raw Normal View History

// Copyright 2022 - Offen Authors <hioffen@posteo.de>
// SPDX-License-Identifier: MPL-2.0
package main
import (
"crypto/x509"
"encoding/pem"
"fmt"
"os"
"regexp"
Add new storage backend: Dropbox (#103) (#251) * Add new storage backend: Dropbox (#103) * Remove duplicate check * Add concurrency level for parallel upload to dropbox. * Fixed some instabilites. Changed default concurrency to 6. * Added some env config vars to readme. WIP * Wrap errors for storage backend creation. * Fixed token issue, added OAuth2 including recipe and docs. * Readme typo fix * Test for dropbox integration * Update info and TOC * Missed a file * Docker-compose fix * Fix endpoint connection * Fix container names * Fix log fetching * Fix log fetching (again) * Print command output to logs * Addressing comments part 1 * Address comments part 2 * OpenAPI Mock spec path adjusted * Dropbox FileMetadata reflection refactored * NaturalNumber type added * Add OAuth2 mock server for CI testing * Fix env name of oauth2 endpoint * Remove hostname * Add forgotten change to commit... * Fix oauth2 endpoint "Worked on my machine" * Try again * Try suggested hostname again * Fix docker internal DNS resolving issues (as suggested by oauth2 mock docs) * Add docker network, remove hostname * Network not external * Last hostname try * Add more delay, add oauth2 endpoint log * Temp CI log output of command even when failing * Try different config and method * Add custom server-hostname. Rename test folder to accellerate debugging * Try that fix again * Adding quotes * Port fix attempt * Try localhost * Try extra hosts * Change network mode * Undo some changes * Use static IP * Remove specific IP binding * Change to default net driver * Fix static IP * Squash for revert * Revert "Squash for revert" This reverts commit e9b617be9a15016f8abb724709a6a1aef321cdb9. * Actual fix for CI testing from #257
2023-08-24 19:33:47 +02:00
"strconv"
"time"
)
// Config holds all configuration values that are expected to be set
// by users.
type Config struct {
2023-08-27 22:29:44 +02:00
AwsS3BucketName string
AwsS3Path string
AwsEndpoint string `default:"s3.amazonaws.com"`
AwsEndpointProto string
2023-08-27 20:14:59 +02:00
AwsEndpointInsecure bool
2023-08-27 22:29:44 +02:00
AwsEndpointCACert CertDecoder
2023-08-27 20:14:59 +02:00
AwsStorageClass string
2023-08-27 22:29:44 +02:00
AwsAccessKeyID string
AwsSecretAccessKey string
2023-08-27 20:14:59 +02:00
AwsIamRoleEndpoint string
AwsPartSize int64
2023-08-27 22:29:44 +02:00
BackupCompression CompressionType `default:"gz"`
BackupSources string `default:"/backup"`
BackupFilename string `default:"backup-%Y-%m-%dT%H-%M-%S.{{ .Extension }}"`
2023-08-27 20:14:59 +02:00
BackupFilenameExpand bool
BackupLatestSymlink string
2023-08-27 22:29:44 +02:00
BackupArchive string `default:"/archive"`
BackupRetentionDays int32 `default:"-1"`
BackupPruningLeeway time.Duration `default:"1m"`
2023-08-27 20:14:59 +02:00
BackupPruningPrefix string
2023-08-27 22:29:44 +02:00
BackupStopContainerLabel string `default:"true"`
2023-08-27 20:14:59 +02:00
BackupFromSnapshot bool
BackupExcludeRegexp RegexpDecoder
BackupSkipBackendsFromPrune []string
2023-08-27 22:29:44 +02:00
GpgPassphrase string
NotificationURLs []string
NotificationLevel string `default:"error"`
2023-08-27 20:14:59 +02:00
EmailNotificationRecipient string
2023-08-27 22:29:44 +02:00
EmailNotificationSender string `default:"noreply@nohost"`
EmailSMTPHost string
EmailSMTPPort int `default:"587"`
EmailSMTPUsername string
EmailSMTPPassword string
2023-08-27 20:14:59 +02:00
WebdavUrl string
WebdavUrlInsecure bool
2023-08-27 22:29:44 +02:00
WebdavPath string `default:"/"`
2023-08-27 20:14:59 +02:00
WebdavUsername string
2023-08-27 22:29:44 +02:00
WebdavPassword string
SSHHostName string
SSHPort string `default:"22"`
SSHUser string
SSHPassword string
SSHIdentityFile string `default:"/root/.ssh/id_rsa"`
SSHIdentityPassphrase string
SSHRemotePath string
2023-08-27 20:14:59 +02:00
ExecLabel string
ExecForwardOutput bool
2023-08-27 22:29:44 +02:00
LockTimeout time.Duration `default:"60m"`
2023-08-27 20:14:59 +02:00
AzureStorageAccountName string
AzureStoragePrimaryAccountKey string
AzureStorageContainerName string
AzureStoragePath string
2023-08-27 22:29:44 +02:00
AzureStorageEndpoint string `default:"https://{{ .AccountName }}.blob.core.windows.net/"`
DropboxEndpoint string `default:"https://api.dropbox.com/"`
DropboxOAuth2Endpoint string `default:"https://api.dropbox.com/"`
DropboxRefreshToken string
DropboxAppKey string
DropboxAppSecret string
2023-08-27 20:14:59 +02:00
DropboxRemotePath string
2023-08-27 22:29:44 +02:00
DropboxConcurrencyLevel NaturalNumber `default:"6"`
}
type CompressionType string
2023-08-27 20:14:59 +02:00
func (c *CompressionType) UnmarshalText(text []byte) error {
v := string(text)
switch v {
case "gz", "zst":
*c = CompressionType(v)
return nil
default:
return fmt.Errorf("config: error decoding compression type %s", v)
}
}
func (c *CompressionType) String() string {
return string(*c)
}
type CertDecoder struct {
Cert *x509.Certificate
}
2023-08-27 20:14:59 +02:00
func (c *CertDecoder) UnmarshalText(text []byte) error {
v := string(text)
if v == "" {
return nil
}
content, err := os.ReadFile(v)
if err != nil {
content = []byte(v)
}
block, _ := pem.Decode(content)
cert, err := x509.ParseCertificate(block.Bytes)
if err != nil {
return fmt.Errorf("config: error parsing certificate: %w", err)
}
*c = CertDecoder{Cert: cert}
return nil
}
type RegexpDecoder struct {
Re *regexp.Regexp
}
2023-08-27 20:14:59 +02:00
func (r *RegexpDecoder) UnmarshalText(text []byte) error {
v := string(text)
if v == "" {
return nil
}
re, err := regexp.Compile(v)
if err != nil {
return fmt.Errorf("config: error compiling given regexp `%s`: %w", v, err)
}
*r = RegexpDecoder{Re: re}
return nil
}
Add new storage backend: Dropbox (#103) (#251) * Add new storage backend: Dropbox (#103) * Remove duplicate check * Add concurrency level for parallel upload to dropbox. * Fixed some instabilites. Changed default concurrency to 6. * Added some env config vars to readme. WIP * Wrap errors for storage backend creation. * Fixed token issue, added OAuth2 including recipe and docs. * Readme typo fix * Test for dropbox integration * Update info and TOC * Missed a file * Docker-compose fix * Fix endpoint connection * Fix container names * Fix log fetching * Fix log fetching (again) * Print command output to logs * Addressing comments part 1 * Address comments part 2 * OpenAPI Mock spec path adjusted * Dropbox FileMetadata reflection refactored * NaturalNumber type added * Add OAuth2 mock server for CI testing * Fix env name of oauth2 endpoint * Remove hostname * Add forgotten change to commit... * Fix oauth2 endpoint "Worked on my machine" * Try again * Try suggested hostname again * Fix docker internal DNS resolving issues (as suggested by oauth2 mock docs) * Add docker network, remove hostname * Network not external * Last hostname try * Add more delay, add oauth2 endpoint log * Temp CI log output of command even when failing * Try different config and method * Add custom server-hostname. Rename test folder to accellerate debugging * Try that fix again * Adding quotes * Port fix attempt * Try localhost * Try extra hosts * Change network mode * Undo some changes * Use static IP * Remove specific IP binding * Change to default net driver * Fix static IP * Squash for revert * Revert "Squash for revert" This reverts commit e9b617be9a15016f8abb724709a6a1aef321cdb9. * Actual fix for CI testing from #257
2023-08-24 19:33:47 +02:00
type NaturalNumber int
2023-08-27 20:14:59 +02:00
func (n *NaturalNumber) UnmarshalText(text []byte) error {
v := string(text)
Add new storage backend: Dropbox (#103) (#251) * Add new storage backend: Dropbox (#103) * Remove duplicate check * Add concurrency level for parallel upload to dropbox. * Fixed some instabilites. Changed default concurrency to 6. * Added some env config vars to readme. WIP * Wrap errors for storage backend creation. * Fixed token issue, added OAuth2 including recipe and docs. * Readme typo fix * Test for dropbox integration * Update info and TOC * Missed a file * Docker-compose fix * Fix endpoint connection * Fix container names * Fix log fetching * Fix log fetching (again) * Print command output to logs * Addressing comments part 1 * Address comments part 2 * OpenAPI Mock spec path adjusted * Dropbox FileMetadata reflection refactored * NaturalNumber type added * Add OAuth2 mock server for CI testing * Fix env name of oauth2 endpoint * Remove hostname * Add forgotten change to commit... * Fix oauth2 endpoint "Worked on my machine" * Try again * Try suggested hostname again * Fix docker internal DNS resolving issues (as suggested by oauth2 mock docs) * Add docker network, remove hostname * Network not external * Last hostname try * Add more delay, add oauth2 endpoint log * Temp CI log output of command even when failing * Try different config and method * Add custom server-hostname. Rename test folder to accellerate debugging * Try that fix again * Adding quotes * Port fix attempt * Try localhost * Try extra hosts * Change network mode * Undo some changes * Use static IP * Remove specific IP binding * Change to default net driver * Fix static IP * Squash for revert * Revert "Squash for revert" This reverts commit e9b617be9a15016f8abb724709a6a1aef321cdb9. * Actual fix for CI testing from #257
2023-08-24 19:33:47 +02:00
asInt, err := strconv.Atoi(v)
if err != nil {
return fmt.Errorf("config: error converting %s to int", v)
}
if asInt <= 0 {
return fmt.Errorf("config: expected a natural number, got %d", asInt)
}
*n = NaturalNumber(asInt)
return nil
}
func (n *NaturalNumber) Int() int {
return int(*n)
}