Commit a11b90b7218e1e2d218da307554a5bd99eaca2f9

Authored by Frederik Lindenaar
1 parent f6637881

small improvements + configurable DNSDomain

- fixed handling of expiry
- fixed calculation of expiry period
- reduced CNAME checks / lookups to when really needed
Showing 2 changed files with 45 additions and 19 deletions
dyndns.cfg.dist
... ... @@ -6,6 +6,14 @@
6 6 # DNS Settings
7 7 #dns_server = 192.168.1.1 # DNS Server to communicate with (use IP!)
8 8  
  9 +dns_domain = ?, !, 1 # DNS Domain to support, match hostname with:
  10 + # '?' - take domain name from parameter 'domain'
  11 + # '!' - take domain name from virtualhost name
  12 + # positive number - last # parts from hostname
  13 + # negative number - last # parts from virtualhost
  14 + # any other string - use if hostname ends on this
  15 +
  16 +
9 17 #expand_cnames = 1 # CNAME levels to expand (0 to disable)
10 18 #require_rr = # Require existing record of this type to update
11 19 #replace_rr = A, AAAA, TXT # Records types to replace (clear) during update
... ...
dyndns.pl
... ... @@ -31,6 +31,12 @@ my $ConfigFile = 'optional'; # hardcoded, either optional, required or ignore
31 31 ##############################
32 32 # Configuration section (defaults, can be set in config file)
33 33 my $DNSServer = '192.168.1.1'; # DNS Server to communicate with (use IP!)
  34 +my @DNSDomain = ( '?', '!', 0 ); # DNS Domain to support, matches hostname with:
  35 + # '?' - take domain name from parameter 'domain'
  36 + # '!' - take domain name from virtualhost name
  37 + # positive number - last # parts from hostname
  38 + # negative number - last # parts from virtualhost
  39 + # any other string - use if hostname ends on this
34 40 my $ExpandCNAMEs = 1; # CNAME levels to expand (0 to disable)
35 41 my $AllowDebugKey = 'off'; # Debuging, 'off' to disable, '' for always on
36 42 # and other values to enable with debug= param.
... ... @@ -63,8 +69,8 @@ sub periodSeconds($) {
63 69 my ($number, $units) = ($_[0]=~/^(\d+)([smhdw])?$/);
64 70 if($number && $units && $units cmp 's') {
65 71 $number *= ($units eq 'm') ? 60 # Seconds per minute
66   - : ($units cmp 'h') ? 3600 # Seconds per hour
67   - : ($units cmp 'd') ? 86400 # Seconds per day
  72 + : ($units eq 'h') ? 3600 # Seconds per hour
  73 + : ($units eq 'd') ? 86400 # Seconds per day
68 74 : 604800; # Seconds per week
69 75 }
70 76 return $number;
... ... @@ -222,8 +228,9 @@ sub DNS_Update($$$$$$$) {
222 228  
223 229 ##############################
224 230 # Handlers for the different requests
225   -sub handle_update($$$$$) {
226   - my ($mode, $host, $dnshost, $dnsdomain, $debug) = @_;
  231 +sub handle_update($$$$) {
  232 + my ($mode, $host, $dnsdomain, $debug) = @_;
  233 + my $dnshost = expand_CNAME($host);
227 234 my ($signer, $key) = get_authinfo($cgi, $host);
228 235  
229 236 # perform the action
... ... @@ -251,8 +258,8 @@ sub handle_update($$$$$) {
251 258  
252 259 }
253 260  
254   -sub handle_expire($$$$$) {
255   - my ($mode, $host, $dnshost, $dnsdomain, $debug) = @_;
  261 +sub handle_expire($$$$) {
  262 + my ($mode, $host, $dnsdomain, $debug) = @_;
256 263 my ($signer, $key) = get_authinfo($cgi, $host);
257 264  
258 265 my $debugmsg = ($debug) ? "\n" : '';
... ... @@ -269,7 +276,7 @@ sub handle_expire($$$$$) {
269 276 if($rr->type eq 'TXT' &&
270 277 $rr->txtdata=~/$UpdateTXT(.*\d\d:\d\d:\d\d \d{4})$/){
271 278 if(my $lastupdate = parse_localtime($1)) {
272   - DNS_Update($dnsdomain, $dnshost, undef, undef, $signer, $key, $debug)
  279 + DNS_Update($dnsdomain, $rr->name, undef, undef, $signer, $key, $debug)
273 280 unless($lastupdate > $validafter);
274 281 if($debug) {
275 282 $debugmsg .= ($lastupdate > $validafter) ? 'Keeping ' : 'Expiring ';
... ... @@ -286,8 +293,9 @@ sub handle_expire($$$$$) {
286 293 }
287 294 }
288 295  
289   -sub handle_view($$$$$) {
290   - my ($mode, $host, $dnshost, $dnsdomain, $debug) = @_;
  296 +sub handle_view($$$$) {
  297 + my ($mode, $host, $dnsdomain, $debug) = @_;
  298 + my $dnshost = expand_CNAME($host);
291 299 my $title = "DynDNS Updater - $host";
292 300 print $cgi->header(-status=>200),
293 301 $cgi->start_html(-title => $title),
... ... @@ -310,8 +318,8 @@ sub handle_view($$$$$) {
310 318 print $cgi->end_html();
311 319 }
312 320  
313   -sub handle_list($$$$$) {
314   - my ($mode, $host, $dnshost, $dnsdomain, $debug) = @_;
  321 +sub handle_list($$$$) {
  322 + my ($mode, $host, $dnsdomain, $debug) = @_;
315 323 my $title = "DynDNS Updater - $dnsdomain";
316 324  
317 325 print $cgi->header(-status=>200),
... ... @@ -345,7 +353,8 @@ if ($ConfigFile cmp 'ignore') {
345 353 $CFGFile =~ s/(\.pl)?$/.cfg/;
346 354 if (open (CONFIG, $CFGFile)) {
347 355 my %CONFIG = (
348   - allow_debug_key => \$AllowDebugKey, dns_server => \$DNSServer,
  356 + allow_debug_key => \$AllowDebugKey,
  357 + dns_server => \$DNSServer, dns_domain => \@DNSDomain,
349 358 expand_cnames => \$ExpandCNAMEs, auth_mode => \$AuthMode,
350 359 static_signer => \$StaticSigner, static_key => \$StaticKey,
351 360 require_rr => \$RequireRR, replace_rr => \@ReplaceRR,
... ... @@ -399,6 +408,20 @@ foreach my $rrtype (@ReplaceRR) {
399 408 my $mode = $cgi->path_info || $cgi->param('mode') || 'view';
400 409 $mode=~s/^\/([^\/]+)(\/(.*))?/$1/;
401 410 my $host = $cgi->param('host') || $3;
  411 +my $dnsdomain;
  412 +foreach my $d (@DNSDomain) {
  413 + if ($d eq '!') { $d = $cgi->virtual_host; }
  414 + elsif ($d eq '?') { $d = $cgi->param('domain'); }
  415 + elsif ($d =~ /-?\d+/) {
  416 + if ($d <0) { $d = join('.', splice([ split(/\./, $cgi->virtual_host) ], $d)); }
  417 + else { $d = join('.', splice([ split(/\./, $host) ], ($d) ? -$d : 1)); }
  418 + }
  419 + $dnsdomain = $d if ($host && length($host) == length($d)+rindex($host,$d));
  420 + last if $dnsdomain;
  421 +}
  422 +fail($PE, "No host name to act on specified", 400)
  423 + unless $host || $mode eq 'list' || $mode eq 'expire';
  424 +fail($PE, "No host or domain name to act on specified", 400) unless $dnsdomain;
402 425  
403 426  
404 427 ##############################
... ... @@ -410,13 +433,8 @@ my %handlers = (
410 433 list => \&handle_list,
411 434 expire => \&handle_expire,
412 435 );
413   -if($host eq '' and $mode cmp 'list' and $mode cmp 'expire') {
414   - fail($PE, "No host name to act on specified", 400);
415   -} elsif(my $handler = $handlers{$mode}) {
416   - # Replace provided host with that of a CNAME it points to and determine domain
417   - my $dnshost = ($host) ? expand_CNAME($host) : undef;
418   - my $dnsdomain = $cgi->param('domain') || ($dnshost=~/\.(.*)$/)[0];
419   - $handler->($mode, $host, $dnshost, $dnsdomain, $debug);
  436 +if(my $handler = $handlers{$mode}) {
  437 + $handler->($mode, $host, $dnsdomain, $debug);
420 438 } else {
421 439 fail("File Not Found", "Invalid Mode '$mode' specified", 404);
422 440 }
... ...