feat: restart to apply update, privileged helper, rollback
This commit is contained in:
1 parent
70460e4170
commit
54e8fd5fed
63 files changed
+8635
-164
No files matched your search
@@ -0,0 +1,90 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"RenewCMS/api"
|
||||
"RenewCMS/internal/domain/update"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
)
|
||||
|
||||
const (
|
||||
enableCommand = "enable-browser-updates"
|
||||
disableCommand = "disable-browser-updates"
|
||||
applyCommand = "apply-update"
|
||||
|
||||
exitOK = 0
|
||||
exitError = 1
|
||||
exitUsage = 2
|
||||
|
||||
usageText = "usage: renewcms [--version]\n" +
|
||||
" renewcms enable-browser-updates [--service NAME] [--binary PATH] [--data-dir DIR] [--port PORT]\n" +
|
||||
" renewcms disable-browser-updates [--service NAME] [--data-dir DIR]\n" +
|
||||
" renewcms apply-update --binary PATH --data-dir DIR [--service NAME] [--port PORT]"
|
||||
|
||||
applyNeedsFlagsMessage = "apply-update needs --binary and --data-dir."
|
||||
)
|
||||
|
||||
func runCommand(args []string, stdout io.Writer, stderr io.Writer) int {
|
||||
name, rest := args[0], args[1:]
|
||||
switch name {
|
||||
case enableCommand:
|
||||
return withOptions(name, rest, stderr, func(options update.InstallOptions) int {
|
||||
message, err := api.InitBrowserUpdateCommands().Enable.Enable(options)
|
||||
return printOutcome(stdout, stderr, message, err)
|
||||
})
|
||||
case disableCommand:
|
||||
return withOptions(name, rest, stderr, func(options update.InstallOptions) int {
|
||||
message, err := api.InitBrowserUpdateCommands().Disable.Disable(options)
|
||||
return printOutcome(stdout, stderr, message, err)
|
||||
})
|
||||
case applyCommand:
|
||||
return withOptions(name, rest, stderr, func(options update.InstallOptions) int {
|
||||
return apply(options, stderr)
|
||||
})
|
||||
}
|
||||
fmt.Fprintln(stderr, usageText)
|
||||
return exitUsage
|
||||
}
|
||||
|
||||
func withOptions(name string, args []string, stderr io.Writer, run func(update.InstallOptions) int) int {
|
||||
flags := flag.NewFlagSet(name, flag.ContinueOnError)
|
||||
flags.SetOutput(stderr)
|
||||
var options update.InstallOptions
|
||||
flags.StringVar(&options.Service, "service", "", "systemd service name of RenewCMS")
|
||||
flags.StringVar(&options.Binary, "binary", "", "path of the RenewCMS binary")
|
||||
flags.StringVar(&options.DataDir, "data-dir", "", "directory that holds DB_FILE")
|
||||
flags.StringVar(&options.Port, "port", "", "port RenewCMS listens on")
|
||||
if err := flags.Parse(args); err != nil {
|
||||
return exitUsage
|
||||
}
|
||||
return run(options)
|
||||
}
|
||||
|
||||
func printOutcome(stdout io.Writer, stderr io.Writer, message string, err error) int {
|
||||
if err != nil {
|
||||
fmt.Fprintln(stderr, err)
|
||||
return exitError
|
||||
}
|
||||
fmt.Fprintln(stdout, message)
|
||||
return exitOK
|
||||
}
|
||||
|
||||
func apply(options update.InstallOptions, stderr io.Writer) int {
|
||||
if options.Binary == "" || options.DataDir == "" {
|
||||
fmt.Fprintln(stderr, applyNeedsFlagsMessage)
|
||||
return exitUsage
|
||||
}
|
||||
if options.Service == "" {
|
||||
options.Service = update.DefaultService
|
||||
}
|
||||
if options.Port == "" {
|
||||
options.Port = update.DefaultPort
|
||||
}
|
||||
if err := api.InitApplyUpdateCommand(options).Apply(); err != nil {
|
||||
log.Printf("apply-update failed: %v", err)
|
||||
return exitError
|
||||
}
|
||||
return exitOK
|
||||
}
|
||||
+17
-5
@@ -8,6 +8,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
@@ -57,6 +58,9 @@ func main() {
|
||||
fmt.Println(version)
|
||||
return
|
||||
}
|
||||
if len(os.Args) > 1 {
|
||||
os.Exit(runCommand(os.Args[1:], os.Stdout, os.Stderr))
|
||||
}
|
||||
if err := run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -76,7 +80,7 @@ func run() error {
|
||||
validator.InitValidator()
|
||||
|
||||
server := newServer(api.InitRoutes(container, settings), settings)
|
||||
return serveUntilStopped(server, settings)
|
||||
return serveUntilStopped(server, settings, container.RecordRunningInfoUseCase.Record)
|
||||
}
|
||||
|
||||
func initEnvVariables() {
|
||||
@@ -127,12 +131,12 @@ func newServer(handler http.Handler, settings config.Settings) *http.Server {
|
||||
}
|
||||
}
|
||||
|
||||
func serveUntilStopped(server *http.Server, settings config.Settings) error {
|
||||
func serveUntilStopped(server *http.Server, settings config.Settings, recordRunning func() error) error {
|
||||
stopSignal, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
serverErr := make(chan error, 1)
|
||||
go listen(server, serverErr, settings)
|
||||
go listen(server, serverErr, settings, recordRunning)
|
||||
|
||||
select {
|
||||
case err := <-serverErr:
|
||||
@@ -142,9 +146,17 @@ func serveUntilStopped(server *http.Server, settings config.Settings) error {
|
||||
}
|
||||
}
|
||||
|
||||
func listen(server *http.Server, serverErr chan<- error, settings config.Settings) {
|
||||
func listen(server *http.Server, serverErr chan<- error, settings config.Settings, recordRunning func() error) {
|
||||
listener, err := net.Listen("tcp", server.Addr)
|
||||
if err != nil {
|
||||
serverErr <- err
|
||||
return
|
||||
}
|
||||
if err := recordRunning(); err != nil {
|
||||
log.Printf("WARNING: could not write the running-version file: %v", err)
|
||||
}
|
||||
log.Printf("RenewCMS %s (%s) listening on %s, public URL %s", version, settings.Environment, server.Addr, settings.PublicURL)
|
||||
err := server.ListenAndServe()
|
||||
err = server.Serve(listener)
|
||||
if errors.Is(err, http.ErrServerClosed) {
|
||||
err = nil
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user