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

SocMaster

Профессор
Регистрация
26 Июл 2011
Сообщения
211
Реакции
49
selfupdate-1.jpg

Собственно есть двиг в нем идет автообновка с китайского сервера, хочется переделать под свой
Вот код где идет запрос на китай сервис
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($v, 34));
            $return['md5'][$k] = substr($v, 0, 32);
            if(trim(substr($v, 32, 2)) != '*') {
                @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($line, 34));
            $md5datanew[$file] = substr($line, 0, 32);
            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($remotefile, false, $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, '', 15, TRUE, '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($dir, 0777)) {
                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_VERSION, 1)) 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);
    }
}
?>
Получается нужна только серверная часть, помогите сделать!
Готов оплатить труды!
Собственно эта система сделана в движке Для просмотра ссылки Войди или Зарегистрируйся
 
а что не так с подменой var $upgradeurl = 'Для просмотра ссылки Войди или Зарегистрируйся';
или нагло захостить (прописать в хостах), что upgrade.discuz.com смотрит в куда тебе нужно?
 
Нет серверной части
даже если серверная часть будет собрана, как вы планируете размещать обновления, так могут быть неочевидные последовательности?
 
Думаю в архивах, каждый названый reliz_20120101, reliz_20120102 и тд
 
Собственно есть двиг в нем идет автообновка с китайского сервера, хочется переделать под свой
Собственно эта система сделана в движке Для просмотра ссылки Войди или Зарегистрируйся

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

Вложения

  • discuz.png
    discuz.png
    38,2 KB · Просмотры: 11
  • discuz2.png
    discuz2.png
    19,3 KB · Просмотры: 13
  • discuz_updates.png
    discuz_updates.png
    73,8 KB · Просмотры: 10
  • discuz_patches.png
    discuz_patches.png
    39,3 KB · Просмотры: 6
так, использовал твою версию, установил, установка прошла без проблем. бегло нашёл два места где есть обращение к их серверу насчёт обновлений. засяду попозже с анализом "что там и как", благо есть свежая версия на которой можно издеваться :crazy:
Да все верно. Там 2 файла отвечает. Есть еще система для плагинов/шаблонов что б тянуть их с китайского сервера, но пока что пусть будет, наша система еще в разработке..
 
забыл сказать, что для директории, где будут размещаться файлы желательно либо vhost конфигурацией, либо htaccess отключить исполнение php и листинг директорий
vhosts

AddType plain/text .php
+
Options -Indexes
htaccess
RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
или
php_flag engine off
или всё вместе
+
Options -Indexes
 
Как он узнает о новых версиях?
Просто стучит на сервер и тот отвечает?
В смысле по крону или как?
 
Как он узнает о новых версиях?
Просто стучит на сервер и тот отвечает?
В смысле по крону или как?
там же в админке есть целый раздел, где можно скачать обновления. но я думаю, что там просто при заходе в админку проверяется. я детально не присматривался как именно запускается процесс проверки обновлений.
 
Назад
Сверху