Skip to content
Snippets Groups Projects
Commit 25683705 authored by ale's avatar ale
Browse files

Add state load/dump logic to the main server binary

The server will attempt to load state on startup, and it will dump
state on (graceful) shutdown.
parent 38d0d11c
No related branches found
No related tags found
1 merge request!35Add state load/dump logic to the main server binary
Pipeline #45278 passed
......@@ -28,6 +28,7 @@ var (
// server config in a single object for YAML deserialization.
type Config struct {
server.Config `yaml:",inline"`
StateFile string `yaml:"state_file"`
ServerConfig *serverutil.ServerConfig `yaml:"http_server"`
}
......@@ -45,6 +46,39 @@ func loadConfig() (*Config, error) {
return &config, nil
}
func loadState(ks *server.KeyStore, path string) error {
f, err := os.Open(path)
if err != nil {
if os.IsNotExist(err) {
return nil
}
return err
}
defer f.Close()
log.Printf("loading state from %s", path)
if err := ks.Load(f); err != nil {
return err
}
if err := os.Remove(path); err != nil {
// Non-fatal error.
log.Printf("error removing state file: %v", err)
}
return nil
}
func dumpState(ks *server.KeyStore, path string) error {
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
return err
}
defer f.Close()
log.Printf("dumping state to %s", path)
return ks.Dump(f)
}
func main() {
log.SetFlags(0)
flag.Parse()
......@@ -60,9 +94,21 @@ func main() {
}
prometheus.MustRegister(server.NewKeystoreCollector(ks))
if config.StateFile != "" {
if err := loadState(ks, config.StateFile); err != nil {
log.Printf("error loading state: %v", err)
}
}
srv := server.NewServer(ks)
if err := serverutil.Serve(srv, config.ServerConfig, *addr); err != nil {
log.Fatal(err)
}
if config.StateFile != "" {
if err := dumpState(ks, config.StateFile); err != nil {
log.Fatalf("error dumping state: %v", err)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment