dig.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 450 行

PHP
450
字号
<?php//// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2002 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Author: Colin Viebrock <colin@easyDNS.com>                           |// +----------------------------------------------------------------------+//// $Id: Dig.php,v 1.1 2002/04/25 14:57:23 cmv Exp $//// A nice friendly OO interface to dig//require_once('PEAR.php');class Net_Dig extends PEAR{	// {{{ Public Properties		/**	 * The address to dig	 *	 * @var string $address	 * @access public	 */	var $address;		/**	 * The server to use for digging	 *	 * @var string $server	 * @access public	 */	var $server;		/**	 * The type of DNS records to dig for	 *	 * @var string $query_type	 * @access public	 */	var $query_type;	/**	 * The last system command executed (for debugging)	 *	 * @var string $cmd	 * @access public	 */	var $cmd;	/**	 * The raw output of the system command (for debugging)	 *	 * @var string $raw_data	 * @access public	 */	var $raw_data;	/**	 * The location of the system dig program	 *	 * @var string $dig_prg	 * @access public	 */	var $dig_prog;	/**	 * The parsed result of the last dig	 *	 * @var string $result	 * @access public	 */	var $result;		// }}}	// {{{ Net_Dig()		/**	 * The Net_Dig constructor         * Called when a new Net_Dig object is initialized	 *	 * @param string     [$address]  The address to dig (can be set 	 *                               using the $address property as well)	 *	 * @param string     [$server]   The server to dig at (can be set 	 *                               using the $server property as well)	 *	 * @return object Net_Dig   $obj   A new Net_Dig object	 *	 * @access public	 * @author Colin Viebrock <colin@easyDNS.com>	 * @since  PHP 4.0.5	 */	function Net_Dig($address = false, $server = false )	{		$this->address = $address;		$this->server = $server;		$this->query_type = false;		$this->cmd = '';		$this->raw_data = '';		$this->result = false;		$this->dig_prog = trim(`which dig`);		if (!$this->dig_prog) {			$this = new PEAR_Error("Couldn't find system dig program");		}	}	// }}}	// {{{ dig()		/**	 * Does a dig of the given address (or $this->address)	 *	 * @param string           [$address] The address to dig (can be set 	 *                                using the $address property as well)	 *	 * @return object Net_Dig_result    $obj   A new Net_Dig_result object	 *	 * @access public	 * @author Colin Viebrock <colin@easyDNS.com>	 * @since  PHP 4.0.5	 */	function dig($address=false)	{		if ($address) {			$this->address = $address;		}		if (!$this->address) {			return new PEAR_Error("No address specified");		}		if (!$this->_validate_type()) {			return new PEAR_Error($this->query_type." is an invalid query type");		}		$cmd = escapeshellcmd(			sprintf("%s %s %s %s",				$this->dig_prog,				($this->server		? '@'.$this->server : ''),				$this->address,				($this->query_type	? $this->query_type : '' )			)		);		$this->cmd = $cmd;		$this->raw_data = `$cmd`;		$this->raw_data = trim(	$this->raw_data );		return $this->_parse_data();	}		// }}}	// {{{ _validate_type()		/**	 * Validates the value of $this->query_type	 *	 * @return boolean	$return   True if $this->query_type is a 	 *                                valid dig query, otherwise false	 *	 * @access private	 * @author Colin Viebrock <colin@easyDNS.com>	 * @since  PHP 4.0.5	 */	function _validate_type()	{		$return = true;		if ($this->query_type) {			$this->query_type = strtolower($this->query_type);			switch ($this->query_type) {			    case 'a':			    case 'any':			    case 'mx':			    case 'ns':			    case 'soa':			    case 'hinfo':			    case 'axfr':			    case 'txt':				break;			    default:				$return = false;			}		}		return $return;	}		// }}}	// {{{ _parse_data()		/**	 * Parses the raw data in $this->raw_data	 *	 * @return obj Net_Dig_result  $return   A Net_Dig_result object	 *	 * @access private	 * @author Colin Viebrock <colin@easyDNS.com>	 * @since  PHP 4.0.5	 */	function _parse_data()	{		if (!$this->raw_data) {			return new PEAR_Error("No raw data to parse");		}		$regex = '/' .			'^;(.*?)' .			';; QUESTION SECTION\:(.*?)' .			'(;; ANSWER SECTION\:(.*?))?' .			'(;; AUTHORITY SECTION\:(.*?))?' .			'(;; ADDITIONAL SECTION\:(.*?))?' .			'(;;.*)' .			'/ims';		if (preg_match($regex, $this->raw_data, $matches)) {			$result = new Net_Dig_result;			/* Start parsing the data */			/* the header ... */			$temp = explode("\n", trim($matches[1]));			if (preg_match('/DiG (.*?) /i', $temp[0], $m)) {				$result->dig_version 		= trim($m[1]);			}			if (preg_match('/status: (.*?), id: (.*?)$/i', $temp[3], $m)) {				$result->status			= trim($m[1]);				$result->id			= trim($m[2]);			}			if (preg_match('/flags: (.*?); query: (.*?), answer: (.*?), authority: (.*?), additional: (.*?)$/i', $temp[4], $m)) {				$result->flags			= trim($m[1]);				$result->query_count		= (int)trim($m[2]);				$result->answer_count		= (int)trim($m[3]);				$result->authority_count	= (int)trim($m[4]);				$result->additional_count	= (int)trim($m[5]);			}			/* query section */			$line = trim(preg_replace('/^(;*)/', '', trim($matches[2])));			list($host, $class, $type) = preg_split('/[\s]+/', $line, 3);			$result->query[] = new Net_Dig_resource($host, false, $class, $type, false);			/* answer section */			$temp = trim($matches[4]);			if ($temp) {				$temp = explode("\n", $temp);				if (count($temp)) {					foreach($temp as $line) {						$result->answer[] = $this->_parse_resource($line);					}				}			}			/* authority section */			$temp = trim($matches[6]);			if ($temp) {				$temp = explode("\n", $temp);				if (count($temp)) {					foreach($temp as $line) {						$result->authority[] = $this->_parse_resource($line);					}				}			}			/* additional section */			$temp = trim($matches[8]);			if ($temp) {				$temp = explode("\n", $temp);				if (count($temp)) {					foreach($temp as $line) {						$result->additional[] = $this->_parse_resource($line);					}				}			}			/* footer */			$temp = explode("\n", trim($matches[9]));			if (preg_match('/query time: (.*?)$/i', $temp[0], $m)) {				$result->query_time	= trim($m[1]);			}			if (preg_match('/server: (.*?)#(.*?)\(/i', $temp[1], $m)) {				$result->dig_server	= trim($m[1]);				$result->dig_port	= trim($m[2]);			}			/* done */			$result->consistency_check = (				(count($result->query) == $result->query_count) &&				(count($result->answer) == $result->answer_count) &&				(count($result->authority) == $result->authority_count) &&				(count($result->additional) == $result->additional_count)			);			return $result;		}		return new PEAR_Error("Can't parse raw data");	}		// }}}	// {{{ _parse_resource()		/**	 * Parses a resource record line	 *	 * @param string           $line	The line to parse	 *	 * @return obj Net_Dig_resource  $return   A Net_Dig_resource object	 *	 * @access private	 * @author Colin Viebrock <colin@easyDNS.com>	 * @since  PHP 4.0.5	 */	function _parse_resource($line)	{		/* trim and remove leading ;, if present */				$line = trim(preg_replace('/^(;*)/', '', trim($line)));		if ($line) {			list($host, $ttl, $class, $type, $data) = preg_split('/[\s]+/', $line, 5);			return new Net_Dig_resource($host, $ttl, $class, $type, $data);		}		return false;	}	// }}}}class Net_Dig_result {	// {{{ Public Properties	var $status;	var $id;	var $flags;	var $query_count;	var $answer_count;	var $authority_count;	var $additional_count;	var $dig_version;	var $dig_server;	var $dig_port;	var $query;	var $answer;	var $authority;	var $additional;	var $consistency_check;	function Net_Dig_result() {		$this->status = false;		$this->id = false;		$this->flags = false;		$this->query_count = false;		$this->answer_count = false;		$this->authority_count = false;		$this->additional_count = false;		$this->dig_version = false;		$this->dig_server = false;		$this->dig_port = false;		$this->query = array();		$this->answer = array();		$this->authority = array();		$this->additional = array();		$this->consistency_check = false;	}}class Net_Dig_resource {	var $host;	var $ttl;	var $class;	var $type;	var $data;	function Net_Dig_resource($host=false, $ttl=false, $class=false, $type=false, $data=false) {		$this->host	= $host;		$this->ttl	= $ttl;		$this->class	= $class;		$this->type	= $type;		$this->data	= $data;	}}?>

⌨️ 快捷键说明

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