Skip to content

Commit 60a116c

Browse files
feat(updates): add host updater engine
1 parent 1e0629b commit 60a116c

5 files changed

Lines changed: 1395 additions & 0 deletions

File tree

server/cmd/fleet-updater/main.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"flag"
6+
"fmt"
7+
"log"
8+
"net/http"
9+
"os"
10+
"os/signal"
11+
"path/filepath"
12+
"syscall"
13+
14+
"github.com/block/proto-fleet/server/internal/updater"
15+
)
16+
17+
var version = "dev"
18+
19+
func main() {
20+
defaultInstallRoot := os.Getenv("PROTO_FLEET_INSTALL_ROOT")
21+
if defaultInstallRoot == "" {
22+
defaultInstallRoot = "/opt/proto-fleet"
23+
}
24+
defaultStateDir := os.Getenv("PROTO_FLEET_UPDATER_STATE_DIR")
25+
if defaultStateDir == "" {
26+
defaultStateDir = "/var/lib/proto-fleet-updater"
27+
}
28+
defaultSocketPath := os.Getenv("PROTO_FLEET_UPDATER_SOCKET_PATH")
29+
if defaultSocketPath == "" {
30+
defaultSocketPath = "/run/proto-fleet-updater/updater.sock"
31+
}
32+
defaultDownloadBase := os.Getenv("PROTO_FLEET_DOWNLOAD_BASE_URL")
33+
if defaultDownloadBase == "" {
34+
defaultDownloadBase = "https://github.com/block/proto-fleet/releases/download"
35+
}
36+
defaultSelfUpdatePath := os.Getenv("PROTO_FLEET_UPDATER_BINARY_PATH")
37+
38+
installRoot := flag.String("install-root", defaultInstallRoot, "Proto Fleet installation root")
39+
stateDir := flag.String("state-dir", defaultStateDir, "Durable updater state directory")
40+
socketPath := flag.String("socket-path", defaultSocketPath, "Unix socket path")
41+
downloadBase := flag.String("download-base-url", defaultDownloadBase, "Official release download base URL")
42+
selfUpdatePath := flag.String("self-update-path", defaultSelfUpdatePath, "Installed updater binary path to atomically refresh")
43+
showVersion := flag.Bool("version", false, "Print version and exit")
44+
flag.Parse()
45+
46+
if *showVersion {
47+
fmt.Println(version)
48+
return
49+
}
50+
absoluteInstallRoot, err := filepath.Abs(*installRoot)
51+
if err != nil {
52+
log.Fatal(err)
53+
}
54+
manager, err := updater.NewManager(updater.Config{
55+
InstallRoot: absoluteInstallRoot,
56+
StateDir: *stateDir,
57+
DownloadBaseURL: *downloadBase,
58+
SelfUpdatePath: *selfUpdatePath,
59+
})
60+
if err != nil {
61+
log.Fatalf("initialize updater: %v", err)
62+
}
63+
server := updater.NewServer(manager)
64+
errs := make(chan error, 1)
65+
go func() {
66+
log.Printf("proto-fleet-updater %s listening on %s", version, *socketPath)
67+
errs <- server.Serve(*socketPath)
68+
}()
69+
70+
signals := make(chan os.Signal, 1)
71+
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
72+
select {
73+
case sig := <-signals:
74+
log.Printf("received %s, shutting down", sig)
75+
if err := server.Shutdown(); err != nil {
76+
log.Printf("shutdown: %v", err)
77+
}
78+
case err := <-errs:
79+
if !errors.Is(err, http.ErrServerClosed) {
80+
log.Fatalf("serve updater API: %v", err)
81+
}
82+
}
83+
}

0 commit comments

Comments
 (0)