package main import ( "log" "os" "github.com/gin-gonic/gin" "github.com/spf13/cobra" "github.com/spf13/viper" "code.crute.me/mcrute/go_ddns_manager/util" "code.crute.me/mcrute/go_ddns_manager/web" "code.crute.me/mcrute/go_ddns_manager/web/controllers" "code.crute.me/mcrute/go_ddns_manager/web/middleware" ) func makeServer(cfg *web.ServerConfig) *gin.Engine { router := gin.Default() router.Use(middleware.ConfigContextMiddleware(cfg)) router.GET("/reflect-ip", controllers.ReflectIP) ddns := router.Group("/dynamic-dns") ddns.Use(middleware.DDNSAuthMiddleware) { ddns.POST("", controllers.UpdateDynamicDNS) } acme := router.Group("/acme") acme.Use(middleware.AcmeAuthMiddleware) { acme.POST("", controllers.CreateAcmeChallenge) acme.DELETE("/:id", controllers.DeleteAcmeChallenge) } return router } func main() { cmd := &cobra.Command{ Use: "dns-manage-service [flags] dns-server-ip-port", Short: "DNS manager service", Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { cfg, err := web.LoadServerConfig( viper.GetString("zones_config"), viper.GetString("auth_config"), args[0], viper.GetString("view_name"), ) if err != nil { log.Println(err) os.Exit(1) } util.GinRun( makeServer(cfg), viper.GetBool("debug"), viper.GetString("listen")) }, } util.WrapViper(cmd, "DNS_MANAGE"). BindString("zones-config", "z", "cfg/zones.conf", "Bind key and zones config file"). BindString("auth-config", "a", "cfg/server_auth.json", "Server auth configuration file"). BindString("view-name", "n", "external", "Name of view to update for ACME and DDNS"). BindString("listen", "l", ":9090", "Listen address and port"). BindBool("debug", "d", false, "Run server in debug mode with debug logs") if err := cmd.Execute(); err != nil { log.Println(err) os.Exit(1) } }