83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
//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)
|
|
}
|
|
}
|