package main import ( "flag" "log/slog" "os" "git.riou.xyz/jriou/coller/internal" "git.riou.xyz/jriou/coller/server" "github.com/prometheus/client_golang/prometheus" ) var ( AppName = "collerd" AppVersion string GoVersion string GitCommit string ) func handleMain() int { var err error config := server.NewConfig() version := flag.Bool("version", false, "Print version and exit") quiet := flag.Bool("quiet", false, "Log errors only") verbose := flag.Bool("verbose", false, "Print more logs") debug := flag.Bool("debug", false, "Print even more logs") configFileName := flag.String("config", "", "Configuration file name") flag.Parse() if *version { internal.ShowVersion(AppName, AppVersion, GitCommit, GoVersion) return internal.RC_OK } var level slog.Level if *debug { level = slog.LevelDebug } if *verbose { level = slog.LevelInfo } if *quiet { level = slog.LevelError } logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level})) if *configFileName != "" { err = internal.ReadConfig(*configFileName, config) if err != nil { slog.Error("cannot parse configuration file", slog.Any("error", err)) return internal.RC_ERROR } logger.Debug("configuration file parsed", slog.Any("file", *configFileName)) } if err = config.Check(); err != nil { logger.Error("invalid configuration", slog.Any("error", err)) return internal.RC_ERROR } db, err := server.NewDatabase(logger, config) if err != nil { slog.Error("could not connect to the database", slog.Any("error", err)) return internal.RC_ERROR } srv, err := server.NewServer(logger, db, config, AppVersion) if err != nil { logger.Error("could not create server", slog.Any("error", err)) return internal.RC_ERROR } srv.SetIDLength(config.IDLength) srv.SetPasswordLength(config.PasswordLength) if config.EnableMetrics { reg := prometheus.NewRegistry() metrics, err := server.NewMetrics(logger, reg, config, db) if err != nil { logger.Error("could not register metrics", slog.Any("error", err)) return internal.RC_ERROR } srv.SetMetrics(metrics) } err = srv.Start() if err != nil { logger.Error("could not start server", slog.Any("error", err)) return internal.RC_ERROR } return internal.RC_OK } func main() { os.Exit(handleMain()) }