enable generic env variables

This commit is contained in:
cupcakearmy 2021-10-30 13:48:44 +02:00
parent 4055ebf8e8
commit 246e6fc0d8
No known key found for this signature in database
GPG Key ID: D28129AE5654D9D9
3 changed files with 62 additions and 32 deletions

View File

@ -4,6 +4,8 @@ In theory [all the restic backends](https://restic.readthedocs.io/en/stable/030_
Those tested are the following: Those tested are the following:
> You can also [specify the `env` variables in a config file](/backend/env) to separate them from the config file.
## Local ## Local
```yaml ```yaml

View File

@ -1,36 +1,67 @@
# Environment # Environment
> ⚠ Available since version `v1.3.0` > ⚠ Available since version `v1.4.0`
Sometimes it's favorable not having the encryption keys in the config files. Sometimes it's favorable not having the encryption keys in the config files.
For that `autorestic` allows passing the backend keys as `ENV` variables, or through an env file. For that `autorestic` allows passing the env variables to backend password as `ENV` variables, or through an env file.
You can also pass whatever `env` variable to restic by prefixing it with `AUTORESTIC_[BACKEND NAME]_`.
The syntax for the `ENV` variables is as follows: `AUTORESTIC_[BACKEND NAME]_KEY`. > Env variables and file overwrite the config file in the following order:
>
> Env Variables > Env File (`.autorestic.env`) > Config file (`.autorestic.yaml`)
## Env file
Alternatively `autorestic` can load an env file, located next to `.autorestic.yml` called `.autorestic.env`.
```
AUTORESTIC_FOO_RESTIC_PASSWORD=secret123
```
### Example with repository password
The syntax for the `ENV` variables is as follows: `AUTORESTIC_[BACKEND NAME]_RESTIC_PASSWORD`.
```yaml | autorestic.yaml ```yaml | autorestic.yaml
backend: backend:
foo: foo:
type: ... type: ...
path: ... path: ...
key: secret123 # => AUTORESTIC_FOO_KEY=secret123 key: secret123 # => AUTORESTIC_FOO_RESTIC_PASSWORD=secret123
``` ```
## Example
This means we could remove `key: secret123` from `.autorestic.yaml` and execute as follows: This means we could remove `key: secret123` from `.autorestic.yaml` and execute as follows:
```bash ```bash
AUTORESTIC_FOO_KEY=secret123 autorestic backup ... AUTORESTIC_FOO_RESTIC_PASSWORD=secret123 autorestic backup ...
``` ```
## Env file ### Example with Backblaze B2
Alternatively `autorestic` can load an env file, located next to `autorestic.yml` called `.autorestic.env`. ```yaml | autorestic.yaml
backends:
```| .autorestic.env bb:
AUTORESTIC_FOO_KEY=secret123 type: b2
path: myBucket
key: myPassword
env:
B2_ACCOUNT_ID: 123
B2_ACCOUNT_KEY: 456
``` ```
after that you can simply use `autorestic` as your are used to. You could create an `.autorestic.env` or pass the following `ENV` variables to autorestic:
```
AUTORESTIC_BB_RESTIC_PASSWORD=myPassword
AUTORESTIC_BB_B2_ACCOUNT_ID=123
AUTORESTIC_BB_B2_ACCOUNT_KEY=456
```
```yaml | autorestic.yaml
backends:
bb:
type: b2
path: myBucket
```
> :ToCPrevNext > :ToCPrevNext

View File

@ -58,20 +58,27 @@ func (b Backend) generateRepo() (string, error) {
func (b Backend) getEnv() (map[string]string, error) { func (b Backend) getEnv() (map[string]string, error) {
env := make(map[string]string) env := make(map[string]string)
// Key
if b.Key != "" { if b.Key != "" {
env["RESTIC_PASSWORD"] = b.Key env["RESTIC_PASSWORD"] = b.Key
} else {
key, err := b.getKey()
if err != nil {
return nil, err
}
env["RESTIC_PASSWORD"] = key
} }
// From config file
repo, err := b.generateRepo() repo, err := b.generateRepo()
env["RESTIC_REPOSITORY"] = repo env["RESTIC_REPOSITORY"] = repo
for key, value := range b.Env { for key, value := range b.Env {
env[strings.ToUpper(key)] = value env[strings.ToUpper(key)] = value
} }
// From Envfile and passed as env
var prefix = "AUTORESTIC_" + strings.ToUpper(b.name) + "_"
for _, variable := range os.Environ() {
var splitted = strings.SplitN(variable, "=", 2)
if strings.HasPrefix(splitted[0], prefix) {
env[strings.TrimPrefix(splitted[0], prefix)] = splitted[1]
}
}
return env, err return env, err
} }
@ -85,17 +92,6 @@ func generateRandomKey() string {
return key return key
} }
func (b Backend) getKey() (string, error) {
if b.Key != "" {
return b.Key, nil
}
keyName := "AUTORESTIC_" + strings.ToUpper(b.name) + "_KEY"
if key, found := os.LookupEnv(keyName); found {
return key, nil
}
return "", fmt.Errorf("no key found for backend \"%s\"", b.name)
}
func (b Backend) validate() error { func (b Backend) validate() error {
if b.Type == "" { if b.Type == "" {
return fmt.Errorf(`Backend "%s" has no "type"`, b.name) return fmt.Errorf(`Backend "%s" has no "type"`, b.name)
@ -105,8 +101,9 @@ func (b Backend) validate() error {
} }
if b.Key == "" { if b.Key == "" {
// Check if key is set in environment // Check if key is set in environment
if _, err := b.getKey(); err != nil { env, _ := b.getEnv()
// If not generate a new one if _, found := env["RESTIC_PASSWORD"]; !found {
// No key set in config file or env => generate random key and save file
key := generateRandomKey() key := generateRandomKey()
b.Key = key b.Key = key
c := GetConfig() c := GetConfig()