diff --git a/data.json b/data.json new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4b53ffb --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.send.nrw/sendnrw/fritzbox_dyndns + +go 1.23.1 diff --git a/main.go b/main.go new file mode 100644 index 0000000..03f4a44 --- /dev/null +++ b/main.go @@ -0,0 +1,136 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "strings" + "time" +) + +type DB map[string]dns_entry + +var D map[string]dns_entry + +type dns_entry struct { + Dns string `json:"dns"` + Ip string `json:"ip"` + User string `json:"user"` + Token string `json:"token"` + LastSeen string `json:"lastseen"` +} + +// Daten in eine Datei schreiben +func writeToFile(filename string, data DB) error { + // JSON konvertieren + jsonData, err := json.MarshalIndent(data, "", " ") + if err != nil { + return fmt.Errorf("Fehler beim Serialisieren: %w", err) + } + + // Datei öffnen/erstellen + err = os.WriteFile(filename, jsonData, 0644) + if err != nil { + return fmt.Errorf("Fehler beim Schreiben der Datei: %w", err) + } + + return nil +} + +// Daten aus einer Datei lesen +func readFromFile(filename string) (DB, error) { + // Datei lesen + jsonData, err := os.ReadFile(filename) + if err != nil { + return nil, fmt.Errorf("Fehler beim Lesen der atei: %w", err) + } + + // JSON in DB parsen + var data DB + err = json.Unmarshal(jsonData, &data) + if err != nil { + return nil, fmt.Errorf("Fehler beim Parsen von JSON: %w", err) + } + + return data, nil +} + +func handler(w http.ResponseWriter, r *http.Request) { + Dns := r.URL.Query().Get("DDNS") + Ip := r.URL.Query().Get("IP") + User := r.URL.Query().Get("USER") + Token := r.URL.Query().Get("TOKEN") + + if D == nil { + D = make(map[string]dns_entry) + } + + if strings.ToLower(Dns) != strings.ToLower("") && strings.ToLower(Ip) != strings.ToLower("") && strings.ToLower(User) != strings.ToLower("") && strings.ToLower(Token) != strings.ToLower("") { + + if entry, exists := D[Dns]; exists { + if User == entry.User && Token == entry.Token { + D[Dns] = dns_entry{Dns: Dns, Ip: Ip, User: User, Token: Token, LastSeen: time.Now().String()} + fmt.Println("Eintrag aktualisiert: ", entry, D[Dns]) + // Datei speichern + filename := "data.json" + err := writeToFile(filename, D) + if err != nil { + fmt.Println("Fehler beim Schreiben:", err) + return + } + fmt.Println("Daten erfolgreich in Datei geschrieben.") + w.WriteHeader(200) + w.Write([]byte("good")) + } else { + fmt.Println("Eintrag aktualisieren abgelehnt (Benutzer/Passwort ungültig): ", entry, D[Dns]) + w.WriteHeader(200) + w.Write([]byte("nochg")) + } + } else { + D[Dns] = dns_entry{Dns: Dns, Ip: Ip, User: User, Token: Token, LastSeen: time.Now().String()} + fmt.Println("Eintrag erstellt: ", entry, D[Dns]) + // Datei speichern + filename := "data.json" + err := writeToFile(filename, D) + if err != nil { + fmt.Println("Fehler beim Schreiben:", err) + return + } + fmt.Println("Daten erfolgreich in Datei geschrieben.") + w.WriteHeader(200) + w.Write([]byte("good")) + } + + } else { + fmt.Println("Eintrag unvollständig: ", D[Dns]) + w.WriteHeader(200) + w.Write([]byte("nochg")) + } + +} + +func handlerIP(w http.ResponseWriter, r *http.Request) { + +} + +func main() { + D = make(map[string]dns_entry) + // Datei lesen + filename := "data.json" + readData, err := readFromFile(filename) + if err != nil { + fmt.Println("Fehler beim Lesen:", err) + } else { + fmt.Println("Daten erfolgreich aus Datei gelesen.") + D = readData + } + + http.HandleFunc("/", handler) + http.HandleFunc("/ip", handlerIP) + fmt.Println("Server läuft auf http://*:8080") + srv_err := http.ListenAndServe(":8080", nil) + if srv_err != nil { + fmt.Println("Starten des Servers fehlgeschlagen!", srv_err) + } +}