Skip to content

Commit 036e3e1

Browse files
committed
feat(agent): implement updater service installation and management
1 parent a603c56 commit 036e3e1

File tree

15 files changed

+257
-83
lines changed

15 files changed

+257
-83
lines changed

agent/config/const.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ type ProtoPort struct {
1313
TCP string
1414
}
1515

16+
const (
17+
SERVICE_UPDATER_NAME = "UTMStackUpdater"
18+
)
19+
1620
var (
1721
REPLACE_KEY string
1822

@@ -41,7 +45,6 @@ var (
4145
IntegrationKeyPath = filepath.Join(utils.GetMyPath(), "certs", "integration.key")
4246
IntegrationCAPath = filepath.Join(utils.GetMyPath(), "certs", "integration-ca.crt")
4347

44-
4548
// MaxConnectionTime = 120 * time.Second
4649
// SERV_NAME = "UTMStackAgent"
4750
// SERV_LOG = "utmstack_agent.log"

agent/config/linux_amd64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package config
55

66
var (
7-
UpdaterSelf = "utmstack_updater_self%s"
87
ServiceFile = "utmstack_agent_service%s"
8+
UpdaterFile = "utmstack_updater_service%s"
99
DependFiles = []string{"utmstack_agent_dependencies_linux.zip"}
1010
)

agent/config/linux_arm64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package config
55

66
var (
7-
UpdaterSelf = "utmstack_updater_self_arm64%s"
87
ServiceFile = "utmstack_agent_service_arm64%s"
8+
UpdaterFile = "utmstack_updater_service_arm64%s"
99
DependFiles = []string{"utmstack_agent_dependencies_linux_arm64.zip"}
1010
)

agent/config/macos.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package config
55

66
var (
7-
UpdaterSelf = "utmstack_updater_self%s"
87
ServiceFile = "utmstack_agent_service%s"
8+
UpdaterFile = "utmstack_updater_service%s"
99
DependFiles = []string{}
1010
)

agent/config/windows_amd64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package config
55

66
var (
7-
UpdaterSelf = "utmstack_updater_self%s.exe"
87
ServiceFile = "utmstack_agent_service%s.exe"
8+
UpdaterFile = "utmstack_updater_service%s.exe"
99
DependFiles = []string{"utmstack_agent_dependencies_windows.zip"}
1010
)

agent/config/windows_arm64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
package config
55

66
var (
7-
UpdaterSelf = "utmstack_updater_self_arm64%s.exe"
87
ServiceFile = "utmstack_agent_service_arm64%s.exe"
8+
UpdaterFile = "utmstack_updater_service_arm64%s.exe"
99
DependFiles = []string{"utmstack_agent_dependencies_windows_arm64.zip"}
1010
)

agent/logs/utmstack_agent.log

Lines changed: 0 additions & 1 deletion
This file was deleted.

agent/models/version.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package models
22

33
type Version struct {
4-
Version string `json:"version"`
4+
Version string `json:"version"`
5+
UpdaterVersion string `json:"updater_version"`
56
}

agent/serv/clean-old.go

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,30 @@
11
package serv
22

33
import (
4-
"fmt"
5-
"os"
6-
"path/filepath"
7-
"runtime"
8-
94
"github.com/utmstack/UTMStack/agent/config"
105
"github.com/utmstack/UTMStack/agent/utils"
116
)
127

138
func CleanOldServices(cnf *config.Config) {
14-
oldVersion := false
15-
16-
isUpdaterINstalled, err := utils.CheckIfServiceIsInstalled("UTMStackUpdater")
17-
if err != nil {
18-
utils.Logger.LogF(100, "error checking if service is installed: %v", err)
19-
}
20-
21-
if isUpdaterINstalled {
22-
oldVersion = true
23-
err = utils.StopService("UTMStackUpdater")
24-
if err != nil {
25-
utils.Logger.LogF(100, "error stopping service: %v", err)
26-
}
27-
28-
err = utils.UninstallService("UTMStackUpdater")
29-
if err != nil {
30-
utils.Logger.LogF(100, "error uninstalling service: %v", err)
31-
}
32-
}
33-
349
isRedlineInstalled, err := utils.CheckIfServiceIsInstalled("UTMStackRedline")
3510
if err != nil {
36-
utils.Logger.LogF(100, "error checking if service is installed: %v", err)
11+
utils.Logger.LogF(100, "error checking if UTMStackRedline service is installed: %v", err)
12+
return
3713
}
3814

3915
if isRedlineInstalled {
40-
oldVersion = true
16+
utils.Logger.Info("old UTMStackRedline service found, removing...")
17+
4118
err = utils.StopService("UTMStackRedline")
4219
if err != nil {
43-
utils.Logger.LogF(100, "error stopping service: %v", err)
20+
utils.Logger.LogF(100, "error stopping UTMStackRedline service: %v", err)
4421
}
4522

4623
err = utils.UninstallService("UTMStackRedline")
4724
if err != nil {
48-
utils.Logger.LogF(100, "error uninstalling service: %v", err)
49-
}
50-
}
51-
52-
if oldVersion {
53-
utils.Logger.Info("old version of agent found, downloading new version")
54-
if runtime.GOOS != "darwin" {
55-
if err := utils.DownloadFile(fmt.Sprintf(config.DependUrl, cnf.Server, config.DependenciesPort, fmt.Sprintf(config.UpdaterSelf, "")), map[string]string{}, fmt.Sprintf(config.UpdaterSelf, "_new"), utils.GetMyPath(), cnf.SkipCertValidation); err != nil {
56-
utils.Logger.LogF(100, "error downloading updater: %v", err)
57-
return
58-
}
59-
}
60-
61-
oldFilePath := filepath.Join(utils.GetMyPath(), fmt.Sprintf(config.UpdaterSelf, ""))
62-
newFilePath := filepath.Join(utils.GetMyPath(), fmt.Sprintf(config.UpdaterSelf, "_new"))
63-
64-
utils.Logger.LogF(100, "renaming %s to %s", newFilePath, oldFilePath)
65-
err := os.Remove(oldFilePath)
66-
if err != nil {
67-
utils.Logger.LogF(100, "error removing old updater: %v", err)
68-
}
69-
err = os.Rename(newFilePath, oldFilePath)
70-
if err != nil {
71-
utils.Logger.LogF(100, "error renaming updater: %v", err)
25+
utils.Logger.LogF(100, "error uninstalling UTMStackRedline service: %v", err)
26+
} else {
27+
utils.Logger.Info("UTMStackRedline service removed successfully")
7228
}
73-
} else {
74-
utils.Logger.LogF(100, "no old version of agent found")
7529
}
7630
}

agent/serv/service.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package serv
22

33
import (
44
"context"
5+
"fmt"
56
"os"
67
"os/signal"
8+
"path/filepath"
9+
"runtime"
710
"strconv"
811
"syscall"
912

@@ -36,6 +39,9 @@ func (p *program) run() {
3639
utils.Logger.Fatal("error getting config: %v", err)
3740
}
3841

42+
// Ensure updater service is installed
43+
ensureUpdaterServiceInstalled()
44+
3945
CleanOldServices(cnf)
4046

4147
ctx, cancel := context.WithCancel(context.Background())
@@ -60,3 +66,52 @@ func (p *program) run() {
6066
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
6167
<-signals
6268
}
69+
70+
func ensureUpdaterServiceInstalled() {
71+
isInstalled, err := utils.CheckIfServiceIsInstalled("UTMStackUpdater")
72+
if err != nil {
73+
utils.Logger.ErrorF("error checking if updater service is installed: %v", err)
74+
return
75+
}
76+
77+
if isInstalled {
78+
utils.Logger.Info("updater service is already installed")
79+
return
80+
}
81+
82+
utils.Logger.Info("updater service not found, installing...")
83+
84+
updaterPath := filepath.Join(utils.GetMyPath(), fmt.Sprintf(config.UpdaterFile, ""))
85+
86+
if !utils.CheckIfPathExist(updaterPath) {
87+
88+
cnf, err := config.GetCurrentConfig()
89+
if err != nil {
90+
utils.Logger.ErrorF("error getting config to download updater: %v", err)
91+
return
92+
}
93+
94+
updaterBinary := fmt.Sprintf(config.UpdaterFile, "")
95+
if err := utils.DownloadFile(fmt.Sprintf(config.DependUrl, cnf.Server, config.DependenciesPort, updaterBinary), map[string]string{}, updaterBinary, utils.GetMyPath(), cnf.SkipCertValidation); err != nil {
96+
utils.Logger.ErrorF("error downloading updater binary: %v", err)
97+
return
98+
}
99+
100+
if runtime.GOOS == "linux" || runtime.GOOS == "darwin" {
101+
if err := utils.Execute("chmod", utils.GetMyPath(), "755", updaterBinary); err != nil {
102+
utils.Logger.ErrorF("error setting permissions on updater: %v", err)
103+
return
104+
}
105+
}
106+
107+
utils.Logger.Info("updater binary downloaded successfully")
108+
}
109+
110+
err = utils.Execute(updaterPath, utils.GetMyPath(), "install")
111+
if err != nil {
112+
utils.Logger.ErrorF("error installing updater service: %v", err)
113+
return
114+
}
115+
116+
utils.Logger.Info("updater service installed successfully")
117+
}

0 commit comments

Comments
 (0)