25 Commits

Author SHA1 Message Date
wh1te909
07cc58e9cd Release 2.8.0 2024-07-08 16:12:16 -07:00
wh1te909
3e0366c43e Release 2.7.0 2024-03-24 17:13:16 -07:00
wh1te909
8461698171 Release 2.6.2 2024-02-04 17:07:26 -08:00
wh1te909
1b650905e3 Release 2.6.1 2023-12-23 16:18:58 -08:00
wh1te909
dd17ae64a7 Release 2.6.0 2023-12-04 12:42:18 -08:00
wh1te909
2cf0f06601 Release 2.5.0 2023-09-01 16:51:06 -07:00
wh1te909
5e70db3d7d Release 2.4.11 2023-08-14 13:34:51 -07:00
wh1te909
6302b9f5ef Release 2.4.10 2023-08-13 23:55:14 -07:00
wh1te909
41218f104a Release 2.4.9 2023-05-30 14:55:14 -07:00
wh1te909
7ea714fc04 Release 2.4.8 2023-05-10 19:05:53 -07:00
wh1te909
fa30a72a5b Release 2.4.7 2023-05-10 12:30:01 -07:00
wh1te909
7062e0451f Release 2.4.6 2023-04-08 19:59:45 -07:00
wh1te909
2370ddd8c6 Release 2.4.5 2023-03-23 13:02:00 -07:00
wh1te909
a3c3de947e Release 2.4.4 2022-12-21 11:11:08 -08:00
wh1te909
e9fd05bd91 Release 2.4.3 2022-12-04 15:10:28 -08:00
wh1te909
b3e0c3e3f8 Release 2.4.2 2022-11-12 16:50:11 -08:00
wh1te909
f336315312 Release 2.4.1 2022-10-25 14:50:06 -07:00
wh1te909
d7560b0706 Release 2.4.0 2022-09-23 19:17:27 -07:00
wh1te909
caa5cd8362 Release 2.3.1 2022-09-11 23:01:07 -07:00
wh1te909
14707d78c9 Release 2.3.0 2022-08-09 13:18:55 -07:00
wh1te909
f6ec32a8d6 Release 2.2.1 2022-08-01 15:44:59 -07:00
wh1te909
1c1fb0af99 Release 2.2.0 2022-08-01 10:14:20 -07:00
wh1te909
82ad6be3aa Merge branch 'develop' 2022-07-26 23:22:40 -07:00
wh1te909
d0186ba48f Merge branch 'develop' 2022-07-07 23:19:28 -07:00
wh1te909
25dfa5db55 Release 2.1.0 2022-07-07 11:41:33 -07:00
3 changed files with 106 additions and 122 deletions

View File

@@ -15,7 +15,6 @@ import (
"bytes"
"context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"math"
@@ -647,124 +646,3 @@ 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
}

View File

@@ -941,6 +941,8 @@ 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 }

View File

@@ -12,6 +12,7 @@ https://license.tacticalrmm.com
package agent
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
@@ -19,9 +20,112 @@ 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"`