Files
keikos.work/main.go

160 lines
3.6 KiB
Go

package main
import (
"context"
"flag"
"log"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"keikos.work/app"
"keikos.work/assets"
)
var (
port uint = 8080
dev bool = false
webFlags *flag.FlagSet = nil
adminFlags *flag.FlagSet = nil
minioAccessKeyID = os.Getenv("AWS_ACCESS_KEY_ID")
minioSecretAccessKey = os.Getenv("AWS_SECRET_ACCESS_KEY")
minioEndpoint = os.Getenv("AWS_ENDPOINT_URL")
minioSSL = false
)
func init() {
webFlags = flag.NewFlagSet("web", flag.ExitOnError)
webFlags.UintVar(&port, "port", 8080, "The port to be used")
webFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
webFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
webFlags.StringVar(
&minioSecretAccessKey,
"aws-access-key-secret",
os.Getenv("AWS_SECRET_ACCESS_KEY"),
"",
)
webFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
webFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
}
func init() {
adminFlags = flag.NewFlagSet("admin", flag.ExitOnError)
adminFlags.UintVar(&port, "port", 8080, "The port to be used")
adminFlags.BoolVar(&dev, "dev", false, "Run the server in development mode")
adminFlags.StringVar(&minioAccessKeyID, "aws-access-key-id", os.Getenv("AWS_ACCESS_KEY_ID"), "")
adminFlags.StringVar(
&minioSecretAccessKey,
"aws-access-key-secret",
os.Getenv("AWS_SECRET_ACCESS_KEY"),
"",
)
adminFlags.StringVar(&minioEndpoint, "aws-enpoint", os.Getenv("AWS_ENDPOINT_URL"), "")
adminFlags.BoolVar(&minioSSL, "aws-ssl", false, "")
}
func main() {
if len(os.Args) < 2 {
log.Fatalf("Expected 'web' or 'admin' subcommands")
}
/* s3, err := minio.New(minioEndpoint, &minio.Options{
Creds: credentials.NewStaticV4(minioAccessKeyID, minioSecretAccessKey, ""),
Secure: minioSSL,
})
if err != nil {
panic(err)
} */
var a app.App
var l *slog.Logger
switch os.Args[1] {
case "web":
webFlags.Parse(os.Args[2:])
var level slog.Leveler
if dev {
level = slog.LevelDebug
} else {
level = slog.LevelInfo
}
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
var assetsHandler http.Handler
if dev {
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
} else {
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
}
a = app.NewWeb(app.Options{
Port: port,
Development: dev,
Log: l,
S3: nil,
Assets: assetsHandler,
})
case "admin":
adminFlags.Parse(os.Args[2:])
var level slog.Leveler
if dev {
level = slog.LevelDebug
} else {
level = slog.LevelInfo
}
l = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
var assetsHandler http.Handler
if dev {
assetsHandler = http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets")))
} else {
assetsHandler = http.StripPrefix("/assets/", http.FileServerFS(assets.ASSETS))
}
a = app.NewAdmin(app.Options{
Port: port,
Development: dev,
Log: l,
S3: nil,
Assets: assetsHandler,
})
default:
log.Fatalf("Command %q is not available", os.Args[1])
}
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
if dev {
l.Info("RUNNING IN DEVELOPMENT MODE")
}
go func() {
if err := a.Start(); err != nil {
l.Error("Failed to start server", slog.String("error", err.Error()))
}
}()
<-ctx.Done()
l.Info("Shutting down")
if err := a.Stop(); err != nil {
l.Error("Failed to shut down", slog.String("error", err.Error()))
}
l.Info("FINAL")
}