mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-09-27 04:36:12 +08:00
102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package app
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"runtime/debug"
|
|
)
|
|
|
|
var (
|
|
Version string
|
|
UserAgent string
|
|
ConfigPath string
|
|
Info = make(map[string]any)
|
|
)
|
|
|
|
const usage = `Usage of go2rtc:
|
|
|
|
-c, --config Path to config file or config string as YAML or JSON, support multiple
|
|
-d, --daemon Run in background
|
|
-v, --version Print version and exit
|
|
`
|
|
|
|
func Init() {
|
|
var config flagConfig
|
|
var daemon bool
|
|
var version bool
|
|
|
|
flag.Var(&config, "config", "")
|
|
flag.Var(&config, "c", "")
|
|
flag.BoolVar(&daemon, "daemon", false, "")
|
|
flag.BoolVar(&daemon, "d", false, "")
|
|
flag.BoolVar(&version, "version", false, "")
|
|
flag.BoolVar(&version, "v", false, "")
|
|
|
|
flag.Usage = func() { fmt.Print(usage) }
|
|
flag.Parse()
|
|
|
|
revision, vcsTime := readRevisionTime()
|
|
|
|
if version {
|
|
fmt.Printf("go2rtc version %s (%s) %s/%s\n", Version, revision, runtime.GOOS, runtime.GOARCH)
|
|
os.Exit(0)
|
|
}
|
|
|
|
if daemon && os.Getppid() != 1 {
|
|
if runtime.GOOS == "windows" {
|
|
fmt.Println("Daemon mode is not supported on Windows")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Re-run the program in background and exit
|
|
cmd := exec.Command(os.Args[0], os.Args[1:]...)
|
|
if err := cmd.Start(); err != nil {
|
|
fmt.Println("Failed to start daemon:", err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("Running in daemon mode with PID:", cmd.Process.Pid)
|
|
os.Exit(0)
|
|
}
|
|
|
|
UserAgent = "go2rtc/" + Version
|
|
|
|
Info["version"] = Version
|
|
Info["revision"] = revision
|
|
|
|
initConfig(config)
|
|
initLogger()
|
|
|
|
platform := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
|
|
Logger.Info().Str("version", Version).Str("platform", platform).Str("revision", revision).Msg("go2rtc")
|
|
Logger.Debug().Str("version", runtime.Version()).Str("vcs.time", vcsTime).Msg("build")
|
|
|
|
if ConfigPath != "" {
|
|
Logger.Info().Str("path", ConfigPath).Msg("config")
|
|
}
|
|
}
|
|
|
|
func readRevisionTime() (revision, vcsTime string) {
|
|
if info, ok := debug.ReadBuildInfo(); ok {
|
|
for _, setting := range info.Settings {
|
|
switch setting.Key {
|
|
case "vcs.revision":
|
|
if len(setting.Value) > 7 {
|
|
revision = setting.Value[:7]
|
|
} else {
|
|
revision = setting.Value
|
|
}
|
|
case "vcs.time":
|
|
vcsTime = setting.Value
|
|
case "vcs.modified":
|
|
if setting.Value == "true" {
|
|
revision = "mod." + revision
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|