diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 103 |
1 files changed, 65 insertions, 38 deletions
@@ -1,21 +1,52 @@ | |||
1 | package main | 1 | package main |
2 | 2 | ||
3 | import ( | 3 | import ( |
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 | ||
17 | func makeServer(cfg *web.ServerConfig) *gin.Engine { | 17 | func 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 | |||
47 | func 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 | ||
39 | func main() { | 83 | func 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 | } |