//go:build !windows package main import ( "crypto/rsa" "flag" "fmt" "log" "opensavecloudserver/config" "opensavecloudserver/config/security" "opensavecloudserver/constant" "opensavecloudserver/data/datasource/pgsql" "opensavecloudserver/data/datasource/pgsql/models/game" "opensavecloudserver/data/datasource/pgsql/models/user" "opensavecloudserver/server" "opensavecloudserver/server/authentication/impl" "os" "runtime" ) func main() { fmt.Printf("Open Save Cloud (Server) v%s %s/%s\n", constant.Version, runtime.GOOS, runtime.GOARCH) defer func() { if err := recover(); err != nil { _, err := fmt.Fprintln(os.Stderr, "the server has encountered an error and must stop: ", err) if err != nil { return } os.Exit(1) } }() if err := initLogger(); err != nil { panic(err) } path := flag.String("config", "./config.yml", "Set the configuration file path") generateRSAKey := flag.Bool("new-rsa-key", false, "Generate a new RSA key. This key will be written to the rsa_key path set in the configuration file") flag.Parse() appConfiguration, err := config.Load(*path) if err != nil { log.Fatal(err) } var pk *rsa.PrivateKey if *generateRSAKey { pk, err = security.GenerateNewRSAKey(appConfiguration.Path.RSAKey, 2048) if err != nil { panic(err) } } else { pk, err = security.LoadPrivateKey(appConfiguration.Path.RSAKey) if err != nil { panic(err) } } dao := pgsql.NewDatabaseDatasource() err = dao.Connect(appConfiguration.Database.URL) if err != nil { log.Fatal("failed to connect to the datasource: ", err) } userRepo := user.NewUserDatasource(dao) jwtAuthenticator, err := impl.NewJWTAuthenticator(pk, userRepo) if err != nil { log.Fatal(err) } deps := server.DatasourceDependencies{ UserRepository: userRepo, GameRepository: game.NewGameDatasource(dao), Authenticator: jwtAuthenticator, } appServer := server.NewServer(appConfiguration, deps) log.Println("the server is up and ready to listen on", appServer.Server.Addr) err = appServer.Server.ListenAndServe() if err != nil { log.Fatal(err) } }