package main import ( "net/http" "os" "time" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log/zap" bindv1alpha1 "git.unkin.net/unkin/bind-operator/api/v1alpha1" "git.unkin.net/unkin/bind-operator/internal/tsigapi" ) var scheme = runtime.NewScheme() func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(bindv1alpha1.AddToScheme(scheme)) } func main() { ctrl.SetLogger(zap.New(zap.UseDevMode(false))) logger := ctrl.Log.WithName("tsig-api") addr := envOr("LISTEN_ADDR", ":8443") namespace := envOr("TARGET_NAMESPACE", currentNamespace()) token := os.Getenv("API_TOKEN") c, err := client.New(ctrl.GetConfigOrDie(), client.Options{Scheme: scheme}) if err != nil { logger.Error(err, "unable to build kubernetes client") os.Exit(1) } srv := &tsigapi.Server{ Client: c, Namespace: namespace, Token: token, Log: logger, WaitTimeout: 15 * time.Second, } httpSrv := &http.Server{ Addr: addr, Handler: srv.Handler(), ReadHeaderTimeout: 10 * time.Second, } logger.Info("starting tsig api", "addr", addr, "namespace", namespace) if err := httpSrv.ListenAndServe(); err != nil { logger.Error(err, "tsig api exited") os.Exit(1) } } func envOr(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func currentNamespace() string { if b, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil { return string(b) } return "bind-system" }