写的一个perl程序

功能:从话单ftp服务器获取话单,然后备份到备份ftp服务器,然后对话单做处理,然后入库。

用到了其他几个perl模块,可以到cpan.org上去下载,安装就ok了(linux/unix下需要使用root用户安装),其他的看说明。

[@more@]

cdr2db.pl

#!/usr/bin/perl
#CopyRight @2005 www.zte.com.cn
#writer : wang.zhihong1@zte.com.cn
#revsion : 2005-07-29 08:50 增加对要访问数据库tns的配置
# 2005-07-29 08:55 增加在数据库无法访问的时候不删除文件的处理
# 2005-07-29 09:15 增加对备份ftp服务器上目录不存在时的异常处理
# 2005-07-29 09:19 增加对备份ftp服务器上不可用时对话单的本地备份处理
# 2005-07-29 09:38 增加对备份ftp服务器上目录不可用,创建仍不可用的处理
# 2005-07-30 09:38 增加对获取文件的名字的限定,只获取RING开头的文件
# 2005-07-30 09:43 合并配置文件
# 2005-07-30 09:56 对获取过来文件转换后名字加前缀"sqlldr.",只备份原始话单文件,如果该文件无法入库,则一直放在该目录下等待人工处理
# 2005-07-30 10:36 增加对配置文件的冗余,广东需要配置两个备份路径,其他地方可能一个
# 2005-07-30 11:33 增加对本地路径是否存在的判断,如果不存在,创建

use strict;
use warnings;
use File::Copy;
use File::stat;
use File::Find;
use Net::FTP;
use Net::FTP::File;
use Date::Parse;
use Oracle::SQLLoader qw/$CHAR $INT $DECIMAL $DATE/;
use Time::Local;
use FileHandle;
use File::chdir;
use Cwd;
use Config::IniFiles;
##================================================================##
#获取当前年月日YYYY-MM-DD HH:MI:ss格式
sub timeString {
my $year = (localtime())[5];
my $mon = (localtime())[4];
my $mday = (localtime())[3];
my $hour = (localtime())[2];
my $min = (localtime())[1];
my $sec = (localtime())[0];

return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
}

sub yyyymmddString {
my $year = (localtime())[5];
my $mon = (localtime())[4];
my $mday = (localtime())[3];
return sprintf("%04d%02d%02d", $year+1900, $mon+1, $mday);
}
##================================================================##


##================================================================##
#判断程序参数个数
if((my $NUM=@ARGV)==0){
print "***********************************************n";
print "** usuage: cdr2db.pl path **n";
print "** usuage: path 为该perl程序的安装路径 **n";
print "** writer: wangzhihong.china@gmail祝你一切顺利**n";
print "***********************************************n";
exit;
}else{
print "***********************************************n";
print "** CopyRight:@2005 www.zte.com.cn **n";
print "** **n";
print "** writer: wangzhihong.china@gmail祝你一切顺利**n";
print "***********************************************n";
}
##================================================================##

##================================================================##
#获取配置信息
##获取配置文件所在路径
my $config_path=shift(@ARGV);
#读取配置文件。
my $cdr2db_cfg = Config::IniFiles->new( -file => "$config_path/cdr2db.config" );
## FTP服务器的IP地址 ##
my $ftp_server = $cdr2db_cfg->val('FTPServer', 'ftp_server') ||'';
## 指定的FTP上传目录路径 ##
my $ftp_dir = $cdr2db_cfg->val('FTPServer', 'ftp_dir') || '';
## FTP的登陆用户名 ##
my $ftp_userid = $cdr2db_cfg->val('FTPServer', 'ftp_userid') || '';
## FTP的登陆密码 ##
my $ftp_passwd = $cdr2db_cfg->val('FTPServer', 'ftp_passwd') || '';
##备份ftp服务器地址
my $put_server = $cdr2db_cfg->val('FTPServer', 'put_server') || '';
##备份路径1
my $put_dir1 = $cdr2db_cfg->val('FTPServer', 'put_dir1') || '';
##备份路径2
my $put_dir2 = $cdr2db_cfg->val('FTPServer', 'put_dir2') || '';
##备份ftp服务器用户名
my $put_userid = $cdr2db_cfg->val('FTPServer', 'put_userid') || '';
##备份ftp服务器密码
my $put_passwd = $cdr2db_cfg->val('FTPServer', 'put_passwd') || '';
##获取的话单文件放置在本地的临时路径
my $local_path = $cdr2db_cfg->val('FTPServer', 'local_path') || '';
##如果备份ftp服务器不可用,暂时放到本地
my $local_bak_path =$cdr2db_cfg->val('FTPServer', 'local_bak_path') || '';
##================================================================##


##================================================================##
##如果本地目录和本地备份目录不存在,创建之
if (! -e $local_path){
mkdir($local_path)||die("cannot make dir $local_path");
}

if (! -e $local_bak_path){
mkdir($local_bak_path)||die("cannot make dir $local_bak_path");
}
##================================================================##


##================================================================##
#读取数据库部分的配置信息
##oracle_home
my $ORACLE_HOME=$cdr2db_cfg->val('DB', 'ORACLE_HOME') || '';
my $ORACLE_SID=$cdr2db_cfg->val('DB', 'ORACLE_SID') || '';
my $db_userid = $cdr2db_cfg->val('DB', 'db_userid') || '';
my $db_passwd = $cdr2db_cfg->val('DB', 'db_passwd') || '';
##要sqlldr的目标表的名字
my $table_name = $cdr2db_cfg->val('DB', 'table_name') || '';
##目标表的字段列表,要和文件中的字段顺序一致。
my $column_name =$cdr2db_cfg->val('DB', 'column_name') || '';
##================================================================##

##================================================================##
##设置环境变量
if($ENV{'ORACLE_HOME'} eq ''){
$ENV{'ORACLE_HOME'} = "$ORACLE_HOME";
}

if($ENV{'ORACLE_SID'} eq ''){
$ENV{'ORACLE_SID'} = "$ORACLE_SID";
}
##================================================================##

##================================================================##
## 记录全部过程的日志文件准备,每天生成一个日志文件
my $yyyymmdd = yyyymmddString();
my $logfilename = "cdr2db$yyyymmdd.log";

#进入对应目录
$CWD = "$local_path";

my $HLOG = new FileHandle;
$HLOG->open(">>$logfilename") or die("打开日志文件出错:文件名为 $logfilename ;错误原因为: $!");

my $g_strLastError;
##================================================================##

##================================================================##

LOG("自动ftp获取话单文件、入库并备份到话单服务器 Version 1.2");
LOG("Copyright @2005 www.zte.com.cn");
##================================================================##

##================================================================##
#ftp
LOG("正在链接至指定FTP服务器($ftp_server)...");
my $ftp = Net::FTP->new($ftp_server);
if($@)
{
$g_strLastError = "不能连接到FTP服务器($ftp_server),错误原因:".$@;
LOG("$g_strLastError@");
}
else
{
$ftp->login($ftp_userid, $ftp_passwd);
if($@)
{
$g_strLastError = "不能登陆FTP服务器($ftp_server),错误原因:".$@;
LOG("$g_strLastError");
}
else
{
$ftp->binary;
LOG("链接FTP服务器成功!");
LOG("开始获取话单文件");
##================================================================##

##================================================================##
#获取ftp服务器上crcdr目录下的路径或者文件名称
$ftp->cwd($ftp_dir);
my @files = $ftp->dir($ftp_dir);

my($access,$link,$user,$group,$size,$month,$day,$ctime,$filename);

for my $file(@files){

($access,$link,$user,$group,$size,$month,$day,$ctime,$filename)=split(/s+/,$file);

if ((defined $filename)&&($filename !~/./)&&($filename !~/bak/)){
LOG("********enter $ftp_dir/$filename/cdr*********");
$ftp->cwd("$ftp_dir/$filename/cdr");

my @cdrfiles=$ftp->dir("$ftp_dir/$filename/cdr");

for my $cdrfile(@cdrfiles){

my($a,$l,$u,$g,$s,$m,$d,$t,$cdrfilename)=split(/s+/,$cdrfile);
#如果不是.w或者.W结尾的文件则获取,上述二者是正在上传的文件,RING开头的文件
if ($ftp->isfile($cdrfilename)&&($cdrfilename !~ /[w|W]/)&&($cdrfilename=~/^RING/)){
LOG("get cdr file :$cdrfilename");
$ftp->get($cdrfilename);
$ftp->delete($cdrfilename);
}
}
}
}

}
LOG("ftp话单文件完毕");
$ftp->quit();
LOG("退出ftp");
}
##================================================================##

##================================================================##
#备份
$CWD = "$local_path";
my @putfiles=();
sub wanted_put{
if (-f $File::Find::name){
#包含RING,并且不是
if (($File::Find::name=~/RING/)&&($File::Find::name !~/sqlldr/)){
push @putfiles,$_;
}
}
}

find (&wanted_put,"$local_path");

LOG("正在链接至指定备份FTP服务器($put_server)...");
my $put = Net::FTP->new($put_server);
if($@)
{
$g_strLastError = "不能连接到备份FTP服务器($put_server),错误原因:".$@;
LOG("$g_strLastError@");
#把获取的原始备份到本地
find(&wanted_bak,"$local_path");
LOG("备份话单到本地,从$local_path到$local_bak_path"); }
else
{
$put->login($put_userid, $put_passwd);
if($@)
{
$g_strLastError = "不能登陆备份FTP服务器($put_server),错误原因:".$@;
LOG("$g_strLastError");
#把获取的原始备份到本地
find(&wanted_bak,"$local_path");
LOG("备份话单到本地,从$local_path到$local_bak_path");
}
else
{
$put->binary;
#判断对应备份目录是否存在,不存在,创建

#判断第一个备份目录是否配置
if ($put_dir1 ne ''){
LOG("在备份ftp服务器($put_server)上配置了备份目录$put_dir1");
if(!$put->exists($put_dir1)){
LOG("在备份ftp服务器($put_server)上$put_dir1不存在,创建");
if($put->mkdir($put_dir1)){
#创建成功
LOG("在备份ftp服务器($put_server)上创建$put_dir1成功");
}else{
LOG("在备份ftp服务器($put_server)上创建$put_dir1失败");
};
}
}else{
LOG("在备份ftp服务器($put_server)上没有配置备份目录put_dir1");
LOG("请配置至少一个备份目录,否则将备份在本地!");

}

#判断第二个备份目录是否配置
if ($put_dir2 ne ''){
LOG("在备份ftp服务器($put_server)上配置了备份目录$put_dir2");
if(!$put->exists($put_dir2)){
LOG("在备份ftp服务器($put_server)上$put_dir2不存在,创建");
if($put->mkdir($put_dir2)){
#创建成功
LOG("在备份ftp服务器($put_server)上创建$put_dir2成功");
}else{
LOG("在备份ftp服务器($put_server)上创建$put_dir2失败");
};
}
}else{
LOG("在备份ftp服务器($put_server)上没有配置备份目录put_dir2");
}


#再次判断备份目录是否存在,如果不存在,备份,不再ftp
if($put->exists($put_dir1) || $put->exists($put_dir2)){
LOG("登陆备份ftp服务器($put_server),开始备份话单文件");
for my $putfile(@putfiles){
$put->cwd($put_dir1);
LOG("backup cdr file: $putfile ");
$put->put($putfile);
if ($put_dir2 ne ''){
#如果第二个备份目录不为空
$put->cwd($put_dir2);
$put->put($putfile);
}
}
LOG("把cdr话单备份到备份ftp服务器完毕");
}else{
LOG("备份ftp服务器($put_server)上$put_dir1和$put_dir2均不存在,且无法创建");
LOG("故,备份到本地$local_bak_path");
#把获取的原始备份到本地
find(&wanted_bak,"$local_path");
LOG("备份话单到本地,从$local_path到$local_bak_path");

}
}
$put->quit();
LOG("退出备份ftp服务器");

}

##================================================================##


##================================================================##
#处理话单文件
#转换后的话单文件名加前缀"sqlldr."
$CWD = "$local_path";
LOG("开始转换话单文件");

foreach my $file(@putfiles){
my $suffix = substr($file,length($file)-3,length($file));
my $newfile ="sqlldr.$file";
open(FH,$file);
open(NewFH,">$newfile");
while(){
if (($_ !~/RING/)&&($_ !~/END/)){
$_=~s/s+/|/g;
$_.="$suffix";
print NewFH "$_n";
}
}
close(FH);
close(NewFH);
unlink($file);
}


LOG("处理话单文件完毕");
##================================================================##

##================================================================##
#话单入库
$CWD = "$local_path";

LOG("开始把话单文件入库");

my @columns=split /,/, $column_name;
LOG("配置的环境变量ORACLE_HOME:$ENV{'ORACLE_HOME'}");
LOG("目标数据库的tnsname:$ENV{'ORACLE_SID'},");

foreach my $cdrfile(@putfiles){
my $indbfile="sqlldr.$cdrfile";
LOG("indb cdr file: $indbfile");
my $ldr = new Oracle::SQLLoader(
infile => "$local_path/$indbfile",
terminated_by => '|',
username => "$db_userid",
password => "$db_passwd",
)||die "$@";

$ldr->addTable(table_name => "$table_name");

foreach my $column(@columns){
$ldr->addColumn(column_name =>"$column");
}

if($ldr->executeLoader()){
unlink("$indbfile");
}
else{
LOG("indb cdr file fail:$indbfile".$@);
}

}

LOG("话单文件入库完毕");
LOG("本次任务结束,^_^!nnnn");
##================================================================##


##================================================================##
#关闭日志文件
$HLOG->close();

##================================================================##
#sub LOG

sub LOG {
my ($text) = @_;
my $time = timeString();

# log to stdout.
print "[$time] $textn";

# log to logfile.
print $HLOG "[$time] $textn";

}
##================================================================##

##================================================================##
#本地话单备份
sub wanted_bak{
if (-f $File::Find::name){
if ($File::Find::name=~/RING/){
my $cdr_file_name=$_;
copy($File::Find::name,"$local_bak_path/$cdr_file_name");
}
}
}
##================================================================##

cdr2db.config

[FTPServer]
#话单文件存放的ftp服务器ip
ftp_server=10.40.45.65
#ftp服务器上话单文件存放的根路径,/crcdr/129/cdr
ftp_dir=/crcdr
#ftp用户名
ftp_userid=zxin10
#ftp密码
ftp_passwd=zxin10
#获取到本地后放置的路径
local_path=/home/zxin10/wangzh


#备份ftp服务器ip
put_server=10.40.45.65
#备份路径1
put_dir1=/tmp
#备份路径2,可以为空,理论上来说至少需要备份在一个路径,所以备份路径1不能为空
put_dir2=
#备份ftp服务器用户名
put_userid=zxin10
#备份ftp服务器密码
put_passwd=zxin10
#如果无法备份到ftp服务器,本地备份路径,注意要和上面的local_path不能有包含关系
local_bak_path=/home/zxin10/fuck

[DB]
#ORACLE_HOME
ORACLE_HOME=/u01/product/oracle9i
#数据库服务名tnsname
ORACLE_SID=zx10_40_95_158
#数据库用户名
db_userid=crgw_user
#数据库密码
db_passwd=crgw_user
#入库的表名
table_name=s50stattemp
#表的字段名
column_name=USERNUMBER,ISPAY,SETTYPE,OPERTYPE,RINGTYPE,RINGID,CDRTIME,RINGFEE,SPCODE,USERTYPE,RESDATA,AREACODE

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/47869/viewspace-804187/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/47869/viewspace-804187/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值