Новые уроки
Получай новые уроки по RSS

Подписка на рассылку


Голосование
Чего выкладывать больше?
Программ
Уроков
Скриптов
Шаблонов
Макетов
CMS
Видеоуроков
Облако тегов

PHP → Делаем свой сервер обновлений для NOD32

Здравствуйте дорогие друзья smile . Сегодня мне бы хотелось рассказать как можно сделать свой сервер обновлений для NOD32.
Для начала нам понадобится специальный скрипт, который будет загружать обновления с чужого сайта.

Код файла: update.php


<?php

define("DEFAULT_SAVE_PATH","/home/users1/f/fiamma/domains/vcevidim.ru");

$servers = array(
array('host'=>'http://lavnod.tapochek.net/eset_upd/','savepath'=>DEFAULT_SAVE_PATH."/nod/")
,array('host'=>'nod32.tapochek.net/eset_upd/')
//,array('host'=>'http://89.202.157.135/eset_upd/','user'=>'EAV-06787424','password'=>'ums5sfbhwf')
);

/**
* 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

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==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);
}
?>


В корневом каталоге вашего сайта сохраняем эти два файла. Нам необходима папочка, куда будут складываться обновления, поэтому создаем папку с названием nod и устанавливаем права 777.

Подготовка закончена. А теперь давайте поговорим о настройке скрипта для Nod32. Ниже выложено изображение и приведено описания для каждого пункта.

Делаем свой сервер обновлений для NOD32


1. Здесь нужно указать абсолютный путь к вашему сайту. Его можно спросить у вашего хостера или найти в техническом разделе.
2. Это папка куда буду складываться обновления. Если она вас устраивает то оставьте ее без изменений.
3. Адрес сайта, откуда будут копироваться обновления.

Ну, думаю вот и все. Установка скрипта завершена. Для доступа к скрипту, в адресной строке браузера набираем “ http://имя вашего сайта.ru/update.php”


P.S. Удачного использования
Новые уроки php здесь
Опубликовал Александр Кистень, 4-03-2010, 20:40 Комментариев: 14
 (голосов: 8)
Пишет klimentino, 13 марта 2010 16:25
  • Сообщений: 0
  • Новостей: 0
Если бы знал , что все так просто winked давно бы уже сделал и пользовался. А нашел время только на днях и наконец-то радуюсь проделанной работе. Пашет супер!
Пишет MICHAEL, 13 апреля 2010 00:06
  • Сообщений: 0
  • Новостей: 0
нижайший поклон за скрипт.
Пишет Александр Кистень, 20 апреля 2010 00:25
  • Сообщений: 0
  • Новостей: 0
Спасибо... Всегда рад помочь :) Если чего нужно, вы пишите, не стесняйтесь. Отвечу всем.
Пишет vanikon, 24 апреля 2010 15:40
  • Сообщений: 0
  • Новостей: 0
Есть пара вопросов
1. Скрипт каждый раз надо запускать вручную или только первый раз?
2. Как установить логин и пароль на папку nod?

winked с паролем разобрался. поставил ограничения на доступ к папке.
Пишет Александр Кистень, 24 апреля 2010 23:10
  • Сообщений: 0
  • Новостей: 0
Сейчас разберемся с пунктом 1.

Скрипт нужно запускать каждый раз, когда хочешь скачать обновления. Но... Если у тебя хостинг поддерживает запуск скриптов по расписанию, то можно установить, чтобы скрипт запускался ну скажем каждые 2 часа.. Или в любое другое подходящее для тебя время.

Насчет пункта 2.
Ты бы может написал интрукцию как ты это делал.. А я бы подредактировал эту новость... А точнее дополнил.
Пишет vanikon, 25 апреля 2010 07:12
  • Сообщений: 0
  • Новостей: 0
По пункту 2: Зашел в панель управления хостингом ( у меня ISPmanager), в меню World Wide Web выбрал пункт Ограничение доступа. Затем выбираю Защитить новую директорию. Создается пункт в меню с этой директорией. Переходишь в нее и нажимаешь на Создать пользователя. И уже здесь задаешь логин и пароль, который будет в дальнейшем запрашивать Nod32.
Пишет Александр Кистень, 25 апреля 2010 22:02
  • Сообщений: 0
  • Новостей: 0
Ок. Спасибо.. Я постараюсь наиболее хорошо описать решение проблемы и дополню статью.
Пишет vanikon, 28 апреля 2010 07:49
  • Сообщений: 0
  • Новостей: 0
а для чего эта строчка?
eset_upd/','user'=>'EAV-06787424','password
9;=>'ums5sfbhwf')
Пишет Александр Кистень, 28 апреля 2010 11:01
  • Сообщений: 0
  • Новостей: 0
Если базы копируются с сайта, на котором установлен пароль, то необходимо использовать эту строчку. Строчки выше необходимо за комментировать.
Пишет Aleso, 18 июня 2010 23:31
  • Сообщений: 0
  • Новостей: 0
Вопрос, все получилось файлы скрипт скачал, но Нод обновлятся с папки не хочет, что не так ? Путь http://ДОМЕН/NOD/
Пишет Александр Кистень, 18 июня 2010 23:57
  • Сообщений: 0
  • Новостей: 0
Очень важно использовать правильный регистр при обновлении. Поэтому путь должен быть http://ДОМЕН/nod/
Пишет Alexsey, 17 января 2011 14:18
  • Сообщений: 0
  • Новостей: 0
А можно такой скрипт использовать для создания зеркала с официальных сайтов обновлений нод?
Пишет Куандык, 18 апреля 2011 12:38
  • Сообщений: 0
  • Новостей: 0
Рахмет (Спасибо!) очень удобно! раньше сам заливал раз в неделю не удобно, а теперь все само работает!
Пишет Константин, 25 мая 2011 21:41
  • Сообщений: 0
  • Новостей: 0
картинка не открывается((((