Организация локального частичного зеркала distfiles по принципу "скачал сам - поделись с другими"

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск

[править] Организация локального частичного зеркала distfiles по принципу "скачал сам - поделись с другими"

Если есть локальная сеть с каким то достаточно стабильно работающим ftp-сервером, можно организовать совместно заполняемое зеркало.

Код:

#!/usr/bin/perl
# usage - add to /etc/make.conf -
#   FETCHCOMMAND="/path/to/get_file \${DISTDIR} \${URI}"
$DOWNCMD = "/usr/bin/wget -t 5 -T 60 --passive-ftp {DOWN_URI} -P {DOWN_DISTDIR}";
# alternative download command
#$DOWNCMD = "/usr/bin/getdelta {DOWN_URI}";
$mirror_server = "w.x.y.z";
$mirror_uri = "ftp://${mirror_server}";
$mirror_uri_upload = $mirror_uri;
$upload_user = "distfiles";
$upload_pass = "distfiles";

$par_count = $#ARGV + 1;
die( 1 ) if $par_count < 2;
$DISTDIR = $ARGV[0];
$URI = $ARGV[1];
@tmp = split( /\//, $URI );
$fname = @tmp[$#tmp];
undef @tmp;
print "Checking for $fname on ${mirror_server}...\n";
system( "curl -o ${DISTDIR}/$fname ${mirror_uri}/$fname" );
if( $? == 0 )
{
    print "Ok.\n";
    exit( 0 );
}
print "File is absent on ${mirror_server} :(\n";
print "Downloading ourselves...\n";
$DOWNCMD =~ s/{DOWN_URI}/$URI/;
$DOWNCMD =~ s/{DOWN_DISTDIR}/$DISTDIR/;
system( $DOWNCMD );
if( $? != 0 )
{
    print "Error: file is absent on internet mirror!\n";
    exit( 1 );
}
print "Uploading file to $mirror_server...\n";
system( "curl -T ${DISTDIR}/$fname ${mirror_uri_upload}/ -u ${upload_user}:${upload_pass}" );
if( $? == 0 )
{
    print "Ok.\n";
    exit( 0 );
}
print "Error occured while uploading to ${mirror_server}!\n";
exit( 1 );

Для использования нужно поместить данный скрипт например в каталог /usr/bin, и добавить строку в make.conf

FETCHCOMMAND="/usr/bin/get_file \${DISTDIR} \${URI}"

Также можно настроить команду для скачки файла непосредственно из интернета:

$DOWNCMD = "/usr/bin/wget -t 5 -T 60 --passive-ftp {DOWN_URI} -P {DOWN_DISTDIR}";

либо

$DOWNCMD = "/usr/bin/getdelta.sh {DOWN_URI}";

(см. HOWTO Экономия трафика с помощью deltup)

Личные инструменты