2770 |
rexy |
1 |
<?php
|
|
|
2 |
if (!defined('PSI_CONFIG_FILE')) {
|
|
|
3 |
/**
|
|
|
4 |
* phpSysInfo version
|
|
|
5 |
*/
|
2976 |
rexy |
6 |
define('PSI_VERSION', '3.3.4');
|
2770 |
rexy |
7 |
/**
|
|
|
8 |
* phpSysInfo configuration
|
|
|
9 |
*/
|
|
|
10 |
define('PSI_CONFIG_FILE', PSI_APP_ROOT.'/phpsysinfo.ini');
|
|
|
11 |
|
|
|
12 |
define('ARRAY_EXP', '/^return array \([^;]*\);$/'); //array expression search
|
|
|
13 |
|
|
|
14 |
if (!is_readable(PSI_CONFIG_FILE)) {
|
|
|
15 |
echo "ERROR: phpsysinfo.ini does not exist or is not readable by the webserver in the phpsysinfo directory";
|
|
|
16 |
die();
|
|
|
17 |
} elseif (!($config = @parse_ini_file(PSI_CONFIG_FILE, true))) {
|
|
|
18 |
echo "ERROR: phpsysinfo.ini file is not parsable";
|
|
|
19 |
die();
|
|
|
20 |
} else {
|
|
|
21 |
foreach ($config as $name=>$group) {
|
|
|
22 |
if (strtoupper($name)=="MAIN") {
|
|
|
23 |
$name_prefix='PSI_';
|
|
|
24 |
} elseif (strtoupper(substr($name, 0, 7))=="SENSOR_") {
|
|
|
25 |
$name_prefix='PSI_'.strtoupper($name).'_';
|
|
|
26 |
} else {
|
|
|
27 |
$name_prefix='PSI_PLUGIN_'.strtoupper($name).'_';
|
|
|
28 |
}
|
|
|
29 |
foreach ($group as $param=>$value) {
|
|
|
30 |
if ((trim($value)==="") || (trim($value)==="0")) {
|
|
|
31 |
define($name_prefix.strtoupper($param), false);
|
|
|
32 |
} elseif (trim($value)==="1") {
|
|
|
33 |
define($name_prefix.strtoupper($param), true);
|
|
|
34 |
} else {
|
|
|
35 |
if (strstr($value, ',')) {
|
|
|
36 |
define($name_prefix.strtoupper($param), 'return '.var_export(preg_split('/\s*,\s*/', trim($value), -1, PREG_SPLIT_NO_EMPTY), 1).';');
|
|
|
37 |
} else {
|
|
|
38 |
define($name_prefix.strtoupper($param), trim($value));
|
|
|
39 |
}
|
|
|
40 |
}
|
|
|
41 |
}
|
|
|
42 |
}
|
|
|
43 |
}
|
|
|
44 |
|
|
|
45 |
if (defined('PSI_ALLOWED') && is_string(PSI_ALLOWED)) {
|
|
|
46 |
if (preg_match(ARRAY_EXP, PSI_ALLOWED)) {
|
|
|
47 |
$allowed = eval(strtolower(PSI_ALLOWED));
|
|
|
48 |
} else {
|
|
|
49 |
$allowed = array(strtolower(PSI_ALLOWED));
|
|
|
50 |
}
|
|
|
51 |
|
|
|
52 |
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
|
|
|
53 |
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
|
|
|
54 |
} else {
|
|
|
55 |
if (isset($_SERVER["HTTP_CLIENT_IP"])) {
|
|
|
56 |
$ip = $_SERVER["HTTP_CLIENT_IP"];
|
|
|
57 |
} else {
|
|
|
58 |
$ip = $_SERVER["REMOTE_ADDR"];
|
|
|
59 |
}
|
|
|
60 |
}
|
|
|
61 |
$ip = preg_replace("/^::ffff:/", "", strtolower($ip));
|
|
|
62 |
|
|
|
63 |
if (!in_array($ip, $allowed, true)) {
|
|
|
64 |
echo "Client IP address not allowed";
|
|
|
65 |
die();
|
|
|
66 |
}
|
|
|
67 |
}
|
|
|
68 |
|
|
|
69 |
/* default error handler */
|
|
|
70 |
if (function_exists('errorHandlerPsi')) {
|
|
|
71 |
restore_error_handler();
|
|
|
72 |
}
|
|
|
73 |
|
|
|
74 |
/* fatal errors only */
|
|
|
75 |
$old_err_rep = error_reporting();
|
|
|
76 |
error_reporting(E_ERROR);
|
|
|
77 |
|
|
|
78 |
/* get git revision */
|
|
|
79 |
if (file_exists(PSI_APP_ROOT.'/.git/HEAD')) {
|
|
|
80 |
$contents = @file_get_contents(PSI_APP_ROOT.'/.git/HEAD');
|
|
|
81 |
if ($contents && preg_match("/^ref:\s+(.*)\/([^\/\s]*)/m", $contents, $matches)) {
|
|
|
82 |
$contents = @file_get_contents(PSI_APP_ROOT.'/.git/'.$matches[1]."/".$matches[2]);
|
|
|
83 |
if ($contents && preg_match("/^([^\s]*)/m", $contents, $revision)) {
|
|
|
84 |
define('PSI_VERSION_STRING', PSI_VERSION ."-".$matches[2]."-".substr($revision[1], 0, 7));
|
|
|
85 |
} else {
|
|
|
86 |
define('PSI_VERSION_STRING', PSI_VERSION ."-".$matches[2]);
|
|
|
87 |
}
|
|
|
88 |
}
|
|
|
89 |
}
|
|
|
90 |
/* get svn revision */
|
|
|
91 |
if (!defined('PSI_VERSION_STRING') && file_exists(PSI_APP_ROOT.'/.svn/entries')) {
|
|
|
92 |
$contents = @file_get_contents(PSI_APP_ROOT.'/.svn/entries');
|
|
|
93 |
if ($contents && preg_match("/dir\n(.+)/", $contents, $matches)) {
|
|
|
94 |
define('PSI_VERSION_STRING', PSI_VERSION."-r".$matches[1]);
|
|
|
95 |
} else {
|
|
|
96 |
define('PSI_VERSION_STRING', PSI_VERSION);
|
|
|
97 |
}
|
|
|
98 |
}
|
|
|
99 |
if (!defined('PSI_VERSION_STRING')) {
|
|
|
100 |
define('PSI_VERSION_STRING', PSI_VERSION);
|
|
|
101 |
}
|
|
|
102 |
|
|
|
103 |
if (!defined('PSI_OS')) { //if not overloaded in phpsysinfo.ini
|
|
|
104 |
/* get Linux code page */
|
|
|
105 |
if (PHP_OS == 'Linux') {
|
|
|
106 |
if (file_exists($fname = '/etc/sysconfig/i18n')
|
|
|
107 |
|| file_exists($fname = '/etc/default/locale')
|
|
|
108 |
|| file_exists($fname = '/etc/locale.conf')
|
|
|
109 |
|| file_exists($fname = '/etc/sysconfig/language')
|
|
|
110 |
|| file_exists($fname = '/etc/profile.d/lang.sh')
|
2976 |
rexy |
111 |
|| file_exists($fname = '/etc/profile.d/i18n.sh')
|
2770 |
rexy |
112 |
|| file_exists($fname = '/etc/profile')) {
|
|
|
113 |
$contents = @file_get_contents($fname);
|
|
|
114 |
} else {
|
|
|
115 |
$contents = false;
|
|
|
116 |
if (file_exists('/system/build.prop')) { //Android
|
|
|
117 |
define('PSI_OS', 'Android');
|
2976 |
rexy |
118 |
if (function_exists('exec') && @exec('uname -o 2>/dev/null', $unameo) && (sizeof($unameo)>0) && (($unameo0 = trim($unameo[0])) != "")) {
|
|
|
119 |
define('PSI_UNAMEO', $unameo0); // is Android on Termux
|
2770 |
rexy |
120 |
}
|
|
|
121 |
if (!defined('PSI_MODE_POPEN')) { //if not overloaded in phpsysinfo.ini
|
|
|
122 |
if (!function_exists("proc_open")) { //proc_open function test by executing 'pwd' command
|
|
|
123 |
define('PSI_MODE_POPEN', true); //use popen() function - no stderr error handling (but with problems with timeout)
|
|
|
124 |
} else {
|
|
|
125 |
$out = '';
|
|
|
126 |
$err = '';
|
|
|
127 |
$pipes = array();
|
|
|
128 |
$descriptorspec = array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w"));
|
|
|
129 |
$process = proc_open("pwd 2>/dev/null ", $descriptorspec, $pipes);
|
|
|
130 |
if (!is_resource($process)) {
|
|
|
131 |
define('PSI_MODE_POPEN', true);
|
|
|
132 |
} else {
|
|
|
133 |
$w = null;
|
|
|
134 |
$e = null;
|
|
|
135 |
|
|
|
136 |
while (!(feof($pipes[1]) && feof($pipes[2]))) {
|
|
|
137 |
$read = array($pipes[1], $pipes[2]);
|
|
|
138 |
|
|
|
139 |
$n = stream_select($read, $w, $e, 5);
|
|
|
140 |
|
|
|
141 |
if (($n === false) || ($n === 0)) {
|
|
|
142 |
break;
|
|
|
143 |
}
|
|
|
144 |
|
|
|
145 |
foreach ($read as $r) {
|
|
|
146 |
if ($r == $pipes[1]) {
|
|
|
147 |
$out .= fread($r, 4096);
|
|
|
148 |
} elseif (feof($pipes[1]) && ($r == $pipes[2])) {//read STDERR after STDOUT
|
|
|
149 |
$err .= fread($r, 4096);
|
|
|
150 |
}
|
|
|
151 |
}
|
|
|
152 |
}
|
|
|
153 |
|
|
|
154 |
if (is_null($out) || (trim($out) == "") || (substr(trim($out), 0, 1) != "/")) {
|
|
|
155 |
define('PSI_MODE_POPEN', true);
|
|
|
156 |
}
|
|
|
157 |
fclose($pipes[0]);
|
|
|
158 |
fclose($pipes[1]);
|
|
|
159 |
fclose($pipes[2]);
|
|
|
160 |
// It is important that you close any pipes before calling
|
|
|
161 |
// proc_close in order to avoid a deadlock
|
|
|
162 |
proc_close($process);
|
|
|
163 |
}
|
|
|
164 |
}
|
|
|
165 |
}
|
|
|
166 |
}
|
|
|
167 |
}
|
|
|
168 |
if (!(defined('PSI_SYSTEM_CODEPAGE') && defined('PSI_SYSTEM_LANG')) //also if both not overloaded in phpsysinfo.ini
|
|
|
169 |
&& $contents && (preg_match('/^(LANG="?[^"\n]*"?)/m', $contents, $matches)
|
|
|
170 |
|| preg_match('/^RC_(LANG="?[^"\n]*"?)/m', $contents, $matches)
|
|
|
171 |
|| preg_match('/^\s*export (LANG="?[^"\n]*"?)/m', $contents, $matches))) {
|
|
|
172 |
if (!defined('PSI_SYSTEM_CODEPAGE')) {
|
|
|
173 |
if (file_exists($vtfname = '/sys/module/vt/parameters/default_utf8')
|
|
|
174 |
&& (trim(@file_get_contents($vtfname)) === "1")) {
|
|
|
175 |
define('PSI_SYSTEM_CODEPAGE', 'UTF-8');
|
2976 |
rexy |
176 |
} elseif (function_exists('exec') && @exec($matches[1].' locale -k LC_CTYPE 2>/dev/null', $lines)) { //if not overloaded in phpsysinfo.ini
|
2770 |
rexy |
177 |
foreach ($lines as $line) {
|
|
|
178 |
if (preg_match('/^charmap="?([^"]*)/', $line, $matches2)) {
|
|
|
179 |
define('PSI_SYSTEM_CODEPAGE', $matches2[1]);
|
|
|
180 |
break;
|
|
|
181 |
}
|
|
|
182 |
}
|
|
|
183 |
}
|
|
|
184 |
}
|
2976 |
rexy |
185 |
if (!defined('PSI_SYSTEM_LANG') && function_exists('exec') && @exec($matches[1].' locale 2>/dev/null', $lines2)) { //also if not overloaded in phpsysinfo.ini
|
2770 |
rexy |
186 |
foreach ($lines2 as $line) {
|
|
|
187 |
if (preg_match('/^LC_MESSAGES="?([^\."@]*)/', $line, $matches2)) {
|
|
|
188 |
$lang = "";
|
|
|
189 |
if (is_readable(PSI_APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(PSI_APP_ROOT.'/data/languages.ini', true))) {
|
|
|
190 |
if (isset($langdata['Linux']['_'.$matches2[1]])) {
|
|
|
191 |
$lang = $langdata['Linux']['_'.$matches2[1]];
|
|
|
192 |
}
|
|
|
193 |
}
|
|
|
194 |
if ($lang == "") {
|
|
|
195 |
$lang = 'Unknown';
|
|
|
196 |
}
|
|
|
197 |
define('PSI_SYSTEM_LANG', $lang.' ('.$matches2[1].')');
|
|
|
198 |
break;
|
|
|
199 |
}
|
|
|
200 |
}
|
|
|
201 |
}
|
|
|
202 |
}
|
|
|
203 |
} elseif (PHP_OS == 'Haiku') {
|
|
|
204 |
if (!(defined('PSI_SYSTEM_CODEPAGE') && defined('PSI_SYSTEM_LANG')) //also if both not overloaded in phpsysinfo.ini
|
2976 |
rexy |
205 |
&& function_exists('exec') && @exec('locale --message 2>/dev/null', $lines)) {
|
2770 |
rexy |
206 |
foreach ($lines as $line) {
|
|
|
207 |
if (preg_match('/^"?([^\."]*)\.?([^"]*)/', $line, $matches2)) {
|
|
|
208 |
|
|
|
209 |
if (!defined('PSI_SYSTEM_CODEPAGE') && isset($matches2[2]) && !is_null($matches2[2]) && (trim($matches2[2]) != "")) { //also if not overloaded in phpsysinfo.ini
|
|
|
210 |
define('PSI_SYSTEM_CODEPAGE', $matches2[2]);
|
|
|
211 |
}
|
|
|
212 |
|
|
|
213 |
if (!defined('PSI_SYSTEM_LANG')) { //if not overloaded in phpsysinfo.ini
|
|
|
214 |
$lang = "";
|
|
|
215 |
if (is_readable(PSI_APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(PSI_APP_ROOT.'/data/languages.ini', true))) {
|
|
|
216 |
if (isset($langdata['Linux']['_'.$matches2[1]])) {
|
|
|
217 |
$lang = $langdata['Linux']['_'.$matches2[1]];
|
|
|
218 |
}
|
|
|
219 |
}
|
|
|
220 |
if ($lang == "") {
|
|
|
221 |
$lang = 'Unknown';
|
|
|
222 |
}
|
|
|
223 |
define('PSI_SYSTEM_LANG', $lang.' ('.$matches2[1].')');
|
|
|
224 |
}
|
|
|
225 |
break;
|
|
|
226 |
}
|
|
|
227 |
}
|
|
|
228 |
}
|
|
|
229 |
} elseif (PHP_OS == 'Darwin') {
|
|
|
230 |
if (!defined('PSI_SYSTEM_LANG') //if not overloaded in phpsysinfo.ini
|
2976 |
rexy |
231 |
&& function_exists('exec') && @exec('defaults read /Library/Preferences/.GlobalPreferences AppleLocale 2>/dev/null', $lines)) {
|
2770 |
rexy |
232 |
$lang = "";
|
|
|
233 |
if (is_readable(PSI_APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(PSI_APP_ROOT.'/data/languages.ini', true))) {
|
|
|
234 |
if (isset($langdata['Linux']['_'.$lines[0]])) {
|
|
|
235 |
$lang = $langdata['Linux']['_'.$lines[0]];
|
|
|
236 |
}
|
|
|
237 |
}
|
|
|
238 |
if ($lang == "") {
|
|
|
239 |
$lang = 'Unknown';
|
|
|
240 |
}
|
|
|
241 |
define('PSI_SYSTEM_LANG', $lang.' ('.$lines[0].')');
|
|
|
242 |
}
|
|
|
243 |
}
|
|
|
244 |
}
|
|
|
245 |
|
2976 |
rexy |
246 |
/* maximum time in seconds a script is allowed to run before it is terminated by the parser */
|
|
|
247 |
if (defined('PSI_MAX_TIMEOUT')) {
|
|
|
248 |
ini_set('max_execution_time', max(intval(PSI_MAX_TIMEOUT), 0));
|
|
|
249 |
} else {
|
|
|
250 |
ini_set('max_execution_time', 30);
|
|
|
251 |
}
|
|
|
252 |
|
2770 |
rexy |
253 |
/* executeProgram() timeout value in seconds */
|
|
|
254 |
if (defined('PSI_EXEC_TIMEOUT')) {
|
|
|
255 |
define('PSI_EXEC_TIMEOUT_INT', max(intval(PSI_EXEC_TIMEOUT), 1));
|
|
|
256 |
} else {
|
|
|
257 |
define('PSI_EXEC_TIMEOUT_INT', 30);
|
|
|
258 |
}
|
|
|
259 |
|
|
|
260 |
/* snmprealwalk() and executeProgram("snmpwalk") number of seconds until the first timeout */
|
|
|
261 |
if (defined('PSI_SNMP_TIMEOUT')) {
|
|
|
262 |
define('PSI_SNMP_TIMEOUT_INT', max(intval(PSI_SNMP_TIMEOUT), 1));
|
|
|
263 |
} else {
|
|
|
264 |
define('PSI_SNMP_TIMEOUT_INT', 3);
|
|
|
265 |
}
|
|
|
266 |
|
|
|
267 |
/* snmprealwalk() and executeProgram("snmpwalk") number of times to retry if timeouts occur */
|
|
|
268 |
if (defined('PSI_SNMP_RETRY')) {
|
|
|
269 |
define('PSI_SNMP_RETRY_INT', max(intval(PSI_SNMP_RETRY), 0));
|
|
|
270 |
} else {
|
|
|
271 |
define('PSI_SNMP_RETRY_INT', 0);
|
|
|
272 |
}
|
|
|
273 |
|
|
|
274 |
if (!defined('PSI_OS')) {
|
|
|
275 |
define('PSI_OS', PHP_OS);
|
|
|
276 |
}
|
|
|
277 |
|
|
|
278 |
if (!defined('PSI_SYSTEM_LANG')) {
|
|
|
279 |
define('PSI_SYSTEM_LANG', null);
|
|
|
280 |
}
|
|
|
281 |
if (!defined('PSI_SYSTEM_CODEPAGE')) { //if not overloaded in phpsysinfo.ini
|
|
|
282 |
if ((PSI_OS=='Android') || (PSI_OS=='Darwin')) {
|
|
|
283 |
define('PSI_SYSTEM_CODEPAGE', 'UTF-8');
|
|
|
284 |
} elseif (PSI_OS=='Minix') {
|
|
|
285 |
define('PSI_SYSTEM_CODEPAGE', 'CP437');
|
2976 |
rexy |
286 |
} elseif (PSI_OS!='WINNT') {
|
2770 |
rexy |
287 |
define('PSI_SYSTEM_CODEPAGE', null);
|
|
|
288 |
}
|
|
|
289 |
}
|
|
|
290 |
|
|
|
291 |
if (!defined('PSI_JSON_ISSUE')) { //if not overloaded in phpsysinfo.ini
|
|
|
292 |
if (!extension_loaded("xml")) {
|
|
|
293 |
die("phpSysInfo requires the xml extension to php in order to work properly.");
|
|
|
294 |
}
|
|
|
295 |
if (simplexml_load_string("<A><B><C/></B>\n</A>") !== simplexml_load_string("<A><B><C/></B></A>")) { // json_encode issue test
|
|
|
296 |
define('PSI_JSON_ISSUE', true); // Problem must be solved
|
|
|
297 |
}
|
|
|
298 |
}
|
|
|
299 |
|
|
|
300 |
/* restore error level */
|
|
|
301 |
error_reporting($old_err_rep);
|
|
|
302 |
|
|
|
303 |
/* restore error handler */
|
|
|
304 |
if (function_exists('errorHandlerPsi')) {
|
|
|
305 |
set_error_handler('errorHandlerPsi');
|
|
|
306 |
}
|
|
|
307 |
}
|