mirror of
https://github.com/cupcakearmy/autorestic.git
synced 2025-09-06 10:30:39 +00:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
86ae70672a | |||
5c0788900f | |||
20334a7e83 | |||
7bebd04482 | |||
b9b8857bf4 | |||
dd6e618161 |
12
CHANGELOG.md
12
CHANGELOG.md
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.2.0] - 2021-08-05
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Community page
|
||||||
|
- Support for yaml references and aliases
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Better verbose output for hooks
|
||||||
|
- Better error message for bad formatted configs
|
||||||
|
|
||||||
## [1.1.2] - 2021-07-11
|
## [1.1.2] - 2021-07-11
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
@@ -19,7 +19,7 @@ Releases are automatically built by the github workflow and uploaded to the rele
|
|||||||
1. Bump `VERSION` in `internal/config.go`.
|
1. Bump `VERSION` in `internal/config.go`.
|
||||||
2. Update `CHANGELOG.md`
|
2. Update `CHANGELOG.md`
|
||||||
3. Commit to master
|
3. Commit to master
|
||||||
4. Create a new release with the `v1.2.3` tag and mark as draft.
|
4. Create a new release with the `v1.2.3` tag and mark as pre-release.
|
||||||
5. The Github action will build the binaries, upload and mark the release as ready when done.
|
5. The Github action will build the binaries, upload and mark the release as ready when done.
|
||||||
|
|
||||||
### Brew
|
### Brew
|
||||||
|
@@ -13,12 +13,11 @@ var backupCmd = &cobra.Command{
|
|||||||
Use: "backup",
|
Use: "backup",
|
||||||
Short: "Create backups for given locations",
|
Short: "Create backups for given locations",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
internal.GetConfig()
|
||||||
err := lock.Lock()
|
err := lock.Lock()
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
defer lock.Unlock()
|
defer lock.Unlock()
|
||||||
|
|
||||||
internal.GetConfig()
|
|
||||||
|
|
||||||
selected, err := internal.GetAllOrSelected(cmd, false)
|
selected, err := internal.GetAllOrSelected(cmd, false)
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
errors := 0
|
errors := 0
|
||||||
|
@@ -11,12 +11,11 @@ var execCmd = &cobra.Command{
|
|||||||
Use: "exec",
|
Use: "exec",
|
||||||
Short: "Execute arbitrary native restic commands for given backends",
|
Short: "Execute arbitrary native restic commands for given backends",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
internal.GetConfig()
|
||||||
err := lock.Lock()
|
err := lock.Lock()
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
defer lock.Unlock()
|
defer lock.Unlock()
|
||||||
|
|
||||||
internal.GetConfig()
|
|
||||||
|
|
||||||
selected, err := internal.GetAllOrSelected(cmd, true)
|
selected, err := internal.GetAllOrSelected(cmd, true)
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
for _, name := range selected {
|
for _, name := range selected {
|
||||||
|
@@ -10,12 +10,11 @@ var forgetCmd = &cobra.Command{
|
|||||||
Use: "forget",
|
Use: "forget",
|
||||||
Short: "Forget and optionally prune snapshots according the specified policies",
|
Short: "Forget and optionally prune snapshots according the specified policies",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
internal.GetConfig()
|
||||||
err := lock.Lock()
|
err := lock.Lock()
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
defer lock.Unlock()
|
defer lock.Unlock()
|
||||||
|
|
||||||
internal.GetConfig()
|
|
||||||
|
|
||||||
selected, err := internal.GetAllOrSelected(cmd, false)
|
selected, err := internal.GetAllOrSelected(cmd, false)
|
||||||
CheckErr(err)
|
CheckErr(err)
|
||||||
prune, _ := cmd.Flags().GetBool("prune")
|
prune, _ := cmd.Flags().GetBool("prune")
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
> [Upgrade](/cli/upgrade)
|
> [Upgrade](/cli/upgrade)
|
||||||
|
|
||||||
[Examples](/examples)
|
[Examples](/examples)
|
||||||
|
|
||||||
[QA](/qa)
|
[QA](/qa)
|
||||||
|
[Community](/community)
|
||||||
[Contributors](/contrib)
|
[Contributors](/contrib)
|
||||||
|
|
||||||
|
9
docs/markdown/community.md
Normal file
9
docs/markdown/community.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# 🏘 Community
|
||||||
|
|
||||||
|
A list of community driven projects. (No official affiliation)
|
||||||
|
|
||||||
|
- Docker image: https://github.com/pascaliske/docker-autorestic
|
||||||
|
- Ansible Role: https://github.com/adsanz/ansible-restic-role
|
||||||
|
- Ansible Role: https://github.com/ItsNotGoodName/ansible-role-autorestic
|
||||||
|
|
||||||
|
> :ToCPrevNext
|
@@ -40,4 +40,44 @@ backends:
|
|||||||
path: /mnt/my_external_storage
|
path: /mnt/my_external_storage
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Aliases
|
||||||
|
|
||||||
|
A handy tool for more advanced configurations is to use yaml aliases.
|
||||||
|
These must be specified under the global `extras` key in the `.autorestic.yml` config file.
|
||||||
|
Aliases allow to reuse snippets of config throughout the same file.
|
||||||
|
|
||||||
|
The following example shows how the locations `a` and `b` share the same hooks and forget policies.
|
||||||
|
|
||||||
|
```yaml | .autorestic.yml
|
||||||
|
extras:
|
||||||
|
hooks: &foo
|
||||||
|
before:
|
||||||
|
- echo "Hello"
|
||||||
|
after:
|
||||||
|
- echo "kthxbye"
|
||||||
|
policies: &bar
|
||||||
|
keep-daily: 14
|
||||||
|
keep-weekly: 52
|
||||||
|
|
||||||
|
backends:
|
||||||
|
# ...
|
||||||
|
locations:
|
||||||
|
a:
|
||||||
|
from: /data/a
|
||||||
|
to: some
|
||||||
|
hooks:
|
||||||
|
<<: *foo
|
||||||
|
options:
|
||||||
|
forget:
|
||||||
|
<<: *bar
|
||||||
|
b:
|
||||||
|
from: data/b
|
||||||
|
to: some
|
||||||
|
hooks:
|
||||||
|
<<: *foo
|
||||||
|
options:
|
||||||
|
forget:
|
||||||
|
<<: *bar
|
||||||
|
```
|
||||||
|
|
||||||
> :ToCPrevNext
|
> :ToCPrevNext
|
||||||
|
854
docs/package-lock.json
generated
854
docs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -2,23 +2,27 @@ package internal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/cupcakearmy/autorestic/internal/colors"
|
"github.com/cupcakearmy/autorestic/internal/colors"
|
||||||
|
"github.com/cupcakearmy/autorestic/internal/lock"
|
||||||
"github.com/mitchellh/go-homedir"
|
"github.com/mitchellh/go-homedir"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
const VERSION = "1.1.2"
|
const VERSION = "1.2.0"
|
||||||
|
|
||||||
var CI bool = false
|
var CI bool = false
|
||||||
var VERBOSE bool = false
|
var VERBOSE bool = false
|
||||||
var CRON_LEAN bool = false
|
var CRON_LEAN bool = false
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
Extras interface{} `yaml:"extras"`
|
||||||
Locations map[string]Location `yaml:"locations"`
|
Locations map[string]Location `yaml:"locations"`
|
||||||
Backends map[string]Backend `yaml:"backends"`
|
Backends map[string]Backend `yaml:"backends"`
|
||||||
}
|
}
|
||||||
@@ -31,7 +35,8 @@ func GetConfig() *Config {
|
|||||||
once.Do(func() {
|
once.Do(func() {
|
||||||
if err := viper.ReadInConfig(); err == nil {
|
if err := viper.ReadInConfig(); err == nil {
|
||||||
if !CRON_LEAN {
|
if !CRON_LEAN {
|
||||||
colors.Faint.Println("Using config file:", viper.ConfigFileUsed())
|
absConfig, _ := filepath.Abs(viper.ConfigFileUsed())
|
||||||
|
colors.Faint.Println("Using config file:", absConfig)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
@@ -39,7 +44,9 @@ func GetConfig() *Config {
|
|||||||
|
|
||||||
config = &Config{}
|
config = &Config{}
|
||||||
if err := viper.UnmarshalExact(config); err != nil {
|
if err := viper.UnmarshalExact(config); err != nil {
|
||||||
panic(err)
|
colors.Error.Println("Could not parse config file!")
|
||||||
|
lock.Unlock()
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -132,8 +132,15 @@ func (l Location) Backup(cron bool) []error {
|
|||||||
Command: "bash",
|
Command: "bash",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := l.validate(); err != nil {
|
||||||
|
errors = append(errors, err)
|
||||||
|
colors.Error.Print(err)
|
||||||
|
goto after
|
||||||
|
}
|
||||||
|
|
||||||
if t == TypeLocal {
|
if t == TypeLocal {
|
||||||
dir, _ := GetPathRelativeToConfig(l.From)
|
dir, _ := GetPathRelativeToConfig(l.From)
|
||||||
|
colors.Faint.Printf("Executing under: \"%s\"\n", dir)
|
||||||
options.Dir = dir
|
options.Dir = dir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user