#!/usr/bin/perl # # $Header: /usr/machine/nat/RCS/nat,v 1.6 2002/06/22 01:16:00 sanpei Exp sanpei $ # $DEBUG = 0; # # local settings # $POOLING_TIME = 60; #seconds) $WAN_INTERFACE = "ed1"; $NAT_DIR = "/usr/machine/nat"; $HEADER = "${NAT_DIR}/header.html"; $MIDDLE = "${NAT_DIR}/middle.html"; $FOOTER = "${NAT_DIR}/footer.html"; $MY_HOME = "my-home.html"; $MY_HOME_HTML = "/tmp/$MY_HOME"; $FTP_COMMAND = "/tmp/put_html"; # # for FreeBSD settings # $DHCPC = "/usr/local/sbin/dhcpc"; $DHCPC_PID = "/var/run/dhcpc.$WAN_INTERFACE.pid"; $DHCPC_START = "$DHCPC $WAN_INTERFACE"; $PS = "/bin/ps"; $PS_OPT = "axuww"; $IFCONFIG = "/sbin/ifconfig"; $PING_BIN = "/sbin/ping"; $CHECK_HOST = "219.117.164.1" ; # www.seaple.icc.ne.jp $KILLALL = "/usr/bin/killall"; # # initialize variable # $old_wan_ip = "0.0.0.0"; while (1) { &check_wan_ip; &check_dhcpc; sleep($POOLING_TIME); } ################### # # check wan_ip # sub check_wan_ip { $current_wan_ip = &ischange_wan_ip; if (! $current_wan_ip) { return 0; } else { system("/usr/local/sbin/ddup --host lily.homedns.org --ip $current_wan_ip"); &recreate_html($current_wan_ip); $old_wan_ip = $current_wan_ip; return 0; } } # # ischange_wan_ip # return wan_ip_address (if wan_interface address was changed) # 0 (if it was not changed # or still not get wan ip address via dhcp) # sub ischange_wan_ip { my($current_wan_ip); $current_wan_ip = &get_wan_ip($WAN_INTERFACE); if ($current_wan_ip =~ /^10.0/) { return 0; } elsif ($current_wan_ip eq $old_wan_ip) { return 0; } else { return $current_wan_ip; } } sub get_wan_ip { local($WAN_INTERFACE) = @_; local($wan_ip, $d1, $d3); open(IFCONFIG, "$IFCONFIG $WAN_INTERFACE |"); while () { chonp; if ($DEBUG) { print "$_\n"; } if (/inet/) { ($d1, $wan_ip, $d3) = split(/ /, $_, 3); } } close(IFCONFIG); if ($DEBUG) { print "$wan_ip\n"; } if ($DEBUG) { return time; } else { return $wan_ip; } } ################ # # check dhcpc # sub check_dhcpc { if (&isconnect_server == 0) { &killdhcpc; } if (&isstaydhcpc) { return 0; } else { &restart_dhcpc; } } sub isconnect_server { if (system("${PING_BIN} -c 1 ${CHECK_HOST} > /dev/null 2>&1") == 0) { return 1; } else { return 0; } } sub killdhcpc { system("${KILLALL} dhcpc"); system("${IFCONFIG} ${WAN_INTERFACE} down"); system("${IFCONFIG} ${WAN_INTERFACE} delete"); } sub restart_dhcpc { system($DHCPC_START); } sub isstaydhcpc { open(FP, "< $DHCPC_PID"); $dhcpc_pid = ; close(FP); open (PS, "$PS $PS_OPT |"); while () { ($dummy1, $pid, $dummy2) = split(/[ \t\n]+/, $_, 3); if ($_ =~ /dhcpc/ && $_ =~ /$WAN_INTERFACE/ && $pid == $dhcpc_pid) { close(PS); return 1; } } close(PS); return 0; } ################### # # recreate html # sub recreate_html { my($wan_ip) = @_; open(HOME, "> $MY_HOME_HTML"); &put_file_to($HEADER); if (0) { print HOME "\n"; print HOME "$wan_ip\n"; print HOME "\n"; } else { print HOME "[1]"; print HOME "$wan_ip\n"; } &put_file_to($MIDDLE); print HOME `date`; print HOME "\n"; &put_file_to($FOOTER); close(HOME); &create_ftp_command; } sub put_file_to { my($file) = @_; open(FP_TMP, "< $file"); open(FP2, ">> /tmp/zz"); while () { print HOME $_; print FP2 $_; } close(FP); close(FP2); } sub create_ftp_command { open(fp, "> $FTP_COMMAND"); print fp <<"---"; #!/bin/csh -f cd /tmp setenv HOME /root ftp www.seaple.icc.ne.jp << _EOF_ >&! ftp.log cd public_html bin --- print fp "put $MY_HOME\n"; print fp <<"---"; quit _EOF_ --- close(fp); system("chmod +x ". $FTP_COMMAND); system($FTP_COMMAND); }