1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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";
|