Файл: admin/about/update.php
Строк: 272
<?php
    include '../../engine/includes/start.php';
    if (!$creator)
        Core::stop();
    $set['title'] = 'Обновление';
    include incDir.'head.php';
    function pre_update($file)
    {
        Core::get('zip');
        $zip = new Pclzip($file);
        $_SESSION['update_file'] = $file;
        $_SESSION['update_with_ftp'] = isset($_POST['ftp']);
        echo '<div class="post">Будут заменены следующие файлы:<br />';
        foreach ($zip->listContent() as $file)
        {
            if ($file['folder'])
                continue;
            echo $file['stored_filename'] .' ('.round($file['size'] / 1024, 2).' kb)<br />';
        }
            echo '</div><a class="link" href="?">Применить обновление</a>';
    }
    function ftp_update($file)
    {
        Core::get('zip');
        $zip = new Pclzip($file);
        $contents = $zip->listContent();
        if ($contents == 0)
            $error = 'Архив поврежден или пуст';
        else
        {
            $config = $zip->extract(PCLZIP_OPT_BY_NAME, 'update.ini', PCLZIP_OPT_EXTRACT_AS_STRING);//, PCLZIP_CB_POST_EXTRACT, 'get_ini');
            file_put_contents(tmpDir . 'update.ini', $config[0]['content']);
            $config = parse_ini_file(tmpDir . 'update.ini', true);
            if (empty($config))
                $error = 'update.ini не найден';
            else
            {
                if (empty($config['version']) || version_compare($config['version'], Core::Secwind('version'), '<='))
                    $error = 'Невозможно установить обновление до версии '. $config['version'] .', когда уже установлена версия '. Core::Secwind('version');
            }
        }
        if (!isset($error))
        {
            @set_time_limit(60);
            $zip->delete(PCLZIP_OPT_BY_NAME, 'upload.ini');
            //$zip->extract(PCLZIP_OPT_SUBSTITUE_FILE, H);
            Core::get('ftp');
            
            $ftp_data = parse_ini_file(H . 'engine/files/data/modules.ini');
            $ftp = new ftp;
            if (!$ftp->connect($ftp_data['ftp_host'], $ftp_data['ftp_user'], $ftp_data['ftp_pass']))
            {
                echo "conntecting failed: ";
                print_r($ftp->error_no);
                print_r($ftp->error_msg);
            }
            else{
            $upd_dir = tmpDir . 'update_to_'.$config['version'] . '/';
            mkdir($upd_dir, 0777);
            $zip->extract(PCLZIP_OPT_SUBSTITUE_FILE, $upd_dir);
            
            foreach($zip->listContent() as $file)
            {
                if ($file['folder'])
                {
                    if (!is_dir(H . $file['filename']))
                    {
                        mkdir(H . $file['filename'], 0777);
                    }
                }
                else
                {
                    //$fil = $zip->extract(PCLZIP_OPT_BY_NAME, $file['filename'], PCLZIP_OPT_EXTRACT_AS_STRING);
                    
                    $ftp->put($file['filename'], $upd_dir . $file['filename']); //, $fil[0]['content']))
                    unlink($upd_dir . $file['filename']);
                }
            }
            //file_put_contents('text.txt', serialize($ftp->lastLines));
            if (!empty($config['sql']))
            {
                Global $sql;
                $sql->from_file(H . $config['sql']);
                $sql->free(true);
                Core::msg_show('Сделаны запросы из файла ' .$config['sql'], 'menu_razd');
                @unlink(H . $config['sql']);
            }
            if (!empty($config['chmod']))
            {
                $dirs = explode(' ', $config['chmod']);
                foreach($dirs as $dir)
                {
                    chmod(H . $dir, 0777);
                }
                Core::msg_show('Выставлены права доступа 777 на необходимые папки', 'menu_razd');
            }
            Core::msg_show('SecWind обновлен до версии '.$config['version'] . '<br />Список изменений: '.nl2br(htmlspecialchars($config['descr'])), 'post');
            $data = unserialize(file_get_contents(H . 'engine/files/data/secwind.db'));
            $data['version'] = $config['version'];
            
            if (!empty($config['secwind']))
            {
                $data = array_merge($data, $config['secwind']);
            }
            
            //file_put_contents(H . 'engine/files/data/secwind.db', serialize($data));
            }
        }
        
        unset($zip, $config, $headers);
    
        if (isset($error))
            Core::msg_show($error);
    }
    
    function update($file)
    {
        Core::get('zip');
        $zip = new Pclzip($file);
        $contents = $zip->listContent();
        if ($contents == 0)
            $error = 'Архив поврежден или пуст';
        else
        {
            $config = $zip->extract(PCLZIP_OPT_SUBSTITUE_FILE, 'update.ini', PCLZIP_OPT_EXTRACT_AS_STRING);//, PCLZIP_CB_POST_EXTRACT, 'get_ini');
            file_put_contents(tmpDir . 'update.ini', $config[0]['content']);
            $config = parse_ini_file(tmpDir . 'update.ini', true);
            if (empty($config))
                $error = 'update.ini не найден';
            else
            {
                if (empty($config['version']) || version_compare($config['version'], Core::Secwind('version'), '<='))
                    $error = 'Невозможно установить обновление до версии '. $config['version'] .', когда уже установлена версия '. Core::Secwind('version');
            }
        }
        if (file_exists(tmpDir . 'update.upd'))
            unlink(tmpDir . 'update.upd');
        if (!isset($error))
        {
            $zip->delete(PCLZIP_OPT_BY_NAME, 'upload.ini');
            $zip->extract(PCLZIP_OPT_SUBSTITUE_FILE, H);
            if (!empty($config['sql']))
            {
                Global $sql;
                $sql->from_file(H . $config['sql']);
                $sql->free(true);
                Core::msg_show('Сделаны запросы из файла ' .$config['sql'], 'menu_razd');
                @unlink(H . $config['sql']);
            }
            if (!empty($config['chmod']))
            {
                $dirs = explode(' ', $config['chmod']);
                foreach($dirs as $dir)
                {
                    chmod(H . $dir, 0777);
                }
                Core::msg_show('Выставлены права доступа 777 на необходимые папки', 'menu_razd');
            }
            Core::msg_show('SecWind обновлен до версии '.$config['version'] . '<br />Список изменений: '.nl2br(htmlspecialchars($config['descr'])), 'post');
            $data = unserialize(file_get_contents(H . 'engine/files/data/secwind.db'));
            $data['version'] = $config['version'];
            
            if (!empty($config['secwind']))
            {
                $data = array_merge($data, $config['secwind']);
            }
            
            file_put_contents(H . 'engine/files/data/secwind.db', serialize($data));
        }
        unset($zip, $config, $headers);
    
        if (isset($error))
            Core::msg_show($error);
    }
    function get_ini($event, &$file)
    {
        Return Rename($file['filename'], tmpDir . 'update.upd');
    }
    switch($act)
    {
        default:
        
        if (
                isset($_SESSION['update_file']) && 
                (
                    is_uploaded_file($_SESSION['update_file']) ||
                    is_file($_SESSION['update_file'])
                ))
            {
                if ($_SESSION['update_with_ftp'])
                {
                    ftp_update($_SESSION['update_file']);
                }
                else
                {
                    update($_SESSION['update_file']);
                }
                
                unset($_SESSION['update_file'], $_SESSION['update_with_ftp']);
            }
        
            echo '<div class="link">Ваша версия: '.Core::SecWind('version').'<br />';
        
            $last_version = @json_decode(file_get_contents('http://secwind.ru/?act=get_last_version'), true);
            if (empty($last_version) || (function_exists('json_last_error') && json_last_error()))
            {
                echo '</div>';
                Core::msg_show('Невозможно проверить на обновление');
            }
            else
            {
                echo (version_compare($last_version['last_version'], Core::SecWind('version'), '=')    ? 'У вас установлена последняя версия' : 'Последняя: <a href="'.$last_version['link_update'].'">'.$last_version['last_version'] . ' ' .$last_version['status'].'</a>') . '<br />
                Дата выхода: '.Core::time($last_version['time_release']) . '<br />
                Список изменений в версии '.$last_version['last_version'] .': <br /> '.nl2br($last_version['changelog']).'</div>';
            }
            ?>
                <form class="link" method = "post" action="?act=import">
                    Ссылка к zip архиву:<br />
                    <input type="text" name="url" value="http://"/><br />
                    <label><input type="checkbox" name="ftp"/>Установка по <a href="/admin/modules/settings.php">ftp</a> (beta)</label><br />
                    <input value = "Импорт" type="submit" />
                </form>
                <form class="link" method="post" enctype="multipart/form-data" action="?act=upload">
                    Выберите архив. Расширение файла должен быть "<b>zip</b>" и присутствовать файл "<b>update.ini</b>"<br/>
                    <input type="file" name="file"/><br />
                    <label><input type="checkbox" name="ftp"/>Установка по <a href="/admin/modules/settings.php">ftp</a> (beta)</label><br />
                    <input value = "Загрузить" name="save" type="submit" />
                </form>
                <?php
        break;
        
        case 'import':
        if (!empty($_POST['url']))
        {
            $headers = @get_headers($_POST['url'], 1);
            if (!$headers)
                $error = 'Не удалось получить заголовки по указанному адресу';
            elseif ($headers['Content-Type'] != 'application/zip')
                $error = 'Только zip архивы';
        
            else
            {
                @set_time_limit(20);
                $up_file = pathinfo($_POST['url'], PATHINFO_FILENAME);
                file_put_contents(tmpDir . $up_file, file_get_contents($_POST['url']));
                
                pre_update(tmpDir . $up_file);
            }
        }
        break;
        case 'upload':
        if (!empty($_FILES['file']['name']))
        {
            $pathinfo = pathinfo($_FILES['file']['name']);
            if ($pathinfo['extension'] != 'zip')
                $error = 'Только zip архивы';
            else
            {
                $up_file = tmpDir . 'update_'.time().'.zip';
                move_uploaded_file($_FILES['file']['tmp_name'], $up_file);
                pre_update($up_file);
            }
        }
        break;
    }
    ?>
    <a href='/admin/?act=about'><div class="link">SecWind</div></a>
    <a href='?'><div class="link">Обновление</div></a>
    <a href='/admin/'><div class="link">Админка</div></a>
    <?php
    include incDir.'foot.php';