index.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. set_time_limit(0);
  4. /**
  5. * Chamilo installation
  6. * This script could be loaded via browser using the URL: main/install/index.php
  7. * or via CM
  8. *
  9. * @package chamilo.install
  10. */
  11. require_once __DIR__.'/../../vendor/autoload.php';
  12. require_once 'install.lib.php';
  13. require_once '../inc/lib/api.lib.php';
  14. error_reporting(-1);
  15. use Symfony\Component\Console\Output\Output;
  16. class BufferedOutput extends Output
  17. {
  18. public $messages = array();
  19. public $lastMessage = null;
  20. public function doWrite($message, $newline)
  21. {
  22. //$this->buffer .= $message. ($newline ? PHP_EOL: '');
  23. $this->buffer .= $message. '<br />';
  24. $this->messages[] = $message;
  25. $this->lastMessage = $message;
  26. }
  27. public function getBuffer()
  28. {
  29. return $this->buffer;
  30. }
  31. }
  32. $app = new Silex\Application();
  33. $app['root_sys'] = dirname(dirname(__DIR__)).'/';
  34. // Registering services
  35. $app['debug'] = false;
  36. $app->register(new Silex\Provider\UrlGeneratorServiceProvider());
  37. $app->register(new Silex\Provider\FormServiceProvider());
  38. $app->register(new Silex\Provider\SessionServiceProvider());
  39. $app->register(new Silex\Provider\DoctrineServiceProvider());
  40. $app->register(new Silex\Provider\TranslationServiceProvider());
  41. $app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
  42. /*$translator->addLoader('yaml', new Symfony\Component\Translation\Loader\YamlFileLoader());
  43. $translator->addResource('yaml', __DIR__.'/lang/fr.yml', 'fr');
  44. $translator->addResource('yaml', __DIR__.'/lang/en.yml', 'en');
  45. $translator->addResource('yaml', __DIR__.'/lang/es.yml', 'es');*/
  46. return $translator;
  47. }));
  48. //$app->register(new Whoops\Provider\Silex\WhoopsServiceProvider);
  49. $app->register(
  50. new Silex\Provider\TwigServiceProvider(),
  51. array(
  52. 'twig.path' => array(
  53. 'templates'
  54. ),
  55. // twitter bootstrap form twig templates
  56. //'twig.form.templates' => array('form_div_layout.html.twig', '../template/default/form/form_custom_template.tpl'),
  57. 'twig.options' => array(
  58. 'debug' => $app['debug'],
  59. 'charset' => 'utf-8',
  60. 'strict_variables' => false,
  61. 'autoescape' => true,
  62. //'cache' => $app['debug'] ? false : $app['twig.cache.path'],
  63. 'cache' => false, // no cache during installation sorry
  64. 'optimizations' => -1, // turn on optimizations with -1
  65. )
  66. )
  67. );
  68. use Knp\Provider\ConsoleServiceProvider;
  69. $app->register(new ConsoleServiceProvider(), array(
  70. 'console.name' => 'Chamilo',
  71. 'console.version' => '1.0.0',
  72. 'console.project_directory' => __DIR__.'/..'
  73. ));
  74. // Adding commands.
  75. /** @var Knp\Console\Application $console */
  76. $console = $app['console'];
  77. $console->addCommands(
  78. array(
  79. // DBAL Commands.
  80. new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(),
  81. new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(),
  82. // Migrations Commands.
  83. new \Doctrine\DBAL\Migrations\Tools\Console\Command\DiffCommand(),
  84. new \Doctrine\DBAL\Migrations\Tools\Console\Command\ExecuteCommand(),
  85. new \Doctrine\DBAL\Migrations\Tools\Console\Command\GenerateCommand(),
  86. new \Doctrine\DBAL\Migrations\Tools\Console\Command\MigrateCommand(),
  87. new \Doctrine\DBAL\Migrations\Tools\Console\Command\StatusCommand(),
  88. new \Doctrine\DBAL\Migrations\Tools\Console\Command\VersionCommand(),
  89. // Chamilo commands.
  90. new ChamiloLMS\Command\Database\UpgradeCommand(),
  91. new ChamiloLMS\Command\Database\InstallCommand(),
  92. new ChamiloLMS\Command\Database\StatusCommand(),
  93. new ChamiloLMS\Command\Database\SetupCommand(),
  94. // Chash commands.
  95. /*new Chash\Command\Database\RunSQLCommand(),
  96. new Chash\Command\Database\DumpCommand(),
  97. new Chash\Command\Database\RestoreCommand(),
  98. new Chash\Command\Database\SQLCountCommand(),
  99. new Chash\Command\Database\FullBackupCommand(),
  100. new Chash\Command\Database\DropDatabaseCommand(),
  101. new Chash\Command\Files\CleanTempFolderCommand(),
  102. new Chash\Command\Files\CleanConfigFiles(),
  103. new Chash\Command\Translation\ExportLanguageCommand(),
  104. new Chash\Command\Translation\ImportLanguageCommand()*/
  105. )
  106. );
  107. $helpers = array(
  108. 'configuration' => new Chash\Helpers\ConfigurationHelper()
  109. );
  110. $helperSet = $console->getHelperSet();
  111. foreach ($helpers as $name => $helper) {
  112. $helperSet->set($helper, $name);
  113. }
  114. $blockInstallation = function() use($app) {
  115. if (file_exists($app['root_sys'].'config/configuration.php') || file_exists($app['root_sys'].'config/configuration.yml')) {
  116. return $app->abort(500, "A Chamilo installation was found. You can't reinstall.");
  117. }
  118. };
  119. // Controllers
  120. $app->match('/', function() use($app) {
  121. $languages = array(
  122. 'english' => 'english',
  123. 'spanish' => 'spanish',
  124. 'french' => 'french'
  125. );
  126. $request = $app['request'];
  127. $form = $app['form.factory']->createBuilder('form')
  128. ->add('languages', 'choice', array(
  129. 'choices' => $languages,
  130. 'required' => true,
  131. ))
  132. ->add('continue', 'submit')
  133. ->getForm();
  134. if ('POST' == $request->getMethod()) {
  135. $url = $app['url_generator']->generate('requirements');
  136. return $app->redirect($url);
  137. }
  138. return $app['twig']->render('index.tpl', array('form' => $form->createView()));
  139. })
  140. ->bind('welcome')
  141. ->before($blockInstallation);
  142. $app->match('/requirements', function() use($app) {
  143. $request = $app['request'];
  144. $form = $app['form.factory']->createBuilder('form')
  145. ->add('continue', 'submit')
  146. ->getForm();
  147. $req = display_requirements($app, 'new');
  148. if ('POST' == $request->getMethod()) {
  149. $url = $app['url_generator']->generate('check-database');
  150. return $app->redirect($url);
  151. }
  152. return $app['twig']->render(
  153. 'requirements.tpl',
  154. array(
  155. 'form' => $form->createView(),
  156. 'requirements' => $req
  157. )
  158. );
  159. })->bind('requirements');
  160. $app->match('/check-database', function() use($app) {
  161. $request = $app['request'];
  162. $command = $app['console']->get('chamilo:install');
  163. $data = $command->getDatabaseSettingsParams();
  164. $builder = $app['form.factory']->createBuilder('form');
  165. foreach ($data as $key => $value) {
  166. $value['attributes'] = isset($value['attributes']) && is_array($value['attributes']) ? $value['attributes'] : array();
  167. $builder->add($key, $value['type'], $value['attributes']);
  168. }
  169. $builder->add('check', 'submit');
  170. $form = $builder->getForm();
  171. if ('POST' == $request->getMethod()) {
  172. $form->bind($request);
  173. if ($form->isValid()) {
  174. $parameters = $form->getData();
  175. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  176. $command = $app['console']->get('chamilo:install');
  177. $command->setDatabaseSettings($parameters);
  178. $connection = $command->getUserAccessConnectionToHost();
  179. try {
  180. $connect = $connection->connect();
  181. $sm = $connection->getSchemaManager();
  182. $databases = $sm->listDatabases();
  183. /*if ($result == false) {
  184. $message = $app['translator']->trans(
  185. 'The database name is not correct: %s',
  186. array('%s' => $parameters['dbname'])
  187. );
  188. $app['session']->getFlashBag()->add('error', $message);
  189. $url = $app['url_generator']->generate('check-database');
  190. return $app->redirect($url);
  191. }*/
  192. if (in_array($parameters['dbname'], $databases)) {
  193. $message = $app['translator']->trans(
  194. 'The database "%s" being used and is going to be deleted!!',
  195. array('%s' => $parameters['dbname'])
  196. );
  197. $app['session']->getFlashBag()->add('warning', $message);
  198. } else {
  199. $message = $app['translator']->trans(
  200. 'A database "%s" is going to be created',
  201. array('%s' => $parameters['dbname'])
  202. );
  203. $app['session']->getFlashBag()->add('warning', $message);
  204. }
  205. $app['session']->getFlashBag()->add('success', 'Connection ok!');
  206. $app['session']->set('database_settings', $parameters);
  207. $url = $app['url_generator']->generate('portal-settings');
  208. return $app->redirect($url);
  209. } catch (Exception $e) {
  210. $app['session']->getFlashBag()->add('success', 'Connection error !'.$e->getMessage());
  211. }
  212. // do something with the data
  213. // redirect somewhere
  214. //return $app->redirect('...');
  215. }
  216. }
  217. return $app['twig']->render('check-database.tpl', array('form' => $form->createView()));
  218. })->bind('check-database');
  219. $app->match('/portal-settings', function() use($app) {
  220. /** @var Request $request */
  221. $request = $app['request'];
  222. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  223. $command = $app['console']->get('chamilo:install');
  224. $builder = $app['form.factory']->createBuilder('form');
  225. $data = $command->getPortalSettingsParams();
  226. $data['institution_url']['attributes']['data'] = str_replace('main/install/', '', $request->getUriForPath('/'));
  227. $permissionNewDir = $app['session']->get('permissions_for_new_directories');
  228. if ($permissionNewDir) {
  229. $data['permissions_for_new_directories']['attributes']['data'] = $permissionNewDir;
  230. }
  231. $permissionNewFiles = $app['session']->get('permissions_for_new_files');
  232. if ($permissionNewFiles) {
  233. $data['permissions_for_new_files']['attributes']['data'] = $permissionNewFiles;
  234. }
  235. foreach ($data as $key => $value) {
  236. $value['attributes'] = isset($value['attributes']) && is_array($value['attributes']) ? $value['attributes'] : array();
  237. $builder->add($key, $value['type'], $value['attributes']);
  238. }
  239. $builder->add('continue', 'submit');
  240. $form = $builder->getForm();
  241. if ('POST' == $request->getMethod()) {
  242. $form->bind($request);
  243. if ($form->isValid()) {
  244. $data = $form->getData();
  245. $app['session']->set('portal_settings', $data);
  246. $url = $app['url_generator']->generate('admin-settings');
  247. return $app->redirect($url);
  248. }
  249. }
  250. return $app['twig']->render('settings.tpl', array('form' => $form->createView()));
  251. })->bind('portal-settings');
  252. // Admin settings.
  253. $app->match('/admin-settings', function() use($app) {
  254. $request = $app['request'];
  255. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  256. $command = $app['console']->get('chamilo:install');
  257. $data = $command->getAdminSettingsParams();
  258. $builder = $app['form.factory']->createBuilder('form', $data);
  259. foreach ($data as $key => $value) {
  260. $builder->add($key, $value['type'], $value['attributes']);
  261. }
  262. $builder->add('continue', 'submit');
  263. $form = $builder->getForm();
  264. if ('POST' == $request->getMethod()) {
  265. $form->bind($request);
  266. if ($form->isValid()) {
  267. $data = $form->getData();
  268. $app['session']->set('admin_settings', $data);
  269. $url = $app['url_generator']->generate('resume');
  270. return $app->redirect($url);
  271. }
  272. }
  273. return $app['twig']->render('settings.tpl', array('form' => $form->createView()));
  274. })->bind('admin-settings');
  275. // Resume before installing.
  276. $app->match('/resume', function() use($app) {
  277. $request = $app['request'];
  278. $data = array();
  279. $portalSettings = $app['session']->get('portal_settings');
  280. $databaseSettings = $app['session']->get('database_settings');
  281. $adminSettings = $app['session']->get('admin_settings');
  282. if (!empty($portalSettings) && !empty($databaseSettings) && !empty($adminSettings)) {
  283. $form = $app['form.factory']->createBuilder('form', $data)
  284. ->add('install', 'submit', array('label' => 'Continue'))
  285. ->getForm();
  286. if ('POST' == $request->getMethod()) {
  287. $url = $app['url_generator']->generate('installing');
  288. return $app->redirect($url);
  289. }
  290. return $app['twig']->render(
  291. 'resume.tpl',
  292. array(
  293. 'form' => $form->createView(),
  294. 'portal_settings' => $portalSettings,
  295. 'database_settings' => $databaseSettings,
  296. 'admin_settings' => $adminSettings
  297. )
  298. );
  299. } else {
  300. $url = $app['url_generator']->generate('check-database');
  301. return $app->redirect($url);
  302. }
  303. })->bind('resume');
  304. // Installation process.
  305. $app->match('/installing', function() use($app) {
  306. $portalSettings = $app['session']->get('portal_settings');
  307. $adminSettings = $app['session']->get('admin_settings');
  308. $databaseSettings = $app['session']->get('database_settings');
  309. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  310. $command = $app['console']->get('chamilo:install');
  311. $def = $command->getDefinition();
  312. $input = new Symfony\Component\Console\Input\ArrayInput(
  313. array(
  314. 'name',
  315. 'path' => realpath(__DIR__.'/../../').'/',
  316. 'version' => '1.10.0'
  317. ),
  318. $def
  319. );
  320. $output = new BufferedOutput();
  321. $command->setPortalSettings($portalSettings);
  322. $command->setDatabaseSettings($databaseSettings);
  323. $command->setAdminSettings($adminSettings);
  324. $result = $command->run($input, $output);
  325. if ($result == 1) {
  326. $output = $output->getBuffer();
  327. $app['session']->getFlashBag()->add('success', 'Installation finished');
  328. $app['session']->set('output', $output);
  329. $url = $app['url_generator']->generate('finish');
  330. return $app->redirect($url);
  331. } else {
  332. $app['session']->getFlashBag()->add('error', 'There was an error during installation, please check your settings.');
  333. $app['session']->getFlashBag()->add('error', $output->lastMessage);
  334. $url = $app['url_generator']->generate('check-database');
  335. return $app->redirect($url);
  336. }
  337. })->bind('installing');
  338. // Finish installation.
  339. $app->get('/finish', function() use($app) {
  340. $output = $app['session']->get('output');
  341. $message = $app['translator']->trans(
  342. 'To protect your site, make the whole %s directory read-only (chmod 0555 on Unix/Linux)',
  343. array('%s' => $app['root_sys'].'config')
  344. );
  345. $app['session']->getFlashBag()->add('warning', $message);
  346. $message = $app['translator']->trans(
  347. 'Delete the %s directory.',
  348. array('%s' => $app['root_sys'].'install')
  349. );
  350. $app['session']->getFlashBag()->add('warning', $message);
  351. return $app['twig']->render('finish.tpl', array('output' => $output));
  352. })->bind('finish');
  353. // Middlewares.
  354. $app->before(
  355. function () use ($app) {
  356. }
  357. );
  358. // Errors
  359. $app->error(function (\Exception $e, $code) use ($app) {
  360. switch ($code) {
  361. case 404:
  362. $message = 'The requested page could not be found.';
  363. break;
  364. default:
  365. // $message = 'We are sorry, but something went terribly wrong.';
  366. $message = $e->getMessage();
  367. }
  368. $app['twig']->addGlobal('code', $code);
  369. $app['twig']->addGlobal('message', $message);
  370. return $app['twig']->render('error.tpl');
  371. });
  372. if (PHP_SAPI == 'cli') {
  373. $console->run();
  374. } else {
  375. $app->run();
  376. }