#!/usr/bin/perl $i=0; #use strict; #use vars qw($ua $rq $date_time); #use vars qw($sec $min $hour $mday $mon $year $wday $yday $isdst); #use vars qw($myip $firewall $target $username $password $version); #use vars qw($pass $url $sock @result $result $code); use LWP::UserAgent; use MIME::Base64 (); use Sys::Syslog qw(:DEFAULT setlogsock); use IO::Socket; ##### hn.orgから接続中のIPアドレスを取得 ##### $ua = LWP::UserAgent->new; $rq = HTTP::Request->new(GET => 'http://myip.hn.org/ip.cgi'); foreach (split(/\n/, $ua->request($rq)->as_string)) { last if (($myip) = m|^|); } #print $myip; ##### 現在の日時とIPアドレスを保存 ##### ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $mon++; $year = $year + 1900; $date_time = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year, $mon, $mday, $hour,$min, $sec); open (OUT,">/etc/adsl.new"); print OUT "date=\'".$date_time."\'\n"; print OUT "IP=\'".$myip."\'\n"; close OUT; print "$date_time\n"; print "ADSL IP is $myip \n"; ##### IPアドレスのチェック ##### open (IN,"/etc/adsl.js"); while () { chomp; $adsl_data[$i] = substr($_, 4, length($_) - 5); ++$i; } close IN; print "Old IP is $adsl_data[1] \n"; if ($myip eq $adsl_data[1]) { print "IP is NOT changed.\n"; system ("rm /etc/adsl.new"); exit(0); } else { print "IP was Changed!\n"; system ("mv /etc/adsl.new /etc/adsl.js"); system ("/usr/local/bin/myip_mail.sh;"); } if ($myip eq "") { exit(0)}; ##### hammernode.plのスタート ##### print "Starting hammernode.pl\n"; # YOUR hn.org name and password go here. $username = "○○○○"; $password = "○○○○"; # If you're behind a firewall or HTTP proxy, set this to 1. # If you're not sure, set it to 1; that's the safer setting anyway. # If you KNOW you're not behind a firewall or proxy, set to 0. $firewall = 1; # Okay, that's all you'll need to configure *here*. You're not done, # though... You still need to configure this to run automatically, and to # use the correct IP address. For Linux users with pppd, the easiest way # to put a line like this in /etc/ppp/ip-up : # # /usr/local/sbin/hammernode.pl $4 # # If that doesn't make much sense, see `man pppd' which details what # parameters pppd sends to ip-up. # # A clever trick for dhcpcd users... put this in your # /etc/dhcpcd/dhcpcd-eth0.exe file: # # source /etc/dhcpc/dhcpcd-eth0.info && /usr/local/sbin/hammernode.pl $IPADDR # # (I discovered this was necessary -- my cable modem company puts an # "invisible" HTTP proxy in between me and the 'net, and my domains were # being assigned the address of the proxy. # # (C)2000-2001 David E. Smith and released to the # public under the terms of the GNU General Public License. # # Modified by Daniel Hagan on 4/2001 to use IO::Socket, # Syslog, and some error checking. Now logs all output to daemon facility. # # Other changes made/suggested by Aurelien Beaujean # Sorry, but I can't type the accent over the first "e" in Aurelien. # ############### # If you don't let syslogd listen on an inet port, uncomment this line. # #setlogsock 'unix'; #openlog ("hammernode", 'pid', 'daemon'); #$myip = shift; if ($firewall && !$myip) { # syslog ('err', "FATAL: IP required as command line argument when \$firewall is set to true."); print "FATAL: IP required as command line argument when \$firewall is set to true.\n"; exit(1); } $target = "dup.hn.org"; $version = "v0.22pl0"; $pass = MIME::Base64::encode_base64("$username:$password"); if ($firewall == 1) { $url = "/vanity/update/?VER=1&IP=$myip" ; } else { $url = "/vanity/update/?VER=1" ; } #syslog ('info', 'Setting domain to %s.', $myip); print "Setting domain to $myip\n"; $sock = new IO::Socket::INET( PeerAddr => "$target", PeerPort => 'http(80)' ); if (!$sock) { # syslog('err', "FATAL: Connect to $target, port 80, failed: %m"); print "FATAL: Connect to $target, port 80, failed\n"; exit(1); } $sock->autoflush(1); $sock->print("GET $url HTTP/1.0\r\n"); $sock->print("User-Agent: hammenode.pl $version\r\n"); $sock->print("Host: $target\r\n"); $sock->print("Authorization: Basic $pass\r\n\r\n"); # Legacy sleep from v0.21pl2. May be necessary on some slow PC platforms. # If you are having problems, try uncommenting this first. # #sleep 5; @result = $sock->getlines(); undef $sock; #Close the socket $result = join '', @result; $result =~ m/DDNS_Response_Code=(\d+)/i; $code = $1; if ($code == 101) { # syslog ('info', "Succeeded in setting domain to $myip."); print "Succeeded in setting domain to $myip\n"; exit(0); } else { # syslog ('notice', "Received DDNS Reponse Code $code, probably failed."); print "Received DDNS Reponse Code $code, probably failed.\n"; exit(1); }