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