131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
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.", ""},
|
|
}
|
|
}
|