diff --git a/agent/agent.go b/agent/agent.go index 20b5970..21d758b 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -15,6 +15,7 @@ import ( "bytes" "context" "crypto/tls" + "encoding/json" "errors" "fmt" "math" @@ -646,3 +647,124 @@ func createWinTempDir() error { } return nil } + +func (a *Agent) RunTask(id int) error { + data := rmm.AutomatedTask{} + url := fmt.Sprintf("/api/v3/%d/%s/taskrunner/", id, a.AgentID) + r1, gerr := a.rClient.R().Get(url) + if gerr != nil { + a.Logger.Debugln(gerr) + return gerr + } + + if r1.IsError() { + a.Logger.Debugln("Run Task:", r1.String()) + return nil + } + + if err := json.Unmarshal(r1.Body(), &data); err != nil { + a.Logger.Debugln(err) + return err + } + + start := time.Now() + + type TaskResult struct { + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + RetCode int `json:"retcode"` + ExecTime float64 `json:"execution_time"` + } + + payload := TaskResult{} + + // loop through all task actions + for _, action := range data.TaskActions { + + action_start := time.Now() + if action.ActionType == "script" { + stdout, stderr, retcode, err := a.RunScript(action.Code, action.Shell, action.Args, action.Timeout, action.RunAsUser, action.EnvVars, action.NushellEnableConfig, action.DenoDefaultPermissions) + + if err != nil { + a.Logger.Debugln(err) + } + + // add text to stdout showing which script ran if more than 1 script + action_exec_time := time.Since(action_start).Seconds() + + if len(data.TaskActions) > 1 { + payload.Stdout += fmt.Sprintf("\n------------\nRunning Script: %s. Execution Time: %f\n------------\n\n", action.ScriptName, action_exec_time) + } + + // save results + payload.Stdout += stdout + payload.Stderr += stderr + payload.RetCode = retcode + + if !data.ContinueOnError && stderr != "" { + break + } + + } else if action.ActionType == "cmd" { + var stdout, stderr string + + switch runtime.GOOS { + case "windows": + out, err := CMDShell(action.Shell, []string{}, action.Command, action.Timeout, false, action.RunAsUser) + if err != nil { + a.Logger.Debugln(err) + } + stdout = out[0] + stderr = out[1] + + if stderr == "" { + payload.RetCode = 0 + } else { + payload.RetCode = 1 + } + + default: + opts := a.NewCMDOpts() + opts.Shell = action.Shell + opts.Command = action.Command + opts.Timeout = time.Duration(action.Timeout) + out := a.CmdV2(opts) + + if out.Status.Error != nil { + a.Logger.Debugln("RunTask() cmd: ", out.Status.Error.Error()) + } + + stdout = out.Stdout + stderr = out.Stderr + payload.RetCode = out.Status.Exit + } + + if len(data.TaskActions) > 1 { + action_exec_time := time.Since(action_start).Seconds() + + // add text to stdout showing which script ran + payload.Stdout += fmt.Sprintf("\n------------\nRunning Command: %s. Execution Time: %f\n------------\n\n", action.Command, action_exec_time) + } + // save results + payload.Stdout += stdout + payload.Stderr += stderr + + if payload.RetCode != 0 { + if !data.ContinueOnError { + break + } + } + } else { + a.Logger.Debugln("Invalid Action", action) + } + } + + payload.ExecTime = time.Since(start).Seconds() + + _, perr := a.rClient.R().SetBody(payload).Patch(url) + if perr != nil { + a.Logger.Debugln(perr) + return perr + } + return nil +} diff --git a/agent/agent_unix.go b/agent/agent_unix.go index 5033dba..83320a0 100644 --- a/agent/agent_unix.go +++ b/agent/agent_unix.go @@ -941,8 +941,6 @@ func (a *Agent) GetInstalledSoftware() []trmm.WinSoftwareList { return []trmm.Wi func (a *Agent) ChecksRunning() bool { return false } -func (a *Agent) RunTask(id int) error { return nil } - func (a *Agent) InstallChoco() {} func (a *Agent) InstallWithChoco(name string) (string, error) { return "", nil } diff --git a/agent/tasks_windows.go b/agent/tasks_windows.go index 3ccdead..5070e53 100644 --- a/agent/tasks_windows.go +++ b/agent/tasks_windows.go @@ -12,7 +12,6 @@ https://license.tacticalrmm.com package agent import ( - "encoding/json" "fmt" "os" "path/filepath" @@ -20,112 +19,9 @@ import ( "time" "github.com/amidaware/taskmaster" - - rmm "github.com/amidaware/rmmagent/shared" "github.com/rickb777/date/period" ) -func (a *Agent) RunTask(id int) error { - data := rmm.AutomatedTask{} - url := fmt.Sprintf("/api/v3/%d/%s/taskrunner/", id, a.AgentID) - r1, gerr := a.rClient.R().Get(url) - if gerr != nil { - a.Logger.Debugln(gerr) - return gerr - } - - if r1.IsError() { - a.Logger.Debugln("Run Task:", r1.String()) - return nil - } - - if err := json.Unmarshal(r1.Body(), &data); err != nil { - a.Logger.Debugln(err) - return err - } - - start := time.Now() - - type TaskResult struct { - Stdout string `json:"stdout"` - Stderr string `json:"stderr"` - RetCode int `json:"retcode"` - ExecTime float64 `json:"execution_time"` - } - - payload := TaskResult{} - - // loop through all task actions - for _, action := range data.TaskActions { - - action_start := time.Now() - if action.ActionType == "script" { - stdout, stderr, retcode, err := a.RunScript(action.Code, action.Shell, action.Args, action.Timeout, action.RunAsUser, action.EnvVars, action.NushellEnableConfig, action.DenoDefaultPermissions) - - if err != nil { - a.Logger.Debugln(err) - } - - // add text to stdout showing which script ran if more than 1 script - action_exec_time := time.Since(action_start).Seconds() - - if len(data.TaskActions) > 1 { - payload.Stdout += fmt.Sprintf("\n------------\nRunning Script: %s. Execution Time: %f\n------------\n\n", action.ScriptName, action_exec_time) - } - - // save results - payload.Stdout += stdout - payload.Stderr += stderr - payload.RetCode = retcode - - if !data.ContinueOnError && stderr != "" { - break - } - - } else if action.ActionType == "cmd" { - // out[0] == stdout, out[1] == stderr - out, err := CMDShell(action.Shell, []string{}, action.Command, action.Timeout, false, action.RunAsUser) - - if err != nil { - a.Logger.Debugln(err) - } - - if len(data.TaskActions) > 1 { - action_exec_time := time.Since(action_start).Seconds() - - // add text to stdout showing which script ran - payload.Stdout += fmt.Sprintf("\n------------\nRunning Command: %s. Execution Time: %f\n------------\n\n", action.Command, action_exec_time) - } - // save results - payload.Stdout += out[0] - payload.Stderr += out[1] - - // no error - if out[1] == "" { - payload.RetCode = 0 - } else { - payload.RetCode = 1 - - if !data.ContinueOnError { - break - } - } - - } else { - a.Logger.Debugln("Invalid Action", action) - } - } - - payload.ExecTime = time.Since(start).Seconds() - - _, perr := a.rClient.R().SetBody(payload).Patch(url) - if perr != nil { - a.Logger.Debugln(perr) - return perr - } - return nil -} - type SchedTask struct { PK int `json:"pk"` Type string `json:"type"`