diff options
author | Erich Eckner <git@eckner.net> | 2019-03-30 20:20:27 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2019-03-30 20:20:27 +0100 |
commit | 36c29f82abf95dc1520989a48814b6882a6db374 (patch) | |
tree | f72f1b2a6e857cd782fe428f18a7a45d3f731d86 /ddns.php | |
download | ddns-36c29f82abf95dc1520989a48814b6882a6db374.tar.xz |
Initial commit
Diffstat (limited to 'ddns.php')
-rw-r--r-- | ddns.php | 89 |
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); + +?> |