diff options
author | Erich Eckner <git@eckner.net> | 2023-05-05 21:45:50 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2023-05-05 21:45:50 +0200 |
commit | 7cc605964b02ba21e08ca4096bb47538192b198f (patch) | |
tree | 2e05e2b19a088f2f7fd72b219bacc786c2edd236 /tor-ddns.php | |
parent | 1d224431db8f22452f2fa80ccaf92f2d9d4ad014 (diff) | |
download | ddns-7cc605964b02ba21e08ca4096bb47538192b198f.tar.xz |
tor-ddns.php new for handling CNAMEs to *.onion addresses
Diffstat (limited to 'tor-ddns.php')
-rw-r--r-- | tor-ddns.php | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tor-ddns.php b/tor-ddns.php new file mode 100644 index 0000000..33a1dd2 --- /dev/null +++ b/tor-ddns.php @@ -0,0 +1,50 @@ +<?php + + // 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 (array_key_exists('address', $_GET)) + $ip = $_GET['address']; + else + die(); + + if (preg_match('@^[0-9a-z]{56}\.onion@', $ip) != 1) + die(); + + $updateCommand = "zone ddns.eckner.net.\n"; + $logContent = ''; + + // delete old record if existing + $updateCommand .= + "prereq yxrrset " . $domain . ".tor.ddns.eckner.net IN CNAME\n" . + "update delete " . $domain . ".tor.ddns.eckner.net IN CNAME\n" . + "send\n"; + + $updateCommand .= + "update add " . $domain . ".tor.ddns.eckner.net. 7200 IN CNAME " . $ip . "\n"; + $logContent .= + date('Y-m-d H:i:s') . ' ' . $domain . ' ' . $ip . "\n"; + $updateCommand .= + "send\n"; + + // actually do something + $pin = popen('nsupdate -l', 'w'); + if ($pin === FALSE) + die_http(500, 'Internal Server Error', 'Failed to update Zone.'); + + fwrite($pin, $updateCommand); + pclose($pin); + + file_put_contents('/srv/http/vhosts/eckner.net/ddns/log', $logContent, FILE_APPEND | LOCK_EX); + + print "updated ips for domain \"" . $domain . ".ddns.eckner.net\": " . implode(", ", $ips) . "\n"; |