support.inc.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 836 行 · 第 1/2 页

SVN-BASE
836
字号
<?php/** * $Id:$ * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited *  * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more * details. *  * You should have received a copy of the GNU General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/>. *  * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,  * California 94120-7775, or email info@knowledgetree.com. *  * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. *  * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the  * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original  * copyright notice. * Contributor( s): ______________________________________ * *//** * TODO: refactor into seperate comparison object * */class MD5SourceTree{	private $rootDir;	private $logFilename;	private $logFile;	private $numDirectories;	private $numFiles;	private $comparisonFailure;	private $exclusions;	public function __construct($exclusions = array())	{		$this->numDirectories = 0;		$this->numFiles = 0;		$this->exclusions = $exclusions;	}	/**	 * Helper function to traverse the directories. Called initially by scan()	 *	 * @param string $dir	 */	private function _scan($dir)	{		if (in_array($dir, $this->exclusions))		{			return;		}		if (is_dir($dir))		{    		if ($dh = opendir($dir))    		{        		while (($filename = readdir($dh)) !== false)        		{        			if (substr($filename,0,1) == '.')        			{        				continue;        			}        			$path = $dir . '/' . $filename;        			if (is_dir($path))        			{        				$this->numDirectories++;        				$this->_scan($path);        			}        			else        			{        				$this->numFiles++;        				if (is_readable($path))        				{							$md5 = md5_file($path);							$path = substr($path, strlen($this->rootDir) + 1);							fwrite($this->logFile, "$md5:$path\n");        				}        			}        		}        		closedir($dh);    		}		}	}	/**	 * This does the scan of the directory.	 *	 * @param string $rootDir	 * @param string $reportFile	 */	public function scan($rootDir, $reportFile)	{		$this->rootDir = $rootDir;		$this->logFilename = $reportFile;		$this->logFile = fopen($reportFile,'wt');		$this->_scan($rootDir);		fclose($this->logFile);	}	/**	 * Used by the compare function, to load a md5 file	 *	 * @param string $path	 * @return array	 */	private function _loadDirectory($path)	{		$dirs = array();		$numFiles = 0;		$numDirectories = 0;		$fp = fopen($path, 'rt');		while (!feof($fp))		{			$line = fgets($fp, 10240);			list($md5, $path) = explode(':',$line);			$dirname = dirname($path);			$filename = basename($path);			$numFiles++;			$dirs[$dirname][$filename] = $md5;		}		fclose($fp);		return array('numFiles'=>$numFiles, 'numDirectories'=>$numDirectories, 'dirs'=>$dirs);	}	/**	 * Internal function used to compare two md5 directory structures.	 *	 * @param array $prev	 * @param array $cur	 * @param string $msg	 */	private function _compare($prev, $cur, $msg)	{		foreach($prev['dirs'] as $prevDir=>$prevDirFiles)		{			if (!array_key_exists($prevDir, $cur['dirs']))			{				print "$msg: $prevDir does not exist in target.\n";			}			else			{				foreach($prevDirFiles as $prevFilename=>$prevMD5)				{					if (!array_key_exists($prevFilename, $cur['dirs'][$prevDir]))					{						$prevFilename = substr($prevFilename,0,-1);						print "$msg: $prevFilename does not exist in $prevDir.\n";					}					else					{						if (in_array($prevDir . '/' . $prevFilename, $this->comparisonFailure))						{							continue;						}						$newMD5 = $cur['dirs'][$prevDir][$prevFilename];						if ($prevMD5 != $newMD5)						{							$this->comparisonFailure[] = $prevDir . '/' . $prevFilename;							$prevFilename = substr($prevFilename,0,-1);							print "$msg: $prevFilename does not match md5; $prevMD5 != $newMD5.\n";						}					}				}			}		}	}	/**	 * Compare to md5 report files	 *	 * @param string $reportA	 * @param string $reportB	 */	public function compare($reportA, $reportB)	{		if (is_null($reportB))		{			$reportB = $this->logFilename;		}		$this->comparisonFailure = array();		$prev = $this->_loadDirectory($reportA);		$cur = $this->_loadDirectory($reportB);		if ($prev['numDirectories'] != $cur['numDirectories'])		{			print "Folder count mismatch!\n";		}		if ($prev['numFiles'] != $cur['numFiles'])		{			print "File count mismatch!\n";		}		$this->_compare($prev, $cur,'>');		$this->_compare($cur,$prev,'<');	}}class SupportUtil{	private $path;	private $innodb;	private $noninnodb;	/**	 * Constructor for SupportUtil. Creates a folder with format support-YYYY-MM-DD_HH-mm-ss	 *	 */	function __construct()	{		$config = KTConfig::getSingleton();		$tempdir = $config->get('urls/tmpDirectory');		$this->path = $tempdir . "/support-" . date('Y-m-d_H-i-s');		mkdir($this->path);	}	/**	 * Main function to capture as much info that is reasonable.	 *	 */	public function capture()	{		// get php info		$this->capture_phpinfo($this->path . '/phpinfo.htm');		// get db schema		$tables = $this->capture_db_schema($this->path);		// get zseq counters from taables		$this->capture_zseqs($tables, $this->path . '/zseqreport.htm');		// get md5 on table		$exclusions = array(			KT_DIR . '/var',			realpath(KT_DIR . '/../var')		);		$tree = new MD5SourceTree($exclusions);		$config = KTConfig::getSingleton();		$sourcePath = $config->get('KnowledgeTree/fileSystemRoot');		$tree->scan($sourcePath, $this->path . '/md5report.txt');		// get plugins		$this->capture_plugins($this->path . '/plugins.htm');		// get logs		$this->capture_logs($this->path);		// get sys info		$this->get_sysinfo($this->path);		// get storage engine list		$this->create_storage_engine($this->path);		// get disk space listing		$this->capture_df($this->path);		// get process listing		$this->capture_ps($this->path);		// get version files		$this->capture_version_files($this->path);		// get system settings		$this->capture_system_settings($this->path);		// create out index file		$this->create_index($this->path);	}	/**	 * Main helper function to cleanup after creating zip file	 *	 * @param stirng $path	 */	private function _cleanup($path)	{		$dh = opendir($path);		while (($filename = readdir($dh)) !== false)		{			if (substr($filename,0,1) == '.') continue;			$fullname = $path . '/' . $filename;			if (is_dir($fullname))			{				$this->_cleanup($fullname);			}			else			{				unlink($fullname);			}        }		closedir($dh);		rmdir($path);	}	/**	 * Main cleanup function	 *	 */	public function cleanup()	{		$this->_cleanup($this->path);	}	/**	 * Creates an archive file	 *	 * @return string	 */	public function archive()	{		$zip = KTUtil::findCommand('export/zip', 'zip');		chdir(dirname($this->path));		$subdir = basename($this->path);		$archivename = $this->path . '.zip';		$cmd = "\"$zip\" -r \"$archivename\" \"$subdir\"";		KTUtil::pexec($cmd);		return $archivename;	}	/**	 * Tries to get list of running processes	 *	 * @param string $path	 */	private function capture_ps($path)	{		$ps = KTUtil::findCommand('externalBinary/ps', 'ps');		if (!file_exists($ps) || !is_executable($ps))		{			return;		}		$cmd = "'$ps' waux";		// TODO: refactor to use KTUtil::pexec		$ps = popen($cmd, 'r');		$content = fread($ps , 10240);		pclose($ps);		file_put_contents($path . '/ps.txt', $content);	}	/**	 * Get list of KnowledgeTree version files	 *	 * @param string $path	 */	private function capture_version_files($path)	{		$path = $path . '/versions';		mkdir($path);		$ver_path = KT_DIR . '/docs';		$dh = opendir($ver_path);		while (($filename = readdir($dh)) !== false)		{			if (substr($filename, 0, 7) == 'VERSION')			{				copy($ver_path . '/' . $filename, $path . '/' . $filename);			}        }		closedir($dh);	}	/**	 * Dump the system_settings table, except for dashboard-state entries.	 *	 * @param string $path	 */	private function capture_system_settings($path)	{		$sql = "SELECT id, name, value FROM system_settings";		$rs = DBUtil::getResultArray($sql);		$html = "<h1>System Settings</h1>";		$html .= '<br><table border=1 cellpadding=0 cellspacing=0>';		foreach($rs as $rec)		{			$id = $rec['id'];			$name = $rec['name'];			$value = $rec['value'];			if (substr($name, 0, 15) == 'dashboard-state') continue;			$html .= "<tr><td>$id<td>$name<td>$value\r\n";		}		$html .= '</table>';		file_put_contents($path . '/systemsettings.htm', $html);	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?