LINUX.ORG.RU
ФорумTalks

Реализация Deltup-server


0

0

Надоело, что не работает deltup. Написал на перле реализацию его сервера.
- полностью совместим с getdelta.sh.
- зависимости: deltup (тот, который в gentoo), bdelta

Ссылка: http://slader.org.ru/dserver-0.20.zip

Как работает:
1. принимает два параметра have= и want=
2. если файлы доступны локально (находятся в указанных каталогах) – делает дельту и выкладывает в свободный доступ.
3. если файлы есть на зеркалах gentoo – скачивает и goto 2.

Что не делает:
- Нет контроля занимаемого места. Может только удалять скачанные пакеты (или перемещать их в локальное хранилище.

Может кто поставит – потестирует? У меня на локальном апаче (с mod_perl) работает нормально. Вот только хостинга у меня нет. Если бы кто смог захостить скрипт – было бы шикарно. А если бы там был локальный репозиторий пакетов… то мы бы все получили работающий deltup сервер.


Пожалуйста, отредактируйте секции настроек в обоих файлах перед их помещением на сервер.

PS. Есть несколько вопросов по программингу на perl:
1. Какой самый простой способ обработки файла с настройками? Хочется все настройки вынести в один файл и в скриптах его читать. Со строками все легко, а вот если у меня массив (т.е. переменная вида @A= ('11', '22');) ?

2. Когда я выдаю пользователю файл (использую print "Location: $name\n\n"), как узнать, что он этот файл закончил скачивать? (чтобы можно было удалять?)
Или, с другой стороны, как узнать, что этот файл нельзя удалять, потому что пользователь его еще качает?

ProtecT
() автор топика

самый простой файл конфигурации на перл, это файл на перл :)

я думаю здесь не все оценят, помести лучше на gentoo.ru

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

Я и на gentoo.ru поместил, и сюда.

Тогда вопрос - а как включить в скрипт на perl другой скрипт на perl?

В C/C++ я бы сделал #include "a.h"
В php - require "a.php"
А на перле как?

ProtecT
() автор топика

Если кто сделает в Тамбове зеркало Дженты и делтуп-сервер поставлю тому коньяка (либо любой другой напиток) немеряно!

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

пишешь так :
use MyPerlScript2 qw{&MyArray1 @MyVar2};
при этом подразумевается , что в этом же каталоге находится файл MyPerlScript2.pm
Начинаеться этот MyPerlScript2 будет так :

!/usr/bin/perl
use CGI qw(:standard);
package MyPerlScript2;

BEGIN {
use Exporter ();
@ISA = 'Exporter';
@EXPORT_OK = qw{&MyArray1 @MyVar2};
}
...
return 1;

END { }

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

Нет, не бросил :) Сделаешь USE="..." emerge -pv censored > ~/censored.txt и сидишь себе душу отводишь...

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

> Тогда вопрос - а как включить в скрипт на perl другой скрипт на perl?

О_о точно так же.

require 'blahblah.pl';

include 'blahblah.pl';

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

по поводу файла конфигурации в перле:

сat adc.cfg

$adcpath="/usr/local/etc/htdocs/banner";
$basepath="/usr/local/etc/htdocs/banner/bases";
$cgi="http://www.qqq.ru/cgi/banner";;
$adcenter="http://www.qqq.ru/banner";;
$sysid="Unix";
$progmail="/usr/sbin/sendmail -t";
$email='xxx@qqq.ru';
$furl="http://www.qqq.ru";
%cal=('Jan','1','Feb','2','Mar','3','Apr','4','May','5','Jun','6','Jul','7','Aug ','8','Sep','9','Oct','10','Nov','11','Dec','12');
%calendar=('Jan','31','Feb','28','Mar','31','Apr','30','May','31','Jun','30','Ju l','31','Aug','31','Sep','30','Oct','31','Nov','30','Dec','31');
$yourname="Banner System of qqq.ru";
$defaultratio=0.5;
$refratio=0.2;
$owntitle="Qqq.ru Banner Network";
$startcred=1000;
$clickratio=0.8;
$banheight=60;
$banwidth=468;
$mbanheight=20;
$mbanwidth=468;
$mfilesize=20000;
$weighttype=2000;
$enablecounter=1;
$enablemaillist=1;
$LOCK_SH=1;
$LOCK_EX=2;
$LOCK_NB=4;
$LOCK_UN=8;

=======================

cat test.pl

#!/usr/bin/perl
open (F, "<adc.cfg");
@commands=<F>;
close (F);
foreach (@commands){eval $_;}

while(my($k,$v) = each %cal){print "$k => $v\n";}

aaa@qqq:/usr/local/etc/httpd/cgi-bin/banner1$ perl rr.pl
Sep => 9
May => 5
Jul => 7
Jun => 6
Jan => 1
Nov => 11
Aug => 8
Feb => 2
Mar => 3
Dec => 12
Apr => 4
Oct => 10
aaa@qqq:/usr/local/etc/httpd/cgi-bin/banner1$

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

>foreach (@commands){eval $_;}

$_ здесь $_ необязательно, eval без аргументов предполагает eval $_;

а $@ кто проверять будет? Если не проверяешь $@, за чем файл в массив считывать, можно сразу в строку, ведь это имеет смысл если хочешь знать в какой строке конига ошибка ;)

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

ну конешно можно улучшить или лучше, всетки, углубить, но гдеж ты был, такой красивый, когда спрашивали то? :)

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

Малоли где был. Пописать вышел :)

А ты не обижайся, я не с наездами ведь.

Это и есть опен-сорц --- один начал, другие помогают :)

guardian
()

Тема не для talks. Уже написали много, поэтому пусть висит. Тем не менее...

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

Отлично. Большое спасибо.

PS. Кстати, на счет скачиваемых файлов (см. второй пост), у кого-нибудь мысли есть?

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

>Кстати, на счет скачиваемых файлов (см. второй пост), у кого-нибудь мысли есть?

Если только допиливать клиента, чтобы он по окончанию создания нужного файла из дельты отправлял еще один запрос на сервер, что мол всё ок и файл можно удалять.

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

Ну или расчитывать ttl для файла. Т.к. дельтапом пользуются в основном модемщики, то миннимальное время будет (size/connection_speed)*k, где k - коэффициент хренового соединения. Обычно от 1.5 до 3.

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

А если у него обрыв связи? Не, это слишком эвристический способ. Надо придумать методику удаления старых/ненужных дельт... Че-то на ночь ничего в голову не лезет :(

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

Можно сделать рейтинговую систему.

Пусть каждая дельта изначально хранится время t0. По его окончанию файл удаляется - истёк его срок годности.

За каждый дополнительный запрос к файлу к его времени жизни добавляется бонусное время t1.

Если в течение суток к файлу со временем >t0 не было запроса, то снимается время t2=exp((`date +%s` - `date --reference $FILE`)/86400). Таким образом, мы уменьшаем его рейтинг, чтобы избавляться от старых ненужных дельт.

По крону, например раз в сутки, производится удаление файлов с рейтингом меньше t0.

Первоначальный рейтинг t0 начисляется для файлов разного размера по-разному. Файлы большего размера имеют большее время жизни, т.к. на их создание уходит больше ресурсов.

Вроде всё =) Комментарии, исправления, предложения приветствуются.

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

Если процессора-памяти много, а винчестера мало, то дельты можно удалять. А если наоборот, то лучше хранить, а чистить каталог (если уж совсем невмоготу) банально удаляя файлы с самым большим "last_access_time".

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

лучше не по крону, а когда истечет запас дискового пространства просто удалить достаточно дельт с самим ранним временем доступа

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

Что-то я не понял одну вещь:
1. создаю на хостинге файл 1.tar.gz
2. на своем компе запускаю wget -c http://hosting/1.tar.gz И он качается.
3. Пока он качается, захожу на хостинг по ssh и удаляю файл. Как не странно, wget продолжает качать. Ага, думаю, сервак кэширует файлы.
4. Останавливаю wget и запускаю заново (файла-то нет), а он начинает докачивать файл с того же места! Это как??

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

RTFM, однако.

В юнихах файл не удаляется физически с диска, пока он кем-то открыт. Апач, видать, после твоего обрыва не успел его закрыть.

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

> Пописать вышел :)

писай дальше, имхо конешно...

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