diagnoser.lib.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Class Diagnoser
  5. * Class that is responsible for generating diagnostic information about the system
  6. *
  7. * @package chamilo.diagnoser
  8. * @author Ivan Tcholakov, 2008, initial proposal and sample code.
  9. * @author spou595, 2009, implementation for Chamilo 2.x
  10. * @author Julio Montoya <gugli100@gmail.com>, 2010, port to chamilo 1.8.7, Some fixes
  11. *
  12. */
  13. class Diagnoser
  14. {
  15. const STATUS_OK = 1;
  16. const STATUS_WARNING = 2;
  17. const STATUS_ERROR = 3;
  18. const STATUS_INFORMATION = 4;
  19. /**
  20. * Contructor
  21. */
  22. public function __construct()
  23. {
  24. }
  25. /**
  26. * Show html table
  27. */
  28. public function show_html()
  29. {
  30. $sections = [
  31. 'chamilo' => [
  32. 'lang' => 'Chamilo',
  33. 'info' => 'State of Chamilo requirements'
  34. ],
  35. 'php' => [
  36. 'lang' => 'PHP',
  37. 'info' => 'State of PHP settings on the server'
  38. ],
  39. 'database' => [
  40. 'lang' => 'Database',
  41. 'info' => 'Configuration settings of the database server. To check the database consistency after an upgrade, if you have access to the command line, you can use "php bin/doctrine.php orm:schema-tool:update --dump-sql". This will print a list of database changes that should be applied to your system in order to get the right structure. Index name changes can be ignored. Use "--force" instead of "--dump" to try and execute them in order.'
  42. ],
  43. 'webserver' => [
  44. 'lang' => get_lang('WebServer'),
  45. 'info' => 'Information about your webserver\'s configuration '
  46. ],
  47. 'paths' => [
  48. 'lang' => 'Paths',
  49. 'info' => 'The following paths are called by their constant throughout Chamilo\'s code using the api_get_path() function. Here is a list of these paths and what they would be translated to on this portal.'
  50. ],
  51. ];
  52. $currentSection = isset($_GET['section']) ? $_GET['section'] : '';
  53. if (!in_array(trim($currentSection), array_keys($sections))) {
  54. $currentSection = 'chamilo';
  55. }
  56. $html = '<div class="tabbable"><ul class="nav nav-tabs">';
  57. foreach ($sections as $section => $details) {
  58. if ($currentSection === $section) {
  59. $html .= '<li class="active">';
  60. } else {
  61. $html .= '<li>';
  62. }
  63. $params['section'] = $section;
  64. $html .= '<a href="system_status.php?section='.$section.'">'.$details['lang'].'</a></li>';
  65. }
  66. $html .= '</ul><div class="tab-pane">';
  67. $data = call_user_func([$this, 'get_'.$currentSection.'_data']);
  68. echo $html;
  69. if ($currentSection != 'paths') {
  70. echo '<br />';
  71. echo Display::return_message($sections[$currentSection]['info'], 'normal');
  72. $table = new SortableTableFromArray($data, 1, 100);
  73. $table->set_header(0, '', false);
  74. $table->set_header(1, get_lang('Section'), false);
  75. $table->set_header(2, get_lang('Setting'), false);
  76. $table->set_header(3, get_lang('Current'), false);
  77. $table->set_header(4, get_lang('Expected'), false);
  78. $table->set_header(5, get_lang('Comment'), false);
  79. $table->display();
  80. } else {
  81. echo '<br />';
  82. echo Display::return_message($sections[$currentSection]['info'], 'normal');
  83. $headers = $data['headers'];
  84. $results = $data['data'];
  85. $table = new HTML_Table(['class' => 'data_table']);
  86. $column = 0;
  87. foreach ($headers as $header) {
  88. $table->setHeaderContents(0, $column, $header);
  89. $column++;
  90. }
  91. $row = 1;
  92. foreach ($results as $index => $rowData) {
  93. $table->setCellContents(
  94. $row,
  95. 0,
  96. $rowData
  97. );
  98. $table->setCellContents(
  99. $row,
  100. 1,
  101. $index
  102. );
  103. $row++;
  104. }
  105. echo $table->display();
  106. }
  107. echo '</div></div>';
  108. }
  109. /**
  110. * @return array
  111. */
  112. public function get_paths_data()
  113. {
  114. global $paths;
  115. $list = $paths[api_get_path(WEB_PATH)];
  116. $list['url_append'] = api_get_configuration_value('url_append');
  117. asort($list);
  118. return [
  119. 'headers' => ['Path', 'constant'],
  120. 'data' => $list
  121. ];
  122. }
  123. /**
  124. * Functions to get the data for the chamilo diagnostics
  125. * @return array of data
  126. */
  127. public function get_chamilo_data()
  128. {
  129. $array = [];
  130. $writable_folders = [
  131. api_get_path(SYS_APP_PATH).'cache',
  132. api_get_path(SYS_COURSE_PATH),
  133. api_get_path(SYS_APP_PATH).'home',
  134. api_get_path(SYS_APP_PATH).'upload/users/',
  135. api_get_path(SYS_PATH).'main/default_course_document/images/',
  136. ];
  137. foreach ($writable_folders as $index => $folder) {
  138. $writable = is_writable($folder);
  139. $status = $writable ? self::STATUS_OK : self::STATUS_ERROR;
  140. $array[] = $this->build_setting(
  141. $status,
  142. '[FILES]',
  143. get_lang('IsWritable').': '.$folder,
  144. 'http://be2.php.net/manual/en/function.is-writable.php',
  145. $writable,
  146. 1,
  147. 'yes_no',
  148. get_lang('DirectoryMustBeWritable')
  149. );
  150. }
  151. $exists = file_exists(api_get_path(SYS_CODE_PATH).'install');
  152. $status = $exists ? self::STATUS_WARNING : self::STATUS_OK;
  153. $array[] = $this->build_setting(
  154. $status,
  155. '[FILES]',
  156. get_lang('DirectoryExists').': /install',
  157. 'http://be2.php.net/file_exists',
  158. $exists,
  159. 0,
  160. 'yes_no',
  161. get_lang('DirectoryShouldBeRemoved')
  162. );
  163. $app_version = api_get_setting('chamilo_database_version');
  164. $array[] = $this->build_setting(
  165. self::STATUS_INFORMATION,
  166. '[DB]',
  167. 'chamilo_database_version',
  168. '#',
  169. $app_version,
  170. 0,
  171. null,
  172. 'Chamilo DB version'
  173. );
  174. $access_url_id = api_get_current_access_url_id();
  175. if ($access_url_id === 1) {
  176. global $_configuration;
  177. $message2 = '';
  178. if ($access_url_id === 1) {
  179. if (api_is_windows_os()) {
  180. $message2 .= get_lang('SpaceUsedOnSystemCannotBeMeasuredOnWindows');
  181. } else {
  182. $dir = api_get_path(SYS_PATH);
  183. $du = exec('du -sh '.$dir, $err);
  184. list($size, $none) = explode("\t", $du);
  185. $limit = $_configuration[$access_url_id]['hosting_limit_disk_space'];
  186. $message2 .= sprintf(get_lang('TotalSpaceUsedByPortalXLimitIsYMB'), $size, $limit);
  187. }
  188. }
  189. $array[] = $this->build_setting(
  190. self::STATUS_OK,
  191. '[FILES]',
  192. 'hosting_limit_disk_space',
  193. '#',
  194. $size,
  195. 0,
  196. null,
  197. $message2
  198. );
  199. }
  200. return $array;
  201. }
  202. /**
  203. * Functions to get the data for the php diagnostics
  204. * @return array of data
  205. */
  206. public function get_php_data()
  207. {
  208. $array = [];
  209. // General Functions
  210. $version = phpversion();
  211. $status = $version > REQUIRED_PHP_VERSION ? self::STATUS_OK : self::STATUS_ERROR;
  212. $array[] = $this->build_setting(
  213. $status,
  214. '[PHP]',
  215. 'phpversion()',
  216. 'http://www.php.net/manual/en/function.phpversion.php',
  217. phpversion(),
  218. '>= '.REQUIRED_PHP_VERSION,
  219. null,
  220. get_lang('PHPVersionInfo')
  221. );
  222. $setting = ini_get('output_buffering');
  223. $req_setting = 1;
  224. $status = $setting >= $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  225. $array[] = $this->build_setting(
  226. $status,
  227. '[INI]',
  228. 'output_buffering',
  229. 'http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering',
  230. $setting,
  231. $req_setting,
  232. 'on_off',
  233. get_lang('OutputBufferingInfo')
  234. );
  235. $setting = ini_get('file_uploads');
  236. $req_setting = 1;
  237. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  238. $array[] = $this->build_setting(
  239. $status,
  240. '[INI]',
  241. 'file_uploads',
  242. 'http://www.php.net/manual/en/ini.core.php#ini.file-uploads',
  243. $setting,
  244. $req_setting,
  245. 'on_off',
  246. get_lang('FileUploadsInfo')
  247. );
  248. $setting = ini_get('magic_quotes_runtime');
  249. $req_setting = 0;
  250. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  251. $array[] = $this->build_setting(
  252. $status,
  253. '[INI]',
  254. 'magic_quotes_runtime',
  255. 'http://www.php.net/manual/en/ini.core.php#ini.magic-quotes-runtime',
  256. $setting,
  257. $req_setting,
  258. 'on_off',
  259. get_lang('MagicQuotesRuntimeInfo')
  260. );
  261. $setting = ini_get('safe_mode');
  262. $req_setting = 0;
  263. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_WARNING;
  264. $array[] = $this->build_setting(
  265. $status,
  266. '[INI]',
  267. 'safe_mode',
  268. 'http://www.php.net/manual/en/ini.core.php#ini.safe-mode',
  269. $setting,
  270. $req_setting,
  271. 'on_off',
  272. get_lang('SafeModeInfo')
  273. );
  274. $setting = ini_get('register_globals');
  275. $req_setting = 0;
  276. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  277. $array[] = $this->build_setting(
  278. $status,
  279. '[INI]',
  280. 'register_globals',
  281. 'http://www.php.net/manual/en/ini.core.php#ini.register-globals',
  282. $setting,
  283. $req_setting,
  284. 'on_off',
  285. get_lang('RegisterGlobalsInfo')
  286. );
  287. $setting = ini_get('short_open_tag');
  288. $req_setting = 0;
  289. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_WARNING;
  290. $array[] = $this->build_setting(
  291. $status,
  292. '[INI]',
  293. 'short_open_tag',
  294. 'http://www.php.net/manual/en/ini.core.php#ini.short-open-tag',
  295. $setting,
  296. $req_setting,
  297. 'on_off',
  298. get_lang('ShortOpenTagInfo')
  299. );
  300. $setting = ini_get('magic_quotes_gpc');
  301. $req_setting = 0;
  302. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  303. $array[] = $this->build_setting(
  304. $status,
  305. '[INI]',
  306. 'magic_quotes_gpc',
  307. 'http://www.php.net/manual/en/ini.core.php#ini.magic_quotes_gpc',
  308. $setting,
  309. $req_setting,
  310. 'on_off',
  311. get_lang('MagicQuotesGpcInfo')
  312. );
  313. $setting = ini_get('display_errors');
  314. $req_setting = 0;
  315. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_WARNING;
  316. $array[] = $this->build_setting(
  317. $status,
  318. '[INI]',
  319. 'display_errors',
  320. 'http://www.php.net/manual/en/ini.core.php#ini.display_errors',
  321. $setting,
  322. $req_setting,
  323. 'on_off',
  324. get_lang('DisplayErrorsInfo')
  325. );
  326. $setting = ini_get('default_charset');
  327. if ($setting == '') {
  328. $setting = null;
  329. }
  330. $req_setting = 'UTF-8';
  331. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  332. $array[] = $this->build_setting(
  333. $status,
  334. '[INI]',
  335. 'default_charset',
  336. 'http://www.php.net/manual/en/ini.core.php#ini.default-charset',
  337. $setting,
  338. $req_setting,
  339. null,
  340. get_lang('DefaultCharsetInfo')
  341. );
  342. $setting = ini_get('max_execution_time');
  343. $req_setting = '300 ('.get_lang('Minimum').')';
  344. $status = $setting >= 300 ? self::STATUS_OK : self::STATUS_WARNING;
  345. $array[] = $this->build_setting(
  346. $status,
  347. '[INI]',
  348. 'max_execution_time',
  349. 'http://www.php.net/manual/en/ini.core.php#ini.max-execution-time',
  350. $setting,
  351. $req_setting,
  352. null,
  353. get_lang('MaxExecutionTimeInfo')
  354. );
  355. $setting = ini_get('max_input_time');
  356. $req_setting = '300 ('.get_lang('Minimum').')';
  357. $status = $setting >= 300 ? self::STATUS_OK : self::STATUS_WARNING;
  358. $array[] = $this->build_setting(
  359. $status,
  360. '[INI]',
  361. 'max_input_time',
  362. 'http://www.php.net/manual/en/ini.core.php#ini.max-input-time',
  363. $setting,
  364. $req_setting,
  365. null,
  366. get_lang('MaxInputTimeInfo')
  367. );
  368. $setting = ini_get('memory_limit');
  369. $req_setting = '>= '.REQUIRED_MIN_MEMORY_LIMIT.'M';
  370. $status = self::STATUS_ERROR;
  371. if ((float)$setting >= REQUIRED_MIN_MEMORY_LIMIT) {
  372. $status = self::STATUS_OK;
  373. }
  374. $array[] = $this->build_setting(
  375. $status,
  376. '[INI]',
  377. 'memory_limit',
  378. 'http://www.php.net/manual/en/ini.core.php#ini.memory-limit',
  379. $setting,
  380. $req_setting,
  381. null,
  382. get_lang('MemoryLimitInfo')
  383. );
  384. $setting = ini_get('post_max_size');
  385. $req_setting = '>= '.REQUIRED_MIN_POST_MAX_SIZE.'M';
  386. $status = self::STATUS_ERROR;
  387. if ((float)$setting >= REQUIRED_MIN_POST_MAX_SIZE) {
  388. $status = self::STATUS_OK;
  389. }
  390. $array[] = $this->build_setting(
  391. $status,
  392. '[INI]',
  393. 'post_max_size',
  394. 'http://www.php.net/manual/en/ini.core.php#ini.post-max-size',
  395. $setting,
  396. $req_setting,
  397. null,
  398. get_lang('PostMaxSizeInfo')
  399. );
  400. $setting = ini_get('upload_max_filesize');
  401. $req_setting = '>= '.REQUIRED_MIN_UPLOAD_MAX_FILESIZE.'M';
  402. $status = self::STATUS_ERROR;
  403. if ((float)$setting >= REQUIRED_MIN_UPLOAD_MAX_FILESIZE) {
  404. $status = self::STATUS_OK;
  405. }
  406. $array[] = $this->build_setting(
  407. $status,
  408. '[INI]',
  409. 'upload_max_filesize',
  410. 'http://www.php.net/manual/en/ini.core.php#ini.upload_max_filesize',
  411. $setting,
  412. $req_setting,
  413. null,
  414. get_lang('UploadMaxFilesizeInfo')
  415. );
  416. $setting = ini_get('upload_tmp_dir');
  417. $status = self::STATUS_OK;
  418. $array[] = $this->build_setting(
  419. $status,
  420. '[INI]',
  421. 'upload_tmp_dir',
  422. 'http://www.php.net/manual/en/ini.core.php#ini.upload_tmp_dir',
  423. $setting,
  424. '',
  425. null,
  426. get_lang('UploadTmpDirInfo')
  427. );
  428. $setting = ini_get('variables_order');
  429. $req_setting = 'GPCS';
  430. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_ERROR;
  431. $array[] = $this->build_setting(
  432. $status,
  433. '[INI]',
  434. 'variables_order',
  435. 'http://www.php.net/manual/en/ini.core.php#ini.variables-order',
  436. $setting,
  437. $req_setting,
  438. null,
  439. get_lang('VariablesOrderInfo')
  440. );
  441. $setting = ini_get('session.gc_maxlifetime');
  442. $req_setting = '4320';
  443. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_WARNING;
  444. $array[] = $this->build_setting(
  445. $status,
  446. '[SESSION]',
  447. 'session.gc_maxlifetime',
  448. 'http://www.php.net/manual/en/ini.core.php#session.gc-maxlifetime',
  449. $setting,
  450. $req_setting,
  451. null,
  452. get_lang('SessionGCMaxLifetimeInfo')
  453. );
  454. if (api_check_browscap()) {
  455. $setting = true;
  456. } else {
  457. $setting = false;
  458. }
  459. $req_setting = true;
  460. $status = $setting == $req_setting ? self::STATUS_OK : self::STATUS_WARNING;
  461. $array[] = $this->build_setting(
  462. $status,
  463. '[INI]',
  464. 'browscap',
  465. 'http://www.php.net/manual/en/misc.configuration.php#ini.browscap',
  466. $setting,
  467. $req_setting,
  468. 'on_off',
  469. get_lang('BrowscapInfo')
  470. );
  471. // Extensions
  472. $extensions = [
  473. 'gd' => [
  474. 'link' => 'http://www.php.net/gd',
  475. 'expected' => 1,
  476. 'comment' => get_lang('ExtensionMustBeLoaded'),
  477. ],
  478. 'pdo_mysql' => [
  479. 'link' => 'http://php.net/manual/en/ref.pdo-mysql.php',
  480. 'expected' => 1,
  481. 'comment' => get_lang('ExtensionMustBeLoaded'),
  482. ],
  483. 'pcre' => [
  484. 'link' => 'http://www.php.net/pcre',
  485. 'expected' => 1,
  486. 'comment' => get_lang('ExtensionMustBeLoaded'),
  487. ],
  488. 'session' => [
  489. 'link' => 'http://www.php.net/session',
  490. 'expected' => 1,
  491. 'comment' => get_lang('ExtensionMustBeLoaded'),
  492. ],
  493. 'standard' => [
  494. 'link' => 'http://www.php.net/spl',
  495. 'expected' => 1,
  496. 'comment' => get_lang('ExtensionMustBeLoaded'),
  497. ],
  498. 'zlib' => [
  499. 'link' => 'http://www.php.net/zlib',
  500. 'expected' => 1,
  501. 'comment' => get_lang('ExtensionMustBeLoaded'),
  502. ],
  503. 'xsl' => [
  504. 'link' => 'http://be2.php.net/xsl',
  505. 'expected' => 2,
  506. 'comment' => get_lang('ExtensionShouldBeLoaded'),
  507. ],
  508. 'curl' => [
  509. 'link' => 'http://www.php.net/curl',
  510. 'expected' => 2,
  511. 'comment' => get_lang('ExtensionShouldBeLoaded'),
  512. ],
  513. 'Zend OPcache' => [
  514. 'link' => 'http://www.php.net/opcache',
  515. 'expected' => 2,
  516. 'comment' => get_lang('ExtensionShouldBeLoaded'),
  517. ],
  518. 'apcu' => [
  519. 'link' => 'http://www.php.net/apcu',
  520. 'expected' => 2,
  521. 'comment' => get_lang('ExtensionShouldBeLoaded'),
  522. ],
  523. ];
  524. foreach ($extensions as $extension => $data) {
  525. $url = $data['link'];
  526. $expected_value = $data['expected'];
  527. $comment = $data['comment'];
  528. $loaded = extension_loaded($extension);
  529. $status = $loaded ? self::STATUS_OK : self::STATUS_ERROR;
  530. $array[] = $this->build_setting(
  531. $status,
  532. '[EXTENSION]',
  533. get_lang('LoadedExtension').': '.$extension,
  534. $url,
  535. $loaded,
  536. $expected_value,
  537. 'yes_no_optional',
  538. $comment
  539. );
  540. }
  541. return $array;
  542. }
  543. /**
  544. * Functions to get the data for the mysql diagnostics
  545. * @return array of data
  546. */
  547. public function get_database_data()
  548. {
  549. $array = [];
  550. $em = Database::getManager();
  551. $connection = $em->getConnection();
  552. $host = $connection->getHost();
  553. $db = $connection->getDatabase();
  554. $port = $connection->getPort();
  555. $driver = $connection->getDriver()->getName();
  556. $array[] = $this->build_setting(
  557. self::STATUS_INFORMATION,
  558. '[Database]',
  559. 'driver',
  560. '',
  561. $driver,
  562. null,
  563. null,
  564. get_lang('Driver')
  565. );
  566. $array[] = $this->build_setting(
  567. self::STATUS_INFORMATION,
  568. '[Database]',
  569. 'host',
  570. '',
  571. $host,
  572. null,
  573. null,
  574. get_lang('MysqlHostInfo')
  575. );
  576. $array[] = $this->build_setting(
  577. self::STATUS_INFORMATION,
  578. '[Database]',
  579. 'port',
  580. '',
  581. $port,
  582. null,
  583. null,
  584. get_lang('Port')
  585. );
  586. $array[] = $this->build_setting(
  587. self::STATUS_INFORMATION,
  588. '[Database]',
  589. 'Database name',
  590. '',
  591. $db,
  592. null,
  593. null,
  594. get_lang('Name')
  595. );
  596. return $array;
  597. }
  598. /**
  599. * Functions to get the data for the webserver diagnostics
  600. * @return array of data
  601. */
  602. public function get_webserver_data()
  603. {
  604. $array = [];
  605. $array[] = $this->build_setting(
  606. self::STATUS_INFORMATION,
  607. '[SERVER]',
  608. '$_SERVER["SERVER_NAME"]',
  609. 'http://be.php.net/reserved.variables.server',
  610. $_SERVER["SERVER_NAME"],
  611. null,
  612. null,
  613. get_lang('ServerNameInfo')
  614. );
  615. $array[] = $this->build_setting(
  616. self::STATUS_INFORMATION,
  617. '[SERVER]',
  618. '$_SERVER["SERVER_ADDR"]',
  619. 'http://be.php.net/reserved.variables.server',
  620. $_SERVER["SERVER_ADDR"],
  621. null,
  622. null,
  623. get_lang('ServerAddessInfo')
  624. );
  625. $array[] = $this->build_setting(
  626. self::STATUS_INFORMATION,
  627. '[SERVER]',
  628. '$_SERVER["SERVER_PORT"]',
  629. 'http://be.php.net/reserved.variables.server',
  630. $_SERVER["SERVER_PORT"],
  631. null,
  632. null,
  633. get_lang('ServerPortInfo')
  634. );
  635. $array[] = $this->build_setting(
  636. self::STATUS_INFORMATION,
  637. '[SERVER]',
  638. '$_SERVER["SERVER_SOFTWARE"]',
  639. 'http://be.php.net/reserved.variables.server',
  640. $_SERVER["SERVER_SOFTWARE"],
  641. null,
  642. null,
  643. get_lang('ServerSoftwareInfo')
  644. );
  645. $array[] = $this->build_setting(
  646. self::STATUS_INFORMATION,
  647. '[SERVER]',
  648. '$_SERVER["REMOTE_ADDR"]',
  649. 'http://be.php.net/reserved.variables.server',
  650. $_SERVER["REMOTE_ADDR"],
  651. null,
  652. null,
  653. get_lang('ServerRemoteInfo')
  654. );
  655. $array[] = $this->build_setting(
  656. self::STATUS_INFORMATION,
  657. '[SERVER]',
  658. '$_SERVER["HTTP_USER_AGENT"]',
  659. 'http://be.php.net/reserved.variables.server',
  660. $_SERVER["HTTP_USER_AGENT"],
  661. null,
  662. null,
  663. get_lang('ServerUserAgentInfo')
  664. );
  665. $array[] = $this->build_setting(
  666. self::STATUS_INFORMATION,
  667. '[SERVER]',
  668. '$_SERVER["SERVER_PROTOCOL"]',
  669. 'http://be.php.net/reserved.variables.server',
  670. $_SERVER["SERVER_PROTOCOL"],
  671. null,
  672. null,
  673. get_lang('ServerProtocolInfo')
  674. );
  675. $array[] = $this->build_setting(
  676. self::STATUS_INFORMATION,
  677. '[SERVER]',
  678. 'php_uname()',
  679. 'http://be2.php.net/php_uname',
  680. php_uname(),
  681. null,
  682. null,
  683. get_lang('UnameInfo')
  684. );
  685. $array[] = $this->build_setting(
  686. self::STATUS_INFORMATION,
  687. '[SERVER]',
  688. '$_SERVER["HTTP_X_FORWARDED_FOR"]',
  689. 'http://be.php.net/reserved.variables.server',
  690. (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : ''),
  691. null,
  692. null,
  693. get_lang('ServerXForwardedForInfo')
  694. );
  695. return $array;
  696. }
  697. /**
  698. * Additional functions needed for fast integration
  699. */
  700. public function build_setting(
  701. $status,
  702. $section,
  703. $title,
  704. $url,
  705. $current_value,
  706. $expected_value,
  707. $formatter,
  708. $comment
  709. ) {
  710. switch ($status) {
  711. case self::STATUS_OK:
  712. $img = 'bullet_green.png';
  713. break;
  714. case self::STATUS_WARNING:
  715. $img = 'bullet_orange.png';
  716. break;
  717. case self::STATUS_ERROR:
  718. $img = 'bullet_red.png';
  719. break;
  720. case self::STATUS_INFORMATION:
  721. $img = 'bullet_blue.png';
  722. break;
  723. }
  724. $image = Display::return_icon($img, $status);
  725. $url = $this->get_link($title, $url);
  726. $formatted_current_value = $current_value;
  727. $formatted_expected_value = $expected_value;
  728. if ($formatter) {
  729. if (method_exists($this, 'format_'.$formatter)) {
  730. $formatted_current_value = call_user_func([$this, 'format_'.$formatter], $current_value);
  731. $formatted_expected_value = call_user_func([$this, 'format_'.$formatter], $expected_value);
  732. }
  733. }
  734. return [$image, $section, $url, $formatted_current_value, $formatted_expected_value, $comment];
  735. }
  736. /**
  737. * Create a link with a url and a title
  738. * @param $title
  739. * @param $url
  740. * @return string the url
  741. */
  742. public function get_link($title, $url)
  743. {
  744. return '<a href="'.$url.'" target="about:bank">'.$title.'</a>';
  745. }
  746. /**
  747. * @param int $value
  748. * @return string
  749. */
  750. public function format_yes_no_optional($value)
  751. {
  752. $return = '';
  753. switch ($value) {
  754. case 0:
  755. $return = get_lang('No');
  756. break;
  757. case 1:
  758. $return = get_lang('Yes');
  759. break;
  760. case 2:
  761. $return = get_lang('Optional');
  762. break;
  763. }
  764. return $return;
  765. }
  766. /**
  767. * @param $value
  768. * @return string
  769. */
  770. public function format_yes_no($value)
  771. {
  772. return $value ? get_lang('Yes') : get_lang('No');
  773. }
  774. /**
  775. * @param int $value
  776. * @return string
  777. */
  778. public function format_on_off($value)
  779. {
  780. $value = intval($value);
  781. if ($value > 1) {
  782. // Greater than 1 values are shown "as-is", they may be interpreted as "On" later.
  783. return $value;
  784. }
  785. // These are the values 'On' and 'Off' used in the php-ini file. Translation (get_lang()) is not needed here.
  786. return $value ? 'On' : 'Off';
  787. }
  788. }