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 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 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..83b9c35 --- /dev/null +++ b/main.go @@ -0,0 +1,141 @@ +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 { + fmt.Println("Fehler beim Serialisieren: ", err) + return err + } + + // Datei öffnen/erstellen + err = os.WriteFile(filename, jsonData, 0644) + if err != nil { + fmt.Println("Fehler beim Schreiben der Datei: ", err) + return err + } + + return nil +} + +// Daten aus einer Datei lesen +func readFromFile(filename string) (DB, error) { + // Datei lesen + jsonData, err := os.ReadFile(filename) + if err != nil { + 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 { + fmt.Println("Fehler beim Parsen von JSON: ", err) + return nil, 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.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 { + 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")) + } + } + +} + +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(":8089", nil) + if srv_err != nil { + fmt.Println("Starten des Servers fehlgeschlagen!", srv_err) + } +}