Skip to content

Commit

Permalink
chore: migrate from golang exec.* to our internal lib
Browse files Browse the repository at this point in the history
  • Loading branch information
sloonz committed Nov 30, 2023
1 parent acc95a4 commit 0d0d216
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 98 deletions.
17 changes: 4 additions & 13 deletions destinations/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down
40 changes: 8 additions & 32 deletions sources/btrfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"fmt"
"io"
"os"
"os/exec"
"path"
"regexp"
"strings"
Expand Down Expand Up @@ -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
Expand All @@ -118,33 +111,22 @@ 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
}

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 != "" {
Expand All @@ -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
}
Expand Down
21 changes: 5 additions & 16 deletions sources/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
}
37 changes: 11 additions & 26 deletions sources/mariabackup.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"fmt"
"io"
"os"
"os/exec"
"path"
"regexp"
"strings"
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -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)
}
16 changes: 5 additions & 11 deletions sources/tar.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
Expand Down Expand Up @@ -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)
}

0 comments on commit 0d0d216

Please sign in to comment.