Files
codapi/cmd/main.go
2023-11-25 04:02:45 +05:00

65 lines
1.4 KiB
Go

// Codapi safely executes code snippets using sandboxes.
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"github.com/nalgeon/codapi/config"
"github.com/nalgeon/codapi/logx"
"github.com/nalgeon/codapi/sandbox"
"github.com/nalgeon/codapi/server"
)
var Version string = "main"
// startServer starts the HTTP API sandbox server.
func startServer(port int) *server.Server {
logx.Log("codapi %s", Version)
logx.Log("listening on port %d...", port)
router := server.NewRouter()
srv := server.NewServer(port, router)
srv.Start()
return srv
}
// listenSignals listens for termination signals
// and performs graceful shutdown.
func listenSignals(srv *server.Server) {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs
logx.Log("stopping...")
err := srv.Stop()
if err != nil {
logx.Log("failed to stop: %v", err)
}
}
func main() {
port := flag.Int("port", 1313, "server port")
flag.Parse()
cfg, err := config.Read("config.json", "boxes.json", "commands.json")
if err != nil {
logx.Log("missing config file")
os.Exit(1)
}
err = sandbox.ApplyConfig(cfg)
if err != nil {
logx.Log("invalid config: %v", err)
os.Exit(1)
}
srv := startServer(*port)
logx.Verbose = cfg.Verbose
logx.Log("workers: %d", cfg.PoolSize)
logx.Log("boxes: %v", cfg.BoxNames())
logx.Log("commands: %v", cfg.CommandNames())
listenSignals(srv)
}