summaryrefslogtreecommitdiff
path: root/ddns.php
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-03-30 20:20:27 +0100
committerErich Eckner <git@eckner.net>2019-03-30 20:20:27 +0100
commit36c29f82abf95dc1520989a48814b6882a6db374 (patch)
treef72f1b2a6e857cd782fe428f18a7a45d3f731d86 /ddns.php
downloadddns-36c29f82abf95dc1520989a48814b6882a6db374.tar.xz
Initial commit
Diffstat (limited to 'ddns.php')
-rw-r--r--ddns.php89
1 files changed, 89 insertions, 0 deletions
diff --git a/ddns.php b/ddns.php
new file mode 100644
index 0000000..8ce064c
--- /dev/null
+++ b/ddns.php
@@ -0,0 +1,89 @@
+<?php
+
+ function lifetime($addr) {
+ $addrTeile=explode(".",$addr);
+ if (($addrTeile[0]=="10") ||
+ (($addrTeile[0]=="192") && ($addrTeile[1]=="168")) ||
+ (($addrTeile[0]=="172") && ($addrTeile[1]>=16) && ($addrTeile[1]<32)))
+ return "7200";
+ return "120";
+ };
+
+ // invalid syntax?
+ if ((!array_key_exists('i',$_GET)) ||
+ (strlen($_GET["i"])!=64) ||
+ (preg_match("@^[0-9A-Za-z]{64}$@",$_GET["i"])!=1))
+ die();
+
+ $line=preg_grep("@^".$_GET["i"]." @", file("/srv/http/vhosts/eckner.net/ddns/tokens"));
+
+ // unknown token?
+ if (count($line)!=1)
+ die();
+
+ $domain=substr(explode(" ",implode("",$line))[1],0,-1);
+ if (isset($_GET["address"]))
+ $ips=explode(",",$_GET["address"]);
+ else
+ $ips[0]="auto";
+
+ foreach ($ips as $i => $ip)
+ if ($ip == "auto")
+ $ips[$i]=$_SERVER["REMOTE_ADDR"];
+
+ $ips=array_unique($ips);
+
+ unset($hasRrType);
+
+ foreach ($ips as $i => $ip) {
+ if (filter_var($ip,FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+ $rrTypes[$i]="A";
+ $hasRrType["A"]=1;
+ }
+ elseif (filter_var($ip,FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ $rrTypes[$i]="AAAA";
+ $hasRrType["AAAA"]=1;
+ }
+ else
+ die();
+ }
+
+ $updateCommand="";
+ $logContent="";
+
+ foreach ($hasRrType as $rrType => $dummy) {
+ // delete old record if existing
+ $updateCommand=
+ $updateCommand.
+ "zone ddns.eckner.net.\n".
+ "prereq yxrrset ".$domain.".ddns.eckner.net IN ".$rrType."\n".
+ "update delete ".$domain.".ddns.eckner.net IN ".$rrType."\n".
+ "send\n".
+ "zone ddns.eckner.net.\n";
+ // set new records no matter what
+ foreach ($ips as $i => $ip)
+ if ($rrTypes[$i] == $rrType) {
+ $updateCommand=
+ $updateCommand.
+ "update add ".$domain.".ddns.eckner.net. ".lifetime($ip)." IN ".$rrType." ".$ip."\n";
+ $logContent=
+ $logContent.
+ date("Y-m-d H:i:s")." ".$domain." ".$ip."\n";
+ }
+ $updateCommand=
+ $updateCommand.
+ "send\n";
+ }
+
+ // actually do something
+ $pin=popen("nsupdate -l","w");
+ if ($pin === FALSE)
+ die();
+
+ fwrite($pin,$updateCommand);
+
+ pclose($pin);
+
+ file_put_contents("/srv/http/vhosts/eckner.net/ddns/log", $logContent, FILE_APPEND | LOCK_EX);
+
+?>