[mdk-re] rsync script

Aleksandr Blohin sass на uustoll.ee
Чт Фев 21 21:03:13 MSK 2002


On Thu, 21 Feb 2002 14:35:55 +0300
"Lenya L. Khachaturov" <lenya на chemsell.yaroslavl.ru> wrote:

LLK> Hello mandrake-russian,

LLK> Пришлите пожалуйста какой-нибудь скрипт для синхронизации
LLK> Сизифа rsync'ом с восстановлением после ошибки rsync.
LLK> getRE Сергея Епифанова что-то не работает у меня, я его
LLK> постил вчера, если кто-нибудь его поправит, буду очень
LLK> признателен.

--
Best regards
AB
--
				... In nomine Altli, et Ctrli, et Spititus Deli, Reset!

----------- следущая часть -----------
#!/usr/bin/perl
=head1 Изменения

Под лицензией GPL v.2

13.08.2001 Версия 2.03
    Изменено:
    1. небольшие недочеты в тексте
    2. Добавлен параметр -q (убирает много ненужной информации)

27.05.2001. Версия 2.02
    Изменено:
    1. изменен режим вывода на экран

31.03.2001. Версия 2.01
    Исправлено:
    1. баг с выходом из программы getrsync
    2. баг запуска rsync и проверки прерывания программы rsync.

29.03.2001. Версия 2.00b
    Изменены оформление и режим запуска rsync.

 4.03.2001. Версия 1.00
    
=cut 


#Общее число попыток (0 - неограничено)
$MAX_TRIES=20;
#Число повторов скачивания одного и того же файла
$MAX_1_TRIES=5;
#Текущая попытка
$cur_try=0;
$cur_1_try=1;
#Сайт для скачивания - пример
$DownSite="www.altlinux.ru/MandrakeRE/Spring2001";
#Каталог для скачивания - пример
$DownDir="/var/ftp/pub/Sisyphus";

#Специальные флаги - НЕ ТРОГАТЬ
$RETVAL=1;
$WHOHANG=1;
$|=1;
$QUIET=0;

if (defined (@ARGV))
{
    if ($ARGV[0] eq '-q')
    {
	shift @ARGV;
	$QUIET=1;
    }
    $DownSite=$ARGV[0];
    if (defined ($ARGV[1]))
    {
	$DownDir=$ARGV[1];	
	print $DownDir,"\n";
        if (defined $ARGV[2])
	{
	    $MAX_TRIES=$ARGV[2];
	    if (defined $ARGV[3])
	    {
		$MAX_1_TRIES=$ARGV[3];
	    }
	}
    }
    else
    {
        print "Недостаточно параметров - нет каталога!\n";
        exit;
    }
}
else
{
    print "Программа скачивания через rsync с несколькими попытками и повторами.\n";
    print "Написана Епифановым Сергеем, МИФИ. Версия 2.02 от 13.08.2001\n\n";
    print "Запуск:\n";
    print "     getrsync   - помощь\n";
    print "     getrsync [-q] сайт каталог_сохранения [число_попыток [число_повторов]]\n";
    print "               -q - уменьшить вывод текста\n\n";
    print " Пример:\n";
    print "     getrsync www.altlinux.ru/MandrakeRE/Spring2001 /var/ftp/pub/Sisyphus\n\n";
    exit;
}
unless ($QUIET)
{
    print "Программа скачивания через rsync с несколькими попытками и повторами.\n";
    print "Написана Епифановым Сергеем, МИФИ. Версия 2.01 от 31.03.2001\n\n";
}
#Основной цикл скачивания

$DownSite="rsync://" . $DownSite;

while ($RETVAL)
{
#Проверка числа попыток
	$cur_try++;
	if ($cur_try>$MAX_TRIES && $MAX_TRIES>0)
	{
	    print "Не хватает попыток ($MAX_TRIES) для полного скачивания, выхожу.\n";
	    exit;
	}
	print "Попытка номер $cur_try\n" if $cur_1_try==1;
	print "Повтор $cur_1_try попытки $cur_try\n" if $cur_1_try>1;
#Запуск скачивания
	$OldMSG=$NewMSG;
	$NewMSG="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
	if ($QUIET)
	{
	    $pid=open (OUTINFO,"rsync -av --partial --timeout=500 --delete-after '${DownSite}' '${DownDir}' |");
	}
	else
	{
	    $pid=open (OUTINFO,"rsync -avP --timeout=500 --delete-after '${DownSite}' '${DownDir}' |");
	}
	if ($pid<1)
	{
	    $NewMGS=$OldMSG;
	    goto skip;
	}
	while ($line=<OUTINFO>)
	{
	    $NewMSG=$line;
	    print $line;
	}
	$res=waitpid ($pid,0);
	$ExitStatus=$?;
	close (OUTINFO);
	if (!$ExitStatus)
	{
	    print "Все скачано!\n";
	    exit;
	}
skip:
	if ($NewMSG eq $OldMSG)
	{
	    $cur_try-- if $cur_1_try==1;
	    $cur_1_try++;
	    if ($cur_1_try>$MAX_1_TRIES)
	    {
		print "Исчерпан лимит повторов ($MAX_1_TRIES)\n";
		exit;
	    }
	}
	else
	{
	    $cur_1_try=1;
	}
}


Подробная информация о списке рассылки Community