Skip to content

Instantly share code, notes, and snippets.

@Rhincodon
Last active September 29, 2015 22:20
Show Gist options
  • Save Rhincodon/0206b0cd660aa52b3d97 to your computer and use it in GitHub Desktop.
Save Rhincodon/0206b0cd660aa52b3d97 to your computer and use it in GitHub Desktop.
shit.md
<?php

header('Content-Type: text/html; charset=utf-8');
session_start();

global $standalone_inst;
$standalone_inst = is_dir('sql') ? false : true;

// Автоматически разворачиваемые файлы экспорта
$autoinstall_dir = realpath(dirname(__FILE__)) . '/autoinstall/';
$autoinstall = array();
if (file_exists($autoinstall_dir)) {
    $autoinstall_ext = array('tgz', 'gz', 'tar');
    $autoinstall = scandir($autoinstall_dir);
    foreach ($autoinstall as $i => $file) {
        $file_ext = pathinfo($file, PATHINFO_EXTENSION);
        if (in_array($file_ext, $autoinstall_ext)) {
            $autoinstall[$i] = $autoinstall_dir . $file;
        }
        else {
            unset($autoinstall[$i]);
        }
    }
}

// installation folder
if (!$standalone_inst) {
    $INSTALL_FOLDER = join(strstr(__FILE__, "/") ? "/" : "\\", array_slice(preg_split("/[\/\\\]+/", __FILE__), 0, -1)) . (strstr(__FILE__, "/") ? "/" : "\\");
}
else {
    $INSTALL_FOLDER = join(strstr(__FILE__, "/") ? "/" : "\\", array_slice(preg_split("/[\/\\\]+/", __FILE__), 0, 0)) . (strstr(__FILE__, "/") ? "/" : "\\");
}
$INSTALL_FOLDER = nc_standardize_path_to_folder($INSTALL_FOLDER);
$_SERVER['DOCUMENT_ROOT'] = nc_standardize_path_to_folder($_SERVER['DOCUMENT_ROOT']);

if (!strstr($INSTALL_FOLDER, $_SERVER['DOCUMENT_ROOT'])) {
    $INSTALL_FOLDER = rtrim($_SERVER['DOCUMENT_ROOT'], '/') . $INSTALL_FOLDER;
}

// main NetCat folder
if (!$standalone_inst) {
    $NETCAT_FOLDER = nc_standardize_path_to_folder(realpath($INSTALL_FOLDER . '../'));
}
else {
    $NETCAT_FOLDER = nc_standardize_path_to_folder(realpath($INSTALL_FOLDER));
}

// custom installation folder
$CUSTOM_FOLDER = str_replace(rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/', '', $NETCAT_FOLDER);

// normalize path
if (strlen(trim($CUSTOM_FOLDER, '/'))) {
    $CUSTOM_FOLDER = '/' . trim($CUSTOM_FOLDER, '/') . '/';
}
else {
    $CUSTOM_FOLDER = '';
}

if (nc_post_get('pwd')) {
    $_SESSION['pwd'] = nc_post_get('pwd');
}

if (nc_post_get('isNaked') && nc_post_get('isNaked')) {
    switch (true) {
        case nc_post_get('get_current_distrib') && nc_post_get('get_current_distrib'):
            $distribs = array();
            $current_dir = opendir('.');

            while ($file = readdir($current_dir)) {
                if (strpos($file, '.') !== 0) {
                    $tmp = (array)explode('.', $file);
                    $ext = array_pop($tmp);

                    if (nc_func_enabled('exec') && !nc_is_windows()) {
                        if ($ext != 'gz' && $ext != 'tgz') {
                            continue;
                        }
                    }
                    else {
                        if ($ext != 'zip') {
                            continue;
                        }
                    }

                    $distribs[] = $file;
                }
            }

            if (!empty($distribs)) {
                $html = "
                    <div>Имя файла:</div>
                    <select name='current_distrib'>";

                foreach ($distribs as $distrib) {
                    $html .= "
                        <option value='$distrib'>$distrib</option>";
                }

                $html .= "
                    </select>";
            }
            else {
                $html = "Дистрибутивов не найдено";
            }

            echo $html;

            break;
    }
    exit;
}

define('NETCAT', 'netcat.ru');
define('INSTALL_GET_INFO_URL', 'http://netcat.ru/download/distrib/latest/info.php');
define('INSTALL_DESIGN_SRC', 'http://netcat.ru/setup/layouts/');

// unlimit time
@set_time_limit(0);
header("Content-type: text/html; charset=utf-8");

error_reporting(E_ALL);
$action = nc_post_get('action');
$ajax = false;

switch ($action) {
    case 0:
        nc_html_beg();
        echo nc_html_status_bar(array("'color': '#444', 'opacity': 1", "можно приступать"));
        echo "Вас приветствует установщик системы управления сайтами <a href='http://netcat.ru/' target='_blank'>NetCat</a>.<br /><br />Сейчас я протестирую ваш сервер на совместимость с NetCat, после чего установлю систему, и вы сможете начать работу. Вы можете ознакомиться с нашими <a href='http://netcat.ru/cms/requirements/' target='_blank'>системными требованиями</a>.<br /><br />На втором шаге проверки мне потребуется доступ к базе данных MySQL.";
        echo nc_html_form(1, 'Приступить к проверке');
        break;
    case 1:
        if (!$ajax) {
            nc_html_beg();
        }
        // Проверка настроек сервера: основных и дополнительных
        $php_version = phpversion();
        $logHeader =
            '--------------------------------------------------' . PHP_EOL .
            'Дата ' . date("d.m.Y") . PHP_EOL .
            '--------------------------------------------------' . PHP_EOL .
            'Установка NetCat' . PHP_EOL .
            '--------------------------------------------------';
        nc_write_log($logHeader, false);

        nc_write_log("Этап №" . $action . ": Начало проверки параметров хостинга.");
        nc_write_log("Текущая версия PHP: " . $php_version);

        $errors = array();
        $notices = array();

        if (version_compare($php_version, "5.3.0") == '-1') {
            $errors['phpversion'] = "Версия PHP должна быть не ниже 5.3.0.";
            nc_write_log("Ошибка: " . $errors['phpversion']);
        }

        // проверка значений обязательных директив в php.ini
        $arr_ini = array(
            'allow_url_fopen' => 1,
            'safe_mode' => 0,
            'short_open_tag' => 1,
            'zend.ze1_compatibility_mode' => 0
        );
        foreach ($arr_ini as $key => $value) {
            if (intval(ini_get($key)) != $value) {
                if (strtolower(ini_get($key)) != ($value ? 'on' : 'off')) {
                    echo $key . " - " . $value;
                    $errors[$key] = "Необходимо " . ($value ? "включить " : "отключить ") . "параметр " . $key . ".";
                    nc_write_log("Ошибка: " . $errors[$key]);
                }
            }
        }
        $memory_limit = intval(ini_get('memory_limit'));
        if ($memory_limit > 0 && $memory_limit < 24) {
            $errors['memory_limit'] = "Необходимо увеличить параметр memory_limit.";
            nc_write_log("Ошибка: " . $errors['memory_limit']);
        }

        // 1 необязательная директива
        if (intval(ini_get('mbstring.func_overload')) != 0) {
            $notices['mbstring.func_overload'] = "Необходимо выключить параметр mbstring.func_overload.";
            nc_write_log("Предупреждение: " . $notices['mbstring.func_overload']);
        }

        $extensions_name = array(
            'mysql' => 'MySQL',
            'session' => 'Session',
            'mbstring' => 'MBstring',
            'iconv' => 'iconv',
            'tokenizer' => 'Tokenizer',
            'ctype' => 'Ctype',
            'dom' => 'DOM',
            'json' => 'JSON',
            'libxml' => 'libxml',
            'simplexml' => 'SimpleXML',
            'curl' => 'cURL',
            'gmp' => 'GMP'
        );

        // проверка наличия обязательных расширений
        $arr_ext = array('session', 'mysql');
        foreach ($arr_ext as $ext) {
            if (!extension_loaded($ext)) {
                $errors[$ext] = "Не хватает расширения " . (isset($extensions_name[$ext]) ? $extensions_name[$ext] : $ext) . ".";
                nc_write_log("Ошибка: " . $errors[$ext]);
            }
        }

        // проверка наличия "необязательных" расширений
        $arr_ext_opt = array('ctype', 'curl', 'dom', 'gd', 'iconv', 'json', 'libxml', 'mbstring', 'simplexml', 'gmp', 'tokenizer');
        foreach ($arr_ext_opt as $ext) {
            if (!extension_loaded($ext)) {
                $notices[$ext] = "Не хватает расширения " . (isset($extensions_name[$ext]) ? $extensions_name[$ext] : $ext) . ".";
                nc_write_log("Предупреждение: " . $notices[$ext]);
            }
            else if ($ext == 'gd') {
                if (function_exists('gd_info')) {
                    $gd = gd_info();
                    preg_match('/\d/', $gd['GD Version'], $match);
                    $gd = $match[0];
                    if ($gd < 2) {
                        $notices['gd'] = "Расширения gd имеет версию ниже 2.0.0.";
                        nc_write_log("Предупреждение: " . $notices['gd']);
                    }
                }
                else {
                    $notices['gd'] = "Не удалось выяснить версию расширения gd.";
                    nc_write_log("Предупреждение: " . $notices['gd']);
                }
            }
        }

        $dir = dirname($_SERVER['PHP_SELF']);
        $test_dir = "testdirtestdir";
        if (!@mkdir($test_dir)) {
            $errors['mkdir'] = "Нет прав на создание директорий.";
            nc_write_log("Ошибка: " . $errors['mkdir']);
        }
        if (!is_writable($test_dir)) {
            $errors['is_writable'] = "Нет прав на изменение директорий.";
            nc_write_log("Ошибка: " . $errors['is_writable']);
        }
        if (!@rmdir($test_dir)) {
            $errors['rmdir'] = "Нет прав на удаление директорий.";
            nc_write_log("Ошибка: " . $errors['rmdir']);
        }

        if (empty($errors)) {
            if (empty($notices)) {
                nc_write_log("Этап №1: Проверка параметров завершена. Все параметры подходят.");
            }
            if (!empty($notices)) {
                nc_write_log("Этап №1: Проверка параметров завершена.");
            }
            $result = nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': '#444', 'opacity': 1", "можно начинать"), false, array(1, 0));
            $result .= "Ваш хостинг" . (empty($notices) ? " прекрасно" : "") . " подходит для работы NetCat. Теперь я проверю базу данных MySQL. Введите параметры доступа к ней. Если вы их не знаете, обратитесь к сотруднику службы поддержки или системному администратору. В случае, когда вы используете обычный хостинг, эти параметры, скорее всего, были присланы вам по электронной почте после регистрации на сайте хостинг-провайдера.";

            if (!empty($notices)) {
                $result .= "<br /><br />Эти предупреждения нужно учесть, чтобы обеспечить корректную работу системы в будущем:<br /><div style='margin: 7px 0; font-style: italic; color: orange;'>" . join("<br />", $notices) . "</div>";
                $result .= "Тем не менее система может быть установлена, но её функциональность может быть ограничена.";
            }

            $result .= "<div class='db'>";
            $opt_html = "
            <div class='cell'>
                <span class='item'>Хост (host)</span><br />
                <input type='text' name='host' id='host' value='" . (nc_post_get('host') ? nc_post_get('host') : "localhost") . "' />
            </div>
                    <div class='cell'>
                <span class='item'>Имя БД (name)</span><br />
                <input type='text' name='dbname' id='dbname' value='" . nc_post_get('dbname') . "' />
            </div>
            <div class='cell'>
                <span class='item'>Логин (user)</span><br />
                <input type='text' name='user' id='user' value='" . nc_post_get('user') . "' />
            </div>
            <div class='cell'>
                <span class='item'>Пароль (password)</span><br />
                <input type='password' name='pass' id='pass' value='" . nc_post_get('pass') . "' />
            </div>";
            $result .= nc_html_form(2, 'Проверить БД', $opt_html);
            $result .= "</div>";
        }
        else {
            $result = nc_html_status_bar(array("'color': 'red', 'opacity': 1", "возникли проблемы!"));
            $result .= "<span style='font-style: italic; padding: 10pt; color: red;'>" . join(" ", $errors) . "</span><br /><br />Эти проблемы не позволяют использовать NetCat на вашем хостинге. Если вы не можете решить их самостоятельно, перешлите их описание сотруднику технической поддержки или системному администратору. Извините, но это зависит не от меня. Я очень надеюсь, что эти проблемы можно решить, и тогда установку можно будет произвести еще раз. ";
        }

        echo $result;
        break;
    case 2:
        // Проверка настроек БД
        if (!$ajax) {
            nc_html_beg();
        }
        nc_write_log("Этап №" . $action . ": Начало проверки БД.");
        $error = "";
        $LinkID = nc_connect_db();
        // проверка соединения с БД
        if (!$LinkID) {
            $error = "Нет соединение с указанной БД. MySQL ошибка: " . mysql_error();
            nc_write_log($error);
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'red', 'opacity': 1", "возникли проблемы!"), false, array(1, 0));
            echo "Не удалось произвести подключение к указанной БД, возможно были указаны не все параметры подключения. Проверьте правильность и повторите попытку.";
            echo nc_html_form(1, "Вернуться и повторить");
            break;
        }
        else {
            nc_write_log("Соединение с БД успешно установлено.");
        }

        // проверка версии MySQL
        if (version_compare(mysql_get_server_info(), "4.1.0") == '-1') {
            $error = "Версия MySQL ниже требуемой. Обратитесь, пожалуйста, к системному администратору или хостинг-провайдеру для решения этой проблемы.";
            nc_write_log($error);
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'red', 'opacity': 1", "возникли проблемы!"), false, array(1, 0));
            echo $error;
            break;
        }

        // проверка прав заданного пользователя на действия в БД
        if (!nc_check_user_grants()) {
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'red', 'opacity': 1", "возникли проблемы!"), false, array(1, 0));
            echo "Указанный вами пользователь не имеет прав записи в базу данных. Может, есть какой-то другой? Обратитесь в службу поддержки вашего хостинг-провайдера или к системному администратору, чтобы решить эту проблему.";
            echo nc_html_form(1, 'Вернуться');
            break;
        }

        // найдены таблицы NetCat
        $deltables = nc_post_get('deltables');
        if ($deltables) {
            $repeatTables = nc_repeat_tables();
            foreach ($repeatTables as $d_t) {
                $query = "DROP TABLE `" . $d_t . "`";
                nc_query($query);
            }
        }

        if (nc_repeat_tables()) {
            $error = "В указанной БД найдены таблицы CMS NetCat.";
            nc_write_log($error);
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'red', 'opacity': 1", "внимание!"), false, array(1, 0));
            echo "В указанной вами базе данных уже есть таблицы, которые хочет создать установщик. Хотите удалить их и продолжить установку?";
            echo nc_html_form(2, 'Удалить и продолжить', "<input type='hidden' id='deltables' name='deltables' value='1' />");
            break;
        }

        nc_write_log("Этап №" . $action . ": Проверка параметров БД успешно завершена.");
        echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': '#444', 'opacity': 1", "осталось совсем немного"), array(1, 1));
        echo nc_post_get('demodistr') ? nc_html_form(3, 'Продолжить', 'Сейчас я установлю бесплатную версию системы, которая будет работать 60 дней, после чего нужно будет приобрести полноценный вариант.<br />') : nc_html_choice($standalone_inst);
        break;
    case 3:
        /*if (!$ajax && (file_get_contents('http://netcat.ru/netcat/modules/default/get_distr_version.php?reg_num=' . +$_REQUEST['regnum']) < 5)) {
            html_beg();
            echo "";
            html_end();
            exit;
        }*/
        // Ввод настроек для установки
        if (!$ajax) {
            nc_html_beg();
        }
        nc_write_log("Этап №" . $action . ": Настройки установки.");
        $errors = array();
        if (!nc_post_get('demodistr') && !(nc_post_get('code') || nc_post_get('regnum'))) {
            nc_write_log('Не выбран дистрибутив для установки или не введены данные по коммерческой версии системы.');
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            echo "Не выбран дистрибутив для установки или введены не все данные по коммерческой версии системы. Вернитесь и выберите какую-либо из предложенных версий системы.";
            echo nc_html_form(2, 'Вернуться');
            break;
        }
        echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': '#444', 'opacity': 1", "последний вопрос"), array(1, 1));
        echo "<div id='settings'>" . nc_html_settings($standalone_inst) . "</div>";
        break;
    case 4:
        // Установка выбранной редакции
        if (!$ajax) {
            nc_html_beg();
        }
        nc_write_log("Этап №" . $action . ": Установка дистрибутива.");
        $errors = array();

        echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': '#444', 'opacity': 1", "устанавливаем систему"), array(1, 1));

        echo "Установка может занять от нескольких секунд до нескольких минут, все зависит от производительности вашего сервера.<br />
        <ul>";
        @ob_flush();
        @flush();

        $notify['success'] = "<script>$('#timer').html('<span style=\'color: green;\'>готово!</span>');</script>";
        $notify['error'] = "<script>$('#timer').html('<span style=\'color: red;\'>ошибка!</span>');</script>";

        echo "<li>Разворачиваю базу данных... <span id='timer'></span></li>";
        @ob_flush();
        @flush();
        if (!nc_install_db()) {
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            $errors['db'] = "При установке базы данных возникла проблема.";
            nc_write_log($errors['db']);
            echo $notify['error'];
            $message['db'] = $errors['db'];
            echo "</ul>";
            echo $message['db'];
            echo nc_html_form(4, 'Повторить');
            break;
        }
        echo $notify['success'];
        @ob_flush();
        @flush();
        $errors['db'] = "База данных успешно развернута.";
        nc_write_log($errors['db']);

        echo "</ul>";
        @ob_flush();
        @flush();

        // update vars.inc.php
        nc_write_varsinc($NETCAT_FOLDER, $CUSTOM_FOLDER);
        // update .htaccess
        nc_change_htaccess($NETCAT_FOLDER, $CUSTOM_FOLDER);

        echo nc_html_form('5', 'Завершить установку');
        break;
    case 41:
        // Загрузка выбранной редакции

        if (!$ajax) {
            nc_html_beg();
        }
        nc_write_log("Этап №" . $action . ": Загрузка и распаковка выбранной редакции.");
        $errors = array();

        $distr_dir = rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/';

        if (!nc_installer_check_perm($distr_dir)) {
            nc_write_log('У директории для установки не хватает прав на запись файлов');
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            echo "У директории для установки не хватает прав на запись файлов. Проставьте права 777 на директорию установки и повторите установку";
            echo nc_html_form(41, 'Повторить');
            break;
        }

        if (!nc_check_domain_available(NETCAT)) {
            $errors['rmdir'] = str_replace('%url%', NETCAT, "Нет соединения с %url%.");
            nc_write_log($errors['rmdir']);
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            echo $errors['rmdir'] . " Установка системы невозможна.";
            break;
        }

        // найдены файлы NetCat
        $delfiles = nc_post_get('delfiles');
        if ($delfiles) {
            $catch_nc_files = nc_repeat_files($distr_dir);
            foreach ($catch_nc_files as $item) {
                $file = nc_standardize_path_to_file($distr_dir . '/' . $item);
                if (is_dir($file)) {
                    nc_clear_dir($file);
                    nc_write_log('Папка ' . $file . ' была удалена');
                }
                else {
                    @unlink($file);
                    nc_write_log('Файл ' . $file . ' был удалён');
                }
            }
        }

        if (nc_repeat_files($distr_dir)) {
            nc_write_log('В директории для установки уже содержатся файлы или папки, которые хочет установить NetCat');
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "внимание!"), array(1, 1));
            echo "В указанной Вами директории уже есть файлы, которые хочет создать установщик. Хотите удалить их и продолжить установку?";
            echo nc_html_form(41, 'Удалить и продолжить', "<input type='hidden' id='delfiles' name='delfiles' value='1' />");
            break;
        }
        echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': '#000', 'opacity': 1", "в процессе"), array(1, 1));
        @ob_flush();
        @flush();
        echo "Установка может занять от нескольких секунд до нескольких минут, все зависит от скорости вашего соединения с Интернетом.<br />
		<ul>";
        @ob_flush();
        @flush();
        $notify['success0'] = "<script>$('#timer0').html('<span style=\'color: green;\'>готово!</span>');</script>";
        $notify['error0'] = "<script>$('#timer0').html('<span style=\'color: red;\'>ошибка!</span>');</script>";
        $notify['success1'] = "<script>$('#timer1').html('<span style=\'color: green;\'>готово!</span>');</script>";
        $notify['error1'] = "<script>$('#timer1').html('<span style=\'color: red;\'>ошибка!</span>');</script>";
        $notify['success2'] = "<script>$('#timer2').html('<span style=\'color: green;\'>готово!</span>');</script>";
        $notify['error2'] = "<script>$('#timer2').html('<span style=\'color: red;\'>ошибка!</span>');</script>";

        echo "<li>Скачиваю... <span id='timer0'></span></li>";
        @ob_flush();
        @flush();

        $get_info_params = array(
            'format' => (nc_func_enabled('exec') && !nc_is_windows()) ? 'tgz' : 'zip',
        );
        nc_write_log('Выбрана компрессия ' . $get_info_params['format']);

        if (nc_post_get('demodistr') && !(nc_post_get('code') || nc_post_get('regnum'))) {
            $is_trial = true;
            $get_info_params['edition'] = nc_post_get('demodistr');
        }
        else {
            $is_trial = false;
            $get_info_params['regnum'] = nc_post_get('regnum');
            $get_info_params['code'] = nc_post_get('code');
        }

        $file_info = json_decode(file_get_contents(INSTALL_GET_INFO_URL . '?' . http_build_query($get_info_params, null, '&')), true);
        if (!$file_info || $file_info['error'] || !$file_info['url'] || !$file_info['md5']) {
            if (!$file_info) {
                $errors['load'] = 'Не получен ответ с сервера.';
                $message['load'] = 'Не получен ответ с сервера. Пожалуйста, повторите установку.';
            }
            elseif ($is_trial) {
                $errors['load'] = 'Выбрана некорректная редакция системы.';
                $message['load'] = 'Выбрана редакция системы, для которой отсутствуют файлы установки. Пожалуйста, повторите установку, выбрав другую редакцию.';
            }
            else {
                $errors['load'] = 'Регистрационный код и/или ключ активации неверные.';
                $message['load'] = 'Не существует такого сочетания лицензии и ключа активации. Проверьте правильность введённых вами данных и повторите установку.';
            }

            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            nc_write_log($errors['load']);
            echo "</ul>";
            echo $message['load'];
            echo nc_html_form(2, 'Повторить');
            break;
        }
        else {
            $filename = basename($file_info['url']);
            $file_md5 = $file_info['md5'];

            $src = fopen($file_info['url'], 'r');
            $dst = fopen($distr_dir . $filename, 'w');

            while (!feof($src)) {
                fwrite($dst, fread($src, 4096));
            }

            fclose($dst);
            fclose($src);
        }

        if (md5_file($distr_dir . $filename) == $file_md5) {
            echo $notify['success0'];
            @ob_flush();
            @flush();
            $errors['file_md5'] = "Архив с дистрибутивом успешно скачан.";
            nc_write_log($errors['file_md5']);
        }
        else {
            echo $notify['error0'];
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            $errors['file_md5'] = "При скачивании архива возникла проблема. Контрольная сумма скачанного архива не совпадает с оригинальной. Попробуйте повторить процедуру установки снова.";
            nc_write_log($errors['file_md5']);
            $message['file_md5'] = $errors['file_md5'];
            echo "</ul>";
            echo $message['file_md5'];
            echo nc_html_form(41, 'Повторить');
            break;
        }

        echo "<li>Распаковываю архив... <span id='timer1'></span></li>";
        @ob_flush();
        @flush();
        nc_write_log('Файл для распаковки: ' . $filename);
        nc_write_log('Директория для распаковки: ' . $distr_dir);
        if (nc_unzip($filename, $distr_dir)) {
            echo $notify['success1'];
            @ob_flush();
            @flush();
            $errors['unzip'] = "Архив " . $filename . " был успешно распакован.";
            nc_write_log($errors['unzip']);
        }
        else {
            echo $notify['error1'];
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            $errors['unzip'] = "Ошибка распаковки файла " . $filename . ". Проверьте, есть ли права на запись файлов в директории архива, есть ли свободное место на жестком диске и не поврежден ли архив.";
            nc_write_log($errors['unzip']);
            $message['upzip'] = $errors['unzip'];
            echo "</ul>";
            echo $message['upzip'];
            echo nc_html_form(41, 'Повторить');
            break;
        }

        echo "<li>Разворачиваю базу данных... <span id='timer2'></span></li>";
        @ob_flush();
        @flush();
        if (!nc_install_db('install/sql/')) {
            echo nc_html_status_bar(array("'color': 'green', 'opacity': 1", "всё отлично!"), array("'color': 'green', 'opacity': 1", "всё прекрасно!"), array("'color': 'red', 'opacity': 1", "возникла проблема!"), array(1, 1));
            $errors['db'] = "При установке базы данных возникла проблема.";
            nc_write_log($errors['db']);
            echo $notify['error2'];
            $message['db'] = $errors['db'];
            echo "</ul>";
            echo $message['db'];
            echo nc_html_form(41, 'Повторить');
            break;
        }
        echo $notify['success2'];
        @ob_flush();
        @flush();
        $errors['db'] = "База данных успешно развернута.";
        nc_write_log($errors['db']);

        echo "</ul>";
        @ob_flush();
        @flush();

        // update vars.inc.php
        nc_write_varsinc($NETCAT_FOLDER, $CUSTOM_FOLDER);
        // update .htaccess
        nc_change_htaccess($NETCAT_FOLDER, $CUSTOM_FOLDER);

        echo nc_html_form('5', 'Завершить установку');

        break;
    case 5:
        if (count($autoinstall)) {
            require_once $NETCAT_FOLDER . 'vars.inc.php';
            require $ROOT_FOLDER . "connect_io.php";

            $nc_core->modules->load_env("", false, true, true);
            foreach ($autoinstall as $file) {
                $result = $nc_core->backup->import($file, array('save_ids' => false));
            }
        }

        // NetCat установлен
        if (!$ajax) {
            nc_html_beg();
        }

        $dir = $_SERVER['HTTP_HOST'] . $CUSTOM_FOLDER . '/';
        $dir = preg_replace('#/{2,}$#', '/', $dir);

        $result = nc_html_status_bar(
            array("'color': 'green', 'opacity': 1", "всё отлично!"),
            array("'color': 'green', 'opacity': 1", "всё прекрасно!"),
            array("'color': 'green', 'opacity': 1", "готово!"),
            array(1, 1)
        );
        $result .= "Ура, NetCat установлен, теперь вы можете начать работу. Смотрите:<br />" .
            "<ul>" .
            "<li>Адрес сайта: <a href='http://" . $dir . "' target='_blank'>http://" . $dir . "</a></li>" .
            "<li>Вход в систему администрирования: <a href='http://" . rtrim($dir, '/') . "/netcat/admin/' target='_blank'>http://" . rtrim($dir, '/') . "/netcat/admin/</a></li>" .
            "<li>Вход на сайт в режиме редактирования: <a href='http://" . rtrim($dir, '/') . "/netcat/' target='_blank'>http://" . rtrim($dir, '/') . "/netcat/</a></li>" .
            "<li>Логин для входа: <strong>admin</strong></li>" .
            "<li>Пароль: тот, который вы ввели " . (nc_post_get('email') ? "(и еще он выслан на e-mail <a href='mailto:" . nc_post_get('email') . "'>" . nc_post_get('email') . "</a>)" : "") . "</li>" .
            "</ul>" .
            "<br />" .
            "<em style='color: red;'>Обязательно удалите папку install с сервера!</em>";
        echo $result;
        nc_mail_to_user($dir);
        // clear session
        unset($_SESSION['pwd']);
        break;
}
nc_html_end();

function nc_repeat_files($distr_dir) {
    $nc_files = array(
        "images",
        "install",
        "netcat",
        "netcat_cache",
        "netcat_dump",
        "netcat_files",
        "netcat_template",
        "netcat_trash",
        ".htaccess",
        "favicon.ico",
        "index.php",
        "vars.inc.php"
    );

    return array_intersect($nc_files, scandir($distr_dir));
}

function nc_html_beg() {

    // Для оффлайн установки из архива
    $jquery = '../netcat_template/jquery/jquery.min.js';
    if (!file_exists($jquery)) {
        $jquery = '//code.jquery.com/jquery-latest.js';
    }

    echo <<<HEREDOC
<!doctype html>
<html>
<head>
    <title>Установка NetCat</title>
    <meta http-equiv="Content-Language" content="ru" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style type="text/css">
		.valid {margin-top:12px; margin-left:10px; position:absolute; font-size:13pt;}
		body {font-family: 'Segoe UI', SegoeWP, Arial, Helvetica, Verdana; background-color: white; margin:0;}
		form {margin: 0; padding: 0;}
		a {color: #1A87C2;}
		a.dashed {border-bottom:1px dashed #000; text-decoration:none; outline:none;}
		a.dashed:hover {border-bottom:none; outline:none;}
		.main {position:relative; top:50px; width:740px; display:block; left:auto; right:auto; background-color: white; color: #444; font-size:12pt; margin:0 auto; padding:30pt 30pt 20pt; border: 2px solid #1A87C2;}
		.top {font-size:30pt;}
		.support {margin-top: 30pt; font-size: 11pt; text-align: right;}
		.status_bar {font-size:16pt; padding:12pt 0 20pt; text-transform: lowercase;}
		.status_bar .pair,#arrow0,#arrow1 {float:left;}
		.status_bar #arrow0,#arrow1 {opacity:0.4; margin:0 5pt;}
		.status_bar .pair #item0,#item1,#item2 {opacity:0.4;}
		.status_bar .pair #status0,#status1,#status2 {font-size:11pt; opacity:0.4;}
		#submit_button {font-size:12pt; margin:20pt 0 0 0; padding:8px 15px; background-color: #1A87C2; color: white; text-align: center; font-family: 'Segoe UI', SegoeWP, Arial; cursor: pointer; text-transform: lowercase; border: none;}
		.db {padding:18pt 0 0;}
		.db .cell {float:left; padding:0 10pt 0 0;}
		.db .item {font-size:10pt; font-weight:700;}
		.db input {font-size:14pt; width:100pt; margin:5pt 0 0; padding:2pt 0;}
		.demos {padding-left:30pt; padding-top:10pt;}
		.demos input {font-size:14pt; margin-right:7pt;}
		.demo_ttl {font-size:14pt; margin-left:-22pt;}
		.selected_tab {font-size:14pt; border-bottom:none; text-decoration:none; cursor:text;}
		.nonselected_tab {font-size:14pt; border-bottom:1pt dashed; text-decoration:none; color:blue;}
		.pwd_create {padding:20pt 0;}
		#pwd_gen {color:blue; cursor:pointer; border-bottom:1pt dashed; font-size:10pt; margin-left:7pt;}
		#pwd_show {margin:5pt 5pt 0 10pt;}
		#regnum,#code {font-size:14pt; margin-top:5pt;}
		#code {width:265pt;}
		#regnum {width:90pt;}
		.hidden {display:none;}
		#newfolder {margin-top:20pt;}
		.color_block {margin:5px 0 0 7px; padding:0;}
		.color_item {cursor:pointer; height:10px; width:20px; border:0; padding:0;}
		.layout {float:left; margin-top:10pt; text-align:center;}
		select[name=distrib], select[name=current_distrib], #setupdir {margin-top:5pt; font-size:12pt; width:265pt;}
		#setupdirname {width:265pt; font-size:14pt; margin-top:5pt;}
		ul {padding-top:20pt; margin:0;}
		.select,.email_form,.regnum_block {margin-bottom:20pt;}
		.demo_def,.pwd_show_block {font-size:10pt;}
		#pwd_field,#pwd_field_clear,#email_field {font-size:14pt; width:265pt; margin:5pt 0 0;}
    </style>
    <script type="text/javascript" src="{$jquery}"></script>
</head>
<body>
    <div class='main'>
            <div class='top'>Установка CMS NetCat</div>
            <div class='status_bar'>
                <div class='pair'>
                    <span id='item0'>Проверка хостинга</span><br />
                    <span id='status0'>можно приступать</span>
                </div>
                <div id='arrow0'>&rarr;</div>
                <div class='pair'>
                    <span id='item1' >Проверка базы данных</span><br />
                    <span id='status1' >еще не производилась</span>
                </div>
                <div id='arrow1'>&rarr;</div>
                <div class='pair'>
                    <span id='item2' >Установка NetCat</span><br />
                    <span id='status2'>сначала все проверим</span>
                </div>
                <div style='clear:both;'></div>
            </div>
            <div id='content'>
HEREDOC;
}

function nc_html_end() {
    $html = "</div>
    <div class='support'>Служба технической поддержки и по работе с клиентами: +7 (495) 783-60-21, <a href='mailto:support@netcat.ru'>support@netcat.ru</a></div>
    </div>
<script type='text/javascript'>
    $(document).ready(function() {
      $('#main_form').submit(function() {
        var ajax = $('#ajax').val();
        if (ajax) {
            var q = $('#main_form').serialize();
            var request = $.ajax({
              type: 'POST',
              data: q,
              dataType: 'html',
              cache: false,
              success: function(data) {
                    $('#content').html(data);
                }
            });
            return false;
        }
      });

	$('#show_block1').click(function(){
		if ($('#show_block1').is('.nonselected_tab')) {
			$('#show_block1').removeClass('nonselected_tab');
			$('#show_block1').addClass('selected_tab');

			$('#show_block2').removeClass('selected_tab');
			$('#show_block2').addClass('nonselected_tab');

			$('#block1').removeClass('hidden');
			$('#block2').addClass('hidden');

			$('#code').val('');
			$('#code_valid').html('');
			$('#regnum').val('');
			$('#regnum_valid').html('');
		}

		return false;
	});

	$('#show_block2').click(function() {
		if ($('#show_block2').is('.nonselected_tab')) {
			$('#show_block2').removeClass('nonselected_tab');
			$('#show_block2').addClass('selected_tab');

			$('#show_block1').removeClass('selected_tab');
			$('#show_block1').addClass('nonselected_tab');

			$('#block2').removeClass('hidden');
			$('#block1').addClass('hidden');

			for(var i = 1; i < 6; i++) {
			$('#db' + i).attr('checked', null);
			}
		}

		return false;
	});

        $('#pwd_gen').click( function() {
          var sign = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f',
          'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W',
          'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H',
          'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4',
          '5', '6', '7', '8', '9', '0'];
          var result = '';
          var end = sign.length - 1;
          for(var i = 0; i < 10; i++) {
            result += sign[Math.floor(Math.random()*end)];
          }
          $('#pwd_field').val(result);
          return false;
        });

        $('#pwd_show').change( function() {
          nc_show_hide_pwd('#pwd_field', this.checked);
        });

        $('#email_field').focusout(function(){
          nc_check_email($('#email_field').val(), '#email_field');
        });

        $('#regnum').focusout(function(){
          if ($('#regnum').val()) {
            $('#regnum_valid').removeClass('hidden');
            nc_is_valid_regnum($('#regnum').val());
          }
        });

        $('#code').focusout(function(){
          if ($('#code').val()) {
            $('#code_valid').removeClass('hidden');
            nc_is_valid_key($('#code').val());
          }
        });

        $('#code').focus(function(){
          $('#code_valid').addClass('hidden');
        });

        $('#regnum').focus(function(){
          $('#regnum_valid').addClass('hidden');
        });
    });

    function nc_show_hide_pwd(id, checked) {
        checked ? nc_show_pwd(id) : nc_hide_pwd(id);
    }

    function nc_show_pwd(id) {
        var id_clear = id+'_clear';
        $(id_clear).removeClass('hidden');
        $(id).addClass('hidden');
        $(id_clear).val($(id).val());
    }

    function nc_hide_pwd(id) {
      var id_clear = id+'_clear';
      $(id).removeClass('hidden');
      $(id_clear).addClass('hidden');
      $(id).val($(id_clear).val());
    }

    function nc_check_email(value, id) {
        var email = value;
        if(email != '') {
          if (nc_is_valid_email(email) == false) {
            $('#email_valid').html('<span style=\'color: red;\'>не похоже на настоящий email</span>');
          }
          else {
            $('#email_valid').html('');
          }
        }
        else {
          $('#email_valid').html('');
        }
    }

    function nc_is_valid_email(emailAddress) {
        var pattern=/[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,5}/i;
        return pattern.test(emailAddress);
    }

    function nc_write_message(result, id) {
        return result ? nc_write_good(id) : nc_write_bad(id);
    }

    function nc_write_good(id) {
      $('#' + id).html('<span style=\'color: green;\'>похоже на настоящий</span>');
      return true;
    }

    function nc_write_bad(id) {
      $('#' + id).html('<span style=\'color: red;\'>не похоже на настоящий</span>');
      return false;
    }

    function nc_is_valid_regnum(regnum) {
        return nc_write_message(/^[0-9]{8}$/.test(regnum), 'regnum_valid');
    }

    function nc_is_valid_key(code) {
        return nc_write_message(/^([\dA-Z]{5}-){4}[\dA-Z]{4}$/.test(code), 'code_valid');
    }

</script>
</body>
</html>";
    echo $html;
}

function nc_html_status_bar($array1 = array(), $array2 = array(), $array3 = array(), $array4 = array()) {
    return "<script type='text/javascript'>
    " . (!empty($array1) && $array1[0] ? "$('#item0, #status0').css({" . $array1[0] . "});" : "") . "
    " . (!empty($array1) && $array1[1] ? "$('#status0').html('" . $array1[1] . "');" : "") . "
    " . (!empty($array4) && $array4[0] ? "$('#arrow0').css({'color': '#444', 'opacity': 1});" : "") . "
    " . (!empty($array2) && $array2[0] ? "$('#item1, #status1').css({" . $array2[0] . "});" : "") . "
    " . (!empty($array2) && $array2[1] ? "$('#status1').html('" . $array2[1] . "');" : "") . "
    " . (!empty($array4) && $array4[1] ? "$('#arrow1').css({'color': '#444', 'opacity': 1});" : "") . "
    " . (!empty($array3) && $array3[0] ? "$('#item2, #status2').css({" . $array3[0] . "});" : "") . "
    " . (!empty($array3) && $array3[1] ? "$('#status2').html('" . $array3[1] . "');" : "") . "
    </script>";
}

function nc_html_form($action, $button, $opt = '') {
    global $ajax;
    $html = "<form method='post' action='" . $_SERVER['SCRIPT_NAME'] . "' name='main_form' id='main_form' >";
    $html .= "<input type='hidden' name='action' id='action' value='" . $action . "' />";
    $params = array(
        "host", "user", "dbname", "pass", "pwd", "email",
        "demodistr", "regnum", "code", "have_site",
        "custom_system_classificators", "custom_system_components", "custom_system_widgets", "custom_system_content",
        "custom_system_content_site", "custom_system_content_shop", "custom_system_content_site_mobile",
        "custom_system_content_adaptive", "custom_system_content_longpage", "custom_system_content_shortpage"
    );
    foreach ($params as $param) {
        $html .= "<input type='hidden' name='" . $param . "' value='" . nc_post_get($param) . "' />";
    }
    $html .= "<input type='hidden' name='ajax' id='ajax' value='" . $ajax . "' />";
    $html .= $opt . "<input type='submit' name='submit_button' id='submit_button' value='" . $button . "' /></form>";

    return $html;
}

function nc_query($query) {
    global $LinkID;
    $res = mysql_query($query, $LinkID);
    if (mysql_error()) {
        print mysql_error() . "\n<br /><strong>Query:</strong> <pre>$query</pre>\n";
        return false;
    }
    else {
        return $res;
    }
}

function nc_results($query = '', $output = 'object', $col = '') {

    if ($query) {
        $result = nc_query($query);
    }
    if ($result == false) {
        return false;
    }

    switch ($output) {
        case 'column':
            while ($row = mysql_fetch_assoc($result)) {
                $last_result[] = $row[$col];
            }
            break;

        case 'array':
            while ($row = mysql_fetch_row($result)) {
                $last_result[] = $row;
            }
            break;

        case 'row':
            while ($row = mysql_fetch_assoc($result)) {
                $last_result = $row;
            }
            break;

        case 'var':
            $var = mysql_fetch_row($result);
            $last_result = $var[0];
            break;

        case 'object':
        default:
            $last_result = $result;
            break;
    }

    return $last_result;
}

function nc_post_get($param) {
    if (empty($_GET) && empty($_POST)) {
        return false;
    }
    if ($param) {
        return array_key_exists($param, $_GET) ? $_GET[$param] : (array_key_exists($param, $_POST) ? $_POST[$param] : "");
    }
    else {
        return array_merge($_POST, $_GET);
    }
}

function nc_connect_db() {
    global $LinkID;
    $host = nc_post_get('host');
    $user = nc_post_get('user');
    $pass = nc_post_get('pass');
    $dbname = nc_post_get('dbname');

    $LinkID = @mysql_connect($host, $user, $pass);
    if (!$LinkID) {
        return false;
    }

    if (!mysql_select_db($dbname, $LinkID)) {
        nc_write_log('Не удалось произвести подключение к указанной БД');
        return false;
    }
    mysql_query("SET NAMES 'utf8'");
    mysql_query("ALTER DATABASE `" . $dbname . "` DEFAULT CHARACTER SET 'utf8'");

    return $LinkID;
}

function nc_check_user_grants() {
    $sql_create = "CREATE TABLE test_table (ID int(11) NOT NULL, FIO varchar(128) NOT NULL)";
    $sql_drop = "DROP TABLE `test_table`";
    $error = false;
    if (!(nc_query($sql_create) && nc_query($sql_drop))) {
        $error = true;
    }
    if ($error) {
        return false;
    }
    else {
        return true;
    }
}

function nc_html_form_demo($standalone_inst) {

    if (!$standalone_inst) {
        $html = "<div style='display: none; '>
			Выберите редакцию NetCat:";
        $html .= "<input type='hidden' name='demodistr' value='extra' id='extra' />";
        $html .= "</div>";
    }
    else {
        $html = "<div id='block1'>
			Выберите редакцию NetCat:";
        $html .= nc_html_form_demo_item('Standard', 'standard', 'rgb(38, 144, 207)', 'Подходит для несложных веб-проектов, сайтов-визиток.');
        $html .= nc_html_form_demo_item('Business', 'business', 'rgb(253, 204, 109)', 'Оптимальный вариант для небольшого интернет-магазина или корпоративного сайта.');
        $html .= nc_html_form_demo_item('Corporate', 'corporate', 'rgb(82, 95, 103)', 'Отлично подходит для больших сложных корпоративных сайтов.');
        $html .= nc_html_form_demo_item('E-commerce', 'ecommerce', 'rgb(240, 125, 34)', 'Прекрасный выбор для больших и функционально сложных интернет-магазинов и торговых систем.');
        $html .= nc_html_form_demo_item('Extra', 'extra', 'rgb(204, 51, 0);', 'Самая полная редакция NetCat, для крупных порталов и нестандартных веб-проектов.');
        $html .= "</div>";
    }

    return $html;
}

function nc_html_form_demo_item($name, $id, $color, $description) {
    $html = "
			<div class='demos'>
	  		<div class='demo_ttl' style='color:" . $color . ";'>
	  			<input type='radio' name='demodistr' value='" . $id . "' id='" . $id . "' /><label for='" . $id . "'>" . $name . "</label>
	  		</div>
	  		<div class='demo_def'>" . $description . "</div>
	  	</div>";
    return $html;
}

function nc_html_form_license() {
    $html = "
        <div id='block2' class='hidden'>
        <div class='regnum_block'>
            Регистрационный номер:<br />
            <input type='text' name='regnum' id='regnum' maxlength='8' />
            <span id='regnum_valid' class='valid'></span>
        </div>
        <div class='code_block'>
            Ключ активации:<br />
            <input type='text' name='code' id='code' maxlength='28' />
            <span id='code_valid' class='valid'></span>
        </div>
      </div>";

    return $html;
}

function nc_html_choice($standalone_inst) {
    $html = "Сейчас я установлю и настрою систему NetCat. Перед этим хотелось бы определиться, ставим ли мы демо-версию (бесплатную версию системы, которая будет работать 60 дней, после чего нужно будет приобрести полноценный вариант) или коммерческую версию (в этом случае у вас должен быть регистрационный номер и ключ активации).<br /><br />Сравнить редакции и приобрести NetCat вы можете <a href='http://netcat.ru/products/editions/compare/' target='_blank'>здесь</a>.
    <br /><br />
    <div class='select'>
        <a href='#' id='show_block1' class='selected_tab'>демо-версия</a>
        &nbsp;&nbsp;
        <a href='#' id='show_block2' class='nonselected_tab'>коммерческая версия</a>
    </div>";

    $html .= nc_html_form(3, 'Продолжить', nc_html_form_demo($standalone_inst) . nc_html_form_license());

    return $html;
}

function nc_html_design() {
    global $autoinstall;

    $result = "<div>Варианты установки:</div>
        <br />
        <div>
            <input type='radio' name='have_site' id='have_site0' value='0' />
            <label for='have_site0'>Установить минимальный набор</label>
        </div>
        <div>
            <input type='radio' name='have_site' id='have_site1' value='1' />
            <label for='have_site1'>Выбрать комплектацию системы вручную</label>
            <input type='hidden' id='custom_system' name='custom_system' value='' />
        </div>
        <div>
            <input type='radio' name='have_site' id='have_site2' value='2' checked />
            <label for='have_site2' checked>Установить систему с готовыми сайтами и данными</label>
        </div>
        <script>
			jQuery(':radio').change(function () {if (jQuery(this).val() == 1) jQuery('#custom_system_block').show(); else jQuery('#custom_system_block').hide();});
		</script>";

    $result .= "<br />
	<div id='custom_system_block' style='display: none;'>
		<div>
            <input type='checkbox' name='custom_system_classificators' id='custom_system_classificators' value='1' />
            <label for='custom_system_classificators'>Списки</label>
        </div>
		<div>
            <input type='checkbox' name='custom_system_components' id='custom_system_components' value='1' />
            <label for='custom_system_components'>Компоненты</label>
        </div>
        <div>
            <input type='checkbox' name='custom_system_widgets' id='custom_system_widgets' value='1' />
            <label for='custom_system_widgets'>Виджет-компоненты</label>
        </div>
        <div>
            <input type='checkbox' name='custom_system_content' id='custom_system_content' value='1' />
            <label for='custom_system_content'>Предустановленные сайты</label>
        </div>
        <br />
        <div id='custom_system_content_block' style='display: none; margin-left: 20px;'>
			<div>
				<input type='checkbox' name='custom_system_content_site' id='custom_system_content_site' value='1' checked />
				<label for='custom_system_content_site'>Корпоративный сайт</label>
			</div>
			<div>
				<input type='checkbox' name='custom_system_content_shop' id='custom_system_content_shop' value='1' checked />
				<label for='custom_system_content_shop'>Интернет-магазин</label>
			</div>
			<div>
				<input type='checkbox' name='custom_system_content_site_mobile' id='custom_system_content_site_mobile' value='1' checked />
				<label for='custom_system_content_site_mobile'>Корпоративный сайт (Мобильный)</label>
			</div>
			<div>
				<input type='checkbox' name='custom_system_content_adaptive' id='custom_system_content_adaptive' value='1' checked />
				<label for='custom_system_content_adaptive'>Адаптивный сайт</label>
			</div>
			<div>
                <input type='checkbox' name='custom_system_content_longpage' id='custom_system_content_longpage' value='1' checked />
                <label for='custom_system_content_longpage'>Longpage сайт</label>
            </div>
            <div>
                <input type='checkbox' name='custom_system_content_shortpage' id='custom_system_content_shortpage' value='1' checked />
                <label for='custom_system_content_shortpage'>Shortpage сайт</label>
            </div>
			<br />
		</div>
	</div>
	<script type='text/javascript'>
		jQuery('#custom_system_content').change(function () {if (jQuery(this).is(':checked')) {jQuery('#custom_system_content_block').show(); $('#custom_system_classificators').attr('checked', true).attr('disabled', true); $('#custom_system_components').attr('checked', true).attr('disabled', true); $('#custom_system_widgets').attr('checked', true).attr('disabled', true);} else {jQuery('#custom_system_content_block').hide(); $('#custom_system_classificators').attr('disabled', false); $('#custom_system_components').attr('disabled', false); $('#custom_system_widgets').attr('disabled', false);}});
	</script>";

    return $autoinstall ? "<div style='visibility:hidden; height:0; width:0; overflow:hidden'>{$result}</div>" : $result;
}

function nc_html_settings($standalone_inst) {
    return nc_html_form(($standalone_inst ? 41 : 4), 'Установить NetCat', nc_html_design() . nc_html_distrib() . nc_html_config());
}

function nc_html_distrib() {
    $html = "
        <script>
            $(document).ready(function() {
                $('select[name=distrib]').change(function() {
                    var current_distrib = $('div#current_distrib');

                    if ($('select[name=distrib] :selected').val() == 1) {
                        nc_update_current_disrib();
                        $('div#current_distrib').show();
                    } else {
                        $('div#current_distrib').hide();
                    }
                });
            });

            function nc_update_current_disrib() {
                $.ajax({'type' : 'GET',
                        'url': '?get_current_distrib=1&isNaked=1',
                        success: function(response) {
                            $('div#current_distrib').html(response);
                        }});
            }
        </script>";

    return $html;
}


/*function choose_install_dir() {
    return null;
}*/

function nc_html_config() {
    $html = "<div class='pwd_create'>
                    Введите пароль пользователя <strong>admin</strong>, для входа в систему администрирования системы:<br />
                    <input type='password' name='pwd' id='pwd_field' />
                    <a href='#' id='pwd_gen' class='selected_tab'>сгенерировать пароль</a>
                    <div>
						<input type='checkbox' name='show_pwd' value='1' id='show_pwd' onclick='document.getElementById(\"pwd_field\").type = (this.checked ? \"text\" : \"password\");' />
                        <label for='show_pwd'>Показать пароль</label>
                    </div>
                </div>
                <div class='email_form'>
                    Выслать параметры доступа на e-mail:<br />
                    <input class='email' type='text' name='email' id='email_field' />
                    <span id='email_valid' class='valid'></span>
                </div>";
    //$html .= choose_install_dir();

    return $html;
}

function nc_check_domain_available($domain) {
    $response = '';
    if (extension_loaded('curl')) {
        $curlInit = curl_init($domain);
        curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($curlInit, CURLOPT_HEADER, true);
        curl_setopt($curlInit, CURLOPT_NOBODY, true);
        curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, true);

        $response = curl_exec($curlInit);
        curl_close($curlInit);
    }
    else {
        $response = file_get_contents("http://" . $domain);
    }

    if ($response) {
        return true;
    }
    else {
        return false;
    }
}

function nc_standardize_path_to_file($path) {
    return rtrim(nc_standardize_path_to_folder($path), '/');
}

function nc_standardize_path_to_folder($path) {
    $path = str_replace('\\', '/', $path);
    while (!(strpos($path, '//') === false)) {
        $path = str_replace('//', '/', $path);
    }
    return rtrim($path, '/') . '/';
}

function nc_install_db($dir = 'sql/', $level = 0) {
    global $autoinstall;

    if (!$level) {
        nc_connect_db();
    }

    $content = false;
    $all = false;

    // При наличии автоустановочных дампов ставим минимальный дистрибутив
    $install_type = $autoinstall ? 0 : nc_post_get('have_site');

    $system_arr = array();
    $module_arr = array();

    // clear system
    $system_arr[0] = array('core', 'version');
    // custom system
    $system_arr[1] = array();
    // full system
    $system_arr[2] = array('classificators', 'components', 'widgets');

    switch ($install_type) {
        case 1:
            $custom_arr = array('custom_system_classificators', 'custom_system_components', 'custom_system_widgets');
            foreach ($custom_arr as $row) {
                if (nc_post_get($row)) {
                    $system_arr[1][] = str_replace('custom_system_', '', $row);
                }
            }
            if (nc_post_get('custom_system_content')) {
                $content = true;
                $system_arr[1] = array('classificators', 'components', 'widgets');
            }
            nc_write_log('Установка кастомизированного наполнения');
            break;
        case 2:
            $content = true;
            $all = true;
            nc_write_log('Установка полного дистрибутива');
            break;
    }

    $version_arr = array('');

    for ($i = 0; $i <= $install_type; $i++):
        foreach ($system_arr[$i] as $row):
            foreach ($version_arr as $ver) {
                $file_name = $row . $ver . '.sql';
                $file = nc_standardize_path_to_file(dirname(__FILE__) . '/' . $dir . $file_name);
                if (file_exists($file)) {
                    if (!nc_exec_sql($file)) {
                        nc_write_log('Возможно система уже установлена: ' . $file);
                        return false;
                    }
                }
            }
        endforeach;
    endfor;

    // collect all modules
    $file = nc_standardize_path_to_file(dirname(__FILE__) . '/' . $dir);
    if (file_exists($file)) {
        if ($handle = opendir($file)) {
            while (false !== ($entry = readdir($handle))) {
                if (strpos($entry, 'module_') === 0) {
                    $module_arr[] = $entry;
                }
            }
            closedir($handle);
        }
        sort($module_arr);
    }

    // install modules db
    foreach ($module_arr as $file_name) {
        // для установки напрямую из репозитория без ошибок:
        if ($file_name == 'module_netshop__basic.sql' && in_array('module_netshop__full.sql', $module_arr)) {
            continue;
        }
        $file = nc_standardize_path_to_file(dirname(__FILE__) . '/' . $dir . $file_name);
        if (file_exists($file)) {
            if (!nc_exec_sql($file)) {
                nc_write_log('Возможно модуль уже установлен: ' . $file);
                return false;
            }
        }
    }

    if (!$level) {

        if ($all || $content) {
            // main content
            nc_install_db($dir . 'content/', 1);
            // site
            if ($all || nc_post_get('custom_system_content_site')) {
                nc_install_db($dir . 'content/site/', 2);
            }
            // shop
            if ($all || nc_post_get('custom_system_content_shop')) {
                nc_install_db($dir . 'content/shop/', 2);
            }
            // site_mobile
            if ($all || nc_post_get('custom_system_content_site_mobile')) {
                nc_install_db($dir . 'content/site_mobile/', 2);
            }
            // adaptive
            if ($all || nc_post_get('custom_system_content_adaptive')) {
                nc_install_db($dir . 'content/adaptive/', 2);
            }
            // longpage
            if ($all || nc_post_get('custom_system_content_longpage')) {
                nc_install_db($dir . 'content/longpage/', 2);
            }
            // shortpage
            if ($all || nc_post_get('custom_system_content_shortpage')) {
                nc_install_db($dir . 'content/shortpage/', 2);
            }
        }

        nc_update_db();
        nc_write_log('Распаковка базы данных прошла успешно.');
    }

    return true;
}


function nc_update_db() {
    if (nc_post_get('demodistr')) {
        $nc47976400764121497450652a10251140849b947a48ee4e73049438777a4917ba6a4 = date("Y-m-d 00:00:00", time() + 60 * 24 * 60 * 60);
        $key = "nc63968534304df688ffedc8ca2e3f59f4a26c255b010e5bc647121dca79e55017726";
        global $standalone_inst;
        if ($standalone_inst) {
            if ($file_data = @file_get_contents('install/index.php')) {
                preg_match("/[\'\"](nc[a-z0-9]{50,100})[\'\"]/", $file_data, $matches);
                if (isset($matches[1])) {
                    $key = $matches[1];
                }
            }
        }
        $nc66633889950dc1f73c5d27e692b9d6bea1ccf88c82dcd3a2f30e98dfade9649f8ed = sha1("Net_^^_Cat" . $nc47976400764121497450652a10251140849b947a48ee4e73049438777a4917ba6a4 . $key . substr($nc47976400764121497450652a10251140849b947a48ee4e73049438777a4917ba6a4, 7, 3));
        nc_query("INSERT INTO `Settings` (`Key`, `Value`) VALUES ('InstallationID', '" . $nc66633889950dc1f73c5d27e692b9d6bea1ccf88c82dcd3a2f30e98dfade9649f8ed . "'), ('InstallationDateOut', '" . $nc47976400764121497450652a10251140849b947a48ee4e73049438777a4917ba6a4 . "')");
    }

    $date = date("Y-m-d H:i:s");

    $first_catalogue = (int)mysql_result(nc_query("SELECT MIN(`Catalogue_ID`) FROM `Catalogue`"), 0);

    $sql = array(
        "UPDATE `Settings` SET `Value` = '" . mysql_real_escape_string(nc_post_get('regnum')) . "', `Module` = 'system' WHERE `Key` = 'ProductNumber'",
        "UPDATE `Settings` SET `Value` = '" . mysql_real_escape_string(nc_post_get('code')) . "', `Module` = 'system' WHERE `Key` = 'Code'",
        "UPDATE `Settings` SET `Value` = 'admin', `Module` = 'system' WHERE `Key` = 'SpamFromName'",
        "UPDATE `Settings` SET `Value` = '" . mysql_real_escape_string(nc_post_get('email')) . "', `Module` = 'system' WHERE `Key` = 'SpamFromEmail'",
        "UPDATE `Settings` SET `Value` = '" . mysql_real_escape_string(md5(nc_post_get('regnum') . srand((double)microtime() * 1000000))) . "', `Module` = 'system' WHERE `Key` = 'SecretKey'",
        "UPDATE `Catalogue` SET `Created` = '$date' ",
        "UPDATE `Subdivision` SET `Created` = '$date' ",
        "UPDATE `Sub_Class` SET `Created` = '$date' ",
        "UPDATE `User` SET `Created` = '$date' ",
        "UPDATE `SystemMessage` SET `Date`    = '$date' ",
        "UPDATE `User` SET `Password` = '" . md5(isset($_SESSION['pwd']) ? $_SESSION['pwd'] : '') . "', Email = '" . mysql_real_escape_string(nc_post_get('email')) . "', Login = 'admin', ForumName = 'admin', FullName = 'admin', InsideAdminAccess = 1 WHERE User_ID = 1",
        "UPDATE `Catalogue` SET `Domain` = '" . mysql_real_escape_string($_SERVER['HTTP_HOST']) . "' WHERE `Catalogue_ID` = $first_catalogue ");
    foreach ($sql as $query) {
        nc_query($query);
    }
}

function nc_get_cattables_for_lower_case() {
    return array_map('strtolower', nc_get_cattables());
}

function nc_get_cattables() {
    $cattables = array('Banner_CampaignBanner', 'Banner_CampaignZone', 'Banner_Log',
        'Banner_StatsBanner', 'Banner_StatsCampaign', 'Banner_StatsReferer',
        'Banner_StatsZone', 'Catalogue', 'Class', 'Classificator', 'CronTasks',
        'Field', 'Log', 'MailTmp', 'Module', 'Module_Catalog', 'Patch', 'Permission', 'PermissionGroup',
        'Poll_Protect', 'Redirect', 'Redirect_Group', 'Settings', 'Stats_Attendance', 'Stats_Browser',
        'Stats_IP', 'Stats_Log', 'Stats_OS', 'Stats_Popularity', 'Stats_Referer',
        'Stats_Phrases', 'Stats_Geo', 'Stats_Openstat_Counters', 'Sub_Class', 'Subdivision', 'Subscriber',
        'SystemMessage', 'System_Table', 'Template', 'TemplateNav', 'User', 'User_Group',
        'Captchas', 'Captchas_Settings', 'Stats_IP2Country', 'Widget_Class', 'Widget', 'Widget_Field', 'Block_Widget',
        /* Таблицы 3.0 */
        'Calendar_Settings', 'Classificator_BlogCommentsAccess',
        'Classificator_BlogMessagesAccess', 'Classificator_BlogPermissionGroup',
        'Tags_Data', 'Tags_Message', 'Tags_Weight',
        /* Еще таблицы */
        'Filetable', 'Forum_categories', 'Forum_forums', 'Forum_permgroup',
        'Forum_repliesXX', 'Forum_subdiv', 'Forum_subscribe', 'Forum_topicsXX',
        'Forum_usergroup', 'Links_Settings', 'Mail_Queue', 'Mail_Attachment',
        'SQLQueries', 'Trash_Data', 'Multifield',
        /* И еще таблицы  */
        'Auth_Settings', 'Auth_UserRelation', 'Auth_ExternalAuth', 'Auth_Token', 'User_OpenID', 'Session', 'Blog_Parent', 'Blog_Subdivision', 'Auth_Pseudo',
        /* Приём платежей */
        'Classificator_PaymentSystem',
        'Payment_SystemCatalogue',
        'Payment_SystemSetting',
        'Payment_Log',
        'Payment_Invoice',
        'Payment_SystemParams',
        'Payment_SystemsCatalogues',
        'Payment_SystemsLogs',
        'Component_Revisions',
        'Csv_Import_History',
        'Csv_Import_History_Ids',

        /* Интернет-магазин */
        'Netshop_CouponBatch',
        'Netshop_Coupon',
        'Netshop_Currency',
        'Netshop_DeliveryMethod',
        'Netshop_DeliveryDiscount',
        'Netshop_ImportMap',
        'Netshop_ImportSources',
        'Netshop_CartDiscount',
        'Netshop_ItemDiscount',
        'Netshop_MailTemplate',
        'Netshop_MailRule',
        'Netshop_OfficialRate',
        'Netshop_OrderDiscounts',
        'Netshop_OrderGoods',
        'Netshop_OrderIds',
        'Netshop_PaymentMethod',
        'Netshop_PriceRule',
        'Netshop_RecentGoods',
        'Netshop_FavoriteGoods',
        'Netshop_CompareGoods',
        'Netshop_StoreGoods',
        'Netshop_Stores',
        'Russianpost_Indexes',
        'Netshop_YandexBundles',
        'Netshop_YandexBundlesMap',
        'Netshop_GoogleBundles',
        'Netshop_GoogleBundlesMap',
        'Netshop_MailBundles',
        'Netshop_MailBundlesMap',
        'Netshop_ItemIndex',

        'Classificator_ShopCurrency',
        'Classificator_ShopDeliveryService',
        'Classificator_ShopOrderStatus',
        'Classificator_ShopUnits',
        'Classificator_RobokassaCurrency',

        /* Счета и акты */
        'Bills_Company',
        'Bills_Act',
        'Bills_Bill',

        /* Модуль маршрутизации */
        'Routing_Route',

        /* Модуль комментариев */
        'Comments_Count', 'Comments_Rules', 'Comments_Text', 'Comments_Settings', 'Comments_Subscribe', 'Comments_Template', 'Comments_LastVisit',
        /* Модуль кеширования */
        'Cache_Audit', 'Cache_Clear', 'Cache_Settings',
        /* Модуль форума v2 */
        'Forum_Count', 'Forum_Groups', 'Forum_Subdivisions', 'Forum_Topics', 'Classificator_ForumTopicType',
        /* Модуль подписок */
        'Subscriber_Mailer', 'Subscriber_Message', 'Subscriber_Prepared', 'Subscriber_Settings', 'Subscriber_Subscription', 'Subscriber_UserMessage', 'Subscriber_Log',
        /* Модуль логирования */
        'Logging',
        /* Минимагазин */
        'Minishop_OrderGoods', 'Documentation',
        /* Модуль поиска */
        'Search_Document', 'Search_Extension', 'Search_Field', 'Search_Log',
        'Search_Query', 'Search_Rule', 'Search_Schedule', 'Search_Stopword',
        'Search_Synonym', 'Search_Task', 'Search_Link', 'Search_LinkReferrer',
        'Search_BrokenLink',
        /* Списки для виджетов */
        'Classificator_facebook_like_action', 'Classificator_facebook_like_colorscheme', 'Classificator_facebook_like_font',
        'Classificator_facebook_like_layout', 'Classificator_twitter_follow_img', 'Classificator_vkontakte_comment_limit',
        'Classificator_vkontakte_like_name', 'Classificator_vkontakte_like_type', 'Classificator_vkontakte_link_type',
        'Classificator_whoyougle_oo', 'Classificator_yandex_dai_rub', 'Classificator_yandex_dai_rub_color',
        'Classificator_yandex_novosti', 'Classificator_yandex_novosti_data', 'Classificator_yandex_novosti_kol',
        'Classificator_yandex_novosti_lang', 'Classificator_yandex_novosti_sort',
        /* Classificator_ */
        'Classificator_Country', 'Classificator_Gallery', 'Classificator_Manufacturer', 'Classificator_Region',
        'Classificator_Sex', 'Classificator_SubscriberPeriod', 'Classificator_TypeOfData', 'Classificator_TypeOfEdit',
        'Classificator_TypeOfModeration', 'Classificator_TypeOfRight', 'Classificator_UserGroup', 'Classificator_MinishopStatus',
        'Classificator_MinishopPayment', 'Classificator_MinishopDelivery', 'Classificator_BannerSize', 'Classificator_BannerType',
        'Classificator_MiniShopCurrency', 'Classificator_MiniShopUnits', 'Classificator_MiniShopDeliveryService', 'Classificator_MiniShopOrderStatus',
        'Classificator_FrameFormat',
        'Classificator_OffersType',

        'Wysiwyg_Panel',
        'Services_YandexRegions',
        'FieldFilter',
    );

    return $cattables;
}

function nc_get_users_tables() {
    $tables = array();
    $showt = mysql_query("SHOW TABLES");
    while ($row = mysql_fetch_array($showt)) {
        $tables[] = $row[0];
    }

    return $tables;
}

function nc_is_windows() {
    return ((strstr(strtolower(PHP_OS), 'win') && PHP_SHLIB_SUFFIX != 'so') ? true : false);
}

function nc_is_lower_case_table_names() {
    $res = nc_query("SHOW VARIABLES LIKE 'lower_case_table_names'");
    $var = mysql_fetch_row($res);
    return ($var[1] == 1 ? true : false);
}

function nc_repeat_tables() {
    $tables = array();
    $user_tables = nc_get_users_tables();
    if (nc_is_lower_case_table_names()) {
        $tables = array_intersect(nc_get_cattables_for_lower_case(), $user_tables);
        $tables = array_merge($tables, nc_select_user_message_tables($user_tables, 1));
    }
    else {
        $tables = array_intersect(nc_get_cattables(), $user_tables);
        $tables = array_merge($tables, nc_select_user_message_tables($user_tables, 0));
    }

    return $tables;
}

function nc_select_user_message_tables($user_tables, $lower_case) {
    $user_message_tables = array();
    $name = 'Message';
    if ($lower_case) {
        $name = strtolower($name);
    }
    foreach ($user_tables as $key => $value) {
        if (preg_match("/^" . $name . "[1-9][0-9]*?$/", $value)) {
            $user_message_tables[] = $value;
        }
    }
    return $user_message_tables;
}

function nc_mail_to_user($path) {
    $mail = nc_post_get('email');
    $pwd = nc_post_get('pwd');

    $subject = "NetCat успешно установлен";
    $message = 'Поздравляю!

Вы успешно установили CMS NetCat на сайт http://' . $path . '.

Ваши авторизационные данные для доступа в административную часть:
- адрес: http://' . $path . 'netcat/admin
- логин: admin
' . ($pwd ? '- пароль: ' . $pwd : '- вход в систему без пароля') . '

Спасибо, что выбрали нашу систему!

С уважением,
Скрипт Установки NetCat';

    $headers = "Content-type: text/plain; charset=UTF-8 \r\n";
    $headers .= "From: info@{$_SERVER['SERVER_NAME']}\r\n";
    @mail($mail, $subject, $message, $headers);
}

function nc_write_log($message, $time = true) {
    return false;
    $message_time = "";
    if ($time) {
        $message_time = date("H:i:s d.m.Y") . ' ';
        if (substr($message, -1) != '.') {
            $message = $message . '.';
        }
    }
    $result_str = PHP_EOL . $message_time . $message;

    file_put_contents("install.log", $result_str, FILE_APPEND);
}

function nc_unzip($file, $dir) {
    if (!file_exists($dir)) {
        nc_installer_safe_mkdir($dir);
    }
    $zip_handle = zip_open($dir . $file);
    if (is_resource($zip_handle)) {
        while ($zip_entry = zip_read($zip_handle)) {
            if ($zip_entry) {
                $zip_name = zip_entry_name($zip_entry);
                $zip_dir = dirname(zip_entry_name($zip_entry));
                $zip_size = zip_entry_filesize($zip_entry);

                #if( empty($zip_size) ) continue;

                #if (($zip_size == 0) && ($zip_name[strlen($zip_name) - 1] == DIRECTORY_SEPARATOR)) {
                #    nc_installer_safe_mkdir($dir . $zip_name);
                #}
                if (!(file_exists($dir . $zip_dir) && is_dir($dir . $zip_dir))) {
                    nc_installer_safe_mkdir($dir . $zip_dir);
                }

                zip_entry_open($zip_handle, $zip_entry, 'r');
                if (is_writable($dir . $zip_dir)) {
                    $fp = @fopen($dir . $zip_name, 'w');
                    if (is_resource($fp)) {
                        @fwrite($fp, zip_entry_read($zip_entry, $zip_size));
                        @fclose($fp);
                    }
                }
                else {
                    nc_write_log('Директория не доступна для записи: ' . $dir . $zip_dir);
                }
                zip_entry_close($zip_entry);
            }
        }
        zip_close($zip_handle);
        return true;
    }
    else {
        $error = 127;
        if (nc_func_enabled('exec')) {
            exec("tar -xvzf " . $dir . $file . " -C " . $dir, $output, $error);
            $error = false;
        }

        if (!$error) {
            return true;
        }
        else {
            return false;
        }
    }
}

function nc_installer_safe_mkdir($dir, $chmod = 0755) {
    $slash = "/";
    if (substr(php_uname(), 0, 7) == "Windows") {
        $slash = "\\";
        $dir = str_replace("/", $slash, $dir);
    }

    $tree = explode($slash, $dir);

    $path = $slash;
    // win path begin from C:\
    if (substr(php_uname(), 0, 7) == "Windows") {
        $path = "";
    }

    foreach ($tree as $row) {

        if ($row === false) {
            continue;
        }

        if (!@is_dir($path . $row)) {
            @mkdir(strval($path . $row), $chmod);
        }

        $path .= $row . $slash;
    }
}

/*function nc_installer_safe_chmod($path, $filemode = 0644, $dirmode = 0777) {
    if ( is_dir($path) ) {
        if ( !chmod($path, $dirmode) ) {
            $dirmode_str = decoct($dirmode);
            // Failed applying filemode '$dirmode_str' on directory '$path'
            // the directory '$path' will be skipped from recursive chmod
            return;
        }
        $dh = opendir($path);
        while ( ($file = readdir($dh)) !== false ) {
            if ($file != '.' && $file != '..') {
				// skip self and parent pointing directories
                $fullpath = $path . DIRECTORY_SEPARATOR . $file;
                nc_installer_safe_chmod($fullpath, $filemode, $dirmode);
            }
        }
        closedir($dh);
    }
    else {
        if ( is_link($path) ) {
            // link '$path' is skipped
            return;
        }
        if ( !@chmod($path, $filemode) ) {
            $filemode_str = decoct($filemode);
            // Failed applying filemode '$filemode_str' on file '$path'
            return;
        }
    }
}*/

function nc_func_enabled($function) {
    $function = strtolower(trim($function));
    if ($function == '') {
        return false;
    }
    $dis_functions = array();
    $dis_functions = explode(",", @ini_get("disable_functions"));
    if (!empty($dis_functions)) {
        $dis_functions = array_map('trim', array_map('strtolower', $dis_functions));
    }
    if (function_exists($function) && is_callable($function) && !in_array($function, $dis_functions)) {
        return true;
    }
    else {
        return false;
    }
}

function nc_clear_dir($directory) {
    $files = nc_double_array_shift(scandir($directory));
    foreach ($files as $file) {
        $file = $directory . '/' . $file;
        if (is_dir($file)) {
            nc_clear_dir($file);
        }
        else {
            @unlink($file);
        }
    }
    @rmdir($directory);
}

function nc_exec_sql($file) {
    $fp = fopen($file, "r");
    if (!$fp) {
        nc_write_log('Не удалось открыть sql-файл: ' . $file);
        return false;
    }
    $i = 0;
    while (!feof($fp)) {
        $statement = chop(fgets($fp, 65536));
        if (strlen($statement)) {
            while (substr($statement, strlen($statement) - 1, 1) <> ";" && substr($statement, 0, 1) <> "#" && substr($statement, 0, 2) <> "--")
                $statement .= chop(fgets($fp, 65536));
            if (substr($statement, 0, 1) <> "#" && substr($statement, 0, 2) <> "--") {
                if (!nc_query($statement)) {
                    nc_write_log('Неудачное выполнение запроса в файле ' . $file . ' MySQL ошибка: ' . mysql_error());
                }
            }
        }
    }

    fclose($fp);
    return true;
}

function nc_get_varsinc($CUSTOM_FOLDER, $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DB_NAME, $MYSQL_ENCRYPT, $AUTHORIZE_BY, $AUTHORIZATION_TYPE, $ISPATH) {
    ob_start();
    ?>
$DOCUMENT_ROOT = rtrim( getenv("DOCUMENT_ROOT"), "/\\" );
$HTTP_HOST = getenv("HTTP_HOST");

# подпапка в которой стоит NetCat
$SUB_FOLDER = '<?= $CUSTOM_FOLDER ?>';
# Если NetCat стоит в подпапке, то раскомментируйте следующую строчку
<?= $ISPATH ?>$SUB_FOLDER = str_replace( str_replace("\\", "/", $DOCUMENT_ROOT), "", str_replace("\\", "/", dirname(__FILE__)) );

# установка переменных окружения
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT | E_DEPRECATED));
@ini_set("session.auto_start", "0");
@ini_set("session.use_trans_sid", "0");
@ini_set("session.use_cookies", "1");
@ini_set("session.use_only_cookies", "1");
@ini_set("url_rewriter.tags", ""); // to disable trans_sid on PHP < 5.0
@ini_set('session.cookie_domain', (strpos(str_replace("www.", "", $HTTP_HOST),'.') !== false) ? str_replace("www.", "", $HTTP_HOST) : '');
@ini_set("session.gc_probability", "1");
@ini_set("session.gc_maxlifetime", "1800");
@ini_set("session.hash_bits_per_character", "5");
@ini_set("mbstring.internal_encoding", "UTF-8");
@ini_set("default_charset", "UTF-8");
@ini_set("session.name", ini_get("session.hash_bits_per_character")>=5 ? "sid" : "ced");

# параметры доступа к базе данных
$MYSQL_HOST = "<?= $MYSQL_HOST ?>";
$MYSQL_USER = "<?= $MYSQL_USER ?>";
$MYSQL_PASSWORD = "<?= $MYSQL_PASSWORD ?>";
$MYSQL_DB_NAME = "<?= $MYSQL_DB_NAME ?>";
$MYSQL_CHARSET = "utf8";
$MYSQL_ENCRYPT = "<?= $MYSQL_ENCRYPT ?>";

# кодировка
$NC_UNICODE = 1;
$NC_CHARSET = "utf-8";

# настройки авторизации
$AUTHORIZE_BY = "<?= $AUTHORIZE_BY ?>";
$AUTHORIZATION_TYPE = "<?= $AUTHORIZATION_TYPE ?>"; # 'http', 'session' or 'cookie'

#разрешить вход только по https
$NC_ADMIN_HTTPS = 0;  # 0 или 1

# серверные настройки
$PHP_TYPE = "module"; # 'module' or 'cgi'
$REDIRECT_STATUS = "on"; # 'on' or 'off'

# настройки безопасности
$SECURITY_XSS_CLEAN = false;

# инструмент "Переадресация" не доступен
$NC_REDIRECT_DISABLED = 0; # 0 или 1

# не загружать устаревшие файлы и функции
$NC_DEPRECATED_DISABLED = 1; # 0 или 1

$ADMIN_LANGUAGE = "Russian"; # Язык административной части NetCat "по-умолчанию"
$FILECHMOD = 0644; # Права на файл при добавлении через систему
$DIRCHMOD = 0755; # Права на директории для закачки пользовательских файлов
$SHOW_MYSQL_ERRORS = 'off'; # Показ ошибок MySQL на страницах сайта
$ADMIN_AUTHTIME = 2592000; # Время жизни авторизации в секундах (при $AUTHORIZATION_TYPE = session, cookie)
$ADMIN_AUTHTYPE = "manual"; # Выбор типа авторизации: 'session', 'always' or 'manual'
$use_gzip_compression = false; # Для включения сжатия вывода установите true

# настройки проекта
$DOMAIN_NAME = $HTTP_HOST; # $HTTP_HOST is server environment variable

#$DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs/www";

$HTTP_IMAGES_PATH = "/images/";
$HTTP_ROOT_PATH = "/netcat/";
$HTTP_FILES_PATH = "/netcat_files/";
$HTTP_DUMP_PATH = "/netcat_dump/";
$HTTP_CACHE_PATH = "/netcat_cache/";
$HTTP_TEMPLATE_PATH = "/netcat_template/";
$HTTP_TRASH_PATH = "/netcat_trash/";

# относительный путь в админку сайта, для ссылок
$ADMIN_PATH = $SUB_FOLDER.$HTTP_ROOT_PATH."admin/";
# относительный путь к теме админки, для изображений и .css файлов
$ADMIN_TEMPLATE = $ADMIN_PATH."skins/default/";
# полный путь к теме админки
$ADMIN_TEMPLATE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$ADMIN_TEMPLATE;

$SYSTEM_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH."system/";
$ROOT_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH;
$FILES_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_FILES_PATH;
$DUMP_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_DUMP_PATH;
$CACHE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_CACHE_PATH;
$TRASH_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TRASH_PATH;
$INCLUDE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH."require/";
$TMP_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH."tmp/";
$MODULE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH."modules/";
$ADMIN_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_ROOT_PATH."admin/";
$EDIT_DOMAIN = $DOMAIN_NAME;
$DOC_DOMAIN = "netcat.ru/developers/docs";

$TEMPLATE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TEMPLATE_PATH."template/";
$CLASS_TEMPLATE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TEMPLATE_PATH."class/";
$WIDGET_TEMPLATE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TEMPLATE_PATH."widget/";
$JQUERY_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TEMPLATE_PATH."jquery/";
$MODULE_TEMPLATE_FOLDER = $DOCUMENT_ROOT.$SUB_FOLDER.$HTTP_TEMPLATE_PATH."module/";

# set include_path: require/lib folder (PEAR and other 3rd-party libraries)
set_include_path("{$INCLUDE_FOLDER}lib/");

# название разработчика, отображаемое на странице «О программе»
#$DEVELOPER_NAME = 'ООО «НетКэт»';
#$DEVELOPER_URL = 'http://www.netcat.ru/';

<?php
    $cfg_file = ob_get_clean();

    $cfg_file = '<?php' . PHP_EOL . PHP_EOL . $cfg_file;

    return $cfg_file;
}

function nc_write_varsinc($distr_dir, $custom_dir) {

    $vars_inc_path = $distr_dir . 'vars.inc.php';

    if (!is_file($vars_inc_path)) {
        nc_write_log('Конфигурационный файл ' . $vars_inc_path . ' не найден!');
        return false;
    }

    $ispath = (!$custom_dir ? '#' : '');

    $cfg_file = nc_get_varsinc($custom_dir, nc_post_get('host'), nc_post_get('user'), nc_post_get('pass'), nc_post_get('dbname'), 'MD5', 'Login', 'cookie', $ispath);

    if (is_writable($vars_inc_path)) {
        file_put_contents($vars_inc_path, $cfg_file);
        nc_write_log('Конфигурационный файл ' . $vars_inc_path . ' записан успешно.');
    }
    else {
        nc_write_log('Конфигурационный файл vars.inc.php недоступен для записи. Установите нужные права на этот файл и повторите установку заново.');
    }
}

function nc_change_htaccess($distr_dir, $custom_dir) {
    // nothing else changed
    if (!$custom_dir) {
        return false;
    }

    // path to the .htaccess
    $htaccess_path = $distr_dir . '.htaccess';
    // file not exist
    if (!is_file($htaccess_path)) {
        nc_write_log('Управляющий файл ' . $htaccess_path . ' не найден!');
        return false;
    }

    // file content
    $htaccess = file($htaccess_path);

    // walk
    foreach ($htaccess as $num => $str) {
        if (strpos($str, 'ErrorDocument 404') === 0) {
            $htaccess[$num] = "ErrorDocument 404 " . rtrim($custom_dir, '/') . "/netcat/require/e404.php\n\r";
        }
        if (strpos($str, 'RewriteRule ^(.+)$') === 0) {
            $htaccess[$num] = "RewriteRule ^(.+)$ " . rtrim($custom_dir, '/') . "/netcat/require/e404.php?REQUEST_URI=$1 [L,QSA]\n\r";
        }
    }

    // update file content
    if (is_writable($htaccess_path)) {
        file_put_contents($htaccess_path, join('', $htaccess));
        nc_write_log('Управляющий файл ' . $htaccess_path . ' записан успешно.');
    }
}

function nc_double_array_shift($files) {
    array_shift($files);
    array_shift($files);

    return $files;
}

function nc_installer_check_perm($dir_name) {
    $filepath = $dir_name . "n123.tmp";
    $h = @fopen($filepath, "w");
    if ($h === false) {
        $result = false;
    }
    else {
        fclose($h);
        @unlink($filepath);
        $result = true;
    }

    return $result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment