package controllers import ( "log" "net/http" "github.com/gin-gonic/gin" godns "github.com/miekg/dns" "code.crute.me/mcrute/frame" "code.crute.me/mcrute/go_ddns_manager/dns" "code.crute.me/mcrute/go_ddns_manager/web/middleware" ) func UpdateDynamicDNS(c *gin.Context) { cfg := middleware.GetServerConfig(c) res := middleware.GetDDNSAuthKey(c) if res == "" { log.Println("ddns: Unable to get auth key") c.AbortWithStatus(http.StatusForbidden) return } zone, part := cfg.BindConfig.FindClosestZone(res, cfg.DynamicDnsView) if zone == nil { log.Println("ddns: Unable to locate zone") c.AbortWithStatus(http.StatusNotFound) return } inip := frame.GetRequestIP(c) if inip == nil { log.Println("ddns: Unable to parse IP") c.AbortWithStatus(http.StatusInternalServerError) return } txn := cfg.DNSClient.QueryRecursive(zone, res, godns.TypeA) cur, err := cfg.DNSClient.SendQuery(txn) if err == nil && len(cur) == 1 { if cur[0].(*godns.A).A.Equal(inip) { log.Printf("ddns: Update not required for '%s', IP %s", res, inip) c.String(http.StatusNotModified, "") return } } txn = cfg.DNSClient.StartUpdate(zone).Upsert(&dns.A{ Name: part, Ttl: 60, A: inip, }) if err := cfg.DNSClient.SendUpdate(txn); err != nil { log.Printf("ddns: %s", err) c.AbortWithStatus(http.StatusInternalServerError) return } c.String(http.StatusAccepted, "") }