#!/usr/local/bin/perl5
#  ↑このパスはサーバーによって違うので調べて設定します。#★必要時変更
#
#　ipftp.pl  by A.Sato 1999.4.10- ver1.1 update 1999.4.28
#　これを実行したマシンのIPアドレスを取得して、指定したファイル
#　の指定された文字列をIPアドレスの文字列に変換しFTPする
#
#　実行するときは、#perl5 ipftp.pl　で実行します。
#
#　ftp用モジュール(下に書いてあるようにgetしてインストールする)
#ftp://www.perl.com/pub/perl/CPAN/modules/by-module/Net/
#から libnet-1.0606.tar.gzをダウンロードする
#
#tar -zxvf libnet-1.0606.tar.gz (tar -xvf libnet-1.0606.tar)
#　解凍したディレクトリーに入って(cd libnet-1.0606)
#  perl5 Makefile.PL　(質問に答える　ほぼデフォルトでOK)
#  make
#  make test
#  make install
#
use Net::FTP;

############################################################################
#初期設定

#  内容が書き込まれる記録ファイルを設定
$tmp1_file = 'ipftp.ifc'; #ifconfigで今回取り出したファイル　←自動作成
$tmp2_file = 'ipftp.ipa'; #前回のIPアドレスのファイル　←自動作成

#その他　#★の行を必要時変更すること

############################################################################
#これを実行したマシンのアドレスを取得する

#シェルコマンドifconfigでマシンのアドレスの行を取り出す(FreeBSD用)
system("ifconfig -a | grep 210. >$tmp1_file"); #★必要時変更

#現在のIPアドレスを変数に入れる($tmp1_fileから)
open(IN,$tmp1_file) || die "Cannot open $tmp1_file for reading\n";
while (<IN>) { # INファイルから1行$_に読み込む
	$st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更
	$en = index($_,"netmask") - 1; #取り出し終了文字位置 #★必要時変更
	$ipaddr_new = substr($_, $st,($en - $st));#IPアドレスを取得
}
close(IN);
print "done... ifconfig\n";

############################################################################
#過去のIPアドレスを読み込む($tmp2_fileから)

if (-e $tmp2_file){ #$tmp2_fileが存在しないときは、新規作成する
	;#存在する
}else{
	open(OUT,">$tmp2_file") || die "Cannot create $tmp2_file\n";
	print OUT " "; # OUTファイルにダミーを書き込む
	close(OUT);
}
open(IN,$tmp2_file) || die "Cannot open $tmp2_file for reading\n";
while (<IN>) { # INファイルから1行$_に読み込む
	$st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更
	$ipaddr_old = substr($_, $st,20);#IPアドレスを取得
}
close(IN);
print "done... IP address get\n";

############################################################################
#過去と現在の比較のため「.」を「_」に変換し比較する

$_=$ipaddr_old; tr/./_/; $ipaddr_old2=$_;
$_=$ipaddr_new; tr/./_/; $ipaddr_new2=$_;

print "old address is $ipaddr_old ($ipaddr_old2)\n";
print "new address is $ipaddr_new ($ipaddr_new2)\n";

$st = index($ipaddr_new2,$ipaddr_old2) ;
if ($st > -1){ #IPアドレスが変更されなかったとき
	print "IP Address is not changed.\n";
	exit;
}else{ #IPアドレスが変更されたとき
	print "IP Address is changed.\n";
	open(OUT,">$tmp2_file") || die "Cannot create $tmp2_file\n";
	print OUT $ipaddr_new; # OUTファイルにIPアドレスを書き込む
	close(OUT);

	#ローカルのファイルの書き換え(/etc/natrulesなど)
#	&local_conv;　#ローカルファイルを書き換えるときの参考にしてください

	#外部(ftp先)のファイルの書き換え
	&ftpconv; #変換作業ルーチンへ
}

############################################################################
#ローカルのファイルの書き換え
sub local_conv{
#	$infile = 'ipftp.old';#変換前の入力ファイル #★必要時変更
#	$outfile = 'ipftp.new'; #変換後の出力ファイル #★必要時変更
#
#	system("cd /root"); #★必要時変更
#	system("cp /etc/natrules ipftp.old"); #★必要時変更
#	&conv;
#	system("cp ipftp.new /etc/natrules"); #★必要時変更
#
#	print "local file is changed.\n";
}
############################################################################
#変換したいファイルをftpして変換後ftpしてもどす
sub ftpconv{

	$outfile = 'temp.html'; #変換後の出力ファイル
	$Host = 'www.catv123.ne.jp';    # ftp先 ホストを指定 ★必要時変更
	$User = 'my_id';             # ftp先 のアカウントを指定 ★必要時変更
	$Password = 'my_pass';       # ftp先 のパスワードを指定 ★必要時変更
	$TopDir = 'public_html/temp'; # ftp先 のディレクトリー ★必要時変更

	&ftp_con; #ftpの接続

	###########ファイルが複数の時は処理をこのように追加する###########
	$infile = 'index2.html';#変換前の入力ファイル ★必要時変更
	&ftp_getput; #ftpからgetとして変換してputする(1つ目のファイル)
#	###########ファイルが複数の時は処理をこのように追加する###########
#	$TopDir = '../';  # public_html/index.htmlの場合 ★必要時変更
#	$infile = 'index.html';#変換前の入力ファイル ★必要時変更
#	&ftp_getput;
#	##################################################################

	&ftp_discon; #ftpの接続をやめる
}

############################################################################
#ftpサブルーチン
sub ftp_con{
	#ftpの接続をする
	print "Connecting... to $Host  Please wait!\n";
	$ftp = Net::FTP->new($Host) or die "can not Net::FTP \"$Host\": $!";
	print "login...\n";
	$ftp->login($User, $Password) or die "can not Net::FTP login \"$User\": $!";
	print "binary mode\n";
	$ftp->binary or die "can not Net::FTP binary: $!";
}

sub ftp_getput{
	print "cd $TopDir\n";
	$ftp->cwd($TopDir) or die "can not Net::FTP cwd \"$TopDir\": $!";
	#ftpで変換元のファイルをgetしてくる
	print "getting $TopDir/$infile\n";
	$ftp->get("$infile");

	&conv;#変換ルーチンへ
	unlink($infile);#変換前のファイルを削除
	rename($outfile,$infile);#変換後のファイルを変換前のファイル名にする

	#ftpで変換後のファイルをputする
	print "putting $TopDir/$infile\n";
	$ftp->put($infile) or die "can not Net::FTP put \"$t\": $!";

	unlink($infile);#変換後のファイルを削除
}

sub ftp_discon{
	#ftpの接続を切る
	$ftp->quit;
}

############################################################################
#$infileファイルを読み込んで置換し$outfileをつくる

sub conv {
	open(IN,$infile) || die "Cannot open $infile for reading\n";
	open(OUT,">$outfile") || die "Cannot create $outfile\n";
	while (<IN>) { # INファイルから1行$_に読み込む
		$st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更
		if ($st > -1){
			$en = index($_,"/~my_id"); #取り出し終了文字位置 #★必要時変更
			if ($en < 0) {$en = index($_,"/~");} #★必要時変更
#			if ($en < 0) {$en = index($_,"/32 portmap");} #★必要時変更
			$temp = substr($_,0,$st);
			print OUT $temp;
			print OUT $ipaddr_new; # OUTファイルにIPアドレスを書き込む
			$temp = substr($_,$en,254);
			print OUT $temp;
		}else{#検索文字がない行はそのまま書き込む
			print OUT $_;
		}
	}
	close(IN);
	close(OUT);
}
