Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07cc58e9cd | ||
|
|
3e0366c43e | ||
|
|
8461698171 | ||
|
|
1b650905e3 | ||
|
|
dd17ae64a7 | ||
|
|
2cf0f06601 | ||
|
|
5e70db3d7d | ||
|
|
6302b9f5ef | ||
|
|
41218f104a | ||
|
|
7ea714fc04 | ||
|
|
fa30a72a5b | ||
|
|
7062e0451f | ||
|
|
2370ddd8c6 | ||
|
|
a3c3de947e | ||
|
|
e9fd05bd91 | ||
|
|
b3e0c3e3f8 | ||
|
|
f336315312 | ||
|
|
d7560b0706 | ||
|
|
caa5cd8362 | ||
|
|
14707d78c9 | ||
|
|
f6ec32a8d6 | ||
|
|
1c1fb0af99 | ||
|
|
82ad6be3aa | ||
|
|
d0186ba48f | ||
|
|
25dfa5db55 |
122
agent/agent.go
122
agent/agent.go
@@ -15,7 +15,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
@@ -647,124 +646,3 @@ func createWinTempDir() error {
|
|||||||
}
|
}
|
||||||
return nil
|
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
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -941,6 +941,8 @@ func (a *Agent) GetInstalledSoftware() []trmm.WinSoftwareList { return []trmm.Wi
|
|||||||
|
|
||||||
func (a *Agent) ChecksRunning() bool { return false }
|
func (a *Agent) ChecksRunning() bool { return false }
|
||||||
|
|
||||||
|
func (a *Agent) RunTask(id int) error { return nil }
|
||||||
|
|
||||||
func (a *Agent) InstallChoco() {}
|
func (a *Agent) InstallChoco() {}
|
||||||
|
|
||||||
func (a *Agent) InstallWithChoco(name string) (string, error) { return "", nil }
|
func (a *Agent) InstallWithChoco(name string) (string, error) { return "", nil }
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ https://license.tacticalrmm.com
|
|||||||
package agent
|
package agent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -19,9 +20,112 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/amidaware/taskmaster"
|
"github.com/amidaware/taskmaster"
|
||||||
|
|
||||||
|
rmm "github.com/amidaware/rmmagent/shared"
|
||||||
"github.com/rickb777/date/period"
|
"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 {
|
type SchedTask struct {
|
||||||
PK int `json:"pk"`
|
PK int `json:"pk"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
|
|||||||
Reference in New Issue
Block a user