GoBroke/cmd/gobroke/main.go

107 lines
2.8 KiB
Go
Raw Normal View History

2025-02-04 12:14:08 -05:00
package main
import (
`errors`
`fmt`
`log`
`os`
`github.com/davecgh/go-spew/spew`
`github.com/jessevdk/go-flags`
`r00t2.io/gobroke/conf`
`r00t2.io/gobroke/daemon`
`r00t2.io/gobroke/runner`
`r00t2.io/gobroke/version`
`r00t2.io/goutils/logging`
)
func main() {
var err error
var args *Args = new(Args)
var logger *logging.MultiLogger
var cfg *conf.Config
var logFlagsRuntime int = logFlags
var singleResults []*runner.TunnelResult
var tunsChanged bool
var tunsUpdated bool
var updater *daemon.Updater
var flagsErr *flags.Error = new(flags.Error)
var parser *flags.Parser = flags.NewParser(args, flags.Default)
if _, err = parser.Parse(); err != nil {
switch {
case errors.As(err, &flagsErr):
switch {
case errors.Is(flagsErr.Type, flags.ErrHelp), errors.Is(flagsErr.Type, flags.ErrCommandRequired), errors.Is(flagsErr.Type, flags.ErrRequired): // These print their relevant messages by themselves.
return
default:
log.Panicln(err)
}
default:
log.Panicln(err)
}
}
if version.Ver, err = version.Version(); err != nil {
log.Panicln(err)
}
// If args.Version or args.DetailVersion are true, just print them and exit.
if args.DetailVersion || args.Version {
if args.Version {
fmt.Println(version.Ver.Short())
return
} else if args.DetailVersion {
fmt.Println(version.Ver.Detail())
return
}
}
// We want to set up logging before anything else.
if args.DoDebug {
logFlagsRuntime = logFlagsDebug
}
logger = logging.GetMultiLogger(args.DoDebug, "GoBroke")
if err = getOsLogger(logger, logFlagsRuntime); err != nil {
log.Panicln(err)
}
if err = logger.Setup(); err != nil {
log.Panicln(err)
}
logger.Info("main: GoBroke version %v", version.Ver.Short())
logger.Debug("main: GoBroke version (extended):\n%v", version.Ver.Detail())
defer logger.Shutdown()
logger.Debug("Initialized with args:\n%v", spew.Sdump(args))
if cfg, err = conf.NewConfig(args.ConfigPath, args.DoDebug, logger); err != nil {
logger.Err("main: Received error while initializing config: %v", err)
log.Panicln(err)
}
if singleResults, tunsChanged, tunsUpdated, err = runner.Run(cfg, logger); err != nil {
logger.Err("main: Received error while running startup checks/updates: %v", err)
log.Panicln(err)
}
logger.Info("main: Startup check: Changed: %v, Updated: %v", tunsChanged, tunsUpdated)
logger.Debug("main: Startup check: Tunnel results:\n%s", spew.Sdump(singleResults))
if !args.Daemon {
// Single run.
logger.Debug("main: Done.")
os.Exit(0)
}
if updater, err = daemon.NewUpdater(cfg, logger); err != nil {
logger.Err("main: Received error while initializing persistent updater: %v", err)
log.Panicln(err)
}
if err = updater.Start(); err != nil {
logger.Err("main: Received error while starting/running persistent updater: %v", err)
log.Panicln(err)
}
logger.Debug("main: Done.")
}