|
| 1 | +package server |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | + "github.com/DarthPestilane/aliddns/app" |
| 6 | + "github.com/DarthPestilane/aliddns/app/dns" |
| 7 | + "github.com/DarthPestilane/aliddns/app/helper" |
| 8 | + jsoniter "github.com/json-iterator/go" |
| 9 | + "github.com/urfave/cli" |
| 10 | + "net/http" |
| 11 | +) |
| 12 | + |
| 13 | +func handler(ctx *cli.Context) { |
| 14 | + port := ctx.Int("port") |
| 15 | + app.Log().Infof("listening at port %d", port) |
| 16 | + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { |
| 17 | + // query strings |
| 18 | + query := r.URL.Query() |
| 19 | + |
| 20 | + // domain name |
| 21 | + domainName := query.Get("domain_name") |
| 22 | + if domainName == "" { |
| 23 | + responseFail(w, 422, "domain_name is required") |
| 24 | + return |
| 25 | + } |
| 26 | + |
| 27 | + // rr |
| 28 | + rr := query.Get("rr") |
| 29 | + if rr == "" { |
| 30 | + rr = "@" |
| 31 | + } |
| 32 | + |
| 33 | + // ip |
| 34 | + currentIP := helper.IP(r) |
| 35 | + |
| 36 | + // bind dns |
| 37 | + dnsHandler := dns.New(domainName, currentIP, rr) |
| 38 | + app.Log().Info("=====") |
| 39 | + if err := dnsHandler.Bind(); err != nil { |
| 40 | + responseFail(w, 400, err.Error()) |
| 41 | + return |
| 42 | + } |
| 43 | + responseOK(w, 200, fmt.Sprintf("set ip of '%s.%s' to %s", rr, domainName, currentIP)) |
| 44 | + }) |
| 45 | + if err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil); err != nil { |
| 46 | + panic(fmt.Errorf("start http server failed: %s", err)) |
| 47 | + } |
| 48 | +} |
| 49 | + |
| 50 | +type Response struct { |
| 51 | + Success bool `json:"success"` |
| 52 | + Message string `json:"message,omitempty"` |
| 53 | + Error string `json:"error,omitempty"` |
| 54 | +} |
| 55 | + |
| 56 | +func responseFail(w http.ResponseWriter, code int, msg string) { |
| 57 | + setHeader(w, code) |
| 58 | + b, _ := jsoniter.Marshal(Response{ |
| 59 | + Success: false, |
| 60 | + Error: msg, |
| 61 | + }) |
| 62 | + _, _ = w.Write(b) |
| 63 | +} |
| 64 | + |
| 65 | +func responseOK(w http.ResponseWriter, code int, msg string) { |
| 66 | + setHeader(w, code) |
| 67 | + b, _ := jsoniter.Marshal(Response{ |
| 68 | + Success: true, |
| 69 | + Message: msg, |
| 70 | + }) |
| 71 | + _, _ = w.Write(b) |
| 72 | +} |
| 73 | + |
| 74 | +func setHeader(w http.ResponseWriter, code int) { |
| 75 | + w.Header().Set("Content-Type", "application/json") |
| 76 | + w.WriteHeader(code) |
| 77 | +} |
0 commit comments