diff --git a/actions/actions.go b/actions/actions.go index 409a672..65e6e19 100644 --- a/actions/actions.go +++ b/actions/actions.go @@ -121,6 +121,7 @@ func GetAllActions() []DocumentedAction { return []DocumentedAction{ Command{}, Printer{}, + RemoveFiles{}, ShellScript{}, Shutdown{}, SendMatrix{}, diff --git a/actions/remove_files.go b/actions/remove_files.go new file mode 100644 index 0000000..01083c1 --- /dev/null +++ b/actions/remove_files.go @@ -0,0 +1,130 @@ +package actions + +import ( + "encoding/json" + "fmt" + "os/exec" + + "github.com/k4lipso/gokill/internal" +) + +type RemoveFiles struct { + Files []string `json:"files"` + Directories []string `json:"directories"` + ActionChan ActionResultChan +} + +func (c RemoveFiles) getRemoveCommand() string { + command := "srm" + isAvailable := isCommandAvailable(command) + + if !isAvailable { + internal.LogDoc(c).Warningf("Command %s not found, falling back to 'rm'", command) + command = "rm" + } + + return command +} + +func (c RemoveFiles) DryExecute() { + internal.LogDoc(c).Infof("Test Execute") + + command := c.getRemoveCommand() + internal.LogDoc(c).Info("The following commands would have been executed:") + + for _, file := range c.Files { + internal.LogDoc(c).Noticef("%s -f %s", command, file) + } + + for _, dir := range c.Directories { + internal.LogDoc(c).Noticef("%s -rf %s", command, dir) + } + + c.ActionChan <- nil +} + +func (c RemoveFiles) Execute() { + internal.LogDoc(c).Infof("Execute") + + command := c.getRemoveCommand() + + for _, file := range c.Files { + cmd := exec.Command(command, "-fv", file) + + stdout, err := cmd.Output() + + if err != nil { + internal.LogDoc(c).Errorf("%s", err.Error()) + } + + internal.LogDoc(c).Notice(string(stdout)) + } + + for _, dir := range c.Directories { + cmd := exec.Command(command, "-rfv", dir) + + stdout, err := cmd.Output() + + if err != nil { + internal.LogDoc(c).Errorf("%s", err.Error()) + } + + internal.LogDoc(c).Notice(string(stdout)) + } + + c.ActionChan <- nil +} + +func CreateRemoveFiles(config internal.ActionConfig, c ActionResultChan) (RemoveFiles, error) { + result := RemoveFiles{} + + err := json.Unmarshal(config.Options, &result) + + if err != nil { + return RemoveFiles{}, fmt.Errorf("Error parsing RemoveFiles: %s", err) + } + + result.ActionChan = c + + return result, nil +} + +func (cc RemoveFiles) Create(config internal.ActionConfig, c ActionResultChan) (Action, error) { + return CreateRemoveFiles(config, c) +} + +func (p RemoveFiles) GetName() string { + return "RemoveFiles" +} + +func (p RemoveFiles) GetDescription() string { + return ` +RemoveFiles deletes the given files and directories. +If available "srm" is used, otherwise RemoveFiles falls back to "rm" + ` +} + +func (p RemoveFiles) GetExample() string { + return ` + { + "type": "RemoveFiles", + "options": { + "files": [ + "/home/user/secrets.txt" + ], + "directories": [ + "/home/user/.gpg", + "/home/user/.ssh", + "/home/user/.thunderbird" + ] + } + } + ` +} + +func (p RemoveFiles) GetOptions() []internal.ConfigOption { + return []internal.ConfigOption{ + {"files", "[]string", "list of absolute paths of files that should be deleted.", ""}, + {"directories", "[]string", "list of absolute paths of directories that should be deleted.", ""}, + } +}