Skip to content

Commit b579574

Browse files
committed
feat(updater): add updater service installation and update logic
1 parent 2bf8c63 commit b579574

13 files changed

Lines changed: 234 additions & 29 deletions

File tree

agent/config/const.go

Lines changed: 4 additions & 0 deletions
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

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%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"
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%s"
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/service.go

Lines changed: 54 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

@@ -46,6 +49,8 @@ func (p *program) run() {
4649
utils.Logger.ErrorF("error migrating logs table: %v", err)
4750
}
4851

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

agent/updates/dependencies.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ func DownloadFirstDependencies(address string, insecure bool) error {
1616
return fmt.Errorf("error downloading version.json : %v", err)
1717
}
1818

19+
updaterBinary := fmt.Sprintf(config.UpdaterFile, "")
20+
if err := utils.DownloadFile(fmt.Sprintf(config.DependUrl, address, config.DependenciesPort, updaterBinary), map[string]string{}, updaterBinary, utils.GetMyPath(), insecure); err != nil {
21+
return fmt.Errorf("error downloading updater binary %s: %v", updaterBinary, err)
22+
}
23+
24+
if runtime.GOOS == "linux" || runtime.GOOS == "darwin" {
25+
if err := utils.Execute("chmod", utils.GetMyPath(), "755", updaterBinary); err != nil {
26+
return fmt.Errorf("error setting permissions on updater: %v", err)
27+
}
28+
}
29+
1930
dependFiles := config.DependFiles
2031
for _, file := range dependFiles {
2132
if err := utils.DownloadFile(fmt.Sprintf(config.DependUrl, address, config.DependenciesPort, file), map[string]string{}, file, utils.GetMyPath(), insecure); err != nil {
@@ -38,12 +49,6 @@ func handleDependenciesPostDownload(dependencies []string) error {
3849
return fmt.Errorf("error unzipping dependencies: %v", err)
3950
}
4051

41-
if runtime.GOOS == "linux" || runtime.GOOS == "darwin" {
42-
if err := utils.Execute("chmod", utils.GetMyPath(), "-R", "755", fmt.Sprintf(config.UpdaterSelf, "")); err != nil {
43-
return fmt.Errorf("error executing chmod on %s: %v", fmt.Sprintf(config.UpdaterSelf, ""), err)
44-
}
45-
}
46-
4752
if err := os.Remove(filepath.Join(utils.GetMyPath(), file)); err != nil {
4853
return fmt.Errorf("error removing file %s: %v", file, err)
4954
}

0 commit comments

Comments
 (0)