summaryrefslogtreecommitdiff
path: root/tor-ddns.php
blob: 33a1dd2f962bbd9ea10b5224517a056d02e67d9b (plain)
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";