package main import ( "flag" "log/slog" "os" "github.com/prometheus/client_golang/prometheus" "git.riou.xyz/jriou/coller/internal" "git.riou.xyz/jriou/coller/server" ) 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") jsonFormat := flag.Bool("json", false, "Print logs in JSON format") 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 } var logger *slog.Logger if *jsonFormat { logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: level})) } else { logger = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level})) } if *configFileName != "" { err = internal.ReadConfig(*configFileName, config) if err != nil { return internal.ReturnError(logger, "could not parse configuration file", err) } logger.Debug("configuration file parsed", slog.Any("file", *configFileName)) } if err = config.Check(); err != nil { return internal.ReturnError(logger, "invalid configuration", err) } db, err := server.NewDatabase(logger, config) if err != nil { return internal.ReturnError(logger, "could not connect to the database", err) } srv, err := server.NewServer(logger, db, config, AppVersion) if err != nil { return internal.ReturnError(logger, "could not create server", err) } srv.SetEncryptionKeyLength(config.EncryptionKeyLength) if config.EnableMetrics { reg := prometheus.NewRegistry() metrics, err := server.NewMetrics(logger, reg, config, db) if err != nil { return internal.ReturnError(logger, "could not register metrics", err) } srv.SetMetrics(metrics) } err = srv.Start() if err != nil { return internal.ReturnError(logger, "could not start server", err) } return internal.RC_OK } func main() { os.Exit(handleMain()) }