先讲一下项目背景,及系统需求。
客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。
怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。
上图是实现FTP文件下载的架构,注意Unix客户端一般默认就有ftp服务,所以你只需打开服务就好。
而windows客户端一般需要安装ftp服务及perl语言环境。
而作为共享给客户的FTP服务器,需要用任务管理器调用Perl脚本。以确保每小时从服务器机台获得数据。
下面,解释一下Perl脚本的实现。
#!/usr/bin/perl
use Net::FTP; use POSIX; use Digest::MD5;两个调用参数
$arg2 = $ARGV[1];
################
$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);
#制作时间戳
#提取数组信息,将不同的系统信息进行归类,大概有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,$position,6); push(@LHT, "$data");}
elsif ($data =~ /LMX-/) {
my $position = rindex ($data,"LMX-"); $data = substr ($data,$position,6); push(@LMX, "$data");}
elsif (($data =~ /HP93K/) && (!($data =~ /L/))){
my $position = rindex ($data,"HP93K"); $data = substr ($data,$position,7); push(@HP93, "$data");}
elsif (($data =~ /HP93K/) && ($data =~ /L/)){
my $position = rindex ($data,"HP93K"); $data = substr ($data,$position,8); push(@HP93, "$data"); } elsif ($data =~ /HPPS-/){ my $position = rindex ($data,"HPPS-"); $data = substr ($data,$position,7); push(@HPPS, "$data");}
elsif ($data =~ /HPQD-/){
my $position = rindex ($data,"HPQD-"); $data = substr ($data,$position,7); push(@HPQD, "$data");}
elsif ($data =~ /HPLC-/){
my $position = rindex ($data,"HPLC-"); $data = substr ($data,$position,7); push(@HPLC, "$data");}
elsif ($data =~ /IFLEXC/){
my $position = rindex ($data,"IFLEXC"); $data = substr ($data,$position,8); push(@IFLEX, "$data");}
elsif ($data =~ /UFLEX-/){
my $position = rindex ($data,"UFLEX-"); $data = substr ($data,$position,8); push(@UFLEX, "$data");}
elsif ($data =~ /UFHD-/){
my $position = rindex ($data,"UFHD-"); $data = substr ($data,$position,7); push(@UFLEX, "$data");}
elsif (($data =~ /CAT-\d\d\d/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){
my $position = rindex ($data,"CAT-"); $data = substr ($data,$position,7); push(@CAT, "$data");}
elsif (($data =~ /CAT-\d\d/) && (!($data =~ /T$/)) && (!($data =~ /isolated/))){
my $position = rindex ($data,"CAT-"); $data = substr ($data,$position,6); push(@CAT, "$data");}
elsif (($data =~ /TGR-/) && (!($data =~ /T$/))) {
my $position = rindex ($data,"TGR-"); $data = substr ($data,$position,6); push(@TGR, "$data"); }}
#根据$arg1,确定要收集那些机台的数据 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 $arg1\n"; @tester = @$arg1;}
elsif (($arg1 =~ /^LTXC\d$/) || ($arg1 =~ /^LHT-\d\d$/) || ($arg1 =~ /^LMX-\d\d$/) || ($arg1 =~ /^HP93KC\d$/) || ($arg1 =~ /^HP93KC\dL$/) || ($arg1 =~ /^HPPS-\d\d$/) || ($arg1 =~ /^HPQD-\d\d$/) || ($arg1 =~ /^HPLC-\d\d$/) || ($arg1 =~ /^IFLEXC\d\d$/) || ($arg1 =~ /^IFLEXC\d$/) || ($arg1 =~ /^UFLEX-\d\d$/) || ($arg1 =~ /^UFHD-\d\d$/) || ($arg1 =~ /^CAT-\d\d$/) || ($arg1 =~ /^CAT-\d\d\d$/)|| ($arg1 =~ /^TGR-\d\d$/) ) {
print "Collecting tester $arg1\n"; @tester = ("$arg1");}
elsif ($arg1 =~ /^ALL$/) {
print "Collecting for all tester\n"; @tester = (@LTX, @LHT, @LMX, @HP93, @HPPS, @HPQD, @HPLC, @IFLEX, @UFLEX, @UFHD, @CAT, @TGR);}
else {
print "Usage Tester_config_download.pl var1\n"; print "var1 = HPPS --> run for all HPPS\n"; print "var1 = HPPS-01 --> run for HPPS-01\n"; print "var1 = ALL --> run for all tester\n"; print "supported tester platforms are LTX, LHT, LMX, HP93, HPPS, HPQD, HPLC, IFLEX, UFLEX, UFHD\n"; 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/$element\n"; 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_lcx\n"; mget($ftp, ".iu_all_output");}
elsif ($element =~ /^HP93KC\d$/) {
$ftp->cwd($Dir_tester_hp); mget($ftp, "di_log_file_$year.$month.$date*");}
elsif ($element =~ /^HP93KC\dL$/) {
$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_win\n"; mget($ftp, "IGXLEventLog.$month.$date.$year*");}
$ftp->quit();}
}
elsif ($element =~ /^HP93KC\d$/) {
$file = "$Dir_server/$element/di_log_file";}
elsif (($element =~ /^CAT-\d\d$/) || ($element =~ /^CAT-\d\d\d$/) || ($element =~ /^TGR-/)) {
$file = "$Dir_server/$element/Tconfig";}
binmode (FILE);
#文件进行MD5加密
$file_md5sum=Digest::MD5->new->addfile(*FILE)->hexdigest;close(FILE);
print "$file_md5sum $file \n";$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"); }}
}
}
#连接服务器函数