info.class.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Loads the system info page
  4. *
  5. * @package modx
  6. * @subpackage manager.controllers
  7. */
  8. class SystemInfoManagerController extends modManagerController {
  9. public $pi;
  10. /**
  11. * Check for any permissions or requirements to load page
  12. * @return bool
  13. */
  14. public function checkPermissions() {
  15. return $this->modx->hasPermission('view_sysinfo');
  16. }
  17. /**
  18. * Custom logic code here for setting placeholders, etc
  19. *
  20. * @param array $scriptProperties
  21. * @return array
  22. */
  23. public function process(array $scriptProperties = array()) {
  24. $pi = $this->getPhpInfo(INFO_GENERAL);
  25. $m = $this->parsePHPModules();
  26. $dbtype_mysql = $this->modx->config['dbtype'] == 'mysql';
  27. $dbtype_sqlsrv = $this->modx->config['dbtype'] == 'sqlsrv';
  28. if ($dbtype_mysql && !empty($m['mysql'])) $pi = array_merge($pi,array('mysql' => $m['mysql']));
  29. if ($dbtype_mysql && !empty($m['mysqlnd'])) $pi = array_merge($pi,array('pdo' => $m['mysqlnd']));
  30. if ($dbtype_sqlsrv && !empty($m['sqlsrv'])) $pi = array_merge($pi,array('sqlsrv' => $m['sqlsrv']));
  31. if (!empty($m['PDO'])) $pi = array_merge($pi,array('pdo' => $m['PDO']));
  32. if ($dbtype_mysql && !empty($m['pdo_mysql'])) $pi = array_merge($pi,array('pdo_mysql' => $m['pdo_mysql']));
  33. if ($dbtype_sqlsrv && !empty($m['pdo_sqlsrv'])) $pi = array_merge($pi,array('pdo_sqlsrv' => $m['pdo_sqlsrv']));
  34. if (!empty($m['zip'])) $pi = array_merge($pi,array('zip' => $m['zip']));
  35. $this->pi = array_merge($pi,$this->getPhpInfo(INFO_CONFIGURATION));
  36. return array(
  37. 'pi' => $this->pi,
  38. );
  39. }
  40. /**
  41. * Register custom CSS/JS for the page
  42. * @return void
  43. */
  44. public function loadCustomCssJs() {
  45. $this->addJavascript($this->modx->getOption('manager_url')."assets/modext/widgets/system/{$this->modx->getOption('dbtype')}/modx.grid.databasetables.js");
  46. $this->addJavascript($this->modx->getOption('manager_url').'assets/modext/widgets/resource/modx.grid.resource.active.js');
  47. $this->addJavascript($this->modx->getOption('manager_url').'assets/modext/sections/system/info.js');
  48. $this->addHtml('<script type="text/javascript">
  49. Ext.onReady(function() {
  50. MODx.load({
  51. xtype: "modx-page-system-info"
  52. ,data: '.$this->modx->toJSON($this->pi).'
  53. });
  54. });
  55. </script>');
  56. }
  57. /**
  58. * Return the pagetitle
  59. *
  60. * @return string
  61. */
  62. public function getPageTitle() {
  63. return $this->modx->lexicon('view_sysinfo');
  64. }
  65. /**
  66. * Return the location of the template file
  67. * @return string
  68. */
  69. public function getTemplateFile() {
  70. return '';
  71. }
  72. /**
  73. * Specify the language topics to load
  74. * @return array
  75. */
  76. public function getLanguageTopics() {
  77. return array('system_info');
  78. }
  79. public function getPhpInfo($type = -1) {
  80. ob_start();
  81. phpinfo($type);
  82. $pi = preg_replace(
  83. array('#^.*<body>(.*)</body>.*$#ms', '#<h2>PHP License</h2>.*$#ms',
  84. '#<h1>Configuration</h1>#', "#\r?\n#", "#</(h1|h2|h3|tr)>#", '# +<#',
  85. "#[ \t]+#", '#&nbsp;#', '# +#', '# class=".*?"#', '%&#039;%',
  86. '#<tr>(?:.*?)" src="(?:.*?)=(.*?)" alt="PHP Logo" /></a>'
  87. .'<h1>PHP Version (.*?)</h1>(?:\n+?)</td></tr>#',
  88. '#<h1><a href="(?:.*?)\?=(.*?)">PHP Credits</a></h1>#',
  89. '#<tr>(?:.*?)" src="(?:.*?)=(.*?)"(?:.*?)Zend Engine (.*?),(?:.*?)</tr>#',
  90. "# +#", '#<tr>#', '#</tr>#'),
  91. array('$1', '', '', '', '</$1>' . "\n", '<', ' ', ' ', ' ', '', ' ',
  92. '<h2>PHP Configuration</h2>'."\n".'<tr><td>PHP Version</td><td>$2</td></tr>'.
  93. "\n".'<tr><td>PHP Egg</td><td>$1</td></tr>',
  94. '<tr><td>PHP Credits Egg</td><td>$1</td></tr>',
  95. '<tr><td>Zend Engine</td><td>$2</td></tr>' . "\n" .
  96. '<tr><td>Zend Egg</td><td>$1</td></tr>', ' ', '%S%', '%E%'),
  97. ob_get_clean());
  98. $sections = explode('<h2>', strip_tags($pi, '<h2><th><td>'));
  99. unset($sections[0]);
  100. $pi = array();
  101. foreach($sections as $section){
  102. $n = substr($section, 0, strpos($section, '</h2>'));
  103. preg_match_all(
  104. '#%S%(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?(?:<td>(.*?)</td>)?%E%#',
  105. $section, $askapache, PREG_SET_ORDER);
  106. foreach($askapache as $m)
  107. $pi[$n][$m[1]]=(!isset($m[3])||$m[2]==$m[3])?$m[2]:array_slice($m,2);
  108. }
  109. return $pi;
  110. }
  111. public function parsePHPModules() {
  112. ob_start();
  113. phpinfo(INFO_MODULES);
  114. $s = ob_get_contents();
  115. ob_end_clean();
  116. $s = strip_tags($s,'<h2><th><td>');
  117. $s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
  118. $s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
  119. $vTmp = preg_split('/(<h2>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
  120. $vModules = array();
  121. for ($i=1;$i<count($vTmp);$i++) {
  122. if (preg_match('/<h2>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
  123. $vName = trim($vMat[1]);
  124. $vTmp2 = explode("\n",$vTmp[$i+1]);
  125. foreach ($vTmp2 AS $vOne) {
  126. $vPat = '<info>([^<]+)<\/info>';
  127. $vPat3 = "/$vPat\s*$vPat\s*$vPat/";
  128. $vPat2 = "/$vPat\s*$vPat/";
  129. if (preg_match($vPat3,$vOne,$vMat)) { // 3cols
  130. $vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
  131. } elseif (preg_match($vPat2,$vOne,$vMat)) { // 2cols
  132. $vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
  133. }
  134. }
  135. }
  136. }
  137. return $vModules;
  138. }
  139. }