root/trunk/modules/default/classes/MaintenanceMgr.php

Revision 2467 (checked in by demian, 1 month ago)

added hooks for debug block

Line 
1 <?php
2 /* Reminder: always indent with 4 spaces (no tabs). */
3 // +---------------------------------------------------------------------------+
4 // | Copyright (c) 2006, Demian Turner                                         |
5 // | All rights reserved.                                                      |
6 // |                                                                           |
7 // | Redistribution and use in source and binary forms, with or without        |
8 // | modification, are permitted provided that the following conditions        |
9 // | are met:                                                                  |
10 // |                                                                           |
11 // | o Redistributions of source code must retain the above copyright          |
12 // |   notice, this list of conditions and the following disclaimer.           |
13 // | o Redistributions in binary form must reproduce the above copyright       |
14 // |   notice, this list of conditions and the following disclaimer in the     |
15 // |   documentation and/or other materials provided with the distribution.    |
16 // | o The names of the authors may not be used to endorse or promote          |
17 // |   products derived from this software without specific prior written      |
18 // |   permission.                                                             |
19 // |                                                                           |
20 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
21 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
22 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
23 // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
24 // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
25 // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
26 // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
27 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
28 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
29 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
30 // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
31 // |                                                                           |
32 // +---------------------------------------------------------------------------+
33 // | Seagull 0.6                                                               |
34 // +---------------------------------------------------------------------------+
35 // | MaintenanceMgr.php                                                        |
36 // +---------------------------------------------------------------------------+
37 // | Author:   Demian Turner <demian@phpkitchen.com>                           |
38 // +---------------------------------------------------------------------------+
39 // $Id: MaintenanceMgr.php,v 1.56 2005/05/31 23:34:23 demian Exp $
40
41 /**
42  * Provides tools preform maintenance tasks.
43  *
44  * @package default
45  * @author  Demian Turner <demian@phpkitchen.com>
46  * @version $Revision: 1.56 $
47  * @since   PHP 4.1
48  */
49
50 class MaintenanceMgr extends SGL_Manager
51 {
52     function MaintenanceMgr()
53     {
54         SGL::logMessage(null, PEAR_LOG_DEBUG);
55         parent::SGL_Manager();
56
57         $this->pageTitle    = 'Maintenance';
58         $this->template     = 'maintenance.html';
59         $this->redirect     = true;
60         $this->da           = & DA_Default::singleton();
61
62         $this->_aActionsMapping =  array(
63             'dbgen'     => array('dbgen'),
64             'rebuildSequences' => array('rebuildSequences'),
65             'rebuildSeagull' => array('rebuildSeagull'),
66             'clearCache' => array('clearCache'),
67             'checkLatestVersion' => array('checkLatestVersion', 'redirectToDefault'),
68             'list'      => array('list'),
69         );
70     }
71
72     function validate($req, &$input)
73     {
74         SGL::logMessage(null, PEAR_LOG_DEBUG);
75
76         $this->validated    = true;
77         $input->pageTitle   = $this->pageTitle;
78         $input->masterTemplate = $this->masterTemplate;
79         $input->template    = $this->template;
80         $input->submitted   = $req->get('submitted');
81         $input->action      = ($req->get('action')) ? $req->get('action') : 'list';
82         $input->cache       = ($req->get('frmCache')) ? $req->get('frmCache') : array();
83         $input->useSampleData  = ($req->get('frmSampleData')) ? 1 : 0;
84
85         if ($input->submitted) {
86             if ($req->get('action') == '' || $req->get('action') == 'list') {
87                 $aErrors['noSelection'] = SGL_Output::translate('please specify an option');
88             }
89             if ($input->action == 'clearCache' && !count($input->cache)) {
90                 $aErrors['nothingChecked'] = SGL_Output::translate('please check at least one box');
91             }
92         }
93         //  if errors have occured
94         if (isset($aErrors) && count($aErrors)) {
95             SGL::raiseMsg('Please fill in the indicated fields');
96             $input->error = $aErrors;
97             $this->validated = false;
98         }
99     }
100
101     //  regenerate dataobject entity files
102     function _cmd_dbgen(&$input, &$output)
103     {
104         require_once SGL_CORE_DIR . '/Task/Install.php';
105
106         //  First regenerate entities files
107         $resEntities = SGL_Task_CreateDataObjectEntities::run();
108         //  Then regenerate links file
109         $data['aModuleList'] = SGL_Util::getAllModuleDirs($onlyRegistered = true);
110         $resLinks = SGL_Task_CreateDataObjectLinkFile::run($data);
111         SGL::raiseMsg('Data Objects rebuilt successfully', true, SGL_MESSAGE_INFO);
112     }
113
114     function _cmd_checkLatestVersion(&$input, &$output)
115     {
116         require_once SGL_CORE_DIR . '/Install/Common.php';
117         $localVersion = SGL_Install_Common::getFrameworkVersion();
118
119         require_once SGL_CORE_DIR . '/XML/RPC/Remote.php';
120         $config = SGL_MOD_DIR . '/default/xmlrpc_conf.ini';
121         $remote = new SGL_XML_RPC_Remote($config);
122         $remoteVersion = $remote->call('framework.determineLatestVersion');
123
124         if (PEAR::isError($remoteVersion)) {
125             SGL::raiseError('remote interface problem');
126         } else {
127             $res = version_compare($localVersion, $remoteVersion);
128             $msgType = SGL_MESSAGE_ERROR;
129             if ($res < 0) {
130                 $msg = 'There is a newer version available: ' . $remoteVersion . ', please upgrade '.
131                 '<a href="http://seagull.phpkitchen.com/index.php/publisher/articleview/frmArticleID/12/staticId/20/">here</a>';
132                 $msgType = SGL_MESSAGE_WARNING;
133             } else {
134                 $msg = "Your current version, $localVersion, is up to date";
135                 $msgType = SGL_MESSAGE_INFO;
136             }
137             SGL::raiseMsg($msg, false, $msgType);
138         }
139     }
140
141     function _cmd_rebuildSequences(&$input, &$output)
142     {
143         SGL::logMessage(null, PEAR_LOG_DEBUG);
144
145         require_once SGL_CORE_DIR . '/Task/Install.php';
146         $res = SGL_Task_SyncSequences::run();
147         if (PEAR::isError($res)) {
148             return $res;
149         } else {
150             SGL::raiseMsg('Sequences rebuilt successfully', true, SGL_MESSAGE_INFO);
151         }
152     }
153
154     function _cmd_rebuildSeagull(&$input, &$output)
155     {
156         SGL::logMessage(null, PEAR_LOG_DEBUG);
157
158         if (!preg_match("/mysql/", $this->dbh->phptype)) {
159             SGL::raiseMsg('This operation is currently only supported for MySQL',
160                 false, SGL_MESSAGE_INFO);
161             return false;
162         }
163         require_once SGL_CORE_DIR . '/Task/Install.php';
164
165         //  retrieve Install password
166         $aLines = file(SGL_PATH . '/var/INSTALL_COMPLETE.php');
167         $installPassword = trim(substr($aLines[1], 1));
168
169         //  retrieve translation settings
170         $transContainer = ($this->conf['translation']['container'] == 'db') ? 1 : 0;
171         $transLanguage  = str_replace('_','-', explode(',', $this->conf['translation']['installedLanguages']));
172
173         $data = array(
174             'createTables'          => 1,
175             'insertSampleData'      => $input->useSampleData,
176             'adminUserName'         => 'admin',
177             'adminPassword'         => 'admin',
178             'adminFirstName'        => 'Demo',
179             'adminLastName'         => 'Admin',
180             'adminEmail'            => 'demian@phpkitchen.com',
181             'aModuleList'           => SGL_Util::getAllModuleDirs($onlyRegistered = true),
182             'serverName'            =>  SGL_SERVER_NAME,
183             'installPassword'       => $installPassword,
184             'storeTranslationsInDB' => $transContainer,
185             'installLangs'          => $transLanguage,
186             );
187
188         define('SGL_ADMIN_REBUILD', 1);
189         $runner = new SGL_TaskRunner();
190         $runner->addData($data);
191         $runner->addTask(new SGL_Task_SetTimeout());
192         $runner->addTask(new SGL_Task_DefineTableAliases());
193         $runner->addTask(new SGL_Task_DisableForeignKeyChecks());
194         $runner->addTask(new SGL_Task_DropDatabase());
195         $runner->addTask(new SGL_Task_CreateDatabase());
196         $runner->addTask(new SGL_Task_CreateTables());
197         $runner->addTask(new SGL_Task_LoadDefaultData());
198         $runner->addTask(new SGL_Task_SyncSequences());
199         $runner->addTask(new SGL_Task_BuildNavigation());
200         $runner->addTask(new SGL_Task_LoadBlockData());
201         $runner->addTask(new SGL_Task_LoadSampleData());
202         $runner->addTask(new SGL_Task_LoadTranslations());
203         $runner->addTask(new SGL_Task_CreateConstraints());
204         $runner->addTask(new SGL_Task_SyncSequences());
205         $runner->addTask(new SGL_Task_EnableForeignKeyChecks());
206         $runner->addTask(new SGL_Task_VerifyDbSetup());
207         $runner->addTask(new SGL_Task_CreateFileSystem());
208         $runner->addTask(new SGL_Task_CreateDataObjectEntities());
209         $runner->addTask(new SGL_Task_CreateDataObjectLinkFile());
210         $runner->addTask(new SGL_Task_SymLinkWwwData());
211         $runner->addTask(new SGL_Task_CreateAdminUser());
212         $runner->addTask(new SGL_Task_CreateMemberUser());
213         $runner->addTask(new SGL_Task_EnableDebugBlock());
214         $runner->addTask(new SGL_Task_InstallerCleanup());
215
216         $ok = $runner->main();
217
218         if (SGL_Error::count()) {
219             $oError = SGL_Error::getLast();
220             $msg = $oError->getMessage();
221             $type = SGL_MESSAGE_WARNING;
222         } else {
223             $msg = 'Environment rebuilt successfully';
224             $type = SGL_MESSAGE_INFO;
225         }
226         SGL::raiseMsg($msg, false, $type);
227
228     }
229
230     function _cmd_clearCache(&$input, &$output)
231     {
232         SGL::logMessage(null, PEAR_LOG_DEBUG);
233
234         $msg = '';
235         if (array_key_exists('templates', $input->cache)) {
236             require_once 'System.php';
237             $tmplDir = SGL_CACHE_DIR . "/tmpl/";
238             $aDirs = System::find(array($tmplDir, "-maxdepth", 1));
239             //  exclude last element found which is the containing tmpl folder itself
240             array_pop($aDirs);
241             foreach ($aDirs as $dir) {
242                 $aFiles = System::find(array($dir, "-name", "*"));
243                 //  exclude last element found which is the theme folder
244                 array_pop($aFiles);
245                 if (!@System::rm($aFiles)) {
246                     SGL::raiseError('There was a problem deleting the files',
247                         SGL_ERROR_FILEUNWRITABLE);
248                 } else {
249                     SGL::raiseMsg('Cache files successfully deleted', true, SGL_MESSAGE_INFO);
250                 }
251             }
252         }
253         if (array_key_exists('translations', $input->cache)) {
254             if (SGL_Translation::clearCache() === false) {
255                 SGL::raiseError('There was a problem deleting the files',
256                     SGL_ERROR_FILEUNWRITABLE);
257             } else {
258                 SGL::raiseMsg('Cache files successfully deleted', true, SGL_MESSAGE_INFO);
259             }
260         }
261         if (count($input->cache) > 0) {
262             $success = true;
263             foreach ($input->cache as $group => $v) {
264                 $result = SGL_Cache::clear($group);
265                 $success = $success && $result;
266             }
267             if ($success === false) { //  let's see what happens with Cache_Lite's return type
268                 SGL::raiseError('There was a problem deleting the files',
269                     SGL_ERROR_FILEUNWRITABLE);
270             } else {
271                 SGL::raiseMsg('Cache files successfully deleted', true, SGL_MESSAGE_INFO);
272             }
273         }
274     }
275
276     function _cmd_list(&$input, &$output)
277     {
278         SGL::logMessage(null, PEAR_LOG_DEBUG);
279     }
280
281     function _cmd_redirectToDefault(&$input, &$output)
282     {
283         SGL::logMessage(null, PEAR_LOG_DEBUG);
284
285         //  if no errors have occured, redirect
286         if (!SGL_Error::count()) {
287             if (!($this->redirect)) {
288                 return;
289             } else {
290                 SGL_HTTP::redirect();
291             }
292
293         //  else display error with blank template
294         } else {
295             $output->template = 'docBlank.html';
296         }
297     }
298 }
299 ?>
300
Note: See TracBrowser for help on using the browser.