#!/usr/bin/perl =head1 4.03.2001. Версия 1.00 29.03.2001. Версия 2.00b Изменены оформление и режим запуска rsync. 31.03.2001. Версия 2.01 Исправлено: 1. баг с выходом из программы getr 2. баг запуска rsync и проверкой прерывания программы rsync. =cut #Общее число попыток (0 - неограничено) $MAX_TRIES=20; #Число повторов скачивания одного и того же файла $MAX_1_TRIES=5; #Текущая попытка $cur_try=0; $cur_1_try=1; #Сайт для скачивания - пример $DownSite="rsync://ftp.altlinux.ru/MandrakeRE/Spring2001"; #Каталог для скачивания - пример $DownDir="/var/ftp/pub/Sisyphus"; #Специальные флаги - НЕ ТРОГАТЬ $RETVAL=1; $WHOHANG=1; #Пользуйтесь как хотите print "Программа скачивания через rsync с несколькими попытками и повторами.\n"; print "Написана Епифановым Сергеем, МИФИ. Версия 2.01 от 31.03.2001\n\n"; print "Запуск:\n"; print " getRE сайт каталог_сохранения [число_попыток [число_повторов]]\n\n"; if (defined (@ARGV)) { $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 { exit; } #Основной цикл скачивания while ($RETVAL) { #Проверка числа попыток $cur_try++; if ($cur_try>$MAX_TRIES && $MAXTRIES>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"; print $DownSite," - ",$DownDir,"\n"; $pid=open (OUTINFO,"rsync -avP --timeout=500 --delete-after '${DownSite}' '${DownDir}' |"); if ($pid<1) { $NewMGS=$OldMSG; goto skip; } while ($line=) { $NewMSG=$line; print $line; } $res=waitpid ($pid,0); $ExitStatus=$?; close (OUTINFO); if (!$ExitStatus) { print "Все скачано!\n"; exit; } skip: if ($NewMSG eq $OldMSG) { $cur_try--; $cur_1_try++; if ($cur_1_try>$MAX_1_TRIES) { print "Исчерпан лимит повторов ($MAX_1_TRIES)\n"; exit; } } else { $cur_1_try=1; } }