From 94467587395bb90a201adf87e413de393d333163 Mon Sep 17 00:00:00 2001 From: DeveloperDurp Date: Sat, 15 Mar 2025 09:57:09 -0500 Subject: [PATCH] initial commit --- .gitignore | 2 + go.mod | 16 +++++ go.sum | 16 +++++ main.go | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f08d9d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +/.idea/ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b838d5a --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module gitlab.com/durfy/durpdns + +go 1.24.1 + +require ( + github.com/caarlos0/env/v6 v6.10.1 + github.com/cloudflare/cloudflare-go/v4 v4.1.0 + github.com/joho/godotenv v1.5.1 +) + +require ( + github.com/tidwall/gjson v1.14.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..19e576b --- /dev/null +++ b/go.sum @@ -0,0 +1,16 @@ +github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/II= +github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= +github.com/cloudflare/cloudflare-go/v4 v4.1.0 h1:1SjQZaPbUe23fSoCuMuN7EblVo+RIldNGd4pfkPCpW4= +github.com/cloudflare/cloudflare-go/v4 v4.1.0/go.mod h1:XcYpLe7Mf6FN87kXzEWVnJ6z+vskW/k6eUqgqfhFE9k= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= diff --git a/main.go b/main.go new file mode 100644 index 0000000..3b39ff3 --- /dev/null +++ b/main.go @@ -0,0 +1,178 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "github.com/caarlos0/env/v6" + "github.com/cloudflare/cloudflare-go/v4" + "github.com/cloudflare/cloudflare-go/v4/dns" + "github.com/cloudflare/cloudflare-go/v4/option" + "github.com/joho/godotenv" + "io" + "log" + "net/http" + "time" +) + +type IPResponse struct { + IPAddress string `json:"YourFuckingIPAddress"` + Location string `json:"YourFuckingLocation"` + Hostname string `json:"YourFuckingHostname"` + ISP string `json:"YourFuckingISP"` + TorExit bool `json:"YourFuckingTorExit"` + City string `json:"YourFuckingCity"` + Country string `json:"YourFuckingCountry"` + CountryCode string `json:"YourFuckingCountryCode"` +} + +type Config struct { + CloudflareZoneID string `env:"CLOUDFLARE_ZONE_ID"` + CloudFlareAPIKey string `env:"CLOUDFLARE_API_KEY"` + CloudflareEmail string `env:"CLOUDFLARE_EMAIL"` +} + +func main() { + + err := godotenv.Load(".env") + if err != nil { + log.Fatal("Failed to load env file") + return + } + + config := &Config{} + err = env.Parse(config) + if err != nil { + log.Fatal("Failed to load env file") + return + } + + if config.CloudflareEmail == "" || config.CloudFlareAPIKey == "" || config.CloudflareZoneID == "" { + log.Fatal("Email, API and ZoneID need to be set") + return + } + + client := cloudflare.NewClient( + option.WithAPIKey(config.CloudFlareAPIKey), + option.WithAPIEmail(config.CloudflareEmail), + ) + + ExistingIP, err := getIP() + if err != nil { + fmt.Println(err) + return + } + + fmt.Println("Your public IP address is:", ExistingIP.IPAddress) + +do: + for { + CurrentIP, err := getIP() + if err != nil { + fmt.Println(err) + break + } + + if ExistingIP.IPAddress != CurrentIP.IPAddress { + ExistingIP = CurrentIP + fmt.Println( + "Your public IP address has updated:", + ExistingIP.IPAddress, + ) + + err := updateDNSRecords( + client, + config.CloudflareZoneID, + CurrentIP.IPAddress, + ) + if err != nil { + fmt.Println(err) + break + } + + } else { + fmt.Println("Your public IP address has not changed.") + } + + time.Sleep(10 * time.Second) + continue do + } +} + +func getIP() (*IPResponse, error) { + + var ip IPResponse + resp, err := http.Get("https://myip.wtf/json") + if err != nil { + return nil, err + } + defer resp.Body.Close() + + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = json.Unmarshal(data, &ip) + return &ip, err +} + +func getDNSRecords( + client *cloudflare.Client, + zoneID string, +) (*[]dns.RecordResponse, error) { + dnslist, err := client.DNS.Records.List( + context.TODO(), + dns.RecordListParams{ + ZoneID: cloudflare.F(zoneID), + }, + ) + if err != nil { + return nil, err + } + + var records []dns.RecordResponse + for _, item := range dnslist.Result { + + if item.Type == "A" { + records = append(records, item) + } + } + return &records, nil +} + +func updateDNSRecords( + client *cloudflare.Client, + zoneID string, + ipAddress string, +) error { + records, err := getDNSRecords(client, zoneID) + if err != nil { + return err + } + + for _, record := range *records { + + NewDNS := dns.ARecordParam{ + Comment: cloudflare.F(record.Comment), + Content: cloudflare.F(ipAddress), + Name: cloudflare.F(record.Name), + Proxied: cloudflare.F(record.Proxied), + TTL: cloudflare.F(record.TTL), + Type: cloudflare.F(dns.ARecordTypeA), + } + + _, err = client.DNS.Records.Edit( + context.TODO(), record.ID, dns.RecordEditParams{ + ZoneID: cloudflare.F(zoneID), + Record: NewDNS, + }, + ) + if err != nil { + return err + } + + fmt.Printf("Updated IP address for %s\n", record.Name) + } + return nil +}