mirror of
https://github.com/offen/docker-volume-backup.git
synced 2024-11-10 00:30:29 +01:00
279844ccfb
* Added abstract helper interface and implemented it for all storage backends * Moved storage client initializations also to helper classes * Fixed ssh init issue * Moved script parameter to helper struct to simplify script init. * Created sub modules. Enhanced abstract implementation. * Fixed config issue * Fixed declaration issues. Added config to interface. * Added StorageProviders to unify all backends. * Cleanup, optimizations, comments. * Applied discussed changes. See description. Moved modules to internal packages. Replaced StoragePool with slice. Moved conditional for init of storage backends back to script. * Fix docker build issue * Fixed accidentally removed local copy condition. * Delete .gitignore * Renaming/changes according to review Renamed Init functions and interface. Replaced config object with specific config values. Init func returns interface instead of struct. Removed custom import names where possible. * Fixed auto-complete error. * Combined copy instructions into one layer. * Added logging func for storages. * Introduced logging func for errors too. * Missed an error message * Moved config back to main. Optimized prune stats handling. * Move stats back to main package * Code doc stuff * Apply changes from #136 * Replace name field with function. * Changed receiver names from stg to b. * Renamed LogFuncDef to Log * Removed redundant package name. * Renamed storagePool to storages. * Simplified creation of new storage backend. * Added initialization for storage stats map. * Invert .dockerignore patterns. * Fix package typo
59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
// Copyright 2022 - Offen Authors <hioffen@posteo.de>
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
|
|
"github.com/offen/docker-volume-backup/internal/utilities"
|
|
)
|
|
|
|
// hook contains a queued action that can be trigger them when the script
|
|
// reaches a certain point (e.g. unsuccessful backup)
|
|
type hook struct {
|
|
level hookLevel
|
|
action func(err error) error
|
|
}
|
|
|
|
type hookLevel int
|
|
|
|
const (
|
|
hookLevelPlumbing hookLevel = iota
|
|
hookLevelError
|
|
hookLevelInfo
|
|
)
|
|
|
|
var hookLevels = map[string]hookLevel{
|
|
"info": hookLevelInfo,
|
|
"error": hookLevelError,
|
|
}
|
|
|
|
// registerHook adds the given action at the given level.
|
|
func (s *script) registerHook(level hookLevel, action func(err error) error) {
|
|
s.hooks = append(s.hooks, hook{level, action})
|
|
}
|
|
|
|
// runHooks runs all hooks that have been registered using the
|
|
// given levels in the defined ordering. In case executing a hook returns an
|
|
// error, the following hooks will still be run before the function returns.
|
|
func (s *script) runHooks(err error) error {
|
|
sort.SliceStable(s.hooks, func(i, j int) bool {
|
|
return s.hooks[i].level < s.hooks[j].level
|
|
})
|
|
var actionErrors []error
|
|
for _, hook := range s.hooks {
|
|
if hook.level > s.hookLevel {
|
|
continue
|
|
}
|
|
if actionErr := hook.action(err); actionErr != nil {
|
|
actionErrors = append(actionErrors, fmt.Errorf("runHooks: error running hook: %w", actionErr))
|
|
}
|
|
}
|
|
if len(actionErrors) != 0 {
|
|
return utilities.Join(actionErrors...)
|
|
}
|
|
return nil
|
|
}
|