1<?php
2/*
3 * Gallery - a web based photo album viewer and editor
4 * Copyright (C) 2000-2008 Bharat Mediratta
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or (at
9 * your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21GalleryCoreApi::requireOnce('modules/core/classes/helpers/MaintenanceHelper_simple.class');
22
23/**
24 * This controller will perform the chosen task in AdminMaintenance
25 * @package GalleryCore
26 * @subpackage UserInterface
27 * @author Bharat Mediratta <bharat@menalto.com>
28 * @version $Revision: 17580 $
29 */
30class AdminMaintenanceController extends GalleryController {
31
32    /**
33     * @see GalleryController::handleRequest
34     */
35    function handleRequest($form) {
36	global $gallery;
37
38	$ret = GalleryCoreApi::assertUserIsSiteAdministrator();
39	if ($ret) {
40	    return array($ret, null);
41	}
42
43	$results = $status = $error = array();
44	if (isset($form['action']['runTask'])) {
45	    list ($ret, $this->_module) = GalleryCoreApi::loadPlugin('module', 'core');
46	    if ($ret) {
47		return array($ret, null);
48	    }
49
50	    $mode = $gallery->getConfig('mode.maintenance');
51
52	    $taskId = GalleryUtilities::getRequestVariables('taskId');
53
54	    list ($ret, $tasks) = MaintenanceHelper_simple::fetchTasks();
55	    if ($ret) {
56		return array($ret, null);
57	    }
58
59	    if (isset($tasks[$taskId])) {
60		$task =& $tasks[$taskId];
61
62		if (!$task->requiresMaintenanceMode() || $mode) {
63		    if ($task->requiresProgressBar()) {
64			$templateAdapter =& $gallery->getTemplateAdapter();
65			$templateAdapter->registerTrailerCallback(
66					array($this, 'runTask'), array($taskId, $task, true));
67			$results['delegate']['view'] = 'core.ProgressBar';
68		    } else {
69			list ($ret, $success)  = $this->runTask($taskId, $task, false);
70			if ($ret) {
71			    return array($ret, null);
72			}
73
74			$status['run'] = array('taskId' => $taskId, 'success' => $success);
75			$redirect['view'] = 'core.SiteAdmin';
76			$redirect['subView'] = 'core.AdminMaintenance';
77		    }
78		} else {
79		    $results['delegate']['view'] = 'core.SiteAdmin';
80		    $results['delegate']['subView'] = 'core.AdminMaintenance';
81		    $error[] = 'form[error][maintenanceModeRequired]';
82		}
83	    }
84	} else if (isset($form['action']['setMode'])) {
85	    $platform =& $gallery->getPlatform();
86
87	    $newMode = !empty($form['setMode']['mode']);
88	    $maintenanceUrl = $form['setMode']['url'];
89
90	    $statusMsg = $newMode ? 'setOn' : 'setOff';
91	    if ($newMode && !empty($maintenanceUrl)) {
92		$urlGenerator =& $gallery->getUrlGenerator();
93	    	$newMode = $urlGenerator->makeAbsoluteUrl($maintenanceUrl);
94	    }
95	    $ret = GalleryCoreApi::setMaintenanceMode($newMode);
96	    if ($ret) {
97		return array($ret, null);
98	    }
99
100	    $ret = GalleryCoreApi::setPluginParameter('module', 'core',
101						       'mode.maintenance.lastUrl', $maintenanceUrl);
102	    if ($ret) {
103		return array($ret, null);
104	    }
105
106	    $status['setMode'][$statusMsg] = 1;
107	    $redirect['view'] = 'core.SiteAdmin';
108	    $redirect['subView'] = 'core.AdminMaintenance';
109	}
110
111	if (!empty($redirect)) {
112	    $results['redirect'] = $redirect;
113	} else if (empty($results['delegate'])) {
114	    $results['delegate']['view'] = 'core.SiteAdmin';
115	    $results['delegate']['subView'] = 'core.AdminMaintenance';
116	}
117
118	$results['status'] = $status;
119	$results['error'] = $error;
120
121	return array(null, $results);
122    }
123
124    function runTask($taskId, $task, $useProgressBar) {
125	global $gallery;
126	$urlGenerator =& $gallery->getUrlGenerator();
127
128	list ($ret1, $success, $details) = $task->run();
129	if ($ret1) {
130	    $details = $ret1->getAsHtml();
131	}
132	$ret2 = MaintenanceHelper_simple::addRun($taskId, time(), $success, $details);
133
134	if ($ret1 || $ret2) {
135	    $ret = $ret1 ? $ret1 : $ret2;
136	    return array($ret, null);
137	}
138
139	$status['run']['success'] = $success;
140	$status['run']['taskId'] = $taskId;
141	$session =& $gallery->getSession();
142	$session->putStatus($status);
143
144	$redirect['view'] = 'core.SiteAdmin';
145	$redirect['subView'] = 'core.AdminMaintenance';
146
147	if ($useProgressBar) {
148	    $templateAdapter =& $gallery->getTemplateAdapter();
149	    $templateAdapter->completeProgressBar($urlGenerator->generateUrl($redirect));
150	}
151
152	return array(null, $success);
153    }
154}
155
156/**
157 * This view will show available maintenance tasks
158 */
159class AdminMaintenanceView extends GalleryView {
160    /**
161     * @see GalleryView::loadTemplate
162     */
163    function loadTemplate(&$template, &$form) {
164	global $gallery;
165
166	$ret = GalleryCoreApi::assertUserIsSiteAdministrator();
167	if ($ret) {
168	    return array($ret, null);
169	}
170
171	/* Load some standard form parameters */
172	if ($form['formName'] != 'AdminMaintenance') {
173	    $form['formName'] = 'AdminMaintenance';
174	}
175
176	list ($ret, $tasks) = MaintenanceHelper_simple::fetchTasks();
177	if ($ret) {
178	    return array($ret, null);
179	}
180
181	$AdminMaintenance = array();
182	foreach ($tasks as $taskId => $task) {
183	    list ($ret, $info) = MaintenanceHelper_simple::fetchLastRun($taskId);
184	    if ($ret) {
185		return array($ret, null);
186	    }
187
188	    $AdminMaintenance['tasks'][$taskId] = $task->getInfo();
189	    if (isset($info)) {
190		$AdminMaintenance['tasks'][$taskId]['runId'] = $info['runId'];
191		$AdminMaintenance['tasks'][$taskId]['timestamp'] = $info['timestamp'];
192		$AdminMaintenance['tasks'][$taskId]['success'] = $info['success'];
193		$AdminMaintenance['tasks'][$taskId]['details'] = $info['details'];
194	    } else {
195		$AdminMaintenance['tasks'][$taskId]['runId'] = null;
196		$AdminMaintenance['tasks'][$taskId]['timestamp'] = null;
197		$AdminMaintenance['tasks'][$taskId]['success'] = null;
198		$AdminMaintenance['tasks'][$taskId]['details'] = null;
199	    }
200	}
201
202	$maintenanceMode = $gallery->getConfig('mode.maintenance');
203	list ($ret, $maintenanceModeUrl) = GalleryCoreApi::getPluginParameter('module',
204								'core', 'mode.maintenance.lastUrl');
205	if ($ret) {
206	    return array($ret, null);
207	}
208
209	if (!empty($maintenanceMode)) {
210	    if (is_string($maintenanceMode)) {
211	    	$maintenanceModeUrl = $maintenanceMode;
212		$maintenanceMode = true;
213	    }
214	} else {
215	}
216	$AdminMaintenance['setMode']['mode'] = $maintenanceMode;
217	$AdminMaintenance['setMode']['url'] = $maintenanceModeUrl;
218
219	$template->setVariable('AdminMaintenance', $AdminMaintenance);
220	$template->setVariable('controller', 'core.AdminMaintenance');
221
222	$template->javascript('lib/javascript/BlockToggle.js');
223	return array(null,
224		     array('body' => 'modules/core/templates/AdminMaintenance.tpl'));
225    }
226}
227
228/**
229 * Base class for all maintenance tasks
230 * @abstract
231 */
232class MaintenanceTask {
233
234    /**
235     * Return internationalized text about this task
236     * @return array('title' => ..., 'description' => ..., 'l10Domain' => ...)
237     */
238    function getInfo() {
239	return array();
240    }
241
242    /**
243     * Execute the task
244     * @return array GalleryStatus a status code
245     *               boolean success or failure
246     *               array string output text
247     */
248    function run() {
249	return array(GalleryCoreApi::error(ERROR_UNIMPLEMENTED), null, null);
250    }
251
252    /**
253     * Will this task run so long that it requires a progress bar?
254     * @return true or false
255     */
256    function requiresProgressBar() {
257	return false;
258    }
259
260    /**
261     * This task requires that the administrator sets Gallery into maintenance mode.
262     * @return true or false
263     */
264    function requiresMaintenanceMode() {
265	return false;
266    }
267}
268?>
269