您的位置:首页 > 编程语言 > PHP开发

用Perl脚本实现FTP的文件下载

2013-05-21 10:01 232 查看
先讲一下项目背景,及系统需求。
客户想每小时获取一下公司为其准备的生产数据,但数据是分布在不同的系统及不同的文件夹下。考虑到安全因素,也不可能把所有的服务器都暴露给客户。
怎么办呢?可以考虑把分布在不同服务器的数据定时集中收集起来,放在一个共享给客户的文件夹下,供客户来读取。



上图是实现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;
}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息