2026-08-10 10:03:46 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2026-08-10 11:35:48 +08:00
|
|
|
"flag"
|
2026-08-10 11:42:45 +08:00
|
|
|
"fmt"
|
2026-08-10 10:03:46 +08:00
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
2026-08-10 11:42:45 +08:00
|
|
|
"regexp"
|
2026-08-10 11:35:48 +08:00
|
|
|
"strings"
|
2026-08-10 10:03:46 +08:00
|
|
|
"syscall"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"bsm/full/all/internal/config"
|
|
|
|
|
"bsm/full/all/internal/impl"
|
|
|
|
|
allserver "bsm/full/all/internal/server"
|
2026-08-10 11:16:02 +08:00
|
|
|
"bsm/full/all/internal/service"
|
2026-08-10 10:03:46 +08:00
|
|
|
)
|
|
|
|
|
|
2026-08-10 11:35:48 +08:00
|
|
|
var ServiceKey = "default"
|
|
|
|
|
|
2026-08-10 11:42:45 +08:00
|
|
|
var workspacePattern = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$`)
|
|
|
|
|
|
|
|
|
|
func normalizeWorkspace(value string) (string, error) {
|
|
|
|
|
value = strings.ToLower(strings.TrimSpace(value))
|
|
|
|
|
if !workspacePattern.MatchString(value) {
|
|
|
|
|
return "", fmt.Errorf("workspace must match %s", workspacePattern.String())
|
|
|
|
|
}
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-10 10:03:46 +08:00
|
|
|
func main() {
|
2026-08-10 11:35:48 +08:00
|
|
|
workspace := flag.String("workspace", ServiceKey, "workspace used to select etc/{workspace}_{runtime}.yaml")
|
|
|
|
|
flag.Parse()
|
2026-08-10 11:42:45 +08:00
|
|
|
value, err := normalizeWorkspace(*workspace)
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
2026-08-10 11:35:48 +08:00
|
|
|
}
|
2026-08-10 11:42:45 +08:00
|
|
|
ServiceKey = value
|
2026-08-10 11:35:48 +08:00
|
|
|
|
|
|
|
|
config.New(ServiceKey)
|
2026-08-10 10:03:46 +08:00
|
|
|
impl.NewImpl()
|
|
|
|
|
|
2026-08-10 11:16:02 +08:00
|
|
|
srv := allserver.New()
|
|
|
|
|
if err := service.Expose(srv); err != nil {
|
|
|
|
|
panic(err)
|
2026-08-10 10:03:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stop := make(chan os.Signal, 1)
|
|
|
|
|
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
|
go func() {
|
|
|
|
|
<-stop
|
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
|
|
defer cancel()
|
|
|
|
|
_ = srv.Stop(ctx)
|
|
|
|
|
}()
|
2026-08-10 11:16:02 +08:00
|
|
|
|
2026-08-10 10:03:46 +08:00
|
|
|
if err := srv.Start(config.Spec.Addr); err != nil && err != http.ErrServerClosed {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
}
|