mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-28 19:34:58 +01:00
729c83ee72
* stack-based execution model, documented in documentation * circbuf for capturing hook output * built-in hooks for postgres and mysql * refactor docs, too much info on the jobs page, too difficult to discover snapshotting & hooks Co-authored-by: Ross Williams <ross@ross-williams.net> Co-authored-by: Christian Schwarz <me@cschwarz.com> fixes #74
53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
package hooks
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/zrepl/zrepl/config"
|
|
"github.com/zrepl/zrepl/zfs"
|
|
)
|
|
|
|
type List []Hook
|
|
|
|
func HookFromConfig(in config.HookEnum) (Hook, error) {
|
|
switch v := in.Ret.(type) {
|
|
case *config.HookCommand:
|
|
return NewCommandHook(v)
|
|
case *config.HookPostgresCheckpoint:
|
|
return PgChkptHookFromConfig(v)
|
|
case *config.HookMySQLLockTables:
|
|
return MyLockTablesFromConfig(v)
|
|
default:
|
|
return nil, fmt.Errorf("unknown hook type %T", v)
|
|
}
|
|
}
|
|
|
|
func ListFromConfig(in *config.HookList) (r *List, err error) {
|
|
hl := make(List, len(*in))
|
|
|
|
for i, h := range *in {
|
|
hl[i], err = HookFromConfig(h)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create hook #%d: %s", i+1, err)
|
|
}
|
|
}
|
|
|
|
return &hl, nil
|
|
}
|
|
|
|
func (l List) CopyFilteredForFilesystem(fs *zfs.DatasetPath) (ret List, err error) {
|
|
ret = make(List, 0, len(l))
|
|
|
|
for _, h := range l {
|
|
var passFilesystem bool
|
|
if passFilesystem, err = h.Filesystems().Filter(fs); err != nil {
|
|
return nil, err
|
|
}
|
|
if passFilesystem {
|
|
ret = append(ret, h)
|
|
}
|
|
}
|
|
|
|
return ret, nil
|
|
}
|