name = "saverestore"; $this->title = "<#LANG_MODULE_SAVERESTORE#>"; $this->module_category = "<#LANG_SECTION_SYSTEM#>"; $this->checkInstalled(); } /** * saveParams * * Saving module parameters * * @access public */ function saveParams($data = 1) { $data = array(); if (isset($this->id)) { $data["id"] = $this->id; } if (isset($this->view_mode)) { $data["view_mode"] = $this->view_mode; } if (isset($this->edit_mode)) { $data["edit_mode"] = $this->edit_mode; } if (isset($this->tab)) { $data["tab"] = $this->tab; } return parent::saveParams($data); } /** * getParams * * Getting module parameters from query string * * @access public */ function getParams() { global $id; global $mode; global $view_mode; global $edit_mode; global $tab; if (isset($id)) { $this->id = $id; } if (isset($mode)) { $this->mode = $mode; } if (isset($view_mode)) { $this->view_mode = $view_mode; } if (isset($edit_mode)) { $this->edit_mode = $edit_mode; } if (isset($tab)) { $this->tab = $tab; } } /** * Run * * Description * * @access public */ function run() { global $session; $out = array(); if ($this->action == 'admin') { $this->admin($out); } else { $this->usual($out); } if (isset($this->owner->action)) { $out['PARENT_ACTION'] = $this->owner->action; } if (isset($this->owner->name)) { $out['PARENT_NAME'] = $this->owner->name; } $out['VIEW_MODE'] = $this->view_mode; $out['EDIT_MODE'] = $this->edit_mode; $out['MODE'] = $this->mode; $out['ACTION'] = $this->action; if (isset ($this->single_rec) && $this->single_rec) { $out['SINGLE_REC'] = true; } else { $out['SINGLE_REC'] = false; } $this->data = $out; $p = new parser(DIR_TEMPLATES . $this->name . "/" . $this->name . ".html", $this->data, $this); $this->result = $p->result; } function parse_size($size) { $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size. $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size. if ($unit) { // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by. return round($size * pow(1024, stripos('bkmgtpezy', $unit[0]))); } else { return round($size); } } /** * BackEnd * * Module backend * * @access public */ function admin(&$out) { $err_msg = gr('err_msg'); if ($err_msg) { $out['ERR_MSG'] = $err_msg; } $ok_msg = gr('ok_msg'); if ($ok_msg) { $out['OK_MSG'] = $ok_msg; } $post_max_size = $this->parse_size(ini_get('post_max_size')); if ($post_max_size > 0) { $max_size = $post_max_size; } $upload_max = $this->parse_size(ini_get('upload_max_filesize')); if ($upload_max > 0 && $upload_max < $max_size) { $max_size = $upload_max; } $out['MAX_SIZE'] = round($max_size / 1024 / 1024, 2) . ' Mb'; if (gr('mode') == 'force_update') { unset($_REQUEST['mode']); $this->autoUpdateSystem(); } if (gr('mode') == 'auto_update_settings') { $this->getConfig(); $this->config['MASTER_UPDATE_URL'] = gr('set_update_url'); $this->config['UPDATE_AUTO'] = gr('update_auto'); $this->config['UPDATE_AUTO_DELAY'] = gr('update_auto_delay'); $this->config['UPDATE_AUTO_TIME'] = gr('update_auto_time'); $this->config['UPDATE_AUTO_PLUGINS'] = gr('update_auto_plugins'); $this->config['LATEST_UPDATED_ID'] = $this->config['LATEST_UPDATED_ID']; if ($this->config['UPDATE_AUTO']) { subscribeToEvent($this->name, 'HOURLY'); } else { unsubscribeFromEvent($this->name, 'HOURLY'); } $this->saveConfig(); $this->redirect("?ok_msg=" . urlencode(LANG_DATA_SAVED)); } $this->getConfig(); if (is_dir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp')) { $out['CLEAR_FIRST'] = 1; } else { $out['CLEAR_FIRST'] = 0; } $link = gr('link'); $update_url = $this->getUpdateURL($link); $out['UPDATE_URL'] = $update_url; $out['UPDATE_AUTO'] = $this->config['UPDATE_AUTO']; $out['UPDATE_AUTO_DELAY'] = $this->config['UPDATE_AUTO_DELAY']; $out['UPDATE_AUTO_TIME'] = $this->config['UPDATE_AUTO_TIME']; $out['UPDATE_AUTO_PLUGINS'] = $this->config['UPDATE_AUTO_PLUGINS']; $aditional_git_urls = gr('aditional_git_urls'); $out['ADITIONAL_GIT_URLS'] = array(); if (is_array($aditional_git_urls)) { foreach ($aditional_git_urls as $url => $title) { $tmp = array(); $tmp['URL'] = $url; $tmp['TITLE'] = $title; $tmp['SELECTED'] = $out['UPDATE_URL'] == $url ? 'selected' : ''; $out['ADITIONAL_GIT_URLS'][] = $tmp; } } $github_feed_url = $update_url; $github_feed_url = str_replace('/archive/', '/commits/', $github_feed_url); $github_feed_url = str_replace('.tar.gz', '.atom', $github_feed_url); $op = isset($_GET['op']) ? $_GET['op'] : ''; if ($op == 'check_updates') { $cache_timeout = 3 * 24 * 60 * 60; } else { $cache_timeout = 30 * 60; } $options = array( CURLOPT_HTTPHEADER => array('Accept: application/xml') ); $github_feed = getURL($github_feed_url, $cache_timeout, '', '', false, $options); if ($github_feed != '') { $tmp = GetXMLTree($github_feed); if (is_array($tmp)) { $data = XMLTreeToArray($tmp); $items = $data['feed']['entry']; } else { $github_feed = getURL($github_feed_url, 0, '', '', false, $options); $items = false; } if (is_array($items)) { $total = count($items); if ($total) { $iteration = 0; // echo '
';
                    // var_dump($items);
                    // die();
                    foreach ($items as $key => $value) {
                        $itm = array();

                        if ($value['author']['name']['textvalue'] != 'sergejey') continue;
                        $itm['ID'] = trim($value['id']['textvalue']);
                        $itm['ID'] = preg_replace('/.+Commit\//is', '', $itm['ID']);
                        $itm['MYVERSION'] = ($itm['ID'] == $this->config['LATEST_UPDATED_ID']) ? 1 : 0;
                        $itm['TITLE'] = trim($value['title']['textvalue']);
                        $itm['AUTHOR'] = $value['author']['name']['textvalue'];
                        $itm['LINK'] = $value['link']['href'];
                        $itm['LINK_URL'] = urlencode($itm['LINK']);
                        $itm['UPDATED'] = strtotime($value['updated']['textvalue']);
                        $itm['UPDATE_TEXT'] = date('d.m.Y H:i', $itm['UPDATED']);
                        $itm['DESC_UPDATE'] = '';
                        if (isset($value['content']['textvalue'])) {
                            $content = preg_split('/\\r\\n?|\\n/', $value['content']['textvalue']);
                            if (isset($content[3])) {
                                $itm['DESC_UPDATE'] = strip_tags($content[3]);
                            }
                        }

                        $itm['MYVERSION'] = ($itm['ID'] == $this->config['LATEST_UPDATED_ID']) ? 1 : 0;
                        $out['UPDATES'][] = $itm;
                        $iteration++;

                        if ($iteration >= 10) {
                            break;
                        }
                    }

                    $out['LATEST_ID'] = $out['UPDATES'][0]['ID'];

                    $out['LATEST_CURR_BRANCH'] = $this->config['LATEST_CURR_BRANCH'];
                    $out['LATEST_UPDATED_ID'] = $this->config['LATEST_UPDATED_ID'];
                    $out['LATEST_UPDATED_ID_SLICE'] = mb_strtoupper(substr($this->config['LATEST_UPDATED_ID'], 0, 7));
                    $out['LATEST_UPDATED_TIME'] = gg('LatestUpdateTimestamp');

                    $currBranch = explode("/", $update_url);
                    $out['UPDATE_CURR_BRANCH'] = mb_strtoupper(explode('.', $currBranch[6])[0]);

                    if ($out['LATEST_ID'] != '' && $out['LATEST_ID'] == $out['LATEST_UPDATED_ID'] && $out['LATEST_CURR_BRANCH'] == $out['UPDATE_CURR_BRANCH']) {
                        $out['NO_NEED_TO_UPDATE'] = 1;
                    }
                    $op = isset($_GET['op']) ? $_GET['op'] : '';
                    if ($this->ajax && $op == 'check_updates') {
                        if (!isset($out['NO_NEED_TO_UPDATE'])) {
                            echo json_encode(array('needUpdate' => '1', 'currBranch' => $out['LATEST_CURR_BRANCH'], 'current_version' => $this->config['LATEST_UPDATED_ID']));
                        } else {
                            echo json_encode(array('needUpdate' => '0', 'currBranch' => $out['LATEST_CURR_BRANCH'], 'current_version' => $this->config['LATEST_UPDATED_ID']));
                        }
                        exit;
                    }
                    //print_r($out['UPDATES']);
                    //exit;
                }
            }
        }


        if ($this->mode == 'savedetails') {

            global $ftp_host;
            global $ftp_username;
            global $ftp_password;
            global $ftp_folder;
            global $ftp_clear;


            if ($ftp_clear) {
                $this->config['FTP_USERNAME'] = '';
                $this->config['FTP_PASSWORD'] = '';
                $this->saveConfig();
                $this->redirect("?");
            }

            $out['FTP_HOST'] = $ftp_host;
            $out['FTP_USERNAME'] = $ftp_username;
            $out['FTP_PASSWORD'] = $ftp_password;
            $out['FTP_FOLDER'] = $ftp_folder;


            $conn_id = @ftp_connect($ftp_host);
            if ($conn_id) {

                $login_result = @ftp_login($conn_id, $ftp_username, $ftp_password);
                if ($login_result) {
                    $systyp = ftp_systype($conn_id);

                    if (!preg_match('/\/$/', $ftp_folder)) {
                        $ftp_folder .= '/';
                    }

                    if (@ftp_chdir($conn_id, $ftp_folder . 'cms/saverestore')) {
                        $this->config['FTP_HOST'] = $ftp_host;
                        $this->config['FTP_USERNAME'] = $ftp_username;
                        $this->config['FTP_PASSWORD'] = $ftp_password;
                        $this->config['FTP_FOLDER'] = $ftp_folder;
                        $this->saveConfig();
                        $this->redirect("?");
                    } else {
                        $out['FTP_ERR'] = 'Incorrect folder (' . $ftp_folder . ')';
                    }
                } else {
                    $out['FTP_ERR'] = 'Incorrect username/password';
                }

                ftp_close($conn_id);

            } else {
                $out['FTP_ERR'] = 'Cannot connect to host (' . $ftp_host . ')';
            }

        }

        if ($this->mode != 'savedetails') {
            if (isset($this->config['FTP_HOST'])) $out['FTP_HOST'] = $this->config['FTP_HOST'];
            if (isset($this->config['FTP_USERNAME'])) $out['FTP_USERNAME'] = $this->config['FTP_USERNAME'];
            if (isset($this->config['FTP_PASSWORD'])) $out['FTP_PASSWORD'] = $this->config['FTP_PASSWORD'];
            if (isset($this->config['FTP_FOLDER'])) $out['FTP_FOLDER'] = $this->config['FTP_FOLDER'];
        }

// if ($this->mode=='' || $this->mode=='upload' || $this->mode=='savedetails') {
        $method = 'ftp';
        if (function_exists('getmyuid') && function_exists('fileowner')) {
            $temp_file = tempnam("./cms/saverestore/", "FOO");
            if (file_exists($temp_file)) {
                $method = 'direct';
                unlink($temp_file);
            }
        }
        $out['METHOD'] = $method;
        $this->method = $method;
// }

        if ($this->mode == 'clear') {
            set_time_limit(0);
            removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp');
            @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . "cms/modules_installed/control_modules.installed");
            $with_extensions = gr('with_extensions');
            $with_backup = gr('with_backup');
            if ($with_extensions) {
                $this->redirect("?(panel:{action=market})&md=market&mode=update_new");
            }
            $this->redirect("?err_msg=" . urlencode($err_msg) . "&ok_msg=" . urlencode($ok_msg));
        }


        if ($this->mode == 'checksubmit') {
            $this->checkSubmit($out);
        }

        if ($this->mode == 'uploadupdates') {
            $this->uploadUpdates($out);
        }

        if ($this->mode == 'checkupdates') {
            $this->checkupdatesSVN($out);
        }

        if ($this->mode == 'downloadupdates') {
            $this->downloadupdatesSVN($out);
        }

        if ($this->mode == 'checkapps') {
            $this->checkApps($out);
        }

        if ($this->mode == 'downloadapps') {
            $this->downloadApps($out);
        }


        if ($this->mode == 'upload') {
            $this->upload($out);
        }
        if ($this->mode == 'dump') {
            $this->dump($out);
            $this->redirect("?mode=clear");
        }

        if ($this->mode == 'delete') {
            $file = gr('file');
            if ($file != '') {
                if (is_dir($file)) { //s
                    removeTree($file);
                } elseif (is_file(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $file)) {
                    @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $file);
                }
            }

            $this->redirect("?");
        }

        if ($this->mode == 'getlatest') {
            $this->getLatest($out);
        }

        if ($this->mode == 'getlatest_iframe') {

            $with_extensions = gr('with_extensions');
            $with_backup = gr('with_backup');
            $link = gr('link');

            $out['WITH_EXTENSIONS'] = $with_extensions;
            $out['WITH_BACKUP'] = $with_backup;
            $out['LINK'] = $link;
            $out['LINK_URL'] = urlencode($link);


            global $backup;
            $out['BACKUP'] = $backup;
            global $data;
            $out['DATA'] = $data;
            global $code;
            $out['CODE'] = $code;
            global $save_files;
            $out['SAVE_FILES'] = $save_files;
            global $design;
            $out['DESIGN'] = $design;
        }


        $source = DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore';
        $currentdir = getcwd();
        chdir($source);
        array_multisort(array_map('filemtime', ($files = glob("*.*"))), SORT_DESC, $files);
        if (defined('SETTINGS_BACKUP_PATH') && SETTINGS_BACKUP_PATH != '' && is_dir(SETTINGS_BACKUP_PATH)) {
            $backups_dir = SETTINGS_BACKUP_PATH;
        } else {
            $backups_dir = DOC_ROOT . DIRECTORY_SEPARATOR . 'backup';
        }
        chdir($backups_dir);
        $backups = glob("*");
        if (is_array($backups)) {
            foreach ($backups as $backup_folder) {
                $files[] = $backups_dir . '/' . $backup_folder;
            }
        }
        chdir($currentdir);
        $out['FILES'] = array();
        $i = 0;
        foreach ($files as $file) {
            $tmp = array();
            $tmp['FILENAME'] = $file;
            if (is_file($source . "/" . $file)) {
                $tmp['FILESIZE'] = number_format((filesize($source . "/" . $file) / 1024 / 1024), 2);
                $tmp['UPDATED'] = date('Y-m-d H:i:s', filemtime($source . "/" . $file));
                $tmp['TITLE'] = basename($file);
            } else {
                $tmp['TITLE'] = 'Backup ' . basename($file);
            }
            $tmp['ID'] = $i;
            $out['FILES'][] = $tmp;
            $i++;
        }


    }


    function getUpdateURL($link = '')
    {
        $this->getConfig();

        if ($this->config['MASTER_UPDATE_URL'] != '') {
            $update_url = $this->config['MASTER_UPDATE_URL'];
        } elseif (defined('MASTER_UPDATE_URL') && MASTER_UPDATE_URL != '') {
            $update_url = MASTER_UPDATE_URL;
        } else {
            $update_url = GIT_URL . 'archive/master.tar.gz';
        }
        if ($link != '') {
            if (preg_match('/\/commit\/(.+?)$/', $link, $m)) {
                $commit = $m[1];
                $update_url = preg_replace('/archive\/\w+?\./', 'archive/' . $commit . '.', $update_url);
            }
        }
        return $update_url;
    }

    /**
     * Title
     *
     * Description
     *
     * @access public
     */
    function getLatest(&$out, $iframe = 0, $with_backup = 1, $link = '')
    {
        $url = $this->getUpdateURL($link);
        $this->url = $url;

        set_time_limit(0);

        if (!is_dir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore')) {
            @umask(0);
            @mkdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore', 0777);
        }

        $filename = DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/master.tgz';

        @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/master.tgz');
        @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/master.tar');

        $f = fopen($filename, 'wb');
        if ($f == FALSE) {
            $this->redirect("?err_msg=" . urlencode("Cannot open " . $filename . " for writing"));
        }

        if ($iframe) {
            echonow('
' . LANG_UPDATEARHIVE_DONE . ' ' . $url . '
'); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_FILE, $f); $incoming = curl_exec($ch); curl_close($ch); @fclose($f); if (file_exists($filename)) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if ($with_backup) { global $code; global $data; global $design; $code = 1; $data = 1; //fix $design = 1; $out['BACKUP'] = 1; $this->dump($out, $iframe); } removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', $iframe); if (!$iframe) { $with_extensions = gr('with_extensions'); $with_backup = gr('with_backup'); $folder = 'majordomo-master'; $basename = basename($this->url); if ($basename != 'master.tar.gz') { $basename = str_replace('.tar.gz', '', $basename); $folder = str_replace('master', $basename, $folder); } $this->redirect("?mode=upload&restore=" . urlencode('master.tgz') . "&folder=" . urlencode($folder) . "&with_extensions=" . $with_extensions . "&with_backup=" . $with_backup); } else { return 1; } } else { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_ERROR_DOWNLOAD . '
', 'red'); exit; } else { $this->redirect("?err_msg=" . urlencode(LANG_UPDATEBACKUP_ERROR_DOWNLOAD . ' ' . $url)); } } } /** * Title * * Description * * @access public */ function uploadUpdates(&$out) { global $to_submit; global $pack_folders; $total = count($to_submit); umask(0); $copied_dirs = array(); if (mkdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0777)) { for ($i = 0; $i < $total; $i++) { $this->copyFile(ROOT . $to_submit[$i], DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i]); if (is_array($pack_folders) && in_array($to_submit[$i], $pack_folders) && !$copied_dirs[dirname(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i])]) { copyTree(dirname(ROOT . $to_submit[$i]), dirname(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i])); $copied_dirs[dirname(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i])] = 1; } if (file_exists(dirname(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i]) . '/installed')) { @unlink(dirname(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/' . $to_submit[$i]) . '/installed'); } } } // packing into tar.gz $tar_name = 'submit_' . date('Y-m-d__H-i-s') . '.tgz'; chdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); exec('tar cvzf ../' . $tar_name . ' .'); chdir('../../../'); removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); // sending to remote server $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } $to_send = array(); global $name; $to_send['NAME'] = $name; setCookie('SUBMIT_NAME', $name, 0, '/'); global $email; $to_send['EMAIL'] = $email; setCookie('SUBMIT_EMAIL', $email, 0, '/'); global $description; $to_send['DESCRIPTION'] = $description; $to_send['FILES'] = $to_submit; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); $post = array( "file" => "@" . DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $tar_name, "mode" => "upload_updates", "repository" => $repository_name, "host" => $_SERVER['HTTP_HOST'], "data" => serialize($to_send) ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=upload_updates&repository=".$repository_name."&host=".$_SERVER['HTTP_HOST']."&data=".$to_send); $incoming = curl_exec($ch); curl_close($ch); $result = unserialize($incoming); $ok_msg = 'Error sending files to repository! ';//.$incoming if ($result['MESSAGE']) { $ok_msg = $result['MESSAGE']; } if ($result['STATUS'] == 'OK') { $with_extensions = gr('with_extensions'); $with_backup = gr('with_backup'); $this->redirect("?mode=clear&ok_msg=" . urlencode($ok_msg) . "&with_extensions=" . $with_extensions . "&with_backup=" . $with_backup); } else { $this->redirect("?mode=clear&err_msg=" . urlencode($ok_msg)); } //exit; } /** * Title * * Description * * @access public */ function checkSubmit(&$out) { $res1 = $this->checkEFiles('.', 0); $res2 = $this->checkEFiles('./modules', 1); $res3 = $this->checkEFiles('./templates', 1); $res4 = $this->checkEFiles('./lib', 0); $res = array_merge($res1, $res2, $res3, $res4); $to_send = serialize($res); $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=check_submit&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&data=" . $to_send); $incoming = curl_exec($ch); curl_close($ch); //echo $incoming;exit; $result = unserialize($incoming); //echo $repository_url; //echo($result);exit; if ($result['STATUS'] != 'OK') { $out['ERROR_CHECK'] = 1; if ($result['MESSAGE']) { $out['ERROR_MESSAGE'] = $result['MESSAGE']; } else { $out['ERROR_MESSAGE'] = 'Cannot connect to updates server'; } } else { $out['OK_CHECKSUBMIT'] = 1; //print_r($result['TO_SUBMIT']);exit; if (is_array($result['TO_SUBMIT'])) { foreach ($result['TO_SUBMIT'] as $f => $v) { $tmp = array('FILE' => $f, 'VERSION' => $v, 'L_VERSION' => $res[$f]); if (preg_match('/\/modules\/.+\/.+/is', $f) || preg_match('/\/templates\/.+\/.+/is', $f)) { $tmp['PACK_FOLDER'] = 1; } $out['TO_SUBMIT'][] = $tmp; } } else { $out['NO_SUBMIT'] = 1; } } $out['NAME'] = $_COOKIE['SUBMIT_NAME']; $out['EMAIL'] = $_COOKIE['SUBMIT_EMAIL']; } /** * Title * * Description * * @access public */ function downloadUpdates(&$out) { global $to_update; $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } // preparing update $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=prepare&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&data=" . serialize($to_update)); $incoming = curl_exec($ch); curl_close($ch); $res = unserialize($incoming); if ($res['STATUS'] == 'OK' && $res['DOWNLOAD_FILE'] != '') { // downloading update $filename = DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $res['DOWNLOAD_FILE']; $f = fopen($filename, 'wb'); if ($f == FALSE) { //print "File not opened
"; //exit; $this->redirect("?err_msg=" . urlencode("Cannot open " . $filename . " for writing")); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_FILE, $f); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=download&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&file=" . $res['DOWNLOAD_FILE']); $incoming = curl_exec($ch); curl_close($ch); @fclose($f); if (file_exists($filename) && filesize($filename) > 0) { // backing up current code version global $code; global $data; $code = 1; $data = 1; $out['BACKUP'] = 1; $this->dump($out); removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); // installing update $this->redirect("?mode=upload&restore=" . urlencode($res['DOWNLOAD_FILE'])); } else { $this->redirect("?err_msg=" . urlencode("Error downloading update")); } } exit; } /** * Title * * Description * * @access public */ function downloadApps(&$out) { global $to_install; $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } // preparing update $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=prepareapps&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&data=" . serialize($to_install)); $incoming = curl_exec($ch); curl_close($ch); //echo $incoming;exit; $res = unserialize($incoming); if ($res['STATUS'] == 'OK' && $res['DOWNLOAD_FILE'] != '') { // downloading update $filename = DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $res['DOWNLOAD_FILE']; $f = fopen($filename, 'wb'); if ($f == FALSE) { //print "File not opened
"; //exit; $this->redirect("?err_msg=" . urlencode("Cannot open " . $filename . " for writing")); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_FILE, $f); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=download&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&file=" . $res['DOWNLOAD_FILE']); $incoming = curl_exec($ch); curl_close($ch); @fclose($f); if (file_exists($filename) && filesize($filename) > 0) { // backing up current code version global $code; global $data; $code = 1; $data = 1; $out['BACKUP'] = 1; $this->dump($out); removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); // installing update $this->redirect("?mode=upload&restore=" . urlencode($res['DOWNLOAD_FILE'])); } else { $this->redirect("?err_msg=" . urlencode("Error downloading update")); } } exit; } /** * Title * * Description * * @access public */ function checkApps(&$out) { $res = array(); $d = './modules'; if ($dir = @opendir($d)) { while (($file = readdir($dir)) !== false) { if (is_dir($d . '/' . $file) && ($file != '..') && ($file != '.') && ($file != 'control_access') && ($file != 'control_modules') ) { $res[] = $file; } } } $to_send = serialize($res); $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=checkapps&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&data=" . $to_send); $incoming = curl_exec($ch); curl_close($ch); //echo $incoming;exit; $result = unserialize($incoming); if ($result['STATUS'] != 'OK') { if ($result['MESSAGE']) { $out['ERROR_MESSAGE'] = $result['MESSAGE']; } else { $out['ERROR_MESSAGE'] = 'Cannot connect to updates server'; } $this->redirect("?err_msg=" . urlencode($out['ERROR_MESSAGE'])); } else { $out['OK_BROWSE'] = 1; if (is_array($result['TO_INSTALL'])) { $out['TO_INSTALL'] = $result['TO_INSTALL']; /* foreach($result['TO_UPDATE'] as $f=>$v) { $out['TO_INSTALL'][]=array('FILE'=>$f, 'VERSION'=>$v); } */ } else { $out['NO_MODULES'] = 1; } } } /** * Title * * Description * * @access public */ function downloadUpdatesSVN(&$out) { global $code; global $data; $code = 1; $data = 1; $out['BACKUP'] = 1; $this->dump($out); removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); include_once DIR_MODULES . 'saverestore/phpsvnclient.php'; $url = 'http://majordomo-sl.googlecode.com/svn/'; $phpsvnclient = new phpsvnclient($url); set_time_limit(0); global $to_update; $total = count($to_update); for ($i = 0; $i < $total; $i++) { $path = 'trunk/' . $to_update[$i]; $file_content = $phpsvnclient->getFile($path); if (!is_dir(dirname(ROOT . $to_update[$i]))) { @mkdir(dirname(ROOT . $to_update[$i]), 0777); } @SaveFile(ROOT . $to_update[$i], $file_content); if (file_exists(dirname(ROOT . $to_update[$i]) . '/installed')) { @unlink(dirname(ROOT . $to_update[$i]) . '/installed'); } } $this->redirect("?ok_msg=" . urlencode('Files have been updated!')); } /** * Title * * Description * * @access public */ function checkUpdatesSVN(&$out) { include_once DIR_MODULES . 'saverestore/phpsvnclient.php'; $url = 'http://majordomo-sl.googlecode.com/svn/'; $phpsvnclient = new phpsvnclient($url); set_time_limit(0); //$phpsvnclient->createOrUpdateWorkingCopy('trunk/', ROOT.'cms/saverestore/temp', true); $cached_name = DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/svn_tree.txt'; if (!file_exists($cached_name) || (time() - filemtime($cached_name) > 8 * 60 * 60)) { $directory_tree = $phpsvnclient->getDirectoryTree('/trunk/'); SaveFile($cached_name, serialize($directory_tree)); } else { $directory_tree = unserialize(LoadFile($cached_name)); } $updated = array(); $total = count($directory_tree); for ($i = 0; $i < $total; $i++) { $item = $directory_tree[$i]; if ($item['type'] != 'file' || $item['path'] == 'trunk/config.php') { continue; } $filename = str_replace('trunk/', ROOT, $item['path']); @$fsize = filesize($filename); $r_rfsize = $item['size']; if ($fsize != $r_rfsize || !file_exists($filename)) { $updated[] = $item; } } $out['OK_CHECK'] = 1; if (!$updated[0]) { $out['NO_UPDATES'] = 1; } else { foreach ($updated as $item) { $item['path'] = str_replace('trunk/', '', $item['path']); $out['TO_UPDATE'][] = array('FILE' => $item['path'], 'VERSION' => $item['version'] . ' (' . $item['last-mod'] . ')'); } } } /** * Title * * Description * * @access public */ function checkUpdates(&$out) { $res1 = $this->checkEFiles('.', 0); $res2 = $this->checkEFiles('./modules', 1); $res3 = $this->checkEFiles('./templates', 1); $res4 = $this->checkEFiles('./lib', 0); $res = array_merge($res1, $res2, $res3, $res4); $to_send = serialize($res); $repository_url = UPDATER_URL; if (defined('UPDATES_REPOSITORY_NAME')) { $repository_name = UPDATES_REPOSITORY_NAME; } else { $repository_name = 'default'; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $repository_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 600); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, "mode=check&repository=" . $repository_name . "&host=" . $_SERVER['HTTP_HOST'] . "&data=" . $to_send); $incoming = curl_exec($ch); curl_close($ch); //echo $incoming;exit; $result = unserialize($incoming); //echo $repository_url; //echo($result);exit; if ($result['STATUS'] != 'OK') { $out['ERROR_CHECK'] = 1; if ($result['MESSAGE']) { $out['ERROR_MESSAGE'] = $result['MESSAGE']; } else { $out['ERROR_MESSAGE'] = 'Cannot connect to updates server'; } } else { $out['OK_CHECK'] = 1; if (is_array($result['TO_UPDATE'])) { foreach ($result['TO_UPDATE'] as $f => $v) { $out['TO_UPDATE'][] = array('FILE' => $f, 'VERSION' => $v); } } else { $out['NO_UPDATES'] = 1; } } //exec('curl ...') } /** * Title * * Description * * @access public */ function checkEFiles($d, $max_level = 0, $level = 0) { $res = array(); if (!is_dir($d)) { return $res; } if ($dir = @opendir($d)) { while (($file = readdir($dir)) !== false) { if (Is_Dir($d . "/" . $file) && ($file != '.') && ($file != '..')) { //echo "
Dir ".$d."/".$file; if ($level < $max_level) { $res2 = $this->checkEFiles($d . "/" . $file, $max_level, ($level + 1)); if (is_array($res2)) { $res = array_merge($res, $res2); } } } elseif (Is_File($d . "/" . $file) && (preg_match('/\.php$/', $file) || preg_match('/\.css$/', $file) || preg_match('/\.html$/', $file) || preg_match('/\.js$/', $file)) ) { if ($file == 'config.php') { continue; } //echo "
".$d.'/'.$file; $version = ''; $content = LoadFile($d . '/' . $file); if (preg_match('/@version (.+?)\n/is', $content, $m)) { $version = trim($m[1]); //echo "
".$d.'/'.$file.' - '.$version; } elseif (preg_match('/\.class\.php$/is', $file)) { // echo "
".$d.'/'.$file.' - '.'unknown'; //$version='unknown'; } if ($version != '') { $res[$d . '/' . $file] = $version; } } } closedir($dir); } return $res; } /** * Title * * Description * * @access public */ function extractVersion($s) { $o_version = preg_replace('/\(.+/', '', $s); $o_version = preg_replace('/[^\d]/', '', $o_version); $o_version = (float)substr($o_version, 0, 1) . '.' . substr($o_version, 1, strlen($o_version) - 1); return $o_version; } /** * Title * * Description * * @access public */ function isNewer($o_version, $r_version) { $o_version = $this->extractVersion($o_version); $r_version = $this->extractVersion($r_version); //$r_version+=0.1; // just for testing //echo $o_version.' to '.$r_version."
"; if ($o_version < $r_version) { return 1; } return 0; } /** * Title * * Description * * @access public */ function upload(&$out, $iframe = 0) { set_time_limit(0); global $restore; global $file; global $file_name; global $folder; $with_extensions = gr('with_extensions'); $with_backup = gr('with_backup'); if (!$folder) $folder = IsWindowsOS() ? '/.' : '/'; else $folder = '/' . $folder; if ($restore != '') { //$file=ROOT.'cms/saverestore/'.$restore; $file = $restore; $file_name = basename($file); } elseif ($file != '') { move_uploaded_file($file, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $file_name); $file = $file_name; } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_APPLY_UPDATE . '
'); } if ($file != '' && preg_match('/\.sql$/', $file_name) && file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $file)) { // restore database only if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_RESTORE_DB_FOR . ' ' . $file . '
'); } $this->restoredatabase(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $file); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if ($iframe) { return 1; } else { $this->redirect("?mode=clear&ok_msg=" . urlencode(LANG_UPDATEBACKUP_RESTORE_DB_DONE)); } } elseif ($file != '' && is_dir($file)) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_UNPACKEGE_FROM_TO . ' ' . $file . ' - ' . ROOT . '
'); } copyTree($file, ROOT, 1); // restore all files if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } $db_filename = $file . '/' . DB_NAME . ".sql"; if (file_exists($db_filename)) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_RESTORE_DB_FOR . ' ' . $db_filename . '
'); } $this->restoredatabase($db_filename); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } if ($iframe) { return 1; } else { $this->redirect("?mode=clear&ok_msg=" . urlencode(LANG_UPDATEBACKUP_RESTORE_DB_DONE)); } } elseif ($file != '') { DebMes("Trying to unpack $file", "restore"); logAction('system_restore', $file); // unpack archive umask(0); @mkdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0777); chdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_UNPACKEGE . ' ' . $file . '
'); } if (IsWindowsOS()) { $result = exec(DOC_ROOT . DIRECTORY_SEPARATOR . 'gunzip ..' . DIRECTORY_SEPARATOR . $file, $output, $res); $result = exec(DOC_ROOT . DIRECTORY_SEPARATOR . 'tar -xvf ..' . DIRECTORY_SEPARATOR . str_replace('.tgz', '.tar', $file), $output, $res); } else { $result = exec('tar xzvf ../' . $file, $output, $res); } if (!$result) { echonow("Unpack failed", 'red'); DebMes("Unpack failed: " . 'tar xzvf ../' . $file, "restore"); return false; } if (file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/index.php') || file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/dump.sql')) { $folder = '/.'; } else { $UpdatesDir = scandir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 1); $folder = DIRECTORY_SEPARATOR . $UpdatesDir[0]; if (!is_dir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder)) { echonow("Unpack failed!", 'red'); return false; } } DebMes("Restore folder: $folder", "restore"); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if (file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/config.php')) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DISABLED . ' config.php
'); } @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/config.php'); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } if (file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . '/scripts/cycle_db_save.php') && file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/scripts/periodical_db_save.php') ) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_PATCHING . ' periodical_db_save.php...
'); } @rename(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/scripts/periodical_db_save.php', DOC_ROOT . DIRECTORY_SEPARATOR . '/scripts/cycle_db_save.php'); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_CHECK_MODULE_UPDATE . '
'); } chdir('../../../'); $ignores = SQLSelect("SELECT * FROM ignore_updates ORDER BY NAME"); $total = count($ignores); for ($i = 0; $i < $total; $i++) { $name = $ignores[$i]['NAME']; if (is_dir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/modules/' . $name)) { removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/modules/' . $name); } if (is_dir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/templates/' . $name)) { removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/templates/' . $name); } } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_APPLY_CHANGES . ' ' . DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . " to " . DOC_ROOT . DIRECTORY_SEPARATOR . '
'); } // UPDATING FILES DIRECTLY Исправлено верно на док_руут - потому что функция копиТрее не воспринимает других слешей copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder, DOC_ROOT, 1); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if (file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/dump.sql')) { // data restore if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_RESTORE_DB . '
'); } $result = $this->restoredatabase(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp' . $folder . '/dump.sql'); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } $this->config['LATEST_UPDATED_ID'] = $out['LATEST_ID']; $this->config['LATEST_CURR_BRANCH'] = $out['UPDATE_CURR_BRANCH']; $this->saveConfig(); setGlobal('LatestUpdateId', $out['LATEST_ID']); setGlobal('LatestUpdateBranch', $out['UPDATE_CURR_BRANCH']); setGlobal('LatestUpdateTimestamp', date('d.m.Y H:i:s')); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if ($iframe) { return 1; } else { setRebootRequired('updated'); $this->redirect("?mode=clear&ok_msg=" . urlencode("Updates Installed!") . "&with_extensions=" . $with_extensions . "&with_backup=" . $with_backup); } } } /** * Title * * Description * * @access public */ function dump(&$out, $iframe = 0) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_REQUEST_BACKUP_CREATE . '
'); } if (mkdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0777)) { // DESIGN global $design; if ($design) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_SAVE_DESIGN . '
'); } $tar_name .= 'design_'; copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'templates', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/templates'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'img', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/img'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'js', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/js'); $pt = array('\.css'); copyFiles(ROOT, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0, $pt); $pt = array('\.swf'); copyFiles(ROOT, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0, $pt); $pt = array('\.htc'); copyFiles(ROOT, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0, $pt); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } // CODE global $code; if ($code) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_SAVE_CODE . '
'); } $tar_name .= 'code_'; copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'lib', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/lib'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'modules', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/modules'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'scripts', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/scripts'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'languages', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/languages'); $pt = array('\.php'); copyFiles(ROOT, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 0, $pt); @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/config.php'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'forum', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/forum'); @unlink(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/forum/config.php'); if (!$design) { copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'js', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/js'); copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'templates', DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/templates'); } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } // DATA global $data; if ($data) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_SAVE_DATA . '
'); } $tar_name .= 'data_'; $this->backupdatabase(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/dump.sql'); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } // FILES global $save_files; if ($save_files) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_SAVE_FILES . '
'); } $tar_name .= 'files_'; $cms_dirs = scandir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms'); foreach ($cms_dirs as $d) { if ($d == '.' || $d == '..' || $d == 'cached' || $d == 'debmes' || $d == 'saverestore' ) continue; copyTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/' . $d, DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp/cms/' . $d); } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } // packing into tar.gz $tar_name .= date('Y-m-d__H-i-s'); $tar_name .= IsWindowsOS() ? '.tar' : '.tgz'; if (isset($out['BACKUP'])) $tar_name = 'backup_' . $tar_name; if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_BACKUP_PACKEGE_TO . ' ' . $tar_name . '
'); } if (IsWindowsOS()) { $result = exec('tar.exe --strip-components=2 -C ./cms/saverestore/temp/ -cvf ./cms/saverestore/' . $tar_name . ' ./'); $new_name = str_replace('.tar', '.tar.gz', $tar_name); $result = exec('gzip.exe ./cms/saverestore/' . $tar_name); if (file_exists('./cms/saverestore/' . $new_name)) { $tar_name = $new_name; } } else { chdir(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp'); exec('tar cvzf ../' . $tar_name . ' .'); chdir('../../../'); } if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } if (defined('SETTINGS_BACKUP_PATH') && SETTINGS_BACKUP_PATH != '' && file_exists(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $tar_name)) { if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_COPY_TO . ' ' . $dest . $tar_name . '
'); } $dest = SETTINGS_BACKUP_PATH; @copy(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/' . $tar_name, $dest . $tar_name); if ($iframe) { echonow('
' . LANG_UPDATEBACKUP_DONE . '
'); } } } return $tar_name; } /** * Title * * Description * * @access public */ function restoredatabase($filename) { $mysql_path = (substr(php_uname(), 0, 7) == "Windows") ? SERVER_ROOT . "/server/mysql/bin/mysql" : 'mysql'; $mysqlParam = " -u " . DB_USER; if (DB_PASSWORD != '') $mysqlParam .= " --password=\"" . DB_PASSWORD . "\""; $mysqlParam .= " " . DB_NAME . " <" . $filename; $cmd = $mysql_path . $mysqlParam; $result = exec($cmd, $output, $result_code); if ($result !== false) { DebMes("DB restored", "restore"); SQLExec("DELETE FROM cached_values"); setGlobal('cycle_mainRun', time()); return true; } else { DebMes("Failed to restore DB:\n" . implode("\n", $output), "restore"); return false; } } /** * Title * * Description * * @access public */ function backupdatabase($filename) { if (defined('PATH_TO_MYSQLDUMP')) $pathToMysqlDump = PATH_TO_MYSQLDUMP; else $pathToMysqlDump = IsWindowsOS() ? SERVER_ROOT . "/server/mysql/bin/mysqldump" : "/usr/bin/mysqldump"; $cmd = $pathToMysqlDump . " -h " . DB_HOST . " --user=\"" . DB_USER . "\" --password=\"" . DB_PASSWORD . "\" --no-create-db --add-drop-table " . DB_NAME . ">" . $filename; exec($cmd); } function copyFile($source, $destination) { $tmp = explode('/', $destination); $total = count($tmp); if ($total > 0) { $d = $tmp[0]; for ($i = 1; $i < ($total - 1); $i++) { $d .= '/' . $tmp[$i]; if (!is_dir($d)) { mkdir($d); } } } return copy($source, $destination); } /* */ function ftpget($conn_id, $local_file, $remote_file, $mode) { global $lset_dirs; $l_dir = dirname($local_file); if (!isset($lset_dirs[$l_dir])) { // echo "zz"; if (!is_dir($l_dir)) { $this->lmkdir($l_dir); } $lset_dirs[$l_dir] = 1; } $res = ftp_get($conn_id, $local_file, $remote_file, $mode); return $res; } function ftpmkdir($conn_id, $ftp_dir) { global $set_dirs; $tmp = explode('/', $ftp_dir); $res_dir = $tmp[0]; $tmpCnt = count($tmp); for ($i = 1; $i < $tmpCnt; $i++) { $res_dir .= '/' . $tmp[$i]; if (!isset($set_dirs[$res_dir])) { $set_dirs[$res_dir] = 1; if (!@ftp_chdir($conn_id, $res_dir)) { ftp_mkdir($conn_id, $res_dir); } } } } function ftpdelete($conn_id, $filename) { $res = ftp_delete($conn_id, $filename); return $res; } function ftpput($conn_id, $remote_file, $local_file, $mode) { global $set_dirs; $ftp_dir = dirname($remote_file); if (!isset($set_dirs[$ftp_dir])) { if (!@ftp_chdir($conn_id, $ftp_dir)) { $this->ftpmkdir($conn_id, $ftp_dir); } $set_dirs[$ftp_dir] = 1; } $res = ftp_put($conn_id, $remote_file, $local_file, $mode); return $res; } function autoUpdateSystem() { $this->getConfig(); $delay = $this->config['UPDATE_AUTO_DELAY']; if (!$delay) $delay = 1; DebMes("Starting auto update ($delay)", 'auto_update'); $update_url = $this->getUpdateURL(); $github_feed_url = $update_url; $github_feed_url = str_replace('/archive/', '/commits/', $github_feed_url); $github_feed_url = str_replace('.tar.gz', '.atom', $github_feed_url); $github_feed = getURL($github_feed_url, 30 * 60); if ($github_feed != '') { $tmp = GetXMLTree($github_feed); if (is_array($tmp)) { $data = XMLTreeToArray($tmp); $items = $data['feed']['entry']; } else { $items = false; } if (is_array($items)) { $latest_id = preg_replace('/.+Commit\//is', '', trim($items[0]['id']['textvalue'])); $latest_tm = strtotime($items[0]['updated']['textvalue']); //$latest_id = 'force_new_id'; if ($latest_id && ($latest_id == $this->config['LATEST_UPDATED_ID'])) { DebMes("Already updated to the latest version ($latest_id)", 'auto_update'); return 0; } else { DebMes("Need to update to $latest_id on top of " . $this->config['LATEST_UPDATED_ID'], 'auto_update'); } $current_delay = round((time() - $latest_tm) / (24 * 60 * 60), 2); if ($latest_tm && $current_delay < $delay) { DebMes("Update is too fresh ($current_delay vs $delay)", 'auto_update'); return 0; } // ok, downloading update set_time_limit(0); // updating main system logAction('system_update', 'Auto-update'); $out = array(); $res = $this->admin($out); DebMes("Getting latest version and making backup", 'auto_update'); $res = $this->getLatest($out, 1); global $restore; global $folder; $restore = 'master.tgz'; $folder = 'majordomo-master'; $basename = basename($this->url); if ($basename != 'master.tar.gz') { $basename = str_replace('.tar.gz', '', $basename); $folder = str_replace('master', $basename, $folder); } DebMes("Applying update $basename from $folder", 'auto_update'); $res = $this->upload($out, 1); removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 1); // now downloading updates for modules if ($this->config['UPDATE_AUTO_PLUGINS']) { DebMes("Getting updates for modules", 'auto_update'); global $mode; $mode = ''; $_GET['op'] = 'iframe'; $out = array(); include_once(DIR_MODULES . "market/market.class.php"); $mkt = new market(); $mkt->category_id = 'all'; $mkt->admin($out); logAction('market_update', 'Auto-update'); $res = $mkt->updateAll($mkt->can_be_updated_new, 1); if ($res) { $mkt->removeTree(DOC_ROOT . DIRECTORY_SEPARATOR . 'cms/saverestore/temp', 1); } } DebMes("Update installed, need to reboot", 'auto_update'); @SaveFile(DOC_ROOT . DIRECTORY_SEPARATOR . 'reboot', 'updated'); } } } function processSubscription($event_name, $details = '') { if ($event_name == 'HOURLY') { $this->getConfig(); if ($this->config['UPDATE_AUTO'] && (int)date('H') == $this->config['UPDATE_AUTO_TIME']) { DebMes("Processing auto update", 'auto_update'); $this->autoUpdateSystem(); } } } /** * FrontEnd * * Module frontend * * @access public */ function usual(&$out) { $this->admin($out); } /** * Install * * Module installation routine * * @access private */ function install($parent_name = "") { if (!Is_Dir(DOC_ROOT . DIRECTORY_SEPARATOR . "cms/saverestore")) { mkdir(DOC_ROOT . DIRECTORY_SEPARATOR . "cms/saverestore", 0777); } parent::install($parent_name); } // -------------------------------------------------------------------- } /* * * TW9kdWxlIGNyZWF0ZWQgU2VwIDE2LCAyMDA4IHVzaW5nIFNlcmdlIEouIHdpemFyZCAoQWN0aXZlVW5pdCBJbmMgd3d3LmFjdGl2ZXVuaXQuY29tKQ== * */ ?>