Backup(бэкап) на FTP(фтп)

В своё время для бэкапа был написан небольшой скрипт на perl, который читает конфиг, получает информацию в какое время что бэкапить и куда слать архивы. При высоком уровне загрузки он бэкапы не делает.

Вот пример его конфига

% backupper config
%
% i H d M D prefix backupped_path tmp_folder storage_path
%

00 22 * * * fast_mysql /var/backup /tmp agava4***:***@host.ru

00 23 * * * etc /etc /tmp agava4***:***@host.ruu
01 23 * * * usr_local_bin /usr/local/bin /tmp agava4***:***@host.ru
10 23 * * * home_0 /home/0* /tmp agava4***:***@host.ru
20 23 * * * home_1 /home/1* /tmp agava4***:***@host.ru
50 23  * * * home_2 /home/2* /tmp agava4***:***@host.ru
55 23  * * * home_3 /home/3* /tmp agava4***:***@host.ru
15 00  * * * home_4 /home/4* /tmp agava4***:***@host.ru
20 00  * * * home_5 /home/5* /tmp agava4***:***@host.ru
25 00  * * * home_6 /home/6* /tmp agava4***:***@host.ru
45 00  * * * home_7 /home/7* /tmp agava4***:***@host.ru
50 00  * * * home_8 /home/8* /tmp agava4***:***@host.ru
00 01   * * * home_9 /home/9* /tmp agava4***:***@host.ru

Синтаксис указания времени почти кроновский, но используются только конкретные числовые значения и звёздочки.

Вот сам скрипт. Для его работы потребуется консольная программа ftp. Скрипт надо повесить на cron ежеминутно.

#!/usr/bin/perl

$GZIP_PATH = "/bin/gzip";
$TAR_PATH = "/bin/tar";
$FTP_PATH = "/usr/bin/ftp";
$CONFIG_FILE = "/etc/backuper.conf";
$LOG_FILE = "/var/log/backuper.log";
$RM_PATH = "/bin/rm";

open(A, $CONFIG_FILE);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
READCONFIG: while (<A>) {
    ($c_minute, $c_hour, $c_day, $c_mon, $c_wday, $backup_prefix,
        $backuped_path, $tmp_folder, $storage_path) =
        split /\s+/, $_;
    next READCONFIG if $c_minute=~/\%/ || !$c_minute;
#    print $fields[0]."\n";
    if(
        ($c_minute == $min      || $c_minute eq "*")   &&
        ($c_hour == $hour       || $c_hour eq "*")   &&
        ($mday == $c_day        || $c_day eq "*")
    ){
        backup($backup_prefix, $backuped_path, $tmp_folder, $storage_path,
            #"-".($year+1900)."-".$mon."-".$mday."_".$hour."_".$min
            ""
            );
    }
}
close(A);

sub backup{
    my ($backup_prefix, $backuped_path, $tmp_folder, $storage_path, $suffix) = @_;

    open(B, ">>".$LOG_FILE);
    print B get_date_log()."Start backup $backuped_path(".get_avg().")\n";
    if(get_avg()>1){
        print B get_date_log()."High load avarage. Stopped.\n";
        $command = 'ps -A|grep "[1-9]\.[0-9]"';
        $ps = `$command`;
        print B "\n$ps\n";
        close(B);
        return 0;
    }
    $command = "$TAR_PATH -cf $tmp_folder/$backup_prefix$suffix.tar $backuped_path";
    `$command`;
    print B get_date_log()."Creating $tmp_folder/$backup_prefix$suffix.tar completed(".get_avg().")\n";
    $command = "$GZIP_PATH -9 $tmp_folder/$backup_prefix$suffix.tar";
    `$command`;
    print B get_date_log()."Creating $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n";
    return 0 if (!$storage_path=~/([a-z0-9\-\.]+):([a-z0-9\-\.]+)\@([a-z0-9\-\.]+)\/([a-z0-9\-\.\_\/]+)/ig);
    my ($username, $password, $host, @path) = split /[\@\:\/]/,$storage_path;$path = join "/", @path;
    $command = "/usr/bin/ftp -i -n <<EOF
open $host
user $username $password
dele $path/$backup_prefix$suffix.tar.gz
put $tmp_folder/$backup_prefix$suffix.tar.gz $path/$backup_prefix$suffix.tar.gz
quit
EOF";
    `$command`;
    print B get_date_log()."Uploading $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n";
    `$RM_PATH $tmp_folder/$backup_prefix$suffix.tar.gz`;
    print B get_date_log()."Removing $tmp_folder/$backup_prefix$suffix.tar.gz completed(".get_avg().")\n";
    close(B);
}

sub get_date_log{
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    return "[".(1900+$year)."-".$mon."-".$mday." ".$hour.":".$min.":".$sec."]";
}

sub get_avg(){
    $avg=`uptime`;
    $avg=~s/^.*?average.*?:\s*(.*?)[^\d\.\,]+.*/$1/gi;
    $avg=~s/\,/\./gi;
    chomp($avg);
    return $avg;
}

Добавить комментарий