summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go103
1 files changed, 65 insertions, 38 deletions
diff --git a/main.go b/main.go
index 5750da1..351633b 100644
--- a/main.go
+++ b/main.go
@@ -1,21 +1,52 @@
1package main 1package main
2 2
3import ( 3import (
4 "log" 4 "encoding/json"
5 "os" 5 "io/ioutil"
6 6
7 "github.com/gin-gonic/gin" 7 "github.com/gin-gonic/gin"
8 "github.com/spf13/cobra"
9 "github.com/spf13/viper"
10 8
11 "code.crute.me/mcrute/go_ddns_manager/util" 9 "code.crute.me/mcrute/frame"
10 "code.crute.me/mcrute/go_ddns_manager/bind"
11 "code.crute.me/mcrute/go_ddns_manager/dns"
12 "code.crute.me/mcrute/go_ddns_manager/web" 12 "code.crute.me/mcrute/go_ddns_manager/web"
13 "code.crute.me/mcrute/go_ddns_manager/web/controllers" 13 "code.crute.me/mcrute/go_ddns_manager/web/controllers"
14 "code.crute.me/mcrute/go_ddns_manager/web/middleware" 14 "code.crute.me/mcrute/go_ddns_manager/web/middleware"
15) 15)
16 16
17func makeServer(cfg *web.ServerConfig) *gin.Engine { 17func loadConfig(app *frame.WebApp, args []string) (interface{}, error) {
18 router := gin.Default() 18 zonesFile := app.GetStringArgument("zones_config")
19 secretsFile := app.GetStringArgument("auth_config")
20 server := args[0]
21 view := app.GetStringArgument("view_name")
22
23 scfg := &web.ServerConfig{
24 DNSClient: &dns.DNSClient{Server: server},
25 AcmeView: view,
26 DynamicDnsView: view,
27 }
28
29 cfg, err := bind.ParseBINDConfig(zonesFile)
30 if err != nil {
31 return nil, err
32 }
33 scfg.BindConfig = cfg
34
35 fd, err := ioutil.ReadFile(secretsFile)
36 if err != nil {
37 return nil, err
38 }
39
40 if err = json.Unmarshal(fd, scfg); err != nil {
41 return nil, err
42 }
43
44 return scfg, nil
45}
46
47func prepareServer(c interface{}, router *gin.Engine) error {
48 cfg := c.(*web.ServerConfig)
49
19 router.Use(middleware.ConfigContextMiddleware(cfg)) 50 router.Use(middleware.ConfigContextMiddleware(cfg))
20 51
21 router.GET("/reflect-ip", controllers.ReflectIP) 52 router.GET("/reflect-ip", controllers.ReflectIP)
@@ -33,42 +64,38 @@ func makeServer(cfg *web.ServerConfig) *gin.Engine {
33 acme.DELETE("/:id", controllers.DeleteAcmeChallenge) 64 acme.DELETE("/:id", controllers.DeleteAcmeChallenge)
34 } 65 }
35 66
36 return router 67 manage := router.Group("/manage")
68 manage.Use(middleware.ApiAuthMiddleware)
69 {
70 manage.GET("", controllers.ManageRoot)
71
72 views := manage.Group("/views")
73 {
74 views.GET("", controllers.ListViews)
75 views.GET("/:view", controllers.ListView)
76 views.GET("/:view/:zone", controllers.ListZone)
77 }
78 }
79
80 return nil
37} 81}
38 82
39func main() { 83func main() {
40 cmd := &cobra.Command{ 84 app := &frame.WebApp{
41 Use: "dns-manage-service [flags] dns-server-ip-port", 85 Name: "dns-manage-service",
42 Short: "DNS manager service", 86 Usage: "dns-manage-service [flags] dns-server-ip-port",
43 Args: cobra.MinimumNArgs(1), 87 Help: "DNS manager service",
44 Run: func(cmd *cobra.Command, args []string) { 88 MinArgCount: 1,
45 cfg, err := web.LoadServerConfig( 89 Arguments: []frame.Argument{
46 viper.GetString("zones_config"), 90 &frame.StringArgument{"zones-config", "z", "cfg/zones.conf", "Bind key and zones config file"},
47 viper.GetString("auth_config"), 91 &frame.StringArgument{"auth-config", "a", "cfg/server_auth.json", "Server auth configuration file"},
48 args[0], 92 &frame.StringArgument{"view-name", "n", "external", "Name of view to update for ACME and DDNS"},
49 viper.GetString("view_name"),
50 )
51 if err != nil {
52 log.Println(err)
53 os.Exit(1)
54 }
55
56 util.GinRun(
57 makeServer(cfg),
58 viper.GetBool("debug"),
59 viper.GetString("listen"))
60 }, 93 },
94 LoadConfig: loadConfig,
95 PrepareServer: prepareServer,
61 } 96 }
62 97
63 util.WrapViper(cmd, "DNS_MANAGE"). 98 if err := app.RunForever(); err != nil {
64 BindString("zones-config", "z", "cfg/zones.conf", "Bind key and zones config file"). 99 panic(err)
65 BindString("auth-config", "a", "cfg/server_auth.json", "Server auth configuration file").
66 BindString("view-name", "n", "external", "Name of view to update for ACME and DDNS").
67 BindString("listen", "l", ":9090", "Listen address and port").
68 BindBool("debug", "d", false, "Run server in debug mode with debug logs")
69
70 if err := cmd.Execute(); err != nil {
71 log.Println(err)
72 os.Exit(1)
73 } 100 }
74} 101}