Dotclear

source: admin/update.php @ 3730:5c45a5df9a59

Revision 3730:5c45a5df9a59, 8.9 KB checked in by franck <carnet.franck.paul@…>, 7 years ago (diff)

Code formatting (PSR-2)

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12
13require dirname(__FILE__) . '/../inc/admin/prepend.php';
14
15if (!defined('DC_BACKUP_PATH')) {
16    define('DC_BACKUP_PATH', DC_ROOT);
17}
18
19dcPage::checkSuper();
20
21if (!is_readable(DC_DIGESTS)) {
22    dcPage::open(__('Dotclear update'));
23    echo '<h2>Access denied</h2>';
24    dcPage::close();
25    exit;
26}
27
28$updater      = new dcUpdate(DC_UPDATE_URL, 'dotclear', DC_UPDATE_VERSION, DC_TPL_CACHE . '/versions');
29$new_v        = $updater->check(DC_VERSION, !empty($_GET['nocache']));
30$zip_file     = $new_v ? DC_BACKUP_PATH . '/' . basename($updater->getFileURL()) : '';
31$version_info = $new_v ? $updater->getInfoURL() : '';
32
33# Hide "update me" message
34if (!empty($_GET['hide_msg'])) {
35    $updater->setNotify(false);
36    http::redirect('index.php');
37}
38
39$p_url = 'update.php';
40
41$step = isset($_GET['step']) ? $_GET['step'] : '';
42$step = in_array($step, array('check', 'download', 'backup', 'unzip')) ? $step : '';
43
44$default_tab = !empty($_GET['tab']) ? html::escapeHTML($_GET['tab']) : 'update';
45if (!empty($_POST['backup_file'])) {
46    $default_tab = 'files';
47}
48
49$archives = array();
50foreach (files::scanDir(DC_BACKUP_PATH) as $v) {
51    if (preg_match('/backup-([0-9A-Za-z\.-]+).zip/', $v)) {
52        $archives[] = $v;
53    }
54}
55if (!empty($archives)) {
56    usort($archives, "version_compare");
57} else {
58    $default_tab = 'update';
59}
60
61# Revert or delete backup file
62if (!empty($_POST['backup_file']) && in_array($_POST['backup_file'], $archives)) {
63    $b_file = $_POST['backup_file'];
64
65    try
66    {
67        if (!empty($_POST['b_del'])) {
68            if (!@unlink(DC_BACKUP_PATH . '/' . $b_file)) {
69                throw new Exception(sprintf(__('Unable to delete file %s'), html::escapeHTML($b_file)));
70            }
71            http::redirect($p_url . '?tab=files');
72        }
73
74        if (!empty($_POST['b_revert'])) {
75            $zip = new fileUnzip(DC_BACKUP_PATH . '/' . $b_file);
76            $zip->unzipAll(DC_BACKUP_PATH . '/');
77            @unlink(DC_BACKUP_PATH . '/' . $b_file);
78            http::redirect($p_url . '?tab=files');
79        }
80    } catch (Exception $e) {
81        $core->error->add($e->getMessage());
82    }
83}
84
85# Upgrade process
86if ($new_v && $step) {
87    try
88    {
89        $updater->setForcedFiles('inc/digests');
90
91        switch ($step) {
92            case 'check':
93                $updater->checkIntegrity(DC_ROOT . '/inc/digests', DC_ROOT);
94                http::redirect($p_url . '?step=download');
95                break;
96            case 'download':
97                $updater->download($zip_file);
98                if (!$updater->checkDownload($zip_file)) {
99                    throw new Exception(
100                        sprintf(__('Downloaded Dotclear archive seems to be corrupted. ' .
101                            'Try <a %s>download it</a> again.'), 'href="' . $p_url . '?step=download"') .
102                        ' ' .
103                        __('If this problem persists try to ' .
104                            '<a href="http://dotclear.org/download">update manually</a>.')
105                    );
106                }
107                http::redirect($p_url . '?step=backup');
108                break;
109            case 'backup':
110                $updater->backup(
111                    $zip_file, 'dotclear/inc/digests',
112                    DC_ROOT, DC_ROOT . '/inc/digests',
113                    DC_BACKUP_PATH . '/backup-' . DC_VERSION . '.zip'
114                );
115                http::redirect($p_url . '?step=unzip');
116                break;
117            case 'unzip':
118                $updater->performUpgrade(
119                    $zip_file, 'dotclear/inc/digests', 'dotclear',
120                    DC_ROOT, DC_ROOT . '/inc/digests'
121                );
122                break;
123        }
124    } catch (Exception $e) {
125        $msg = $e->getMessage();
126
127        if ($e->getCode() == dcUpdate::ERR_FILES_CHANGED) {
128            $msg =
129                __('The following files of your Dotclear installation ' .
130                'have been modified so we won\'t try to update your installation. ' .
131                'Please try to <a href="http://dotclear.org/download">update manually</a>.');
132        } elseif ($e->getCode() == dcUpdate::ERR_FILES_UNREADABLE) {
133            $msg =
134                sprintf(__('The following files of your Dotclear installation are not readable. ' .
135                'Please fix this or try to make a backup file named %s manually.'),
136                '<strong>backup-' . DC_VERSION . '.zip</strong>');
137        } elseif ($e->getCode() == dcUpdate::ERR_FILES_UNWRITALBE) {
138            $msg =
139                __('The following files of your Dotclear installation cannot be written. ' .
140                'Please fix this or try to <a href="http://dotclear.org/download">update manually</a>.');
141        }
142
143        if (isset($e->bad_files)) {
144            $msg .=
145            '<ul><li><strong>' .
146            implode('</strong></li><li><strong>', $e->bad_files) .
147                '</strong></li></ul>';
148        }
149
150        $core->error->add($msg);
151
152        $core->callBehavior('adminDCUpdateException', $e);
153    }
154}
155
156/* DISPLAY Main page
157-------------------------------------------------------- */
158dcPage::open(__('Dotclear update'),
159    (!$step ?
160        dcPage::jsPageTabs($default_tab) .
161        dcPage::jsLoad('js/_update.js')
162        : ''),
163    dcPage::breadcrumb(
164        array(
165            __('System')          => '',
166            __('Dotclear update') => ''
167        ))
168);
169
170if (!$core->error->flag()) {
171    if (!empty($_GET['nocache'])) {
172        dcPage::success(__('Manual checking of update done successfully.'));
173    }
174}
175
176if (!$step) {
177    echo '<div class="multi-part" id="update" title="' . __('Dotclear update') . '">';
178    if (empty($new_v)) {
179        echo '<p><strong>' . __('No newer Dotclear version available.') . '</strong></p>' .
180        '<form action="' . $p_url . '" method="get">' .
181        '<p><input type="hidden" name="nocache" value="1" />' .
182        '<input type="submit" value="' . __('Force checking update Dotclear') . '" /></p>' .
183            '</form>';
184    } else {
185        echo
186        '<p class="static-msg">' . sprintf(__('Dotclear %s is available.'), $new_v) .
187            ($version_info ? ' <a href="' . $version_info . '" class="outgoing" title="' . __('Information about this version') . '">(' .
188            __('Information about this version') . ')&nbsp;<img src="images/outgoing.png" alt=""/></a>' : '') .
189            '</p>';
190        if (version_compare(phpversion(), $updater->getPHPVersion()) < 0) {
191            echo
192            '<p class="warning-msg">' . sprintf(__('PHP version is %s (%s or earlier needed).'), phpversion(), $updater->getPHPVersion()) . '</p>';
193        } else {
194            echo
195            '<p>' . __('To upgrade your Dotclear installation simply click on the following button. ' .
196                'A backup file of your current installation will be created in your root directory.') . '</p>' .
197            '<form action="' . $p_url . '" method="get">' .
198            '<p><input type="hidden" name="step" value="check" />' .
199            '<input type="submit" value="' . __('Update Dotclear') . '" /></p>' .
200                '</form>';
201        }
202    }
203    echo '</div>';
204
205    if (!empty($archives)) {
206        echo '<div class="multi-part" id="files" title="' . __('Manage backup files') . '">';
207
208        echo
209        '<h3>' . __('Update backup files') . '</h3>' .
210        '<p>' . __('The following files are backups of previously updates. ' .
211            'You can revert your previous installation or delete theses files.') . '</p>';
212
213        echo '<form action="' . $p_url . '" method="post">';
214        foreach ($archives as $v) {
215            echo
216            '<p><label class="classic">' . form::radio(array('backup_file'), html::escapeHTML($v)) . ' ' .
217            html::escapeHTML($v) . '</label></p>';
218        }
219
220        echo
221        '<p><strong>' . __('Please note that reverting your Dotclear version may have some ' .
222            'unwanted side-effects. Consider reverting only if you experience strong issues with this new version.') . '</strong> ' .
223        sprintf(__('You should not revert to version prior to last one (%s).'), end($archives)) .
224        '</p>' .
225        '<p><input type="submit" class="delete" name="b_del" value="' . __('Delete selected file') . '" /> ' .
226        '<input type="submit" name="b_revert" value="' . __('Revert to selected file') . '" />' .
227        $core->formNonce() . '</p>' .
228            '</form>';
229
230        echo '</div>';
231    }
232} elseif ($step == 'unzip' && !$core->error->flag()) {
233    echo
234    '<p class="message">' .
235    __("Congratulations, you're one click away from the end of the update.") .
236    ' <strong><a href="index.php?logout=1">' . __('Finish the update.') . '</a></strong>' .
237        '</p>';
238}
239
240dcPage::helpBlock('core_update');
241dcPage::close();
Note: See TracBrowser for help on using the repository browser.

Sites map