先讲一下项目背景,及系统需求。
客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。
怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。
上图是实现FTP文件下载的架构,注意Unix客户端一般默认就有ftp服务,所以你只需打开服务就好。
而windows客户端一般需要安装ftp服务及perl语言环境。
而作为共享给客户的FTP服务器,需要用任务管理器调用Perl脚本。以确保每小时从服务器机台获得数据。
下面,解释一下Perl脚本的实现。
#!/usr/bin/perl
use Net::FTP;use POSIX;
use Digest::MD5;
两个调用参数
$arg2 = $ARGV[1];
################
$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);
#制作时间戳
$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,$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");
}
}
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();}
$file = "$Dir_server/$element/.iu_all_output";
}
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";}
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";$md5test2 = 0;
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");
}
}
}
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";
}
#连接服务器函数
connect_retry:
}
connect_retry:
my $err=0;
my $ftp = Net::FTP->new("$arg2") or $err=1;
if($err==1) {
print "Connection failed\n";
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;
}
print "Login failed, ".localtime()."\n";
next;
}
return $ftp;
}