diff --git a/agent/agent.go b/agent/agent.go
index 2e465e0..84f1889 100644
--- a/agent/agent.go
+++ b/agent/agent.go
@@ -78,6 +78,8 @@ const (
meshSvcName = "mesh agent"
)
+var winTempDir = filepath.Join(os.Getenv("PROGRAMDATA"), "TacticalRMM")
+var winMeshDir = filepath.Join(os.Getenv("PROGRAMFILES"), "Mesh Agent")
var natsCheckin = []string{"agent-hello", "agent-agentinfo", "agent-disks", "agent-winsvc", "agent-publicip", "agent-wmi"}
func New(logger *logrus.Logger, version string) *Agent {
@@ -402,54 +404,47 @@ func (a *Agent) GetUninstallExe() string {
}
func (a *Agent) CleanupAgentUpdates() {
- cderr := os.Chdir(a.ProgramDir)
- if cderr != nil {
- a.Logger.Errorln(cderr)
- return
- }
+ // TODO remove a.ProgramDir, updates are now in winTempDir
+ dirs := [2]string{winTempDir, a.ProgramDir}
+ for _, dir := range dirs {
+ err := os.Chdir(dir)
+ if err != nil {
+ a.Logger.Debugln("CleanupAgentUpdates()", dir, err)
+ continue
+ }
- // winagent-v* is deprecated
- files, err := filepath.Glob("winagent-v*.exe")
- if err == nil {
- for _, f := range files {
- os.Remove(f)
+ // TODO winagent-v* is deprecated
+ globs := [2]string{"tacticalagent-v*", "winagent-v*"}
+ for _, glob := range globs {
+ files, err := filepath.Glob(glob)
+ if err == nil {
+ for _, f := range files {
+ a.Logger.Debugln("CleanupAgentUpdates() Removing file:", f)
+ os.Remove(f)
+ }
+ }
}
}
- agents, err := filepath.Glob("tacticalagent-v*.exe")
+ err := os.Chdir(os.Getenv("TMP"))
if err == nil {
- for _, f := range agents {
- os.Remove(f)
- }
- }
-
- cderr = os.Chdir(os.Getenv("TMP"))
- if cderr != nil {
- a.Logger.Errorln(cderr)
- return
- }
- folders, err := filepath.Glob("tacticalrmm*")
- if err == nil {
- for _, f := range folders {
- os.RemoveAll(f)
+ dirs, err := filepath.Glob("tacticalrmm*")
+ if err == nil {
+ for _, f := range dirs {
+ os.RemoveAll(f)
+ }
}
}
}
func (a *Agent) RunPythonCode(code string, timeout int, args []string) (string, error) {
content := []byte(code)
- dir, err := ioutil.TempDir("", "tacticalpy")
- if err != nil {
- a.Logger.Debugln(err)
- return "", err
- }
- defer os.RemoveAll(dir)
-
- tmpfn, _ := ioutil.TempFile(dir, "*.py")
+ tmpfn, _ := ioutil.TempFile(winTempDir, "*.py")
if _, err := tmpfn.Write(content); err != nil {
a.Logger.Debugln(err)
return "", err
}
+ defer os.Remove(tmpfn.Name())
if err := tmpfn.Close(); err != nil {
a.Logger.Debugln(err)
return "", err
@@ -489,13 +484,12 @@ func (a *Agent) RunPythonCode(code string, timeout int, args []string) (string,
}
-func (a *Agent) CreateTRMMTempDir() {
- // create the temp dir for running scripts
- dir := filepath.Join(os.TempDir(), "trmm")
- if !trmm.FileExists(dir) {
- err := os.Mkdir(dir, 0775)
+func createWinTempDir() error {
+ if !trmm.FileExists(winTempDir) {
+ err := os.Mkdir(winTempDir, 0775)
if err != nil {
- a.Logger.Errorln(err)
+ return err
}
}
+ return nil
}
diff --git a/agent/agent_unix.go b/agent/agent_unix.go
index 993b446..9d23590 100644
--- a/agent/agent_unix.go
+++ b/agent/agent_unix.go
@@ -209,6 +209,13 @@ func SetDetached() *syscall.SysProcAttr {
return &syscall.SysProcAttr{Setpgid: true}
}
+func (a *Agent) seEnforcing() bool {
+ opts := a.NewCMDOpts()
+ opts.Command = "getenforce"
+ out := a.CmdV2(opts)
+ return out.Status.Exit == 0 && strings.Contains(out.Stdout, "Enforcing")
+}
+
func (a *Agent) AgentUpdate(url, inno, version string) {
self, err := os.Executable()
@@ -276,6 +283,13 @@ func (a *Agent) AgentUpdate(url, inno, version string) {
}
}
+ if a.seEnforcing() {
+ se := a.NewCMDOpts()
+ se.Command = fmt.Sprintf("restorecon -rv %s", self)
+ out := a.CmdV2(se)
+ a.Logger.Debugln("%+v\n", out)
+ }
+
opts := a.NewCMDOpts()
opts.Detached = true
opts.Command = "systemctl restart tacticalagent.service"
diff --git a/agent/agent_windows.go b/agent/agent_windows.go
index a3dd2f5..00e489c 100644
--- a/agent/agent_windows.go
+++ b/agent/agent_windows.go
@@ -86,9 +86,10 @@ func (a *Agent) RunScript(code string, shell string, args []string, timeout int,
content := []byte(code)
- dir := filepath.Join(os.TempDir(), "trmm")
- if !trmm.FileExists(dir) {
- a.CreateTRMMTempDir()
+ err := createWinTempDir()
+ if err != nil {
+ a.Logger.Errorln(err)
+ return "", err.Error(), 85, err
}
const defaultExitCode = 1
@@ -110,7 +111,7 @@ func (a *Agent) RunScript(code string, shell string, args []string, timeout int,
ext = "*.bat"
}
- tmpfn, err := ioutil.TempFile(dir, ext)
+ tmpfn, err := ioutil.TempFile(winTempDir, ext)
if err != nil {
a.Logger.Errorln(err)
return "", err.Error(), 85, err
@@ -576,13 +577,15 @@ func (a *Agent) UninstallCleanup() {
a.PatchMgmnt(false)
a.CleanupAgentUpdates()
CleanupSchedTasks()
+ os.RemoveAll(winTempDir)
}
func (a *Agent) AgentUpdate(url, inno, version string) {
time.Sleep(time.Duration(randRange(1, 15)) * time.Second)
a.KillHungUpdates()
+ time.Sleep(1 * time.Second)
a.CleanupAgentUpdates()
- updater := filepath.Join(a.ProgramDir, inno)
+ updater := filepath.Join(winTempDir, inno)
a.Logger.Infof("Agent updating from %s to %s", a.Version, version)
a.Logger.Debugln("Downloading agent update from", url)
@@ -605,14 +608,7 @@ func (a *Agent) AgentUpdate(url, inno, version string) {
return
}
- dir, err := ioutil.TempDir("", "tacticalrmm")
- if err != nil {
- a.Logger.Errorln("Agentupdate create tempdir:", err)
- CMD("net", []string{"start", winSvcName}, 10, false)
- return
- }
-
- innoLogFile := filepath.Join(dir, "tacticalrmm.txt")
+ innoLogFile := filepath.Join(winTempDir, fmt.Sprintf("tacticalagent_update_v%s.txt", version))
args := []string{"/C", updater, "/VERYSILENT", fmt.Sprintf("/LOG=%s", innoLogFile)}
cmd := exec.Command("cmd.exe", args...)
@@ -658,12 +654,11 @@ func (a *Agent) AgentUninstall(code string) {
}
func (a *Agent) addDefenderExlusions() {
- code := `
-Add-MpPreference -ExclusionPath 'C:\Program Files\TacticalAgent\*'
-Add-MpPreference -ExclusionPath 'C:\Windows\Temp\tacticalagent-v*.exe'
-Add-MpPreference -ExclusionPath 'C:\Windows\Temp\trmm\*'
-Add-MpPreference -ExclusionPath 'C:\Program Files\Mesh Agent\*'
-`
+ code := fmt.Sprintf(`
+Add-MpPreference -ExclusionPath '%s\*'
+Add-MpPreference -ExclusionPath '%s\*'
+Add-MpPreference -ExclusionPath '%s\*'
+`, winTempDir, a.ProgramDir, winMeshDir)
_, _, _, err := a.RunScript(code, "powershell", []string{}, 20, false)
if err != nil {
a.Logger.Debugln(err)
diff --git a/agent/install.go b/agent/install.go
index a975581..b03518c 100644
--- a/agent/install.go
+++ b/agent/install.go
@@ -224,13 +224,16 @@ func (a *Agent) Install(i *Installer) {
a.SendSoftware()
a.Logger.Debugln("Creating temp dir")
- a.CreateTRMMTempDir()
+ err := createWinTempDir()
+ if err != nil {
+ a.Logger.Errorln("Install() createWinTempDir():", err)
+ }
a.Logger.Debugln("Disabling automatic windows updates")
a.PatchMgmnt(true)
a.Logger.Infoln("Installing service...")
- err := a.InstallService()
+ err = a.InstallService()
if err != nil {
a.installerMsg(err.Error(), "error", i.Silent)
}
diff --git a/agent/svc.go b/agent/svc.go
index e360ebf..4ca85c2 100644
--- a/agent/svc.go
+++ b/agent/svc.go
@@ -29,7 +29,10 @@ func (a *Agent) RunAsService() {
func (a *Agent) AgentSvc() {
go a.GetPython(false)
- a.CreateTRMMTempDir()
+ err := createWinTempDir()
+ if err != nil {
+ a.Logger.Errorln("AgentSvc() createWinTempDir():", err)
+ }
a.RunMigrations()
sleepDelay := randRange(14, 22)
diff --git a/build/rmm.exe.manifest b/build/rmm.exe.manifest
index 3ce8a05..df6fc51 100644
--- a/build/rmm.exe.manifest
+++ b/build/rmm.exe.manifest
@@ -3,7 +3,7 @@
diff --git a/build/setup.iss b/build/setup.iss
index 9f236b9..cae5a3e 100644
--- a/build/setup.iss
+++ b/build/setup.iss
@@ -1,5 +1,5 @@
#define MyAppName "Tactical RMM Agent"
-#define MyAppVersion "2.2.1"
+#define MyAppVersion "2.3.0"
#define MyAppPublisher "AmidaWare LLC"
#define MyAppURL "https://github.com/amidaware"
#define MyAppExeName "tacticalrmm.exe"
diff --git a/main.go b/main.go
index eb2e193..21f4d6e 100644
--- a/main.go
+++ b/main.go
@@ -25,7 +25,7 @@ import (
)
var (
- version = "2.2.1"
+ version = "2.3.0"
log = logrus.New()
logFile *os.File
)
@@ -85,6 +85,8 @@ func main() {
a.Logger.Debugf("%+v\n", a)
switch *mode {
+ case "getenv":
+ fmt.Println(os.Getenv(flag.Arg(0)))
case "nixmeshnodeid":
fmt.Print(a.NixMeshNodeID())
case "installsvc":
diff --git a/versioninfo.json b/versioninfo.json
index d993149..b7064a2 100644
--- a/versioninfo.json
+++ b/versioninfo.json
@@ -2,14 +2,14 @@
"FixedFileInfo": {
"FileVersion": {
"Major": 2,
- "Minor": 2,
- "Patch": 1,
+ "Minor": 3,
+ "Patch": 0,
"Build": 0
},
"ProductVersion": {
"Major": 2,
- "Minor": 2,
- "Patch": 1,
+ "Minor": 3,
+ "Patch": 0,
"Build": 0
},
"FileFlagsMask": "3f",
@@ -22,14 +22,14 @@
"Comments": "",
"CompanyName": "AmidaWare LLC",
"FileDescription": "Tactical RMM Agent",
- "FileVersion": "v2.2.1.0",
+ "FileVersion": "v2.3.0.0",
"InternalName": "tacticalrmm.exe",
"LegalCopyright": "Copyright (c) 2022 AmidaWare LLC",
"LegalTrademarks": "",
"OriginalFilename": "tacticalrmm.exe",
"PrivateBuild": "",
"ProductName": "Tactical RMM Agent",
- "ProductVersion": "v2.2.1.0",
+ "ProductVersion": "v2.3.0.0",
"SpecialBuild": ""
},
"VarFileInfo": {