1: <?php
2:
3: namespace Alpha\Controller;
4:
5: use Alpha\Util\Logging\Logger;
6: use Alpha\Util\Config\ConfigProvider;
7: use Alpha\Util\Http\Response;
8: use Alpha\Util\Http\Session\SessionProviderFactory;
9: use Alpha\Model\ActiveRecord;
10: use Alpha\Model\Rights;
11: use Alpha\Model\Person;
12: use Alpha\Model\Type\DEnum;
13: use Alpha\Model\Type\DEnumItem;
14: use Alpha\Exception\FailedIndexCreateException;
15: use Alpha\Exception\FailedLookupCreateException;
16: use Alpha\Controller\Front\FrontController;
17: use Alpha\View\View;
18:
19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
61: class InstallController extends Controller implements ControllerInterface
62: {
63: 64: 65: 66: 67: 68: 69:
70: private static $logger = null;
71:
72: 73: 74: 75: 76:
77: public function __construct()
78: {
79: self::$logger = new Logger('InstallController');
80: self::$logger->debug('>>__construct()');
81:
82: $config = ConfigProvider::getInstance();
83:
84: parent::__construct('Public');
85:
86:
87: $this->setTitle('Installing '.$config->get('app.title'));
88:
89: self::$logger->debug('<<__construct');
90: }
91:
92: 93: 94: 95: 96: 97: 98: 99: 100:
101: public function doGET($request)
102: {
103: self::$logger->debug('>>doGET($request=['.var_export($request, true).'])');
104:
105: $config = ConfigProvider::getInstance();
106:
107: $sessionProvider = $config->get('session.provider.name');
108: $session = SessionProviderFactory::getInstance($sessionProvider);
109:
110:
111: if ($session->get('currentUser') === false) {
112: self::$logger->info('Nobody logged in, invoking Login controller...');
113:
114: $controller = new LoginController();
115: $controller->setName('LoginController');
116: $controller->setRequest($request);
117: $controller->setUnitOfWork(array('Alpha\Controller\LoginController', 'Alpha\Controller\InstallController'));
118:
119: self::$logger->debug('<<__construct');
120:
121: return $controller->doGET($request);
122: }
123:
124: $params = $request->getParams();
125:
126: $sessionProvider = $config->get('session.provider.name');
127: $session = SessionProviderFactory::getInstance($sessionProvider);
128:
129: $body = View::displayPageHead($this);
130:
131: $body .= '<h1>Installing the '.$config->get('app.title').' application</h1>';
132:
133: try {
134: $body .= $this->createApplicationDirs();
135: } catch (\Exception $e) {
136: $body .= View::displayErrorMessage($e->getMessage());
137: $body .= View::displayErrorMessage('Aborting.');
138:
139: return new Response(500, $body, array('Content-Type' => 'text/html'));
140: }
141:
142:
143: ActiveRecord::begin();
144:
145: 146: 147:
148: $DEnum = new DEnum();
149: $DEnumItem = new DEnumItem();
150:
151: try {
152: $body .= '<p>Attempting to create the DEnum tables...';
153: if (!$DEnum->checkTableExists()) {
154: $DEnum->makeTable();
155: }
156: self::$logger->info('Created the ['.$DEnum->getTableName().'] table successfully');
157:
158: if (!$DEnumItem->checkTableExists()) {
159: $DEnumItem->makeTable();
160: }
161: self::$logger->info('Created the ['.$DEnumItem->getTableName().'] table successfully');
162:
163:
164: $DEnum = new DEnum('Alpha\Model\Article::section');
165: $DEnumItem = new DEnumItem();
166: $DEnumItem->set('value', 'Main');
167: $DEnumItem->set('DEnumID', $DEnum->getID());
168: $DEnumItem->save();
169:
170: $body .= View::displayUpdateMessage('DEnums set up successfully.');
171: } catch (\Exception $e) {
172: $body .= View::displayErrorMessage($e->getMessage());
173: $body .= View::displayErrorMessage('Aborting.');
174: self::$logger->error($e->getMessage());
175: ActiveRecord::rollback();
176:
177: return new Response(500, $body, array('Content-Type' => 'text/html'));
178: }
179:
180: 181: 182:
183: $classNames = ActiveRecord::getBOClassNames();
184: $loadedClasses = array();
185:
186: foreach ($classNames as $classname) {
187: array_push($loadedClasses, $classname);
188: }
189:
190: foreach ($loadedClasses as $classname) {
191: try {
192: $body .= '<p>Attempting to create the table for the class ['.$classname.']...';
193:
194: try {
195: $BO = new $classname();
196:
197: if (!$BO->checkTableExists()) {
198: $BO->makeTable();
199: } else {
200: if ($BO->checkTableNeedsUpdate()) {
201: $missingFields = $BO->findMissingFields();
202:
203: $count = count($missingFields);
204:
205: for ($i = 0; $i < $count; ++$i) {
206: $BO->addProperty($missingFields[$i]);
207: }
208: }
209: }
210: } catch (FailedIndexCreateException $eice) {
211:
212: self::$logger->warn($eice->getMessage());
213: } catch (FailedLookupCreateException $elce) {
214:
215: self::$logger->warn($elce->getMessage());
216: }
217:
218: self::$logger->info('Created the ['.$BO->getTableName().'] table successfully');
219: $body .= View::displayUpdateMessage('Created the ['.$BO->getTableName().'] table successfully');
220: } catch (\Exception $e) {
221: $body .= View::displayErrorMessage($e->getMessage());
222: $body .= View::displayErrorMessage('Aborting.');
223: self::$logger->error($e->getMessage());
224: ActiveRecord::rollback();
225:
226: return new Response(500, $body, array('Content-Type' => 'text/html'));
227: }
228: }
229:
230: $body .= View::displayUpdateMessage('All business object tables created successfully!');
231:
232: 233: 234:
235: $adminGroup = new Rights();
236: $adminGroup->set('name', 'Admin');
237: $standardGroup = new Rights();
238: $standardGroup->set('name', 'Standard');
239:
240: try {
241: try {
242: $body .= '<p>Attempting to create the Admin and Standard groups...';
243: $adminGroup->save();
244: $standardGroup->save();
245:
246: self::$logger->info('Created the Admin and Standard rights groups successfully');
247: $body .= View::displayUpdateMessage('Created the Admin and Standard rights groups successfully');
248: } catch (FailedIndexCreateException $eice) {
249:
250: self::$logger->warn($eice->getMessage());
251: } catch (FailedLookupCreateException $elce) {
252:
253: self::$logger->warn($elce->getMessage());
254: }
255: } catch (\Exception $e) {
256: $body .= View::displayErrorMessage($e->getMessage());
257: $body .= View::displayErrorMessage('Aborting.');
258: self::$logger->error($e->getMessage());
259: ActiveRecord::rollback();
260:
261: return new Response(500, $body, array('Content-Type' => 'text/html'));
262: }
263:
264: 265: 266:
267: try {
268: try {
269: $body .= '<p>Attempting to save the Admin account...';
270: $admin = new Person();
271: $admin->set('displayName', 'Admin');
272: $admin->set('email', $session->get('currentUser')->get('email'));
273: $admin->set('password', $session->get('currentUser')->get('password'));
274: $admin->save();
275: self::$logger->info('Created the admin user account ['.$session->get('currentUser')->get('email').'] successfully');
276:
277: $adminGroup->loadByAttribute('name', 'Admin');
278:
279: $lookup = $adminGroup->getMembers()->getLookup();
280: $lookup->setValue(array($admin->getID(), $adminGroup->getID()));
281: $lookup->save();
282:
283: self::$logger->info('Added the admin account to the Admin group successfully');
284: $body .= View::displayUpdateMessage('Added the admin account to the Admin group successfully');
285: } catch (FailedIndexCreateException $eice) {
286:
287: self::$logger->warn($eice->getMessage());
288: } catch (FailedLookupCreateException $elce) {
289:
290: self::$logger->warn($elce->getMessage());
291: }
292: } catch (\Exception $e) {
293: $body .= View::displayErrorMessage($e->getMessage());
294: $body .= View::displayErrorMessage('Aborting.');
295: self::$logger->error($e->getMessage());
296: ActiveRecord::rollback();
297:
298: return new Response(500, $body, array('Content-Type' => 'text/html'));
299: }
300:
301: $body .= '<br><p align="center"><a href="'.FrontController::generateSecureURL('act=Alpha\Controller\ListActiveRecordsController').'">Administration Home Page</a></p><br>';
302: $body .= View::displayPageFoot($this);
303:
304:
305: ActiveRecord::commit();
306:
307: self::$logger->info('Finished installation!');
308: self::$logger->action('Installed the application');
309: self::$logger->debug('<<doGET');
310:
311: return new Response(200, $body, array('Content-Type' => 'text/html'));
312: }
313:
314: 315: 316: 317: 318: 319: 320:
321: public function createApplicationDirs()
322: {
323: self::$logger->debug('>>createApplicationDirs()');
324:
325: $config = ConfigProvider::getInstance();
326:
327: $body = '';
328:
329:
330: umask(0);
331:
332: 333: 334:
335: $logsDir = $config->get('app.file.store.dir').'logs';
336:
337: $body .= '<p>Attempting to create the logs directory <em>'.$logsDir.'</em>...';
338:
339: if (!file_exists($logsDir)) {
340: var_dump(mkdir($logsDir, 0774));
341: }
342:
343: self::$logger = new Logger('InstallController');
344: self::$logger->info('Started installation process!');
345: self::$logger->info('Logs directory ['.$logsDir.'] successfully created');
346: $body .= View::displayUpdateMessage('Logs directory ['.$logsDir.'] successfully created');
347:
348: 349: 350:
351: $srcDir = $config->get('app.root').'src';
352:
353: $body .= '<p>Attempting to create the src directory <em>'.$srcDir.'</em>...';
354:
355: if (!file_exists($srcDir)) {
356: mkdir($srcDir, 0774);
357: }
358:
359: self::$logger->info('Source directory ['.$srcDir.'] successfully created');
360: $body .= View::displayUpdateMessage('Source directory ['.$srcDir.'] successfully created');
361:
362: $srcDir = $config->get('app.root').'src/Model';
363:
364: if (!file_exists($srcDir)) {
365: mkdir($srcDir, 0774);
366: }
367:
368: self::$logger->info('Source directory ['.$srcDir.'] successfully created');
369: $body .= View::displayUpdateMessage('Source directory ['.$srcDir.'] successfully created');
370:
371: $srcDir = $config->get('app.root').'src/View';
372:
373: if (!file_exists($srcDir)) {
374: mkdir($srcDir, 0774);
375: }
376:
377: self::$logger->info('Source directory ['.$srcDir.'] successfully created');
378: $body .= View::displayUpdateMessage('Source directory ['.$srcDir.'] successfully created');
379:
380: 381: 382:
383: $attachmentsDir = $config->get('app.file.store.dir').'attachments';
384:
385: $body .= '<p>Attempting to create the attachments directory <em>'.$attachmentsDir.'</em>...';
386:
387: if (!file_exists($attachmentsDir)) {
388: mkdir($attachmentsDir, 0774);
389: }
390:
391: self::$logger->info('Attachments directory ['.$attachmentsDir.'] successfully created');
392: $body .= View::displayUpdateMessage('Attachments directory ['.$attachmentsDir.'] successfully created');
393:
394: 395: 396:
397: $cacheDir = $config->get('app.file.store.dir').'cache';
398: $htmlDir = $config->get('app.file.store.dir').'cache/html';
399: $imagesDir = $config->get('app.file.store.dir').'cache/images';
400: $pdfDir = $config->get('app.file.store.dir').'cache/pdf';
401: $xlsDir = $config->get('app.file.store.dir').'cache/xls';
402:
403:
404: $body .= '<p>Attempting to create the cache directory <em>'.$cacheDir.'</em>...';
405: if (!file_exists($cacheDir)) {
406: mkdir($cacheDir, 0774);
407: }
408:
409: self::$logger->info('Cache directory ['.$cacheDir.'] successfully created');
410: $body .= View::displayUpdateMessage('Cache directory ['.$cacheDir.'] successfully created');
411:
412:
413: $body .= '<p>Attempting to create the HTML cache directory <em>'.$htmlDir.'</em>...';
414: if (!file_exists($htmlDir)) {
415: mkdir($htmlDir, 0774);
416: }
417:
418: self::$logger->info('Cache directory ['.$htmlDir.'] successfully created');
419: $body .= View::displayUpdateMessage('Cache directory ['.$htmlDir.'] successfully created');
420:
421:
422: $body .= '<p>Attempting to create the cache directory <em>'.$imagesDir.'</em>...';
423: if (!file_exists($imagesDir)) {
424: mkdir($imagesDir, 0774);
425: }
426:
427: self::$logger->info('Cache directory ['.$imagesDir.'] successfully created');
428: $body .= View::displayUpdateMessage('Cache directory ['.$imagesDir.'] successfully created');
429:
430:
431: $body .= '<p>Attempting to create the cache directory <em>'.$pdfDir.'</em>...';
432: if (!file_exists($pdfDir)) {
433: mkdir($pdfDir, 0774);
434: }
435:
436: self::$logger->info('Cache directory ['.$pdfDir.'] successfully created');
437: $body .= View::displayUpdateMessage('Cache directory ['.$pdfDir.'] successfully created');
438:
439:
440: $body .= '<p>Attempting to create the cache directory <em>'.$xlsDir.'</em>...';
441: if (!file_exists($xlsDir)) {
442: mkdir($xlsDir, 0774);
443: }
444:
445: self::$logger->info('Cache directory ['.$xlsDir.'] successfully created');
446: $body .= View::displayUpdateMessage('Cache directory ['.$xlsDir.'] successfully created');
447:
448: self::$logger->debug('<<createApplicationDirs');
449:
450: return $body;
451: }
452:
453: 454: 455: 456: 457: 458: 459: 460:
461: public function checkRights()
462: {
463: self::$logger->debug('>>checkRights()');
464:
465: $config = ConfigProvider::getInstance();
466: $sessionProvider = $config->get('session.provider.name');
467: $session = SessionProviderFactory::getInstance($sessionProvider);
468:
469: if ($this->getVisibility() == 'Public') {
470: self::$logger->debug('<<checkRights [true]');
471:
472: return true;
473: }
474:
475: if (ActiveRecord::isInstalled()) {
476: self::$logger->debug('<<checkRights [false]');
477:
478: return false;
479: }
480:
481:
482: if ($session->get('currentUser') !== false) {
483: if ($session->get('currentUser')->get('email') == $config->get('app.install.username')) {
484: self::$logger->debug('<<checkRights [true]');
485:
486: return true;
487: }
488: }
489: }
490: }
491: