用Perl脚本实现FTP的文件下载
先讲一下项目背景,及系统需求。 客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。 怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。 上图是实现FTP文件下载的架构,注意Unix客户端一般默认就有ftp服务,所以你只需打开服务就好。 而windows客户端一般需要安装ftp服务及perl语言环境。 而作为共享给客户的FTP服务器,需要用任务管理器调用Perl脚本。以确保每小时从服务器机台获得数据。 下面,解释一下Perl脚本的实现。 #!/usr/bin/perl use Net::FTP;use POSIX; use Digest::MD5; 两个调用参数
################
$arg1 = $ARGV[0];
$arg2 = $ARGV[1]; ################
# 下面五行分别指出数据在不同系统的存放路径,第五行是FTP文件夹的存放路径
$hosts_file="hosts"; $Dir_tester_lcx = '/opt/ltx_nic/user_data'; $Dir_tester_hp = '/var/opt/hp93000/soc/diagnostic'; $Dir_tester_tera_win = '/Program Files/Teradyne/IG-XL/logs'; $Dir_server = '/export/np101/System/automation/Tester_Hardware/Data'; open(DAT,"$hosts_file") || die ("Could not open file $hosts_file"); #声明一个数组存放系统信息 @raw_data = <DAT>;close (DAT); #制作时间戳
$minute = strftime('%M',localtime);
$hour = strftime('%H',localtime); $date = strftime('%d',localtime); $date_without_zero = strftime("%-d",localtime); $month = strftime('%m',localtime); $month_without_zero = strftime("%-m",localtime); $year = strftime('%Y',localtime); #提取数组信息,将不同的系统信息进行归类,大概有11类操作系统及机台系统 foreach $data (@raw_data) {if ($data =~ /LTXC/) { ? ? my $position = rindex ($data,"LTXC"); ? ? $data = substr ($data,$position,5); ? ? push(@LTX,"$data"); } elsif ($data =~ /LHT-/) { ? ? ? ?my $position = rindex ($data,"LHT-");? ? ? ?$data = substr ($data,6); ? ? ? ?push(@LHT,"$data"); ? ? ? ?} elsif ($data =~ /LMX-/) { ? ? ? ?my $position = rindex ($data,"LMX-");? ? ? ?$data = substr ($data,6); ? ? ? ?push(@LMX,"$data"); ? ? ? ?} elsif (($data =~ /HP93K/) && (!($data =~ /L/))){ ? ? ? ?my $position = rindex ($data,"HP93K");? ? ? ?$data = substr ($data,7); ? ? ? ?push(@HP93,"$data"); ? ? ? ?} elsif (($data =~ /HP93K/) && ($data =~ /L/)){ ? ? ? ?my $position = rindex ($data,8);? ? ? ?push(@HP93,"$data"); ? ? ? ?} elsif ($data =~ /HPPS-/){ ? ? ? ?my $position = rindex ($data,"HPPS-"); ? ? ? ?$data = substr ($data,7); ? ? ? ?push(@HPPS,"$data"); ? ? ? ?} elsif ($data =~ /HPQD-/){ ? ? ? ?my $position = rindex ($data,"HPQD-");? ? ? ?$data = substr ($data,7); ? ? ? ?push(@HPQD,"$data"); ? ? ? ?} elsif ($data =~ /HPLC-/){ ? ? ? ?my $position = rindex ($data,"HPLC-");? ? ? ?$data = substr ($data,7); ? ? ? ?push(@HPLC,"$data"); ? ? ? ?} elsif ($data =~ /IFLEXC/){ ? ? ? ?my $position = rindex ($data,"IFLEXC");? ? ? ?$data = substr ($data,8); ? ? ? ?push(@IFLEX,"$data"); ? ? ? ?} elsif ($data =~ /UFLEX-/){ ? ? ? ?my $position = rindex ($data,"UFLEX-");? ? ? ?$data = substr ($data,8); ? ? ? ?push(@UFLEX,"$data"); ? ? ? ?} elsif ($data =~ /UFHD-/){ ? ? ? ?my $position = rindex ($data,"UFHD-");? ? ? ?$data = substr ($data,7); ? ? ? ?push(@UFLEX,"$data"); ? ? ? ?} elsif (($data =~ /CAT-ddd/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){ ? ? ? ?my $position = rindex ($data,"CAT-");? ? ? ?$data = substr ($data,7); ? ? ? ?push(@CAT,"$data"); ? ? ? ?} elsif (($data =~ /CAT-dd/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){ ? ? ? ?my $position = rindex ($data,6);? ? ? ?push(@CAT,"$data"); ? ? ? ?} elsif (($data =~ /TGR-/) && (!($data =~ /T$/))) { ? ? ? ?my $position = rindex ($data,"TGR-");? ? ? ?$data = substr ($data,6); ? ? ? ?push(@TGR,"$data"); ? ? ? ?} } if (($arg1 =~ /^LTXC$/) || ($arg1 =~ /^LHT$/) || ($arg1 =~ /^LMX$/) || ($arg1 =~ /^HP93$/) || ($arg1 =~ /^HP93L$/) || ($arg1 =~ /^HPPS$/) || ($arg1 =~ /^HPQD$/) || ($arg1 =~ /^HPLC$/) || ($arg1 =~ /^IFLEXC$/) || ($arg1 =~ /^UFLEX$/) || ($arg1 =~ /^UFHD$/) ?|| ($arg1 =~ /^CAT$/) || ($arg1 =~ /^TGR$/)) ?{ print "Collecting for all $arg1n"; @tester = @$arg1; } elsif (($arg1 =~ /^LTXCd$/) || ($arg1 =~ /^LHT-dd$/) || ($arg1 =~ /^LMX-dd$/) || ($arg1 =~ /^HP93KCd$/) || ($arg1 =~ /^HP93KCdL$/) || ($arg1 =~ /^HPPS-dd$/) || ($arg1 =~ /^HPQD-dd$/) || ($arg1 =~ /^HPLC-dd$/) || ($arg1 =~ /^IFLEXCdd$/) || ($arg1 =~ /^IFLEXCd$/) || ($arg1 =~ /^UFLEX-dd$/) || ($arg1 =~ /^UFHD-dd$/) || ($arg1 =~ /^CAT-dd$/) || ($arg1 =~ /^CAT-ddd$/)|| ($arg1 =~ /^TGR-dd$/) ) ?{ ? ? ? ?print "Collecting tester $arg1n";? ? ? ?@tester = ("$arg1"); } elsif ($arg1 =~ /^ALL$/) { print "Collecting for all testern";@tester = (@LTX,@LHT,@LMX,@HP93,@HPPS,@HPQD,@HPLC,@IFLEX,@UFLEX,@UFHD,@CAT,@TGR); } else { ? ? ? ?print "Usage Tester_config_download.pl var1n";? ? ? ?print "var1 = HPPS ? ? ?--> run for all HPPSn"; ? ? ? ?print "var1 = HPPS-01 ? --> run for HPPS-01n"; ? ? ? ?print "var1 = ALL --> run for all testern"; ? ?print "supported tester platforms are LTX,LHT,LMX,HP93,HPPS,HPQD,HPLC,IFLEX,UFLEX,UFHDn"; ? ? ? ?exit 1 } @tester = sort(@tester); foreach $element (@tester){ ? ? ? ?if( !-d "$Dir_server/$element") { ? ? ? ? mkdir "D:/inetpub/ftproot/OTPMS/$element"; } chdir "D:/inetpub/ftproot/OTPMS/$element"; print "D:/OTPMS/$elementn"; if ( (!($element =~ /CAT/)) && (!($element =~ /TGR/)) ) ?{ print "starting ftp to $element n"; #建立连接 $ftp = connect_ftpserver();# 开始下载文件 $ftp->binary(); ? hosts_retry: ? $err=0; ? if ($element =~ /LTXC*|LHT-*|LMX-*/) { ? ? ? $ftp->cwd($Dir_tester_lcx); ? ? ? print "$Dir_tester_lcxn"; ? ? ? mget($ftp,".iu_all_output"); ? } ? elsif ($element =~ /^HP93KCd$/) { ? ? ? $ftp->cwd($Dir_tester_hp);? ? ? mget($ftp,"di_log_file_$year.$month.$date*"); ? } ? elsif ($element =~ /^HP93KCdL$/) { ? ? ? $ftp->cwd($Dir_tester_hp);? ? ? mget($ftp,"di_log_file_$year.$month.$date*"); ? } ? elsif($element =~ /HPPS-*|HPQD-*|HPLC-*/){ ? ? ? $ftp->cwd($Dir_tester_hp);? ? ? mget($ftp,"di_log_file_$year.$month.$date*"); ? } ? elsif($element =~ /IFLEXC*|UFLEX-*|UFHD-*/){ ? ? ? $ftp->cwd($Dir_tester_tera_win) or warn $ftp->message;? ? ? print "$Dir_tester_tera_winn"; ? ? ? mget($ftp,"IGXLEventLog.$month.$date.$year*"); } ? ?$ftp->quit();}
if ($element =~ /LTXC*|LHT-*|LMX-*/) {
? ?$file = "$Dir_server/$element/.iu_all_output"; } elsif ($element =~ /^HP93KCd$/) { ? ?$file = "$Dir_server/$element/di_log_file";} elsif (($element =~ /^CAT-dd$/) || ($element =~ /^CAT-ddd$/) || ($element =~ /^TGR-/)) { ? ?$file = "$Dir_server/$element/Tconfig";}
if (($element =~ /LTXC*|LHT-*|LMX-*/) || ($element =~ /^HP93KCd$/) || ($element =~ /^CAT-dd$/) || ($element =~ /^CAT-ddd$/) || ($element =~ /^TGR-/) ) {
if ( -f $file) { open(FILE,$file) or die "Can't open '$file': $!"; binmode (FILE); #文件进行MD5加密 $file_md5sum=Digest::MD5->new->addfile(*FILE)->hexdigest;close(FILE); print "$file_md5sum $file n";
system ("touch $file_$year_$month_$date");
$md5test2 = 0;
foreach my $element2 (`ls $file_$year_$month_$date*`) {
? ?open(FILE2,$element2) ?or die "Can't open '$element2': $!"; ? ?binmode (FILE2); ? ?$file2_md5sum=Digest::MD5->new->addfile(*FILE2)->hexdigest; ? ?close(FILE2); ? ?print "$file2_md5sum $element2 n"; ? ?if ($file_md5sum eq $file2_md5sum) { ? ? ? ?$md5test2 = 1; ? ?} ? ?else { ? ? ? ?$md5test1 = 0;? ?} ? ?if ($element2 =~ /^$file_$year_$month_$date$/) { ? ? ? ?print "Deleting $element2"; ? ? ? ?system ("rm $element2"); ? ?} } ? ? ? ?if (($md5test1 == 0) && ($md5test2 != 1)) { ? ? ? ? ? ? system ("cp $file $file_$year_$month_$date_$hour:$minute"); ? ? ? ? } ? ?} }
sub mget {
? ?my ($ftp,$pattern) = @_; ? ?$ftp->binary(); ? ?my @array = $ftp->ls($pattern) or $ftp->message; ? ?foreach my $file (@array) { ? ? ? ?$ftp->get($file) or $err=1; ? ? ? ?#$ftp->message(); ? ? ? ?if($err == 1) { ? ? ? ? ? ?if($ftp_freq == 3) { ? ? ? ? ? ? ? ?print "FTP fail more then 3 times,".localtime()."n"; ? ? ? ? ? ? ? ? ? ?exit 2; ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ?++$ftp_freq; ? ? ? ? ? ? ? ?print "Download failed,".$element.localtime()."n"; ? ? ? ? ? ? ? ?$ftp->quit(); ? ? ? ? ? ? ? ?$ftp = connect_ftpserver(); ? ? ? ? ? ? ? ?$ftp->ascii(); ? ? ? ? ? ? ? ?$ftp->binary(); ? ? ? ? ? ? ? ?goto hosts_retry; ? ? ? ?} ? ? ? ?print "Download file $file from ".$element." is done at ".localtime()."n";
? ?}
} #连接服务器函数
sub connect_ftpserver {
connect_retry: }
sub connect_ftpserver {
connect_retry: ? ? ? ?my $err=0; ? ? ?my $ftp = Net::FTP->new("$arg2") or $err=1; ? ? ? ?if($err==1) { ? ? ? ? ? ? ? ?print "Connection failedn"; ? ? ? ? ? ? ? ?next; ? ? ? ?} ? ? ? ?$err=0; ? ? ? ?if($element =~ /LTXC*/) { ? ? ? ?$ftp->login("root","SyncMaster") or $err=1 ? ? ? ?} elsif($element =~ /LHT-*/) { ? ? ? ?$ftp->login("login_name","login_password") or $err=1 ? ? ? ?} elsif($element =~ /LMX-*/) { ? ? ? ?$ftp->login("login_name","login_password") or $err=1 ? ? ? ?} elsif($element =~ /HP93K*/) { ? ? ? ?$ftp->login("root","SyncMaster") or $err=1 ? ? ? ?} elsif($element =~ /HPPS-*/){ ? ? ? ?$ftp->login("login_name","login_password") or $err=1 ? ? ? ?} elsif($element =~ /HPQD-*/){ ? ? ? ?$ftp->login("login_name","login_password") or $err=1 ? ? ? ?} elsif($element =~ /HPLC-*/){ ? ? ? ?$ftp->login("login_name","login_password") or $err=1 ? ? ? ?} elsif($element =~ /IFLEXC*|UFLEX-*|UFHD-*/){ ? ? ? ?$ftp->login("root","root123") or $err=1; ? ? }
? ? ? ?if($err==1) {
? ? ? ? ? ? ? ?print "Login failed,".localtime()."n"; ? ? ? ? ? ? ? ?next; ? ? ? ?} ? ? ? ?return $ftp; ? ?}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |