Он даже не должен а он работает и исключительно с оффиц. серверами!!! Проверить проще всего, а не флудить в топике!
Printable View
Значит так. Разумеецца я проверил вначале, он не заработал. И насколько я понимаю.
1. Файлне закрыт РАРом и для него не нужен логин/пароль.Code:http://login:pass@update.eset.com/eset_upd/update.ver
2. В файлележит только список серверов и нет списка файлов обновления.Code:http://login:pass@update.eset.com/eset_upd/update.ver
3. По адресувообще нет файлов обновлений и взять их поэтому там неоткуда.Code:http://login:pass@update.eset.com
А теперь как надо делать, насколько я понимаю.
1. Читаем из http://update.eset.com/eset_upd/update.ver список текущих серверов обновлений.
2. Последовательно перебираем полученный список на предмет появления нового файла update.ver.
3. Если таковой найден, то загружаем (только здесь при загрузке нужен заветный логин и пароль) с этого сервера файлы по списку из update.ver (вот тут уже не забыть его разРАРить) новее чем у нас есть. (Например если update.ver получен с сервера http://u21.eset.com/eset_upd/, то файлики по списку будут по адресу http://u21.eset.com/ а дальше структура берется из поля file=)
Если ошибаюсь, можете меня поправить. Отправить куда подальше проще простого.
Седня ночька свободная есть... Я добью скриптик до ума... Перебор серверов сделаю... Но меня вот что волнует. Возможен такой момент, когда update.ver обновился, а файлик обновления новый не смог... Ну проблемы у провайдера, к примеру. Или когда кто-то обновляется с локальной машины в тот момент когда зеркало обновляется с сервера... В общем ничего хорошего это не сулит. Вопрос как изящнее эту проблему порешать. Что-то именно изящного решения не приходит в голову, а выеживацца сильно не хочецца.
Может как-нить придумать скачивание файла по таймауту?
(что бы на off серваках работало :) )
YAG Приятно видеть что и тут про мое зеркало и сайт знают :D
Но это так...
Может тебе поможет вот это
update.php:
PHP Code:#!/usr/local/bin/php
<?php
define("DEFAULT_SAVE_PATH","/home/www/nod32upd/public_html/");
$servers = array(
array('host'=>'http://nod.madbadjack.com/','savepath'=>DEFAULT_SAVE_PATH."/nod_upd/"),
array('host'=>'http://nod3.madbadjack.com/')
//,array('host'=>'http://nod3.madbadjack.com/','user'=>'admin','password'=>'11111')
);
/**
* Quick & Dirty Script to manage NOD 32 Updates
*
* @author Kode
* @email kode@airnet.ru
* @version 1.1
*
*/
ini_set("display_errors",0);
ini_set("user_agent","WGET");
include("functions.php");
$start = microtime(true);
foreach ($servers as $server){
if(!isset($server['savepath'])){
$server['savepath'] = DEFAULT_SAVE_PATH;
}
if(file_exists($server['savepath']."update.ver"))
$current_db = parseDB(file_get_contents($server['savepath']."update.ver"));
echo "Checking {$server['host']}\n";
$updatedb = parseDB(getHTTPFile($server['host'],"update.ver","",@$server['user'],@$server['password']));
if(!$updatedb){
echo "Invalid server!\n";
continue;
}
foreach ($updatedb as $section=>$vars){
echo "Checking {$section} ({$vars['file']},".@$vars['date'].")\n";
if(!isset($current_db) or ((@$current_db[$section]['versionid'] < @$vars['versionid'] ) or (@$current_db[$section]['build'] < @$vars['build']))){
echo "Obtaining {$vars['file']} (size: {$vars['size']}, verison: {$vars['date']})\n";
getHTTPFile($server['host'],$vars['file'],$server['savepath'].$vars['file'],@$server['user'],@$server['password']);
$current_db[$section] = $vars;
}else{
echo "Also have rather version\n";
}
}
echo "Generation new update.ver\n";
$new_db = createDB($current_db);
echo "Saving new update.ver\n";
file_put_contents($server['savepath']."update.ver",$new_db);
}
echo "Execution time ",round(microtime(true)-$start,4)," sec.";
?>
functions.php
PHP Code:<?php
if(!function_exists("file_put_contents")){
/**
* file_put_contents PHP4 replace
*
* @param string $file
* @param string $data
* @return boolean
*/
function file_put_contents($file,$data){
$fp = fopen($file,"w");
if(!$fp){
return false;
}
fwrite($fp,$data);
fclose($fp);
return true;
}
}
if(!function_exists("file_get_contents")){
/**
* file_put_contents PHP4 replace
*
* @param string $file
* @return mixed
*/
function file_get_contents($file){
$fp = fopen($file,"r");
if(!$fp){
return false;
}
$result = "";
while (!feof($fp)) {
$result .= fread($fp,1024);
}
fclose($fp);
return $result;
}
}
/**
* parses update.ver
*
* @param string $db
* @return array
*/
function parseDB($db){
$result = array();
$last_section = "";
$lines = explode("\n",$db);
foreach ($lines as $line){
$line = trim($line);
if(!empty($line)){
if(@$line[0] == "[" and $line[strlen($line)-1]=="]"){
$last_section = trim($line,"[]");
$result[$last_section] = array();
}else{
@list($var,$val) = explode("=",$line);
$result[$last_section][$var] = $val;
}
}
}
return $result;
}
/**
* Creates update.ver from array
*
* @param unknown_type $arr
* @return unknown
*/
function createDB($arr){
$return = "";
foreach ($arr as $section=>$params){
$return .= "[{$section}]\n";
foreach ($params as $key=>$value){
$return .= "{$key}={$value}\n";
}
}
return $return;
}
/**
* Small function to help parse HTTP Headers
*
* @param unknown_type $array
* @return unknown
*/
function parseHeader($array){
$result = array();
foreach ($array as $value){
if(substr_count($value,":")){
$data = explode(":",$value);
$result[trim($data[0])] = trim($data[1]);
}
}
return $result;
}
/**
* Downloads file from given host
*
* @param string $host HTTP Host
* @param string $file File on host to download
* @param string $save If not empty - save to file
* @param string $user HTTP Auth User
* @param string $password HTTP Auth Password
* @return mixed
*/
function getHTTPFile($host,$file,$save="",$user="",$password=""){
$host = trim(str_replace("http://","",$host),"/");
$data = "";
$last_percent = 0;
$user_password = ($user)?"$user".(($password)?":{$password}":"")."@":"";
$open_url = "http://{$user_password}{$host}/{$file}";
$fp = fopen($open_url,"r",false,stream_context_create(array('http'=>array('user_agent'=>'WGET'))));
if($fp){
if($save){
echo "Creating file {$save}\n";
$sp = fopen($save,"w+",false,stream_context_create(array('ftp' => array('overwrite' => true))));
if(!$sp){
echo "Error: Failed to create file!!!\n"; return false;
}
}
echo "Downloading {$open_url}: ";
$params = stream_get_meta_data($fp);
$params = parseHeader($params['wrapper_data']);
$length = $params['Content-Length'];
while (!feof($fp)) {
$percent = round(ftell($fp)/$length*100);
if($last_percent < $percent and $percent%10==0){
$last_percent = $percent;
echo "...{$percent}%";
}
if(!isset($sp)){
$data .= fread($fp,128);
}else{
fwrite($sp,fread($fp,128));
}
}
echo "...OK \n";
}else{
echo "Failed to download {$open_url}!!!\n";
}
fclose($fp);
if(!$save){
return $data;
}
fclose($sp);
}
?>
Взято как не трудно догадаться тут автор KodeQuote:
Впринципе может работать и из браузера, только необходимо убрать
#!/usr/local/bin/php в начале update.php
Для использования из консоли не забудьте сделать chmod a+x update.php и поставить верный путь до php (можно узнать через whereis php)
Обязательно исправьте DEFAULT_SAVE_PATH - поставьте директорию куда будут качатся обновления
Плюсы:
+ Поддерживает несколько серверов
+ Скачивает только более новые файлы
+ Можно обновлять как из браузера так и через консоль/cron
+ Работает как под *nix так и под Windows, нужен только php
+ Можно сразу заливать на FTP, надо лишь указать DEFAULT_SAVE_PATH_DIR например так ftp://admin:12345@myserver.ru/nod32upd/ (не тестировалось)
+ Гибкая настройка что куда сохранять, те для различных серверов можно указать различные папки
+ Теоретически работает на >= PHP 4.3.0
Минусы
- Нужен PHP c allow_url_fopen = On
DarkTwin, у куда писать логин/пасс от офф серваков?
Спасибо, просто беглым взглядом пропустил верхушку :)
Меня вот пугают ошибки:
Code:
Checking http://nod.madbadjack.com/ Downloading http://nod.madbadjack.com/update.ver: ...10%...40%...50%...60%...70%...OK Checking ENGINE0 (engine0.nup,02.01.2008) Obtaining engine0.nup (size: 8198935, verison: 02.01.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/engine0.nup Error: Failed to create file!!! Checking ENGINE1 (engine1.nup,18.04.2008) Obtaining engine1.nup (size: 1387731, verison: 18.04.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/engine1.nup Error: Failed to create file!!! Checking ENGINE2 (engine2.nup,29.04.2008) Obtaining engine2.nup (size: 61130, verison: 29.04.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/engine2.nup Error: Failed to create file!!! Checking ARCHS0 (archs0.nup,29.02.2008) Obtaining archs0.nup (size: 214149, verison: 29.02.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/archs0.nup Error: Failed to create file!!! Checking ARCHS1 (archs1.nup,07.03.2008) Obtaining archs1.nup (size: 7763, verison: 07.03.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/archs1.nup Error: Failed to create file!!! Checking ARCHS2 (archs2.nup,22.04.2008) Obtaining archs2.nup (size: 39951, verison: 22.04.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/archs2.nup Error: Failed to create file!!! Checking ADVHEUR0 (advheur0.nup,16.01.2008) Obtaining advheur0.nup (size: 429384, verison: 16.01.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/advheur0.nup Error: Failed to create file!!! Checking ADVHEUR1 (advheur1.nup,12.02.2008) Obtaining advheur1.nup (size: 28945, verison: 12.02.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/advheur1.nup Error: Failed to create file!!! Checking PWSCAN0 (pwscan0.nup,21.10.2003) Obtaining pwscan0.nup (size: 4140, verison: 21.10.2003) Creating file /tmp/harddisk/www/nod32upd//nod_upd/pwscan0.nup Error: Failed to create file!!! Checking PWSCAN1 (pwscan1.nup,21.10.2003) Obtaining pwscan1.nup (size: 864, verison: 21.10.2003) Creating file /tmp/harddisk/www/nod32upd//nod_upd/pwscan1.nup Error: Failed to create file!!! Checking PWSCAN2 (pwscan2.nup,04.11.2003) Obtaining pwscan2.nup (size: 1347, verison: 04.11.2003) Creating file /tmp/harddisk/www/nod32upd//nod_upd/pwscan2.nup Error: Failed to create file!!! Checking UTILMOD0 (utilmod0.nup,12.07.2006) Obtaining utilmod0.nup (size: 23017, verison: 12.07.2006) Creating file /tmp/harddisk/www/nod32upd//nod_upd/utilmod0.nup Error: Failed to create file!!! Checking UTILMOD1 (utilmod1.nup,29.01.2008) Obtaining utilmod1.nup (size: 9472, verison: 29.01.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/utilmod1.nup Error: Failed to create file!!! Checking UTILMOD2 (utilmod2.nup,15.04.2008) Obtaining utilmod2.nup (size: 4459, verison: 15.04.2008) Creating file /tmp/harddisk/www/nod32upd//nod_upd/utilmod2.nup Error: Failed to create file!!! Checking CHARON0 (charon0.nup,20.07.2006) Obtaining charon0.nup (size: 6090, verison: 20.07.2006) Creating file /tmp/harddisk/www/nod32upd//nod_upd/charon0.nup Error: Failed to create file!!! Checking CHARON1 (charon1.nup,08.09.2006) Obtaining charon1.nup (size: 874, verison: 08.09.2006) Creating file /tmp/harddisk/www/nod32upd//nod_upd/charon1.nup Error: Failed to create file!!! Checking CHARON2 (charon2.nup,10.09.2007) Obtaining charon2.nup (size: 944, verison: 10.09.2007) Creating file /tmp/harddisk/www/nod32upd//nod_upd/charon2.nup Error: Failed to create file!!! Checking NOD32MOD_WINNT_ENGLISH_BASE (ntbaseen.nup,11.05.2007) Obtaining ntbaseen.nup (size: 2161903, verison: 11.05.2007) Creating file /tmp/harddisk/www/nod32upd//nod_upd/ntbaseen.nup Error: Failed to create file!!! Checking NOD32MOD_WIN98_ENGLISH_BASE (98baseen.nup,11.05.2007) Obtaining 98baseen.nup (size: 2115516, verison: 11.05.2007) Creating file /tmp/harddisk/www/nod32upd//nod_upd/98baseen.nup Error: Failed to create file!!! Checking NOD32MOD_WINNT_RUSSIAN_BASE (ntbaseru.nup,11.05.2007) Obtaining ntbaseru.nup (size: 2279586, verison: 11.05.2007)
DarkTwin, конечно знаю я про зеркало Ваше и про сайт и про форум. Ну и конечно же про тот скрипт тоже знаю. Давно причем. Форум полезный, зеркала тоже, жаль забанили их пару недель назад... Собственно поэтому и начал делать свое зеркало на роутере, потому что хорошие зеркала либо банят, либо умирают они быстро. Решения проблем с баном конечно тоже знаю. Не устраивают меня они. Решил написать скриптик для зеркала под понятно какую железку. Понятно что такое зеркальце не забанят ввиду того, что знать про него будут не многие. Тот скрипт, что у Вас не устраивает по ряду причин. Как показала практика требует доведения в каждом конкретном случае, да и др. минусы имеет. Хотя написан грамотно, тут не поспоришь. Выкладываю то что сваял для обновления с официального сервера. Кое что кривовато пока, но в целом работоспособно. В общем-то дорабатывать дальше можно только преобразование файла update.ver, поскольку я раскладываю файлы по папкам так как они лежат на оф. серверах, а update.ver оставляю как есть. Ну и дорабатывать по хорошему нужно контроль за ошибками во время скачивания.
Code:#!/bin/sh
WEB_ROOT=/opt/share/www #путь к корневой папке домена, где будет лежать зеркало
AVBASE_DIR=nod_off #имя папки, куда будут валиться базы
SERVER=http://update.eset.com #сервер, откуда обновляемся
USER=EAV-********
PASS=**********
cd $WEB_ROOT
mkdir -p $WEB_ROOT/$AVBASE_DIR
/opt/bin/wget -N --cache=off $SERVER/eset_upd/update.ver
SERVERS=`grep Other= $WEB_ROOT/update.ver|sed s/Other=//|tr -d "\r"|sed s/,/'\n'/g|sed s/^.*@//|sed s/eset_upd//`
rm $WEB_ROOT/update.ver
cd $WEB_ROOT/$AVBASE_DIR
for UPDSERVERS in $SERVERS; do
rm log.txt
/opt/bin/wget -a log.txt -N --cache=off $UPDSERVERS/eset_upd/update.ver
if grep saved log.txt; then
mv -f update.ver update.rar
/opt/bin/unrar x -y update.rar
FILES=`grep file= $WEB_ROOT/$AVBASE_DIR/update.ver|sed s/file=//|tr -d "\r"`
rm update.ver
cd $WEB_ROOT
for UPDFILES in $FILES; do
/opt/bin/wget -xnH -N --cache=off --http-user=$USER --password=$PASS $UPDSERVERS/$UPDFILES
done
cd $WEB_ROOT/$AVBASE_DIR
mv -f update.rar update.ver
fi
done
rm log.txt
Я не особо вчитывался но это разве не просто копирование с зеркала в локальную папку ?
Простите, а что еще по большому счету надо от процесса создания зеркала? Просто нужно знать что куда и как копировать, а точнее не знать, а смотреть в соответствующих местах...