#!/usr/bin/perl -w #Author is not held responsible for any damages by this script. #Feel free to redistribute and modify the script. # # # Author: brian2004[at] hotmail[dot] com # # DynDNS Utility v1.0 # Feel free to modify and redistribute under GNU # Obtain IP address from http://checkip.dyndns.org $^W++; # Turn on debug warnings use strict; # Strict Variables! use IO::Socket; # Sock support use MIME::Base64; # Base64 encoding support use Data::Dumper; # Data Dumper use Tk; use Tk::Dialog; use Tk::Entry; use Tk::Label; use Tk::Scrollbar; use Tk::Text; use Tk::Menu; use Tk::Frame; use Tk::DialogBox; use Tk::Menubutton; use Tk::Button; use Tk::Radiobutton; use Tk::Toplevel; use Tk::Optionmenu; my $version = "1.0"; my $lupdate = "April/11/2004"; my $reported_ip = "0.0.0.0"; my $remote_host = "checkip.dyndns.org"; my $remote_port = "80"; my $remote_url = "/"; my @socket_buffer = (); my $tmpdata = ""; my $username = ""; my $password = ""; my $dyntype = "statdns"; my $g_dyntype = "statdns"; my $dynhost = "yourhost.ath.cx"; my $dynstate = "Idle..."; my $encoded; my $decoded; my $h_type = {'Dynamic DNS' => 'dyndns', 'Static DNS' => 'statdns', 'Custom DNS' => 'custom'}; my @host_type = keys %$h_type; # Create and Display GUI my $mw = MainWindow->new(); $mw->title ("Tk-DYNDNS IP Manager"); $mw->geometry('+500+300'); $mw->configure(-menu => my $menubar = $mw->Menu); # File Menu my $file = $menubar->cascade(-label => '~File', -tearoff => 0, ); $file->command( -label => "Close", -accelerator => 'Ctrl-w', -underline => 0, -command => \&exit, ); # Help Menu my $help = $menubar->cascade(-label => '~Help', -tearoff => 0, ); $help->command( -label => "About", -command => \&mnabout, ); my $frm1 = $mw->Frame( -relief => 'groove', -borderwidth => 2, -background => 'black', ) ->pack( -side => 'top', -fill => 'x' ); my $lbl1 = $mw->Label( -text => "Tk-DYNDNS Client. VER: $version", -font => "-family Elephant -weight normal", ) ->pack( -side => 'top' ); my $frm2 = $mw->Frame( -relief => 'groove', -borderwidth => 2, -background => 'gray', ) ->pack( -side => 'top', -padx => 120, -pady => 10, -fill =>'x' ); my $lbl2 = $mw->Label( -text => "Detected IP address:", ) ->pack( -side => 'top', -anchor => 'nw' ); my $txt1 = $mw->Entry( -textvariable => \$reported_ip, -background => 'gray', -foreground => 'black', ) ->pack( -side => 'top', -anchor => 'ne' ); my $lbl3 = $mw->Label( -text => "Your DNS host type: ", ) ->pack( -side => 'top', -anchor => 'nw', ); my $opt1 = $mw->Optionmenu( -options => \@host_type, -variable => \$dyntype, -background => 'gray', ) ->pack( -side => 'top', -anchor => 'ne' ); my $lbl4 = $mw->Label( -text => "Your DNS host name: ", ) ->pack( -side => 'top', -anchor => 'nw', ); my $txt2 = $mw->Entry( -textvariable => \$dynhost, -background => 'gray', ) ->pack( -side => 'top', -anchor => 'ne' ); my $lbl5 = $mw->Label( -text => "Your DNS username: ", ) ->pack( -side => 'top', -anchor => 'nw', ); my $txt3 = $mw->Entry( -textvariable => \$username, -background => 'gray', ) ->pack( -side => 'top', -anchor => 'ne' ); my $lbl6 = $mw->Label( -text => "Your DNS password: ", ) ->pack( -side => 'top', -anchor => 'nw', ); my $txt4 = $mw->Entry( -textvariable => \$password, -show => "*", -background => 'gray', ) ->pack( -side => 'top', -anchor => 'ne' ); my $lbl7 = $mw->Label( -text => "Program status: ", ) ->pack( -side => 'top', -anchor => 'nw', ); my $txt7 = $mw->Entry( -textvariable => \$dynstate, -background => 'grey', ) ->pack( -side => 'top', -anchor => 'ne', ); my $frm3 = $mw->Frame( -relief => 'groove', -borderwidth => 2, -background => 'black', ) ->pack( -side => 'top', -padx => 120, -pady => 10, -fill => 'x' ); my $btn1 = $mw->Button( -text => "Update", -command => sub { &update_ip } ) ->pack( -side => 'left', -anchor => 'nw', ); my $btn2 = $mw->Button( -text => "Done", -command => sub { exit } ) ->pack( -side => 'left', -anchor => 'ne', ); # Focus in the username box $txt3->focus; my $socket = new IO::Socket::INET (PeerAddr => $remote_host, PeerPort => $remote_port, Proto => "tcp", Type => SOCK_STREAM) or die "Can't connect to $remote_host:$remote_port : $!\n"; print $socket "GET $remote_url HTTP/1.0\n"; print $socket "Accept: */*\n"; print $socket "User-Agent: Tk-DynIP ($version)\n"; print $socket "Connection: Keep-Alive\n"; print $socket "\r\n\r\n"; @socket_buffer = <$socket>; foreach (@socket_buffer) { #print $_."\n"; $reported_ip = $_; chop ($reported_ip); if ($reported_ip =~ /[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/) { # Debug # print "\nIP address detected by DynDNS Server: $&\n"; $reported_ip = $&; } } # Initiate Main Loop where the Loop. MainLoop(); # Subroutine for about operation. sub mnabout{ my $dw = $mw->Dialog( -title => 'About IP Manger', -bitmap => 'info', -buttons => ["OK",], -text => "Tk-DYNDNS IP Manager $version\n". "Brian Ponnampalam\n". " ". "Last Updated: $lupdate\n", ); $dw->Show; } # Subroutine for Update operation. sub update_ip{ # Debug # print "Update Loop\n"; # print "Selected: ".$dyntype."\=".$h_type->{"$dyntype"}."\n"; # print $dyntype; $dynstate = "Sending..."; $g_dyntype = $h_type->{"$dyntype"}; $encoded = encode_base64("$username:$password"); #$decoded = decode_base64($encoded); # Debug # print "Encoded: ".$encoded."\n"; # print "Decoded: ".$decoded."\n"; $remote_host = "members.dyndns.org"; $remote_url = "/nic/update\?system\=$g_dyntype\&hostname\=$dynhost\&". "myip\=$reported_ip\&wildcard\=OFF\&mx\=$dynhost\&". "backmx\=YES&offline\=NO"; # Debug # print $remote_url."\n"; $socket = new IO::Socket::INET (PeerAddr => $remote_host, PeerPort => $remote_port, Proto => "tcp", Type => SOCK_STREAM) or die "Can't connect to $remote_host:$remote_port : $!\n"; print $socket "GET $remote_url HTTP/1.0\n"; print $socket "Accept: */*\n"; print $socket "User-Agent: Tk-DynIP ($version)\n"; print $socket "Connection: Keep-Alive\n"; print $socket "Authorization: Basic $encoded\n"; print $socket "\r\n\r\n"; @socket_buffer = <$socket>; # Debug foreach(@socket_buffer){ #Debug #print $_; if ($_ =~ /badauth/){ $dynstate = "Invalid username/password."; #Debug #print $dynstate."\n"; } elsif ($_ =~ /nochg/){ $dynstate = "No change necessary."; #Debug #print $dynstate."\n"; } elsif($_ =~ /good/){ $dynstate = "Updated sucessfully."; #Debug #print $dynstate."\n"; } elsif($_ =~ /nohost/){ $dynstate = "Host type doesn't match/exist."; #Debug #print $dynstate."\n"; } elsif($_ =~ /abuse/){ $dynstate = "Abuse host is blocked."; #Debug #print $dynstate."\n"; } else{ #Debug print $_ } } }