initial commit

This commit is contained in:
DeveloperDurp 2025-03-15 09:57:09 -05:00
parent b75d297ac8
commit 9446758739
4 changed files with 212 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.env
/.idea/

16
go.mod Normal file
View file

@ -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
)

16
go.sum Normal file
View file

@ -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=

178
main.go Normal file
View file

@ -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
}