LINUX.ORG.RU

Ответ на: комментарий от lodin

1. через redirector скармливать нужные URLы команде squidclient

или

2. парсить access.log и скармливать нужные URLы команде squidclient
   это можно условно делать так: 
   tail -f access.log | grep "$template" | xargs -l squidclient 

sdio ★★★★★
()
Ответ на: комментарий от lodin

Насколько до меня дошло, надо накатать скрипт (bash, perl, ruby ...), который возьмет URL, поищет у себя в каталоге файл по этому URLу, если найдет, то возвращает URL на этот файл на диске, если не найдет, то качает файл, например wget'ом в свой каталог, затем как в пред. пункте выдает на него URL? У этого метода есть минус - не видно процесса скачивания файла.

Есть ли уже готовые реализации подобного?

anonymous
()
Ответ на: комментарий от sdio

1. Не понял, что мне даст squidclient? Редирект вызывается еще до того как файл скачан и помещен в кеш, насколько я понимаю.

2. Со вторым пунктом более-менее понятно, но нужный файл из кеша уже может быть вытокнут.

anonymous
()
Ответ на: комментарий от anonymous

>1. Не понял, что мне даст squidclient? Редирект вызывается еще до того как файл скачан и помещен в кеш, насколько я понимаю.

Ну эта, с задержкой его использовать, зато access.log не надо парсить

sdio ★★★★★
()

Я для таких целей исспользую немного переколбашенные скрипты для кеширования файлов с Windows Update, Adobe, etc...

В squid.conf:

redirect_program /etc/squid/redir.pl
redirect_children 3
refresh_pattern mysite.com/.*\.(cab|exe) 4320 100% 43200 reload-into-ims

В /etc/squid/redir.pl:

#!/usr/bin/perl
$| = 1;

my $cache_path  = '/var/www/somedir/store';
my $cache_url   = 'http://mysite.com/somedir/store/';
my $downloader  = '/etc/squid/download.pl';

URL: while(<>) {

        # grab url (first word)
        ($url) = /^(\S+)/;
        $orig_req = $_;
        $orig_url = $url;

        # decode
        $url =~ tr|+| |;
        $url =~ s|%([a-fA-F0-9][a-fA-F0-9])|pack("C", hex($1))|ge;
        $url =~ s/\000+$//;     # trailing nulls

        # check cache store

        {
                my $url = $orig_url;
                $url =~ s#^http://##i;
                $url =~ s/^www\.//i;
                if($url !~ /iuident\.cab/ && -e "$cache_path/$url" && !-d "$cache_path/$url" && !-e "$cache_path/$url.downloading") {
                        open(FH, ">>$cache_path/../log");
                        print FH '[', scalar localtime, '] ';
                        print FH "cachehit ", -s "$cache_path/$url", " $url\n";
                        close FH;
                        # s|^\S+|$cache_url/$url|;
                        print "$cache_url/$url\n";
                        next URL;
                }
        }
        # cache windows update and other bits

        if(!/^\Q$cache_url/i) {
                if(
            (
                # any microsoft cab (windowsupdate, officeupdate, msdn, etc)
                   m#^http://(.*?\.microsoft\.com\S+\.(cab|exe))\b#i
                || m#^http://(.*?\.windowsupdate\.com\S+\.(cab|exe))\b#i
                            || m#^http://(.*?mssjus\.www\.conxion\.com\S+\.(cab|exe))\b#i
                # quicktime
                || m#^http://(.*?qtinstall\.apple\.com\S+\.(cab|exe|idx|dat))\b#i
                # java
                || m#^http://(.*?java\.sun\.com\S+\.(cab|exe))\b#i
                # adobe acrobat
                || m#^http://(.*?ardownload\.adobe\.com\S+\.(bin|dmg|idx|gz|exe))\b#i
            )
                && !(m#iuident\.cab\b#i)
                ) {
                        my $url = $1;
                        $url =~ s/^www\.//i;
                        if(-e "$cache_path/$url" && !-e "$cache_path/$url.downloading") {
                                open(FH, ">>$cache_path/../log");
                                print FH '[', scalar localtime, '] ';
                                print FH "cachehit ", -s "$cache_path/$url", " $url\n";
                                close FH;
                                # s|^\S+|$cache_url/$url|;
                                print "$cache_url/$url\n";
                                next URL;
                        } else {
                                system("$downloader $url 2>&1 >/dev/null &");
                        }
                }
        }

        # no change
        print "\n";

}




/etc/squid/download.pl:

#!/usr/bin/perl
use strict;

my $cache_path  = '/var/www/somedir/store';
my $nice        = '/bin/nice';
my $wget        = '/usr/bin/wget';

my $url = shift;
$url =~ s|^http://||i;
$url =~ s|^www\.||i;
$url =~ s|\?$||;
$url =~ s|//|/|g;

my $debug = shift;

exit if $url =~ /^.*\.asp\?.*$/i;
logloglog("downloading $url");

aieee("$url exists") if -e "$cache_path/$url";
aieee("$url.downloading exists") if -e "$cache_path/$url.downloading";

chdir($cache_path) || aieee("counld't chdir to $cache_path : $!");

open(FH, '/bin/df .|') || aieee("couldn't run /bin/df : $!");
my $free = 100;
while(<FH>) {
        next unless /\d+\s+(\d+)\%\s+\S+$/;
        $free = $1;
        last;
}
close FH;
aieee("the disk is >90% full") if $free >= 90;

my @paths = split /\//, $url;
my $file = pop @paths;
foreach my $dir (@paths) {
        (-e $dir) || (mkdir($dir, 0755) || aieee("couldn't mkdir $dir : $!"));
        chdir $dir || aieee("couldn't chdir to $dir : $!");
}
open(FH, ">$file.downloading") || aieee("couldn't create $file.downloading : $!");
close FH;
if($debug) {
        system "$wget -nc $url;chmod 0644 * -R";
} else {
        system "$wget -q -nc $url;chmod 0644 * -R";
}

unlink "$file.downloading";
exit unless -e $file;

my $size = -s $file;
logloglog("downloaded $size $url");

sub aieee($) {
        my $error = shift;
        logloglog($error);
        exit;
}

sub logloglog($) {
        open(FH, ">>$cache_path/../log");
        print FH '[', scalar localtime, '] ';
        print FH "@_\n";
        close FH;
}


Работает просто чудно...

iron ★★★★★
()
Ответ на: комментарий от iron

З.Ы: Нужно будет еще поставить модуль Time::Date

iron ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.