Files
triggerssmith/cmd/reload.go

71 lines
1.6 KiB
Go

package cmd
import (
"io/ioutil"
"log/slog"
"os"
"strconv"
"strings"
"syscall"
"git.oblat.lv/alex/triggerssmith/internal/vars"
"github.com/spf13/cobra"
)
var optsReloadCmd = struct {
Debug *bool
PID *int
}{}
func readPID(path string) (int, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return 0, err
}
s := strings.TrimSpace(string(data))
pid, err := strconv.Atoi(s)
if err != nil {
return 0, err
}
return pid, nil
}
var reloadCmd = &cobra.Command{
Use: "reload",
Short: "Reload active server by PID using SIGHUP",
Run: func(cmd *cobra.Command, args []string) {
defer func() {
if r := recover(); r != nil {
slog.Error("Application panicked", slog.Any("error", r))
}
}()
// configure logger
if *optsReloadCmd.Debug {
slog.SetDefault(slog.New(slog.NewTextHandler(cmd.OutOrStdout(), &slog.HandlerOptions{Level: slog.LevelDebug, AddSource: true})))
} else {
slog.SetDefault(slog.New(slog.NewTextHandler(cmd.OutOrStdout(), &slog.HandlerOptions{Level: slog.LevelInfo})))
}
pid, err := readPID(vars.PID_PATH)
if err != nil {
panic(err)
}
*optsReloadCmd.PID = pid
slog.Debug("restarting server", slog.Int("pid", *optsReloadCmd.PID))
proc, err := os.FindProcess(*optsReloadCmd.PID)
if err != nil {
slog.Error("failed to find process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error()))
}
proc.Signal(syscall.SIGHUP)
slog.Debug("done")
},
}
func init() {
optsReloadCmd.Debug = reloadCmd.Flags().BoolP("debug", "d", false, "Enable debug logs")
optsReloadCmd.PID = reloadCmd.Flags().IntP("pid", "p", -1, "Define server PID")
rootCmd.AddCommand(reloadCmd)
}