Система автообновления

Тема в разделе "Как сделать...", создана пользователем SocMaster, 31 дек 2012.

  1. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    [​IMG]
    Собственно есть двиг в нем идет автообновка с китайского сервера, хочется переделать под свой
    Вот код где идет запрос на китай сервис
    PHP:
    class discuz_upgrade {
     
        var 
    $upgradeurl 'http://upgrade.discuz.com/DiscuzX/';
        var 
    $locale 'SC';
        var 
    $charset 'GBK';
     
        public function 
    fetch_updatefile_list($upgradeinfo) {
     
            
    $file DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/updatelist.tmp';
            
    $upgradedataflag true;
            
    $upgradedata = @file_get_contents($file);
            if(!
    $upgradedata) {
                
    $upgradedata dfsockopen($this->upgradeurl.substr($upgradeinfo['upgradelist'], 0, -4).strtolower('_'.$this->locale.'_'.$this->charset).'.txt');
                
    $upgradedataflag false;
            }
     
            
    $return = array();
            
    $upgradedataarr explode("\r\n"$upgradedata);
            foreach(
    $upgradedataarr as $k => $v) {
                if(!
    $v) {
                    continue;
                }
                
    $return['file'][$k] = trim(substr($v34));
                
    $return['md5'][$k] = substr($v032);
                if(
    trim(substr($v322)) != '*') {
                    @
    unlink($file);
                    return array();
                }
     
            }
            if(!
    $upgradedataflag) {
                
    $this->mkdirs(dirname($file));
                
    $fp fopen($file'w');
                if(!
    $fp) {
                    return array();
                }
                
    fwrite($fp$upgradedata);
            }
     
            return 
    $return;
        }
     
        public function 
    compare_basefile($upgradeinfo$upgradefilelist) {
            if(!
    $discuzfiles = @file('./source/admincp/discuzfiles.md5')) {
                return array();
            }
     
            
    $newupgradefilelist = array();
            foreach(
    $upgradefilelist as $v) {
                
    $newupgradefilelist[$v] = md5_file(DISCUZ_ROOT.'./'.$v);
            }
     
            
    $modifylist $showlist $searchlist = array();
            foreach(
    $discuzfiles as $line) {
                
    $file trim(substr($line34));
                
    $md5datanew[$file] = substr($line032);
                if(isset(
    $newupgradefilelist[$file])) {
                    if(
    $md5datanew[$file] != $newupgradefilelist[$file]) {
                        if(!
    $upgradeinfo['isupdatetemplate'] && preg_match('/\.htm$/i'$file)) {
                            
    $ignorelist[$file] = $file;
                            
    $searchlist[] = "\r\n".$file;
                            continue;
                        }
                            
    $modifylist[$file] = $file;
                    } else {
                        
    $showlist[$file] = $file;
                    }
                }
            }
            if(
    $searchlist) {
                
    $file DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/updatelist.tmp';
                
    $upgradedata file_get_contents($file);
                
    $upgradedata str_replace($searchlist''$upgradedata);
                
    $fp fopen($file'w');
                if(
    $fp) {
                    
    fwrite($fp$upgradedata);
                }
            }
     
            return array(
    $modifylist$showlist$ignorelist);
        }
     
        public function 
    compare_file_content($file$remotefile) {
            if(!
    preg_match('/\.php$|\.htm$/i'$file)) {
                return 
    false;
            }
            
    $content preg_replace('/\s/'''file_get_contents($file));
            
    $ctx stream_context_create(array('http' => array('timeout' => 60)));
            
    $remotecontent preg_replace('/\s/'''file_get_contents($remotefilefalse$ctx));
            if(
    strcmp($content$remotecontent)) {
                return 
    false;
            } else {
                return 
    true;
            }
        }
     
        public function 
    check_upgrade() {
     
            include_once 
    libfile('class/xml');
            include_once 
    libfile('function/cache');
     
            
    $return false;
            
    $upgradefile $this->upgradeurl.$this->versionpath().'/'.DISCUZ_RELEASE.'/upgrade.xml';
            
    $response xml2array(dfsockopen($upgradefile));
            if(isset(
    $response['cross']) || isset($response['patch'])) {
                
    C::t('common_setting')->update('upgrade'$response);
                
    $return true;
            } else {
                
    C::t('common_setting')->update('upgrade''');
                
    $return false;
            }
            
    updatecache('setting');
            return 
    $return;
        }
     
        public function 
    check_folder_perm($updatefilelist) {
            foreach(
    $updatefilelist as $file) {
                if(!
    file_exists(DISCUZ_ROOT.$file)) {
                    if(!
    $this->test_writable(dirname(DISCUZ_ROOT.$file))) {
                        return 
    false;
                    }
                } else {
                    if(!
    is_writable(DISCUZ_ROOT.$file)) {
                        return 
    false;
                    }
                }
            }
            return 
    true;
        }
     
        public function 
    test_writable($dir) {
            
    $writeable 0;
            
    $this->mkdirs($dir);
            if(
    is_dir($dir)) {
                if(
    $fp = @fopen("$dir/test.txt"'w')) {
                    @
    fclose($fp);
                    @
    unlink("$dir/test.txt");
                    
    $writeable 1;
                } else {
                    
    $writeable 0;
                }
            }
            return 
    $writeable;
        }
     
        public function 
    download_file($upgradeinfo$file$folder 'upload'$md5 ''$position 0$offset 0) {
            
    $dir DISCUZ_ROOT.'./data/update/Discuz! X'.$upgradeinfo['latestversion'].' Release['.$upgradeinfo['latestrelease'].']/';
            
    $this->mkdirs(dirname($dir.$file));
            
    $downloadfileflag true;
     
            if(!
    $position) {
                
    $mode 'wb';
            } else {
                
    $mode 'ab';
            }
            
    $fp fopen($dir.$file$mode);
            if(!
    $fp) {
                return 
    0;
            }
            
    $response dfsockopen($this->upgradeurl.$upgradeinfo['latestversion'].'/'.$upgradeinfo['latestrelease'].'/'.$this->locale.'_'.$this->charset.'/'.$folder.'/'.$file.'sc'$offset''''FALSE''15TRUE'URLENCODE'FALSE$position);
            if(
    $response) {
                if(
    $offset && strlen($response) == $offset) {
                    
    $downloadfileflag false;
                }
                
    fwrite($fp$response);
            }
            
    fclose($fp);
     
            if(
    $downloadfileflag) {
                if(
    md5_file($dir.$file) == $md5) {
                    return 
    2;
                } else {
                    return 
    0;
                }
            } else {
                return 
    1;
            }
        }
     
        public function 
    mkdirs($dir) {
            if(!
    is_dir($dir)) {
                if(!
    self::mkdirs(dirname($dir))) {
                    return 
    false;
                }
                if(!@
    mkdir($dir0777)) {
                    return 
    false;
                }
                @
    touch($dir.'/index.htm'); @chmod($dir.'/index.htm'0777);
            }
            return 
    true;
        }
     
        public function 
    copy_file($srcfile$desfile$type) {
            global 
    $_G;
     
            if(!
    is_file($srcfile)) {
                return 
    false;
            }
            if(
    $type == 'file') {
                
    $this->mkdirs(dirname($desfile));
                
    copy($srcfile$desfile);
            } elseif(
    $type == 'ftp') {
                
    $siteftp $_GET['siteftp'];
                
    $siteftp['on'] = 1;
                
    $siteftp['password'] = authcode($siteftp['password'], 'ENCODE'md5($_G['config']['security']['authkey']));
                
    $ftp = & discuz_ftp::instance($siteftp);
                
    $ftp->connect();
                
    $ftp->upload($srcfile$desfile);
                if(
    $ftp->error()) {
                    return 
    false;
                }
            }
            return 
    true;
        }
     
        public function 
    versionpath() {
            
    $versionpath '';
            foreach(
    explode(' 'substr(DISCUZ_VERSION1)) as $unit) {
                
    $versionpath $unit;
                break;
            }
            return 
    $versionpath;
        }
     
        function 
    copy_dir($srcdir$destdir) {
            
    $dir = @opendir($srcdir);
            while(
    $entry = @readdir($dir)) {
                
    $file $srcdir.$entry;
                if(
    $entry != '.' && $entry != '..') {
                    if(
    is_dir($file)) {
                        
    self::copy_dir($file.'/'$destdir.$entry.'/');
                    } else {
                        
    self::mkdirs(dirname($destdir.$entry));
                        
    copy($file$destdir.$entry);
                    }
                }
            }
            
    closedir($dir);
        }
     
        function 
    rmdirs($srcdir) {
            
    $dir = @opendir($srcdir);
            while(
    $entry = @readdir($dir)) {
                
    $file $srcdir.$entry;
                if(
    $entry != '.' && $entry != '..') {
                    if(
    is_dir($file)) {
                        
    self::rmdirs($file.'/');
                    } else {
                        @
    unlink($file);
                    }
                }
            }
            
    closedir($dir);
            
    rmdir($srcdir);
        }
    }
    ?>
    Получается нужна только серверная часть, помогите сделать!
    Готов оплатить труды!
    Собственно эта система сделана в движке http://yadi.sk/d/Nlx2zw2e0Yojp
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    а что не так с подменой var $upgradeurl = 'http://upgrade.discuz.com/DiscuzX/';
    или нагло захостить (прописать в хостах), что upgrade.discuz.com смотрит в куда тебе нужно?
     
    SocMaster нравится это.
  3. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Нет серверной части
     
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    даже если серверная часть будет собрана, как вы планируете размещать обновления, так могут быть неочевидные последовательности?
     
    SocMaster нравится это.
  5. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Думаю в архивах, каждый названый reliz_20120101, reliz_20120102 и тд
     
  6. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    так, использовал твою версию, установил, установка прошла без проблем. бегло нашёл два места где есть обращение к их серверу насчёт обновлений. засяду попозже с анализом "что там и как", благо есть свежая версия на которой можно издеваться :crazy:
     

    Вложения:

    • discuz.png
      discuz.png
      Размер файла:
      38,2 КБ
      Просмотров:
      11
    • discuz2.png
      discuz2.png
      Размер файла:
      19,3 КБ
      Просмотров:
      13
    • discuz_updates.png
      discuz_updates.png
      Размер файла:
      73,8 КБ
      Просмотров:
      10
    • discuz_patches.png
      discuz_patches.png
      Размер файла:
      39,3 КБ
      Просмотров:
      6
    SocMaster нравится это.
  7. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Да все верно. Там 2 файла отвечает. Есть еще система для плагинов/шаблонов что б тянуть их с китайского сервера, но пока что пусть будет, наша система еще в разработке..
     
  8. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    забыл сказать, что для директории, где будут размещаться файлы желательно либо vhost конфигурацией, либо htaccess отключить исполнение php и листинг директорий
    vhosts

    htaccess
     
    SocMaster нравится это.
  9. SocMaster

    SocMaster aka Hakerok

    Регистр.:
    26 июл 2011
    Сообщения:
    202
    Симпатии:
    47
    Как он узнает о новых версиях?
    Просто стучит на сервер и тот отвечает?
    В смысле по крону или как?
     
  10. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.723
    Симпатии:
    2.100
    там же в админке есть целый раздел, где можно скачать обновления. но я думаю, что там просто при заходе в админку проверяется. я детально не присматривался как именно запускается процесс проверки обновлений.
     
    SocMaster нравится это.