From 0d0d2169a418ce048ba054a1e01fad8af42eac00 Mon Sep 17 00:00:00 2001 From: Simon Lipp Date: Thu, 30 Nov 2023 19:29:28 +0100 Subject: [PATCH] chore: migrate from golang exec.* to our internal lib --- destinations/command.go | 17 ++++------------- sources/btrfs.go | 40 ++++++++-------------------------------- sources/command.go | 21 +++++---------------- sources/mariabackup.go | 37 +++++++++++-------------------------- sources/tar.go | 16 +++++----------- 5 files changed, 33 insertions(+), 98 deletions(-) diff --git a/destinations/command.go b/destinations/command.go index 6f4a4f7..fd5f6c1 100644 --- a/destinations/command.go +++ b/destinations/command.go @@ -49,7 +49,6 @@ func newCommandDestination(options *uback.Options) (uback.Destination, error) { buf := bytes.NewBuffer(nil) cmd := uback.BuildCommand(command, "destination", "validate-options") cmd.Stdout = buf - cmd.Stderr = os.Stderr cmd.Env = env err := cmd.Run() if err != nil { @@ -65,9 +64,8 @@ func (d *commandDestination) ListBackups() ([]uback.Backup, error) { buf := bytes.NewBuffer(nil) cmd := uback.BuildCommand(d.command, "destination", "list-backups") cmd.Stdout = buf - cmd.Stderr = os.Stderr cmd.Env = d.env - err := cmd.Run() + err := uback.RunCommand(commandLog, cmd) if err != nil { return nil, err } @@ -106,30 +104,23 @@ func (d *commandDestination) ListBackups() ([]uback.Backup, error) { func (d *commandDestination) RemoveBackup(backup uback.Backup) error { cmd := uback.BuildCommand(d.command, "destination", "remove-backup", backup.FullName()) - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr cmd.Env = d.env - return cmd.Run() + return uback.RunCommand(commandLog, cmd) } func (d *commandDestination) SendBackup(backup uback.Backup, data io.Reader) error { cmd := uback.BuildCommand(d.command, "destination", "send-backup", backup.FullName()) cmd.Stdin = data - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr cmd.Env = d.env - return cmd.Run() + return uback.RunCommand(commandLog, cmd) } func (d *commandDestination) ReceiveBackup(backup uback.Backup) (io.ReadCloser, error) { pr, pw := io.Pipe() cmd := uback.BuildCommand(d.command, "destination", "receive-backup", backup.FullName()) cmd.Stdout = pw - cmd.Stderr = os.Stderr cmd.Env = d.env - - commandLog.Printf("running: %v", cmd.String()) - err := cmd.Start() + err := uback.StartCommand(commandLog, cmd) if err != nil { return nil, err } diff --git a/sources/btrfs.go b/sources/btrfs.go index c782554..25d14c0 100644 --- a/sources/btrfs.go +++ b/sources/btrfs.go @@ -7,7 +7,6 @@ import ( "fmt" "io" "os" - "os/exec" "path" "regexp" "strings" @@ -98,14 +97,8 @@ func (s *btrfsSource) RemoveSnapshot(snapshot uback.Snapshot) error { if s.snapshotsPath == "" { return nil } - args := []string{} - args = append(args, s.deleteCommand...) - args = append(args, path.Join(s.snapshotsPath, string(snapshot))) - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr - btrfsLog.Printf("running %s", cmd.String()) - return cmd.Run() + cmd := uback.BuildCommand(s.deleteCommand, path.Join(s.snapshotsPath, string(snapshot))) + return uback.RunCommand(btrfsLog, cmd) } // Part of uback.Source interface @@ -118,14 +111,7 @@ func (s *btrfsSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup, baseSnapshot = nil } - args := []string{} - args = append(args, s.snapshotCommand...) - args = append(args, "-r", s.basePath, tmpSnapshotPath) - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr - btrfsLog.Printf("running %s", cmd.String()) - err := cmd.Run() + err := uback.RunCommand(btrfsLog, uback.BuildCommand(s.snapshotCommand, "-r", s.basePath, tmpSnapshotPath)) if err != nil { return uback.Backup{}, nil, err } @@ -133,18 +119,14 @@ func (s *btrfsSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup, backup := uback.Backup{Snapshot: uback.Snapshot(snapshot), BaseSnapshot: baseSnapshot} btrfsLog.Printf("creating backup: %s", backup.Filename()) - args = nil - args = append(args, s.sendCommand...) + args := []string{} if baseSnapshot != nil { args = append(args, "-p", path.Join(s.snapshotsPath, baseSnapshot.Name())) } args = append(args, tmpSnapshotPath) - return uback.WrapSourceCommand(backup, exec.Command(args[0], args[1:]...), func(err error) error { + return uback.WrapSourceCommand(backup, uback.BuildCommand(s.sendCommand, args...), func(err error) error { if err != nil || s.snapshotsPath == "" { - args = nil - args = append(args, s.deleteCommand...) - args = append(args, tmpSnapshotPath) - _ = exec.Command(args[0], args[1:]...).Run() + _ = uback.RunCommand(btrfsLog, uback.BuildCommand(s.deleteCommand, tmpSnapshotPath)) return err } if s.snapshotsPath != "" { @@ -156,15 +138,9 @@ func (s *btrfsSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup, // Part of uback.Source interface func (s *btrfsSource) RestoreBackup(targetDir string, backup uback.Backup, data io.Reader) error { - args := []string{} - args = append(args, s.receiveCommand...) - args = append(args, targetDir) - cmd := exec.Command(args[0], args[1:]...) - btrfsLog.Printf("running %s", cmd.String()) + cmd := uback.BuildCommand(s.receiveCommand, targetDir) cmd.Stdin = data - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr - err := cmd.Run() + err := uback.RunCommand(btrfsLog, cmd) if err != nil { return err } diff --git a/sources/command.go b/sources/command.go index d310419..38e1940 100644 --- a/sources/command.go +++ b/sources/command.go @@ -52,9 +52,8 @@ func newCommandSource(options *uback.Options) (uback.Source, string, error) { buf := bytes.NewBuffer(nil) cmd := uback.BuildCommand(command, "source", "type") cmd.Stdout = buf - cmd.Stderr = os.Stderr cmd.Env = env - err := cmd.Run() + err := uback.RunCommand(commandLog, cmd) if err != nil { return nil, "", err } @@ -81,9 +80,8 @@ func (s *commandSource) ListSnapshots() ([]uback.Snapshot, error) { buf := bytes.NewBuffer(nil) cmd := uback.BuildCommand(s.command, "source", "list-snapshots") cmd.Stdout = buf - cmd.Stderr = os.Stderr cmd.Env = s.env - err := cmd.Run() + err := uback.RunCommand(commandLog, cmd) if err != nil { return nil, err } @@ -122,10 +120,8 @@ func (s *commandSource) ListSnapshots() ([]uback.Snapshot, error) { // Part of uback.Source interface func (s *commandSource) RemoveSnapshot(snapshot uback.Snapshot) error { cmd := uback.BuildCommand(s.command, "source", "remove-snapshot", snapshot.Name()) - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr cmd.Env = s.env - return cmd.Run() + return uback.RunCommand(commandLog, cmd) } // Part of uback.Source interface @@ -137,14 +133,10 @@ func (s *commandSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup cmd = uback.BuildCommand(s.command, "source", "create-backup") } - commandLog.Printf("running: %v", cmd.String()) - pr, pw := io.Pipe() - cmd.Stdout = pw - cmd.Stderr = os.Stderr cmd.Env = s.env - err := cmd.Start() + err := uback.StartCommand(commandLog, cmd) if err != nil { return uback.Backup{}, nil, err } @@ -178,9 +170,6 @@ func (s *commandSource) RestoreBackup(targetDir string, backup uback.Backup, dat cmd = uback.BuildCommand(s.command, "source", "restore-backup", targetDir, backup.Snapshot.Name()) } - commandLog.Printf("running: %v", cmd.String()) cmd.Stdin = data - cmd.Stdout = os.Stderr - cmd.Stderr = os.Stderr - return cmd.Run() + return uback.RunCommand(commandLog, cmd) } diff --git a/sources/mariabackup.go b/sources/mariabackup.go index 2ae6433..3866551 100644 --- a/sources/mariabackup.go +++ b/sources/mariabackup.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "os" - "os/exec" "path" "regexp" "strings" @@ -203,8 +202,8 @@ func (s *mariaBackupSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Ba return uback.Backup{}, nil, ErrParseMariadbVersion } - cmd := exec.Command(mdbVersionCommand[0], mdbVersionCommand[1:]...) - cmd.Stderr = os.Stderr + cmd := uback.BuildCommand(mdbVersionCommand) + cmd.Stdout = nil serverVersion, err = cmd.Output() if err != nil { return uback.Backup{}, nil, fmt.Errorf("cannot get mariadb server version: %v", err) @@ -231,10 +230,10 @@ func (s *mariaBackupSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Ba backup := uback.Backup{Snapshot: uback.Snapshot(snapshot), BaseSnapshot: baseSnapshot} mariaBackupLog.Printf("creating backup: %s", backup.Filename()) - return uback.WrapSourceCommand(backup, exec.Command(command[0], command[1:]...), func(err error) error { + return uback.WrapSourceCommand(backup, uback.BuildCommand(command), func(err error) error { if serverVersion != nil { - cmd := exec.Command(mdbVersionCommand[0], mdbVersionCommand[1:]...) - cmd.Stderr = os.Stderr + cmd := uback.BuildCommand(mdbVersionCommand) + cmd.Stdout = nil newServerVersion, err := cmd.Output() if err != nil { return fmt.Errorf("cannot get mariadb server version: %v", err) @@ -290,14 +289,10 @@ func (s *mariaBackupSource) RestoreBackup(targetDir string, backup uback.Backup, if s.useDocker { extractCommand = append(extractCommand, "docker", "run", "--rm", "-u", fmt.Sprintf("%d", os.Getuid()), "-v", fmt.Sprintf("%s:%s", targetDir, targetDir), "-i", "mariadb:latest") } - extractCommand = append(extractCommand, "mbstream", "-x", "-C", restoreDir) - cmd := exec.Command(extractCommand[0], extractCommand[1:]...) + cmd := uback.BuildCommand(extractCommand, "mbstream", "-x", "-C", restoreDir) cmd.Stdin = data - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - mariaBackupLog.Printf("running %v", cmd.String()) - err = cmd.Run() + err = uback.RunCommand(mariaBackupLog, cmd) if err != nil { return err } @@ -322,13 +317,8 @@ func (s *mariaBackupSource) RestoreBackup(targetDir string, backup uback.Backup, if backup.BaseSnapshot != nil { baseDir := path.Join(targetDir, backup.BaseSnapshot.Name()) - prepareCommand = append(prepareCommand, "--prepare", fmt.Sprintf("--target-dir=%s", baseDir), fmt.Sprintf("--incremental-dir=%s", restoreDir)) - cmd = exec.Command(prepareCommand[0], prepareCommand[1:]...) - cmd.Stdin = nil - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - mariaBackupLog.Printf("running %v", cmd.String()) - err = cmd.Run() + cmd = uback.BuildCommand(prepareCommand, "--prepare", fmt.Sprintf("--target-dir=%s", baseDir), fmt.Sprintf("--incremental-dir=%s", restoreDir)) + err = uback.RunCommand(mariaBackupLog, cmd) if err != nil { return err } @@ -341,11 +331,6 @@ func (s *mariaBackupSource) RestoreBackup(targetDir string, backup uback.Backup, return os.Rename(baseDir, restoreDir) } - prepareCommand = append(prepareCommand, "--prepare", fmt.Sprintf("--target-dir=%s", restoreDir)) - cmd = exec.Command(prepareCommand[0], prepareCommand[1:]...) - cmd.Stdin = nil - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - mariaBackupLog.Printf("running %v", cmd.String()) - return cmd.Run() + cmd = uback.BuildCommand(prepareCommand, "--prepare", fmt.Sprintf("--target-dir=%s", restoreDir)) + return uback.RunCommand(mariaBackupLog, cmd) } diff --git a/sources/tar.go b/sources/tar.go index c8f882b..42389b9 100644 --- a/sources/tar.go +++ b/sources/tar.go @@ -103,10 +103,6 @@ func (s *tarSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup, io baseSnapshot = nil } - command := make([]string, 0, len(s.command)+5) - command = append(command, s.command...) - command = append(command, []string{"--create", "-C", s.basePath}...) - if baseSnapshot != nil { err := uback.CopyFile(tmpSnapshotPath, path.Join(s.snapshotsPath, baseSnapshot.Name())) if err != nil { @@ -119,11 +115,12 @@ func (s *tarSource) CreateBackup(baseSnapshot *uback.Snapshot) (uback.Backup, io backup := uback.Backup{Snapshot: uback.Snapshot(snapshot), BaseSnapshot: baseSnapshot} tarLog.Printf("creating backup: %s", backup.Filename()) + args := []string{"--create", "-C", s.basePath} if s.snapshotsPath != "" { - command = append(command, fmt.Sprintf("--listed-incremental=%s", tmpSnapshotPath)) + args = append(args, fmt.Sprintf("--listed-incremental=%s", tmpSnapshotPath)) } - command = append(command, ".") - return uback.WrapSourceCommand(backup, exec.Command(command[0], command[1:]...), func(err error) error { + args = append(args, ".") + return uback.WrapSourceCommand(backup, uback.BuildCommand(s.command, args...), func(err error) error { // For tar, exit code 1 is a warning, don't treat it as an error if err != nil { exitErr, ok := err.(*exec.ExitError) @@ -158,9 +155,6 @@ func (s *tarSource) RestoreBackup(targetDir string, backup uback.Backup, data io } cmd := exec.Command("tar", "-x", "-C", path.Join(targetDir, backup.Snapshot.Name())) - tarLog.Printf("running %s", cmd.String()) cmd.Stdin = data - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd.Run() + return uback.RunCommand(tarLog, cmd) }