|
| 1 | +package rclone |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/go-cmd/cmd" |
| 5 | + "github.com/pkg/errors" |
| 6 | + "github.com/sirupsen/logrus" |
| 7 | +) |
| 8 | + |
| 9 | +/* Public */ |
| 10 | + |
| 11 | +func Dedupe(remotePath string, additionalRcloneParams []string) (bool, int, error) { |
| 12 | + // set variables |
| 13 | + rLog := log.WithFields(logrus.Fields{ |
| 14 | + "action": CMD_DEDUPE, |
| 15 | + "remote_path": remotePath, |
| 16 | + }) |
| 17 | + result := false |
| 18 | + |
| 19 | + // generate required rclone parameters |
| 20 | + params := []string{ |
| 21 | + CMD_DEDUPE, |
| 22 | + remotePath, |
| 23 | + } |
| 24 | + |
| 25 | + if baseParams, err := getBaseParams(); err != nil { |
| 26 | + return false, 1, errors.Wrapf(err, "failed generating baseParams to %q: %q", CMD_DEDUPE, |
| 27 | + remotePath) |
| 28 | + } else { |
| 29 | + params = append(params, baseParams...) |
| 30 | + } |
| 31 | + |
| 32 | + if additionalParams, err := getAdditionalParams(CMD_DEDUPE, additionalRcloneParams); err != nil { |
| 33 | + return false, 1, errors.Wrapf(err, "failed generating additionalParams to %s: %q", |
| 34 | + CMD_DEDUPE, remotePath) |
| 35 | + } else { |
| 36 | + params = append(params, additionalParams...) |
| 37 | + } |
| 38 | + |
| 39 | + rLog.Debugf("Generated params: %v", params) |
| 40 | + |
| 41 | + // setup cmd |
| 42 | + cmdOptions := cmd.Options{ |
| 43 | + Buffered: false, |
| 44 | + Streaming: true, |
| 45 | + } |
| 46 | + rcloneCmd := cmd.NewCmdOptions(cmdOptions, cfg.Rclone.Path, params...) |
| 47 | + |
| 48 | + // live stream logs |
| 49 | + doneChan := make(chan struct{}) |
| 50 | + go func() { |
| 51 | + defer close(doneChan) |
| 52 | + |
| 53 | + for rcloneCmd.Stdout != nil || rcloneCmd.Stderr != nil { |
| 54 | + select { |
| 55 | + case line, open := <-rcloneCmd.Stdout: |
| 56 | + if !open { |
| 57 | + rcloneCmd.Stdout = nil |
| 58 | + continue |
| 59 | + } |
| 60 | + log.Info(line) |
| 61 | + case line, open := <-rcloneCmd.Stderr: |
| 62 | + if !open { |
| 63 | + rcloneCmd.Stderr = nil |
| 64 | + continue |
| 65 | + } |
| 66 | + log.Info(line) |
| 67 | + } |
| 68 | + } |
| 69 | + }() |
| 70 | + |
| 71 | + // run command |
| 72 | + rLog.Debug("Starting...") |
| 73 | + |
| 74 | + status := <-rcloneCmd.Start() |
| 75 | + <-doneChan |
| 76 | + |
| 77 | + // check status |
| 78 | + switch status.Exit { |
| 79 | + case EXIT_SUCCESS: |
| 80 | + result = true |
| 81 | + default: |
| 82 | + break |
| 83 | + } |
| 84 | + |
| 85 | + rLog.WithField("exit_code", status.Exit).Debug("Finished") |
| 86 | + return result, status.Exit, status.Error |
| 87 | +} |
0 commit comments