From 1ddd899a4f95789338c30adef8f89395366e995a Mon Sep 17 00:00:00 2001 From: jbergner Date: Wed, 8 Jan 2025 22:32:49 +0100 Subject: [PATCH 1/4] init --- data.json | 0 go.mod | 3 ++ main.go | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 data.json create mode 100644 go.mod create mode 100644 main.go 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) + } +} From 876cb95d509bd15d2686596d8d679599af2dc5e4 Mon Sep 17 00:00:00 2001 From: groot Date: Thu, 9 Jan 2025 07:07:49 +0000 Subject: [PATCH 2/4] =?UTF-8?q?Dockerfile=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..54721e5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM golang:1.23.3 +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY *.go ./ +RUN CGO_ENABLED=0 GOOS=linux go build -o /go-ddns +EXPOSE 8080 +CMD ["/go-ddns"] \ No newline at end of file From 658d78d1a821692fd1122134732cf0a490eefd11 Mon Sep 17 00:00:00 2001 From: groot Date: Thu, 9 Jan 2025 07:09:26 +0000 Subject: [PATCH 3/4] =?UTF-8?q?.gitea/workflows/registry.yml=20hinzugef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/registry.yml | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .gitea/workflows/registry.yml diff --git a/.gitea/workflows/registry.yml b/.gitea/workflows/registry.yml new file mode 100644 index 0000000..d609b9f --- /dev/null +++ b/.gitea/workflows/registry.yml @@ -0,0 +1,51 @@ +name: release-tag +on: + push: + branches: + - 'main' +jobs: + release-image: + runs-on: ubuntu-latest + env: + DOCKER_ORG: sendnrw + DOCKER_LATEST: latest + RUNNER_TOOL_CACHE: /toolcache + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker BuildX + uses: docker/setup-buildx-action@v2 + with: # replace it with your local IP + config-inline: | + [registry."git.send.nrw"] + http = true + insecure = true + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + registry: git.send.nrw # replace it with your local IP + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Get Meta + id: meta + run: | + echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT + echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + platforms: | + linux/amd64 + push: true + tags: | # replace it with your local IP and tags + git.send.nrw/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }} + git.send.nrw/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }} \ No newline at end of file From 8fae6b387b827418f76557b857ec4506a8c1412f Mon Sep 17 00:00:00 2001 From: jbergner Date: Fri, 10 Jan 2025 17:39:56 +0100 Subject: [PATCH 4/4] Optimierungen EqualFold und Fehlermeldungen --- main.go | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 03f4a44..83b9c35 100644 --- a/main.go +++ b/main.go @@ -26,13 +26,15 @@ 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) + fmt.Println("Fehler beim Serialisieren: ", err) + return err } // Datei öffnen/erstellen err = os.WriteFile(filename, jsonData, 0644) if err != nil { - return fmt.Errorf("Fehler beim Schreiben der Datei: %w", err) + fmt.Println("Fehler beim Schreiben der Datei: ", err) + return err } return nil @@ -43,14 +45,16 @@ 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) + fmt.Println("Fehler beim Lesen der Datei: ", err) + return nil, 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) + fmt.Println("Fehler beim Parsen von JSON: ", err) + return nil, err } return data, nil @@ -66,7 +70,13 @@ func handler(w http.ResponseWriter, r *http.Request) { 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 strings.EqualFold(Dns, "") || strings.EqualFold(Ip, "") || strings.EqualFold(User, "") || strings.EqualFold(Token, "") { + /* strings.ToLower(Dns) != strings.ToLower("") && strings.ToLower(Ip) != strings.ToLower("") && strings.ToLower(User) != strings.ToLower("") && strings.ToLower(Token) != strings.ToLower("")*/ + fmt.Println("Eintrag unvollständig: ", D[Dns]) + w.WriteHeader(200) + w.Write([]byte("nochg")) + + } else { if entry, exists := D[Dns]; exists { if User == entry.User && Token == entry.Token { @@ -101,11 +111,6 @@ func handler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("good")) } - - } else { - fmt.Println("Eintrag unvollständig: ", D[Dns]) - w.WriteHeader(200) - w.Write([]byte("nochg")) } } @@ -129,7 +134,7 @@ func main() { http.HandleFunc("/", handler) http.HandleFunc("/ip", handlerIP) fmt.Println("Server läuft auf http://*:8080") - srv_err := http.ListenAndServe(":8080", nil) + srv_err := http.ListenAndServe(":8089", nil) if srv_err != nil { fmt.Println("Starten des Servers fehlgeschlagen!", srv_err) }