Перейти к содержимому


Фото
- - - - -

Создание зеркала обновлений на Linux сервере для Windows машин


  • Please log in to reply
203 ответов в этой теме

#21 QuAzI

QuAzI

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 02 Апрель 2009 - 13:39

А ещё почему-то хеш CRC32 безумно медленно считается :P на дайлапе базы обновлять нереально. Хеш одного файла может рассчитываться 2-3 минуты.


значит так написали :P в реальной жизни он считается со скоростью считывания данных с диска

Ну уж как в библах cpan для перла сделано, так и написали :) Если кто вариант получше подскажет, будет великолепно.

Pig,
Таки да, по ключу. А разве без валидного ключа можно качать бинари?
Я дусал что в wiki и есть линупсовый update.pl... Значит ща посмотрю, спасибо.

#22 pig

pig

    Бредогенератор

  • Helpers
  • 10 855 Сообщений:

Отправлено 02 Апрель 2009 - 17:26

CRC32.pm - там же вообще сишный код, всё должно скомпилироваться и летать. А я под винду этот алгоритм в своё время на чистый Perl переписал - ну, работал раза в два - три медленнее, но всё равно не две минуты на файл. Меньше минуты на весь список.
Почтовый сервер Eserv тоже работает с Dr.Web

#23 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 02 Апрель 2009 - 18:20

А разве без валидного ключа можно качать бинари?

Нет, нельзя
По-моему это игра на грани фола.

#24 QuAzI

QuAzI

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 03 Апрель 2009 - 07:56

Интересно, почему на грани фола, если качаю как раз используя ключ. Или качать чем-то кроме виндового DrWebUpW религией запрещено, такие ключи будут отлавливаться и гнусно убиваться?

#25 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 03 Апрель 2009 - 09:35

QuAzI

это я не вам. Если будет время, на выходных посмотрю скрипт с подсчетом crc32. А вообще, зачем вам парсинг lst-файла? Лично мне было лень его писать (брать из update.pl) и wget вполне справляется с закачкой новых файлов.

#26 QuAzI

QuAzI

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 03 Апрель 2009 - 12:26

Предыдущий скрипт перекачивает все файлы целиком. Это надо иметь анлимитную выделенку, потому что ни при траффике, ни при дайлапной работе (оплата по времени) выкачивать всё файло не есть коросо. Вот для этого читается drweb32.lst, а затем сравнивается и если надо, файл перекачивается. А затем crc32 ещё раз проверяется (чтобы убедиться что всё Ок) и если с официального сайта DrWeb слит файл с другим crc то соответственно и в drweb32.lst пишем правильный crc.
Если crc не перезаписывать, DrWeb дохнет в двух случаях:
1) Обрыв связи после скачивания drweb32.lst - не все файлы успели обновиться, DrWebUpW дохнет записывая в лог ошибку контрольной суммы
2) Качаются файлы нулевой длинны (точнее выдаётся 451 access denied для today) и опять таки DrWebUpW здохнет потому что crc не заплясало.
Сейчас есть мысль для файлов с нулевой длинной делать закачку не с http, а с ftp (базы то доступны). Это решит вопрос с today. А вот по части недокачанных файлов, вероятно буду думать про временный каталог и при ошибке закачки прибивать недокачанные файлы.
Смотрел update.pl оригинальный - не понравился. Очень большрй, есть вещи с которыми другие утилиты, те же wget и lftp справятся лучше. В работе не проверял.

Ещё, видел в инете примеры, где было несколько секций расписано, для разных версий. Вот хотелось бы уточнить, а часом обновить таким скриптом DrWeb с 4.44 на 5.00 не получится? Прикольно будет, если можно.

#27 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 05 Апрель 2009 - 19:43

Во-первых, я не рекомендую вот так парсить drweb32.lst

@newlist=();
open&#40;FILELIST, &#34;< drweb32.lst&#34;&#41; or die &#34;Can&#39;t open &#39;$basedir\\drweb32.lst&#39;&#58; $!&#34;;
if &#40;defined&#40;$line=<FILELIST>&#41;&#41;
{
   if &#40;uc $line eq &#34;&#91;DRWEBUPDATELIST&#93;\n&#34;&#41; {
	while&#40;<FILELIST>&#41; {
	$record = $_;
	if &#40; $record ne &#34;&#91;DrWebUpdateListEnd&#93;\n&#34; and $record ne &#34;&#91;$version&#93;\n&#34; &#41; 
		{ 
		 &#40;$file, $crc&#41; = split&#40;/, /, $record&#41;;
		 chomp $crc;
		 &#40;@str&#41; = split&#40;//, $file&#41;;
		 if &#40;&#40;$str&#91;0&#93; eq &#39;-&#39;&#41; or &#40;$str&#91;0&#93; eq &#39;!&#39;&#41;&#41; { @newlist = &#40;@newlist, &#34;$record&#34;&#41;; }
		  else 	
	{ 
			  $char = $str&#91;1&#93;;
	if &#40;$char eq &#39;<&#39;&#41; { $filetest = substr $file, 6;	}
		else { $filetest = substr $file, 1; }
	}
	print $filetest.&#39; &#39;.$crc.&#34;\n&#34;;
		}
	}

Вы забываете, например, drwebnet.sys. Если хотите парсить lst, то лучше так:

open FHR, &#39;<&#39;.&#34;$dir/drweb32.lst&#34; or die &#34;can&#39;t open $dir/drweb32.lst &#40;$!&#41;\n&#34;;
	while &#40;<FHR>&#41; {
		s/\r?\n$//; # remove \r\n, \n
		/^\&#91;&#91;\w &#93;+\&#93;$/ and next;
		/^&#91;-&#93;/ and next; #skip delete;
		my &#40; $filename, undef,$crc &#41; = /^&#91;\+\=\@\!&#93;.*?&#40;&#91;_a-zA-Z0-9\.\-&#93;+&#41;&#40;\|.+&#41;?&#91;, \t&#93;+&#40;&#91;a-fA-F\d&#93;+&#41;?&#91;, \t&#93;*&#40;\d+\.\d+&#41;?/o
			or print STDERR &#34;unknown line \&#34;$_\&#34; in lst\n&#34;;
		next if -f &#34;$dir/$filename&#34; and checkcrc32&#40;&#34;$dir/$filename&#34;,$crc&#41;;
		$ret++ unless download&#40;&#34;$url/$filename&#34;,&#34;$dir/$filename&#34;,$crc&#41;;
		print &#34;$url/$filename, $crc\n&#34;; #what try to download
	}
	close FHR;
Поверьте, в компании DrWeb lst могут поправить совершенно невообразимым способом (:-) я это когда-то сделал) и ваш парсер обломится

Я не стал парсить lst по двум причинам:
1) Мне лень
2) По-моему очень удобно самому рулить обновлением. Вот, представте, что завтра вы не захотите обновлять spiderml, который стоит на 100 станциях. Не удалять же его 100 раз. Просто закомментировали одну строку и всё. Также по-моему совсем необязательно качать файлы с музыкой от DrWeb, справку и пр.


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


Не смог воспроизвести ошибку с закачкой файла drwtoday.vdb. Может, Вам действительно качать с http://msk3.drweb.com/pub/drweb/bases.

Сейчас есть мысль для файлов с нулевой длинной


Да, я тоже замечал, что тянется какой-то шлак. Поэтому появился код:
# удаление нулевых файлов
opendir &#40;C_DIR, $basedir&#41;;
my @c_files=readdir &#40;C_DIR&#41;;
closedir &#40;C_DIR&#41;;
foreach my $c_file &#40;@c_files&#41;{
	if &#40;&#40;-s $basedir.&#39;/&#39;.$c_file&#41; eq 0&#41;{
   	unlink &#40;$basedir.&#39;/&#39;.$c_file&#41;
 }
}


* Я не проверял, но в 5-й версии dwprot не должен дать загрузить левый модуль DrWeb.

#28 polkan

polkan

    Newbie

  • Posters
  • 15 Сообщений:

Отправлено 08 Апрель 2009 - 03:16

Почиткал скрипт на вики...
начало красивое
#!/usr/bin/perl -w
use Digest&#58;&#58;MD5;
my $logdir = &#39;/tmp/update&#39;;
а вот продолжение озадачивает
# обновление баз и движков
if &#40;defined $logdir&#41;{
system &#40;&#39;rm -rf &#39;. $logdir. &#39;/*.*&#39;&#41;;
}
этим блоком убиваются все файлы во всех перечисленных каталогах.... включая ключевой файл...
и при каждом запуске скрипта закачивается ВЕСЬ список баз и файлов антивира... даже те, что были ранее... (анлим не у всех еще есть в руси) :)

#29 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 08 Апрель 2009 - 08:59

этим блоком убиваются все файлы во всех перечисленных каталогах.... включая ключевой файл...



гг =) Был напуган, исправлюсь.
Просто файлы надо удалять, т.к. wget всё равно скачивает новые файлы. А скачивать их надо, т.к. у DrWeb частая тенденция заменять базы.

#30 polkan

polkan

    Newbie

  • Posters
  • 15 Сообщений:

Отправлено 08 Апрель 2009 - 09:43

Просто файлы надо удалять, т.к. wget всё равно скачивает новые файлы. А скачивать их надо, т.к. у DrWeb частая тенденция заменять базы.

а ключевой то файл зачем грохать?... могет стоит
my $drwebkey = &#39;/tmp/update/drweb32-betatesting.key&#39;;
заменить на что нить типа
my $drwebkey = &#39;/tmp/update/KEY/drweb32-betatesting.key&#39;;
или как?... сам я перловку варить не очень... а скрипт пашеть после такого изменения... правда до сих пор не пойму зачем передергивать уже скачанные архивы баз? они то не изменятся для этой версии зеркала, а для другой версии другой каталог можно назначить базедиром :)

#31 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 08 Апрель 2009 - 12:22

заменить на что нить типа

Да, конечно можно. Это просто у меня дома всё в одном каталоге лежало. Потом в голову вдарило, на wiki дописал код не тестируя. Сейчас поправлю, хотя вы могли бы и сами это сделать на wiki ;-)

они то не изменятся для этой версии зеркала, а для другой версии другой каталог можно назначить базедиром


Просто происходит вот что:
* качаем базу drweb5000.zip
* распаковываем, всё нормально
* при повторном запуске скрипта wget закачает эту же базу с именем drweb500_1.zip (имя не точное)
Т.о., в каталоге my $logdir = '/tmp/update' будет лежать куча файлов. А время разархивации будет расти экспоненциально.

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

переопредил рабочие каталоги, чтобы всё лежало в разных местах

#32 basid

basid

    Guru

  • Posters
  • 4 479 Сообщений:

Отправлено 08 Апрель 2009 - 15:49

Просто файлы надо удалять, т.к. wget всё равно скачивает новые файлы. А скачивать их надо, т.к. у DrWeb частая тенденция заменять базы.

И, типа, при этом тайм-штамп не обновляется, а wget ни работать с ним не умеет, ни зеркалировать ...

#33 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 08 Апрель 2009 - 21:19

Серия 3.
Скрипт переписан. Оптимизировано количество закачиваемого контента для уменьшения затрат на Интернет :-)
* Не надо самостоятельно поддерживать актуальность компонент.
* Избавились от wget'a.
* Сделан разбор lst-файла. При этом, если crc совпал со скаченным ранее файлом, то повторного скачивания не будет. Если crc скаченного файла не совпадает с тем, что написано в lst, то такой файл записан не будет
* хеш считается с использованием библиотеки Zlib. У меня на машине никаких тормозов нет.

Смотрите в следующей серии: список исключаемых из скачивания компонент.

#34 Konstantin Yudin

Konstantin Yudin

    Смотрящий

  • Dr.Web Staff
  • 19 552 Сообщений:

Отправлено 08 Апрель 2009 - 23:58

Серия 3.
Скрипт переписан. Оптимизировано количество закачиваемого контента для уменьшения затрат на Интернет :-)
* Не надо самостоятельно поддерживать актуальность компонент.
* Избавились от wget'a.
* Сделан разбор lst-файла. При этом, если crc совпал со скаченным ранее фалом, то повторного скачивания не будет. Если crc скаченного файла не совпадает с тем, что написано в lst, то такой файл записан не будет
* хеш считает с использованием библиотеки Zlib. У меня на машине никаких тормозов нет.

Смотрите в следующей серии: список исключаемых из скачивания компонент.

Дима, ты такими темпами штатный апдейтер напишешь. Я завидую твоему времени :)
With best regards, Konstantin Yudin
Doctor Web, Ltd.

#35 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 09 Апрель 2009 - 08:01

Дима, ты такими темпами штатный апдейтер напишешь


DrWeb opensource


Konstantin Yudin
Кстати, к тебе персональный вопрос: "почему на зоне http://update.drweb.com/500/windows лежит lst без баз родительского контроля и откуда тогда тянутся эти базы?"

#36 pig

pig

    Бредогенератор

  • Helpers
  • 10 855 Сообщений:

Отправлено 09 Апрель 2009 - 09:42

На этот вопрос и я отвечу. Потому что /500/windows - это обычный антивирус. А Security Space живёт в /500/sspace.
Почтовый сервер Eserv тоже работает с Dr.Web

#37 Eugeny Gladkih

Eugeny Gladkih

    the Spirit of the Enlightenment

  • Dr.Web Staff
  • 5 295 Сообщений:

Отправлено 09 Апрель 2009 - 09:44

DrWeb opensource


ага, типичный. наличие вызова system() сразу отсылает в эту категорию :)

#38 Axel

Axel

    Member

  • Posters
  • 215 Сообщений:

Отправлено 09 Апрель 2009 - 16:21

На этот вопрос и я отвечу. Потому что /500/windows - это обычный антивирус. А Security Space живёт в /500/sspace.


Спасибо, поправлю.

#39 Konstantin Yudin

Konstantin Yudin

    Смотрящий

  • Dr.Web Staff
  • 19 552 Сообщений:

Отправлено 09 Апрель 2009 - 16:33

DrWeb opensource

пока ты не используешь недокументированные особенности наших серверов, я только за :)
With best regards, Konstantin Yudin
Doctor Web, Ltd.

#40 polkan

polkan

    Newbie

  • Posters
  • 15 Сообщений:

Отправлено 10 Апрель 2009 - 09:14

&#58;> perl 3drwebupw.pl
403 Forbidden &#40;file http&#58;//update.drweb.com/500/windows/drweb32.lst&#41;
can&#39;t open ./update/500/drweb32.lst &#40;No such file or directory&#41;
вот так отпинывается....
и тута мне подмогнули с проксей:
my $ua = LWP&#58;&#58;UserAgent->new;
	$ua->env_proxy;
	$ua->agent&#40;&#34;DrWebUpdate-5.00.3.03020 &#40;windows&#58; 5.00.2195&#41;&#34;&#41;;
иначе перловка напрямую рвется в инет, а его у меня напрямую нету :)


Читают тему: 0

0 пользователей, 0 гостей, 0 скрытых