#!/usr/bin/perl -w
#--------------------------------------------------------------------------
#FreeDNS updater by Charles Puffer V0.1
#This program licensed under the GNU GPL
#send comments at cpuffer@red-belt.org
#
#For a copy of the GPL and more informaion on FreeSoftware
#on the web go to www.fsf.org
#--------------------------------------------------------------------------
use strict;
use LWP::Simple;
use Sys::Syslog;
my $domain="NA";
my $code="NA";
my $system='NA';
my $dns='NA';
my $verbose=0;
my $deamon=0;
sub setDNSIP {
my $content= get("http://freedns.afraid.org/dynamic/update.php?" . $code . "=");
chomp $content;
syslog('info', "FreeDNS update of domain: $domain");
syslog('info', "FreeDNS useing code: $code");
&output("-The Return------------------------------------------------\n");
&output("$content\n");
&output("-----------------------------------------------------------\n");
syslog('info', "FreeDNS return: $content");
}
sub checkDNSIP {
# this might be better if ifconfig was used with -a and the match for the address
# made use of the network part of the expected address. (cpuffer)
$_=`ifconfig ppp0`;
chomp;
&output("-From ifconfig ppp0----------------------------------------\n");
&output("$_\n");
&output("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
if ( m/addr:(\d+\.\d+\.\d+\.\d+)/ ) {
$system=$1;
&output("The system\'s address is $system\n");
&output("----------------------------------------------------------\n");
}
else {
syslog('err', "FreeDNS update could not get ifconfig ppp0 ip");
$system="NA"
}
$_=`host red-belt.org`;
chomp;
&output("-From host $domain-----------------------------------------\n");
&output("$_\n");
&output("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
if ( m/has address (\d+\.\d+\.\d+\.\d+)/ ) {
$dns=$1;
&output("The DNS address is $dns\n");
&output("-----------------------------------------------------------\n");
}
else {
syslog('err', "FreeDNS update could not get host $domain ip");
$dns="NA"
}
if ( $system ne "NA" && $dns ne "NA" ) {
if ( $system eq $dns ) {
&output("The addresses are the same no DNS service update needed.\n");
return "same";
}
else {
&output("The addresses are not the same update DNS service.\n");
return "different";
}
}
else {
return 0;
}
}
sub output {
my ($line)=@_;
if ($verbose) {
print $line;
}
}
sub getargs {
my $temp=0;
foreach (@ARGV) {
$temp++;
&output("$temp $_\n");
if ( m/-h/) {
print "FreeDNS DNS updater\n";
print " By Charles Puffer\n";
print " Version 0.1 licenses under the GNU GPL www.fsf.org for copy of license\n";
print "Useage:\n";
print " FreeDNS -v -d a.domain.you.have.at.freedns.afraid.org ?the_strange_code*=\n";
print "";
print "Parameters:\n";
print " -v turn on or off verbose\n";
print " -d\#\# deamon mode run once every \#\# minuets\n";
print " should not less than 10min\n";
print " -h this help\n";
print "";
print "*Note:\n";
print " The strange code you have to include comes from FreeDNS.\n";
print " You get it by going to the Dynamic update page and clicking\n";
print " on Direct URL, the strange code will be near the end of the\n";
print " URL and will begin with a\'?\' and end with a \'=\['.\n";
exit;
}
if ( m/-v/) {
if ($verbose==0) {
$verbose=1;
&output("Verbose mode on\n");
&output("$temp $_\n");
} else {
&output("Verbose mode off\n");
$verbose=0;
}
}elsif ( m/-d\s*(\n*)/ ) {
$deamon=$1;
if ($deamon < 10.0){ #It is bad to change this. You will just risk hitting FreeDNS
$deamon=10.0; #hard if you ip does not update.
&output("Deamon mode on check every $deamon minuts\n");
$deamon*=60;
}
}elsif ( ($domain eq "NA") && ($code eq "NA") && ( m/(\S+)/ ) ) { #this could be better defined to avoid input errors
$domain=$1;
&output("The Domain is $domain\n");
}elsif ( ($domain ne "NA") && ($code eq "NA") && ( m/\?(\S+)=/ ) ) { #this could be better defined to avoid input errors
$code=$1;
&output("The code is $code\n");
}else {
&output("There may be a problem with your input arguments\n");
exit;
}
}
if ( ($domain eq "NA") || ($domain eq "NA") ) {
die "You must provide a domain and a FreeDNS code";
}
}
sub FreeDNSupdater {
&getargs();
if ( &checkDNSIP() ne "same" ) {
&setDNSIP();
}
while ($deamon) {
&output("sleeping\n");
sleep $deamon;
if ( &checkDNSIP() ne "same" ) {
&setDNSIP();
}
}
}
&FreeDNSupdater();