mirror of https://github.com/qwc/backive.git
Added a possibility to have scripts with arguments
This commit is contained in:
parent
7cd0cee610
commit
5b092b1988
47
backup.go
47
backup.go
|
@ -13,21 +13,20 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Mockings
|
// Mockings
|
||||||
var mockExecCommand = exec.Command
|
|
||||||
var mockCmdRun = func(c *exec.Cmd) error {
|
var mockCmdRun = func(c *exec.Cmd) error {
|
||||||
return c.Run()
|
return c.Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backup contains all necessary information for executing a configured backup.
|
// Backup contains all necessary information for executing a configured backup.
|
||||||
type Backup struct {
|
type Backup struct {
|
||||||
Name string `mapstructure:",omitempty"`
|
Name string `mapstructure:",omitempty"`
|
||||||
TargetDevice string `mapstructure:"targetDevice"`
|
TargetDevice string `mapstructure:"targetDevice"`
|
||||||
TargetPath string `mapstructure:"targetPath"`
|
TargetPath string `mapstructure:"targetPath"`
|
||||||
SourcePath string `mapstructure:"sourcePath"`
|
SourcePath string `mapstructure:"sourcePath"`
|
||||||
ScriptPath string `mapstructure:"scriptPath"`
|
ScriptPath interface{} `mapstructure:"scriptPath"`
|
||||||
Frequency int `mapstructure:"frequency"`
|
Frequency int `mapstructure:"frequency"`
|
||||||
ExeUser string `mapstructure:"user,omitempty"`
|
ExeUser string `mapstructure:"user,omitempty"`
|
||||||
Label string `mapstructure:"label,omitempty"`
|
Label string `mapstructure:"label,omitempty"`
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +80,7 @@ func (b *Backup) PrepareRun() error {
|
||||||
}
|
}
|
||||||
writer := io.MultiWriter(logfile)
|
writer := io.MultiWriter(logfile)
|
||||||
b.logger = log.New(writer, b.Name, log.LstdFlags)
|
b.logger = log.New(writer, b.Name, log.LstdFlags)
|
||||||
cmd := mockExecCommand("chown", "-R", b.ExeUser, backupPath)
|
cmd := exec.Command("chown", "-R", b.ExeUser, backupPath)
|
||||||
err = mockCmdRun(cmd)
|
err = mockCmdRun(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.logger.Printf("chown for backup directory failed: %s", err)
|
b.logger.Printf("chown for backup directory failed: %s", err)
|
||||||
|
@ -102,15 +101,37 @@ func (b *Backup) Run() error {
|
||||||
return fmt.Errorf("device %s not found", b.TargetDevice)
|
return fmt.Errorf("device %s not found", b.TargetDevice)
|
||||||
}
|
}
|
||||||
if ok && dev.IsMounted() {
|
if ok && dev.IsMounted() {
|
||||||
if !strings.ContainsAny(b.ScriptPath, "/") || strings.HasPrefix(b.ScriptPath, ".") {
|
var scriptWArgs []string
|
||||||
|
switch slice := b.ScriptPath.(type) {
|
||||||
|
case []interface{}:
|
||||||
|
for _, v := range slice {
|
||||||
|
scriptWArgs = append(scriptWArgs, v.(string))
|
||||||
|
}
|
||||||
|
case []string:
|
||||||
|
for _, v := range slice {
|
||||||
|
scriptWArgs = append(scriptWArgs, v)
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
scriptWArgs = append(scriptWArgs, slice)
|
||||||
|
default:
|
||||||
|
log.Print("Fuck, the var is nothing we predicted...")
|
||||||
|
}
|
||||||
|
if !strings.ContainsAny(scriptWArgs[0], "/") || strings.HasPrefix(scriptWArgs[0], ".") {
|
||||||
//The scriptPath is a relative path, from the place of the config, so use the config as base
|
//The scriptPath is a relative path, from the place of the config, so use the config as base
|
||||||
log.Printf("ERROR: Script path is relative, aborting.")
|
log.Printf("ERROR: Script path is relative, aborting.")
|
||||||
return fmt.Errorf("script path is relative, aborting")
|
return fmt.Errorf("script path is relative, aborting")
|
||||||
}
|
}
|
||||||
cmd := mockExecCommand("/usr/bin/sh", b.ScriptPath)
|
var cmd *exec.Cmd
|
||||||
|
var args []string
|
||||||
if b.ExeUser != "" {
|
if b.ExeUser != "" {
|
||||||
// setup script environment including user to use
|
// setup script environment including user to use
|
||||||
cmd = mockExecCommand("sudo", "-E", "-u", b.ExeUser, "/usr/bin/sh", b.ScriptPath)
|
args = []string{"-E", "-u", b.ExeUser, "/usr/bin/sh"}
|
||||||
|
args = append(args, scriptWArgs...)
|
||||||
|
cmd = exec.Command("sudo", args...)
|
||||||
|
} else {
|
||||||
|
args = []string{}
|
||||||
|
args = append(args, scriptWArgs...)
|
||||||
|
cmd = exec.Command("/usr/bin/sh", args...)
|
||||||
}
|
}
|
||||||
b.logger.Printf("Running backup script of '%s'", b.Name)
|
b.logger.Printf("Running backup script of '%s'", b.Name)
|
||||||
b.logger.Printf("Script is: %s", b.ScriptPath)
|
b.logger.Printf("Script is: %s", b.ScriptPath)
|
||||||
|
|
Loading…
Reference in New Issue