safing-portbase/api/main.go

88 lines
1.7 KiB
Go

package api
import (
"encoding/json"
"errors"
"flag"
"os"
"time"
"github.com/safing/portbase/modules"
)
var (
module *modules.Module
exportEndpoints bool
)
// API Errors.
var (
ErrAuthenticationAlreadySet = errors.New("the authentication function has already been set")
ErrAuthenticationImmutable = errors.New("the authentication function can only be set before the api has started")
)
func init() {
module = modules.Register("api", prep, start, stop, "database", "config")
flag.BoolVar(&exportEndpoints, "export-api-endpoints", false, "export api endpoint registry and exit")
}
func prep() error {
if exportEndpoints {
modules.SetCmdLineOperation(exportEndpointsCmd)
}
if getDefaultListenAddress() == "" {
return errors.New("no default listen address for api available")
}
if err := registerConfig(); err != nil {
return err
}
if err := registerDebugEndpoints(); err != nil {
return err
}
if err := registerConfigEndpoints(); err != nil {
return err
}
if err := registerModulesEndpoints(); err != nil {
return err
}
return registerMetaEndpoints()
}
func start() error {
startServer()
_ = updateAPIKeys(module.Ctx, nil)
err := module.RegisterEventHook("config", "config change", "update API keys", updateAPIKeys)
if err != nil {
return err
}
// start api auth token cleaner
if authFnSet.IsSet() {
module.NewTask("clean api sessions", cleanSessions).Repeat(5 * time.Minute)
}
return registerEndpointBridgeDB()
}
func stop() error {
return stopServer()
}
func exportEndpointsCmd() error {
data, err := json.MarshalIndent(ExportEndpoints(), "", " ")
if err != nil {
return err
}
_, err = os.Stdout.Write(data)
return err
}