/usr/share/phpsysinfo/includes/class.CommonFunctions.inc.php is in phpsysinfo 3.0.17-1.
This file is owned by nobody:nogroup, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | <?php
/**
* common Functions class
*
* PHP version 5
*
* @category PHP
* @package PSI
* @author Michael Cramer <BigMichi1@users.sourceforge.net>
* @copyright 2009 phpSysInfo
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @version SVN: $Id: class.CommonFunctions.inc.php 570 2012-04-16 07:10:52Z namiltd $
* @link http://phpsysinfo.sourceforge.net
*/
/**
* class with common functions used in all places
*
* @category PHP
* @package PSI
* @author Michael Cramer <BigMichi1@users.sourceforge.net>
* @copyright 2009 phpSysInfo
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @version Release: 3.0
* @link http://phpsysinfo.sourceforge.net
*/
class CommonFunctions
{
/**
* phpSysInfo version
*
* @var string
*/
const PSI_VERSION = '3.0.17';
public static $PSI_VERSION_STRING = self::PSI_VERSION;
/**
* get svn version info
*
* @return none
*/
public static function checkForSVN()
{
if (file_exists (dirname(__FILE__) . '/.svn/entries')){
restore_error_handler();
$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries');
set_error_handler('errorHandlerPsi');
if ($contents && preg_match("/dir\n(.+)/", $contents, $matches))
self::$PSI_VERSION_STRING = self::PSI_VERSION."-r".$matches[1];
}
}
/**
* Find a system program, do also path checking when not running on WINNT
* on WINNT we simply return the name with the exe extension to the program name
*
* @param string $strProgram name of the program
*
* @return string complete path and name of the program
*/
private static function _findProgram($strProgram)
{
$arrPath = array();
if (PHP_OS == 'WINNT') {
$strProgram .= '.exe';
$arrPath = preg_split('/;/', getenv("Path"), -1, PREG_SPLIT_NO_EMPTY);
} else {
$arrPath = preg_split('/:/', getenv("PATH"), -1, PREG_SPLIT_NO_EMPTY);
}
if (PSI_ADD_PATHS !== false) {
$addpaths = preg_split('/,/', PSI_ADD_PATHS, -1, PREG_SPLIT_NO_EMPTY);
$arrPath = array_merge($addpaths, $arrPath); // In this order so $addpaths is before $arrPath when looking for a program
}
//add some default paths if we still have no paths here
if ( empty($arrPath) && PHP_OS != 'WINNT') {
array_push($arrPath, '/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin');
}
// If open_basedir defined, fill the $open_basedir array with authorized paths,. (Not tested when no open_basedir restriction)
if ((bool)ini_get('open_basedir')) {
$open_basedir = preg_split('/:/', ini_get('open_basedir'), -1, PREG_SPLIT_NO_EMPTY);
}
foreach ($arrPath as $strPath) {
// To avoid "open_basedir restriction in effect" error when testing paths if restriction is enabled
if ((isset($open_basedir) && !in_array($strPath, $open_basedir)) || !is_dir($strPath)) {
continue;
}
$strProgrammpath = $strPath."/".$strProgram;
if (is_executable($strProgrammpath)) {
return $strProgrammpath;
}
}
}
/**
* Execute a system program. return a trim()'d result.
* does very crude pipe checking. you need ' | ' for it to work
* ie $program = CommonFunctions::executeProgram('netstat', '-anp | grep LIST');
* NOT $program = CommonFunctions::executeProgram('netstat', '-anp|grep LIST');
*
* @param string $strProgramname name of the program
* @param string $strArgs arguments to the program
* @param string &$strBuffer output of the command
* @param boolean $booErrorRep en- or disables the reporting of errors which should be logged
*
* @return boolean command successfull or not
*/
public static function executeProgram($strProgramname, $strArgs, &$strBuffer, $booErrorRep = true)
{
$strBuffer = '';
$strError = '';
$pipes = array();
$strProgram = self::_findProgram($strProgramname);
$error = Error::singleton();
if (!$strProgram) {
if ($booErrorRep) {
$error->addError('find_program('.$strProgramname.')', 'program not found on the machine');
}
return false;
}
// see if we've gotten a |, if we have we need to do path checking on the cmd
if ($strArgs) {
$arrArgs = preg_split('/ /', $strArgs, -1, PREG_SPLIT_NO_EMPTY);
for ($i = 0, $cnt_args = count($arrArgs); $i < $cnt_args; $i++) {
if ($arrArgs[$i] == '|') {
$strCmd = $arrArgs[$i + 1];
$strNewcmd = self::_findProgram($strCmd);
$strArgs = preg_replace("/\| ".$strCmd.'/', "| ".$strNewcmd, $strArgs);
}
}
}
$descriptorspec = array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w"));
$process = proc_open($strProgram." ".$strArgs, $descriptorspec, $pipes);
if (is_resource($process)) {
$strBuffer .= self::_timeoutfgets($pipes, $strBuffer, $strError);
$return_value = proc_close($process);
}
$strError = trim($strError);
$strBuffer = trim($strBuffer);
if (! empty($strError) && $return_value <> 0) {
if ($booErrorRep) {
$error->addError($strProgram, $strError."\nReturn value: ".$return_value);
}
return false;
}
if (! empty($strError)) {
if ($booErrorRep) {
$error->addError($strProgram, $strError."\nReturn value: ".$return_value);
}
return true;
}
return true;
}
/**
* read a file and return the content as a string
*
* @param string $strFileName name of the file which should be read
* @param string &$strRet content of the file (reference)
* @param integer $intLines control how many lines should be read
* @param integer $intBytes control how many bytes of each line should be read
* @param boolean $booErrorRep en- or disables the reporting of errors which should be logged
*
* @return boolean command successfull or not
*/
public static function rfts($strFileName, &$strRet, $intLines = 0, $intBytes = 4096, $booErrorRep = true)
{
$strFile = "";
$intCurLine = 1;
$error = Error::singleton();
if (file_exists($strFileName)) {
if ($fd = fopen($strFileName, 'r')) {
while (!feof($fd)) {
$strFile .= fgets($fd, $intBytes);
if ($intLines <= $intCurLine && $intLines != 0) {
break;
} else {
$intCurLine++;
}
}
fclose($fd);
$strRet = $strFile;
} else {
if ($booErrorRep) {
$error->addError('fopen('.$strFileName.')', 'file can not read by phpsysinfo');
}
return false;
}
} else {
if ($booErrorRep) {
$error->addError('file_exists('.$strFileName.')', 'the file does not exist on your machine');
}
return false;
}
return true;
}
/**
* reads a directory and return the name of the files and directorys in it
*
* @param string $strPath path of the directory which should be read
* @param boolean $booErrorRep en- or disables the reporting of errors which should be logged
*
* @return array content of the directory excluding . and ..
*/
public static function gdc($strPath, $booErrorRep = true)
{
$arrDirectoryContent = array();
$error = Error::singleton();
if (is_dir($strPath)) {
if ($handle = opendir($strPath)) {
while (($strFile = readdir($handle)) !== false) {
if ($strFile != "." && $strFile != "..") {
$arrDirectoryContent[] = $strFile;
}
}
closedir($handle);
} else {
if ($booErrorRep) {
$error->addError('opendir('.$strPath.')', 'directory can not be read by phpsysinfo');
}
}
} else {
if ($booErrorRep) {
$error->addError('is_dir('.$strPath.')', 'directory does not exist on your machine');
}
}
return $arrDirectoryContent;
}
/**
* Check for needed php extensions
*
* We need that extensions for almost everything
* This function will return a hard coded
* XML string (with headers) if the SimpleXML extension isn't loaded.
* Then it will terminate the script.
* See bug #1787137
*
* @param array $arrExt additional extensions for which a check should run
*
* @return void
*/
public static function checkForExtensions($arrExt = array())
{
$arrReq = array('simplexml', 'pcre', 'xml', 'mbstring', 'dom');
$extensions = array_merge($arrExt, $arrReq);
$text = "";
$error = false;
$text .= "<?xml version='1.0'?>\n";
$text .= "<phpsysinfo>\n";
$text .= " <Error>\n";
foreach ($extensions as $extension) {
if (!extension_loaded($extension)) {
$text .= " <Function>checkForExtensions</Function>\n";
$text .= " <Message>phpSysInfo requires the ".$extension." extension to php in order to work properly.</Message>\n";
$error = true;
}
}
$text .= " </Error>\n";
$text .= "</phpsysinfo>";
if ($error) {
header("Content-Type: text/xml\n\n");
echo $text;
die();
}
}
/**
* get the content of stdout/stderr with the option to set a timeout for reading
*
* @param array $pipes array of file pointers for stdin, stdout, stderr (proc_open())
* @param string &$out target string for the output message (reference)
* @param string &$err target string for the error message (reference)
* @param integer $sek timeout value in seconds
*
* @return void
*/
private static function _timeoutfgets($pipes, &$out, &$err, $sek = 10)
{
// fill output string
$time = $sek;
$w = null;
$e = null;
while ($time >= 0) {
$read = array($pipes[1]);
/*
while (!feof($read[0]) && ($n = stream_select($read, $w, $e, $time)) !== false && $n > 0 && strlen($c = fgetc($read[0])) > 0) {
$out .= $c;
*/
while (!feof($read[0]) && ($n = stream_select($read, $w, $e, $time)) !== false && $n > 0) {
$out .= fread($read[0], 4096);
}
--$time;
}
// fill error string
$time = $sek;
while ($time >= 0) {
$read = array($pipes[2]);
/*
while (!feof($read[0]) && ($n = stream_select($read, $w, $e, $time)) !== false && $n > 0 && strlen($c = fgetc($read[0])) > 0) {
$err .= $c;
*/
while (!feof($read[0]) && ($n = stream_select($read, $w, $e, $time)) !== false && $n > 0) {
$err .= fread($read[0], 4096);
}
--$time;
}
}
/**
* get all configured plugins from config.php (file must be included before calling this function)
*
* @return array
*/
public static function getPlugins()
{
$plugins = preg_split("/[\s]?,[\s]?/", PSI_PLUGINS, -1, PREG_SPLIT_NO_EMPTY);
return $plugins;
}
}
?>
|