ddns-scripts: change servercow.de to new dns api
authorPatrick Hemmen <redacted>
Tue, 10 Feb 2026 20:38:23 +0000 (21:38 +0100)
committerFlorian Eckert <redacted>
Mon, 2 Mar 2026 12:45:34 +0000 (13:45 +0100)
The previous way to update dns records at servercow.de was replaced
with a https based dns api. The new dns api is documented at
https://wiki.servercow.de/de/domains/dns_api/api-syntax/#einfuhrung

Signed-off-by: Patrick Hemmen <redacted>
net/ddns-scripts/Makefile
net/ddns-scripts/files/usr/lib/ddns/update_servercow_de.sh [new file with mode: 0644]
net/ddns-scripts/files/usr/share/ddns/default/servercow.de.json

index db405263ede2038bd8d4411db925551ed704cf36..1ac0210b2e3a3328060c50d46c43b3226de8c12e 100644 (file)
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ddns-scripts
 PKG_VERSION:=2.8.2
-PKG_RELEASE:=92
+PKG_RELEASE:=93
 
 PKG_LICENSE:=GPL-2.0
 
@@ -387,6 +387,16 @@ define Package/ddns-scripts-aliyun/description
        Dynamic DNS Client scripts extension for aliyun.com API
 endef
 
+define Package/ddns-scripts-servercow
+       $(call Package/ddns-scripts/Default)
+       TITLE:=Extension for Servercow DNS API
+       DEPENDS:=ddns-scripts +curl +openssl-util
+endef
+
+define Package/ddns-scripts-servercow/description
+       Dynamic DNS Client scripts extension for servercow.de API
+endef
+
 define Build/Configure
 endef
 
@@ -458,6 +468,7 @@ define Package/ddns-scripts-services/install
        rm $(1)/usr/share/ddns/default/porkbun.com-v3.json
        rm $(1)/usr/share/ddns/default/huaweicloud.com.json
        rm $(1)/usr/share/ddns/default/aliyun.com.json
+       rm $(1)/usr/share/ddns/default/servercow.de.json
 endef
 
 
@@ -920,6 +931,23 @@ fi
 exit 0
 endef
 
+define Package/ddns-scripts-servercow/install
+       $(INSTALL_DIR) $(1)/usr/lib/ddns
+       $(INSTALL_BIN) ./files/usr/lib/ddns/update_servercow_de.sh \
+               $(1)/usr/lib/ddns
+
+       $(INSTALL_DIR) $(1)/usr/share/ddns/default
+       $(INSTALL_DATA) ./files/usr/share/ddns/default/servercow.de.json \
+               $(1)/usr/share/ddns/default/
+endef
+
+define Package/ddns-scripts-servercow/prerm
+#!/bin/sh
+if [ -z "$${IPKG_INSTROOT}" ]; then
+       /etc/init.d/ddns stop
+fi
+exit 0
+endef
 
 $(eval $(call BuildPackage,ddns-scripts))
 $(eval $(call BuildPackage,ddns-scripts-services))
@@ -948,3 +976,4 @@ $(eval $(call BuildPackage,ddns-scripts-one))
 $(eval $(call BuildPackage,ddns-scripts-porkbun))
 $(eval $(call BuildPackage,ddns-scripts-huaweicloud))
 $(eval $(call BuildPackage,ddns-scripts-aliyun))
+$(eval $(call BuildPackage,ddns-scripts-servercow))
diff --git a/net/ddns-scripts/files/usr/lib/ddns/update_servercow_de.sh b/net/ddns-scripts/files/usr/lib/ddns/update_servercow_de.sh
new file mode 100644 (file)
index 0000000..209082c
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+# Based on update_gandi_net.sh script
+# New servercow.de DNS-API https://wiki.servercow.de/de/domains/dns_api/api-syntax/
+
+. /usr/share/libubox/jshn.sh
+
+local __TTL=600
+local __RRTYPE
+local __ENDPOINT="https://api.servercow.de/dns/v1/domains"
+local __STATUS
+
+[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing username"
+[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing password"
+
+[ $use_ipv6 -ne 0 ] && __RRTYPE="AAAA" || __RRTYPE="A"
+
+# Get host and domain from $domain
+__RECORD="${domain%%.*}"
+__DOMAIN="${domain#*.}"
+
+# Construct JSON payload
+json_init
+json_add_string "type" "$__RRTYPE"
+json_add_string "name" "$__RECORD"
+json_add_string "content" "$__IP"
+json_add_string "ttl" "60"
+json_close_array
+
+# Log the curl command
+write_log 7 "curl -s -X POST \"$__ENDPOINT/$__DOMAIN\" \
+               -H \"X-Auth-Username: $username\" \
+               -H \"X-Auth-Password: $password\" \
+               -H \"Content-Type: application/json\" \
+               -d \"$(json_dump)\" \
+               --connect-timeout 30"
+
+__STATUS=$(curl -s -X POST "$__ENDPOINT/$__DOMAIN" \
+               -H "X-Auth-Username: $username" \
+               -H "X-Auth-Password: $password" \
+               -H "Content-Type: application/json" \
+               -d "$(json_dump)" \
+               --connect-timeout 30 \
+               -w "%{http_code}\n" -o $DATFILE 2>$ERRFILE)
+
+local __ERRNO=$?
+if [ $__ERRNO -ne 0 ]; then
+               write_log 14 "Curl failed with $__ERRNO: $(cat $ERRFILE)"
+               return 1
+elif [ -z $__STATUS ] || [ $__STATUS != 200 ]; then
+               write_log 14 "DNS API Update failed: $__STATUS \napi.servercow.de answered: $(cat $DATFILE)"
+               return 1
+fi
+
+write_log 7 "api.servercow.de answered: $(cat $DATFILE)"
+
+return 0
index ebe963ab561553666a721f610826f7f4e4f7ce11..aebe5f20fbfed6dc62cd785e40fae468f76195ac 100644 (file)
@@ -1,11 +1,9 @@
 {
-       "name": "servercow.de",
-       "ipv4": {
-               "url": "http://www.servercow.de/dnsupdate/update.php?username=[USERNAME]&pass=[PASSWORD]&hostname=[DOMAIN]&ipaddr=[IP]",
-               "answer": "OKv4"
-       },
-       "ipv6": {
-               "url": "http://www.servercow.de/dnsupdate/update.php?username=[USERNAME]&pass=[PASSWORD]&hostname=[DOMAIN]&ip6addr=[IP]",
-               "answer": "OKv6"
-       }
+               "name": "servercow.de",
+               "ipv4": {
+                               "url": "update_servercow_de.sh"
+               },
+               "ipv6": {
+                       "url": "update_servercow_de.sh"
+               }
 }
git clone https://git.99rst.org/PROJECT