先讲一下项目背景,及系统需求。

客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。

怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。

091522653.png

上图是实现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,$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();

}


if ($element =~ /LTXC*|LHT-*|LMX-*/) {
   $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 (($element =~ /LTXC*|LHT-*|LMX-*/) || ($element =~ /^HP93KC\d$/) || ($element =~ /^CAT-\d\d$/) || ($element =~ /^CAT-\d\d\d$/) || ($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 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;
    }
       if($err==1) {
               print "Login failed, ".localtime()."\n";
               next;
       }
       return $ftp;
   }
}