Skip to content

Commit e0999c8

Browse files
authored
Merge pull request #9 from flatrun/chore/updater
feat(agent): add self-update command
2 parents 6a701d8 + 92d01b7 commit e0999c8

File tree

2 files changed

+409
-6
lines changed

2 files changed

+409
-6
lines changed

cmd/agent/main.go

Lines changed: 102 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,29 @@ import (
1111
"github.com/flatrun/agent/internal/api"
1212
"github.com/flatrun/agent/internal/watcher"
1313
"github.com/flatrun/agent/pkg/config"
14+
"github.com/flatrun/agent/pkg/updater"
1415
"github.com/flatrun/agent/pkg/version"
1516
)
1617

1718
func main() {
19+
if len(os.Args) > 1 {
20+
switch os.Args[1] {
21+
case "update":
22+
handleUpdate(os.Args[2:])
23+
return
24+
case "version":
25+
printVersion()
26+
return
27+
}
28+
}
29+
1830
configPath := flag.String("config", "config.yml", "Path to configuration file")
1931
showVersion := flag.Bool("version", false, "Print version information")
2032
flag.Parse()
2133

2234
if *showVersion {
23-
info := version.Get()
24-
fmt.Printf("Flatrun Agent\n")
25-
fmt.Printf("Version: %s\n", info.Version)
26-
fmt.Printf("Build Time: %s\n", info.BuildTime)
27-
fmt.Printf("Git Commit: %s\n", info.GitCommit)
28-
os.Exit(0)
35+
printVersion()
36+
return
2937
}
3038

3139
cfg, err := config.Load(*configPath)
@@ -59,3 +67,91 @@ func main() {
5967
log.Println("Shutting down Flatrun Agent...")
6068
_ = apiServer.Stop()
6169
}
70+
71+
func printVersion() {
72+
info := version.Get()
73+
fmt.Printf("Flatrun Agent\n")
74+
fmt.Printf("Version: %s\n", info.Version)
75+
fmt.Printf("Build Time: %s\n", info.BuildTime)
76+
fmt.Printf("Git Commit: %s\n", info.GitCommit)
77+
}
78+
79+
func handleUpdate(args []string) {
80+
updateFlags := flag.NewFlagSet("update", flag.ExitOnError)
81+
checkOnly := updateFlags.Bool("check", false, "Check for updates without installing")
82+
force := updateFlags.Bool("force", false, "Force update even if on latest version")
83+
restart := updateFlags.Bool("restart", false, "Restart service after update")
84+
rollback := updateFlags.Bool("rollback", false, "Rollback to previous version")
85+
86+
updateFlags.Usage = func() {
87+
fmt.Println("Usage: flatrun-agent update [options]")
88+
fmt.Println()
89+
fmt.Println("Options:")
90+
updateFlags.PrintDefaults()
91+
fmt.Println()
92+
fmt.Println("Examples:")
93+
fmt.Println(" flatrun-agent update --check Check for available updates")
94+
fmt.Println(" flatrun-agent update Download and install latest version")
95+
fmt.Println(" flatrun-agent update --restart Update and restart the service")
96+
fmt.Println(" flatrun-agent update --rollback Rollback to previous version")
97+
}
98+
99+
if err := updateFlags.Parse(args); err != nil {
100+
os.Exit(1)
101+
}
102+
103+
if *rollback {
104+
fmt.Println("Rolling back to previous version...")
105+
if err := updater.Rollback(); err != nil {
106+
fmt.Printf("Error: %v\n", err)
107+
os.Exit(1)
108+
}
109+
fmt.Println("Rollback successful")
110+
fmt.Println("Restart the service to apply: sudo systemctl restart flatrun-agent")
111+
return
112+
}
113+
114+
if *checkOnly {
115+
result, err := updater.CheckForUpdate()
116+
if err != nil {
117+
fmt.Printf("Error: %v\n", err)
118+
os.Exit(1)
119+
}
120+
fmt.Printf("Current version: %s\n", result.CurrentVersion)
121+
fmt.Printf("Latest version: %s\n", result.LatestVersion)
122+
if result.UpdateAvailable {
123+
fmt.Println("Update available!")
124+
fmt.Println("Run 'flatrun-agent update' to install")
125+
} else {
126+
fmt.Println("Already up to date")
127+
}
128+
return
129+
}
130+
131+
result, err := updater.Update(*force)
132+
if err != nil {
133+
fmt.Printf("Error: %v\n", err)
134+
os.Exit(1)
135+
}
136+
137+
if !result.UpdateAvailable && !*force {
138+
fmt.Printf("Already up to date (v%s)\n", result.CurrentVersion)
139+
return
140+
}
141+
142+
if result.Installed {
143+
fmt.Printf("Successfully updated to v%s\n", result.LatestVersion)
144+
145+
if *restart {
146+
fmt.Println("Restarting service...")
147+
if err := updater.RestartService(); err != nil {
148+
fmt.Printf("Failed to restart service: %v\n", err)
149+
fmt.Println("Please restart manually: sudo systemctl restart flatrun-agent")
150+
os.Exit(1)
151+
}
152+
fmt.Println("Service restarted successfully")
153+
} else {
154+
fmt.Println("Restart the service to apply: sudo systemctl restart flatrun-agent")
155+
}
156+
}
157+
}

0 commit comments

Comments
 (0)