- #!/usr/bin/perl -w
- use strict;
- use Net::FTP;
- use Config::Tiny;
- use POSIX "strftime";
- # 获取系统当前日期
- my $data_now = strftime( "%Y-%m-%d", localtime( time() - 86400 * 0 ) );
- # 获取前7天日期
- my $data5 = strftime( "%Y-%m-%d", localtime( time() - 86400 * 7 ) );
- my $Config = Config::Tiny->new();
- $Config = Config::Tiny->read('Config.ini');
- # Net::Ftp
- my $FTP_User = $Config->{Net_FTP}->{FTP_User};
- my $FTP_Password = $Config->{Net_FTP}->{FTP_Password};
- my $FTP_Ipaddre = $Config->{Net_FTP}->{FTP_Ipaddre};
- # 备份列表
- my $Backup_List = $Config->{Settings}->{Backup_List};
- # Subversion 仓库路径
- my $svn_repos = $Config->{Settings}->{Svn_Repos_Path};
- # 目标路径
- my $backup_dir = $Config->{Settings}->{Backup_Tirget};
- # Password
- my $Zip_Passwd = $Config->{Settings}->{Zip_Passwd};
- # Svn仓库
- my @repos = split /,/ => $Backup_List;
- foreach (@repos) {
- &start_thread($_);
- }
- sub start_thread {
- my ($repos_loop) = @_;
- my $next_backup_file = "$repos_loop\_$data_now";
- # 定义backup路径
- my $repos_Path = "$backup_dir/Temp/$repos_loop";
- # 如果目录不存就创建
- system("mkdir -p $repos_Path") if ( !-e "$repos_Path" );
- &LOGINFO( 'INFO',"正在备份 ---> $svn_repos/$repos_loop");
- system("svnadmin hotcopy $svn_repos/$repos_loop $repos_Path");
- }
- # 存放包路径
- mkdir("$backup_dir/Package") if ( !-e "$backup_dir/Package" );
- # 设置口令为123456
- &LOGINFO( 'INFO',"正在打包 7z a -bd -p$Zip_Passwd $backup_dir/Package/Svn_$data_now.7z $backup_dir/Temp");
- system("7z a -bd -p$Zip_Passwd $backup_dir/Package/Svn_$data_now.7z $backup_dir/Temp");
- # 删除本地前次备份的7z文件
- system("rm -rf $backup_dir/Package/Svn_$data5.7z");
- # Delete Temp
- system("rm -rf $backup_dir/Temp");
- &Net_FTP( "$FTP_User", "$FTP_Password", "$FTP_Ipaddre", "Subversion", "Put" );
- #Net_FTP文件上传部分
- sub Net_FTP {
- my ( $FTP_User, $FTP_Password, $FTP_Ipaddre, $FTP_Backup, $Action ) = @_;
- my $ftp = Net::FTP->new(
- "$FTP_Ipaddre",
- Debug => 0,
- Timeout => 360
- ) or die &LOGINFO( 'ERROR', "不能连接到FTP服务器,错误原因:" . $@ );
- if ( $ftp->login( $FTP_User, $FTP_Password ) ) {
- &LOGINFO( 'INFO', "Net::FTP 成功连接服务器$FTP_Ipaddre" );
- }
- else {
- &LOGINFO( 'ERROR', "Net::FTP 不能登陆FTP $FTP_Ipaddre服务器,错误原因:" . $@ );
- }
- #切换目录
- $ftp->cwd("/$FTP_Backup"), my $FTP_error = $ftp->message;
- if ( $FTP_error =~ /failed/i ) {
- &LOGINFO( 'INFO', "$FTP_Backup 目录不存在,开始创建目录 $FTP_Backup" );
- $ftp->mkdir($FTP_Backup);
- &LOGINFO( 'INFO', "$FTP_Backup 目录创建完毕,并切换到目录创建目录" );
- $ftp->cwd("/$FTP_Backup");
- }
- #删除FTP上前5天的备份
- &LOGINFO( 'INFO', "删除FTP前5天的备份 /$FTP_Backup/Svn_$data5.7z" );
- $ftp->delete("/$FTP_Backup/Svn_$data5.7z"), my $FTP_Error = $ftp->message;
- &LOGINFO( 'INFO', "/$FTP_Backup/Svn_$data5.7z" );
- &LOGINFO( 'INFO', "$FTP_Error" );
- &LOGINFO( 'INFO', "Net::FTP 使用binary二进制格式上传" );
- $ftp->binary();
- #如果动作等于Put
- if ( $Action eq "Put" ) {
- &LOGINFO( 'INFO', "正在上传 至 $FTP_Backup" );
- $ftp->put("$backup_dir/Package/Svn_$data_now.7z") or die &LOGINFO( 'ERROR', "上传 $backup_dir/Package/Svn_$data_now.7z 失败" );
- }
- &LOGINFO( 'INFO', "File Svn_$data_now.7z 上传 successfully\n" );
- $ftp->quit;
- }
- sub current_time {
- my $time_now = POSIX::strftime( "[%Y-%m-%d %H:%M:%S]", localtime );
- return $time_now;
- }
- sub LOGINFO {
- my ( $INFO, $Message ) = @_;
- open FH, ">>logs/$data_now\.txt";
- my $start_time = ¤t_time();
- print("$start_time $INFO $Message \n");
- print FH ("$start_time $INFO $Message \n");
- close(FH);
- }
Config配置文件
- [Net_FTP]
FTP_User=backup
FTP_Password=110110
FTP_Ipaddre=192.168.100.24 - [Settings]
- Backup_List=authcenter,buildtools #需要备份的列表
- Svn_Repos_Path=/data/d_tech #仓库根路径
- Backup_Tirget=/data/Svnback #备份tirget路径
- Zip_Passwd=123456 #Zip打包时设置的秘密