All pastes #2102658 Raw Edit

Netconf.php

public php v1 · immutable
#2102658 ·published 2012-01-12 15:28 UTC
rendered paste body
<?phpdefine("RPC_REPLY_OK",		1);define("RPC_REPLY_WARNING",	0);define("RPC_REPLY_ERROR",	-1);class Netconf{	private $host;	private $login;	private $password;	private $port;	public $error_state;	public $error_info;	public $error_message;	private $ssh;	private $stream;	private $buffer;	function connect($config)	{		$this->host	= $config['hostname'];		$this->login	= $config['login'];		$this->password	= $config['password'];		$this->port	= $config['port'];		if (!($this->ssh = ssh2_connect($this->host, $this->port)))			return FALSE;		if (!ssh2_auth_password($this->ssh, $this->login, $this->password))			return FALSE;		$this->buffer	= "";		$this->stream	= ssh2_exec($this->ssh, "xml-mode netconf need-trailer");		if (!$this->stream)			return FALSE;		stream_set_blocking($this->stream, 30);		/* Send Hello and Capabilities to the server */		$hello['capabilities']['capability'] = "urn:ietf:params:xml:ns:netconf:base:1.0";		$this->hello($hello);		/* Receive Hello and Capabilities from Server */		$capability	= $this->parse_capabilities($this->recv());		return TRUE;	}	function parse_capabilities($hello)	{		if ($hello->getName() != "hello")			return FALSE;		foreach ($hello->capabilities->children() as $key => $value) {			if ($key == "capability") {//				printf("debug: capability: %s\n", $value);			}		}		$cap['session-id']	= (string) $hello->{"session-id"};		return $cap;	}	function parse_rpc_reply($msg)	{		if ($msg->getName() != "rpc-reply")			return FALSE;		$msg	= $msg->children();		switch ($msg->getName()) {		    case "ok":			return RPC_REPLY_OK;		    case "rpc-error":			printf("RPC ERROR: %s\n", $msg->asXML());			$this->error_severity	= (string) $msg->{'rpc-error'}->{'error-severity'};		        $this->error_info	= (string) $msg->{'rpc-error'}->{'error-info'};			$this->error_message	= (string) $msg->{'rpc-error'}->{'error-message'};			if ($this->error_severity == "warning")				return RPC_REPLY_WARNING;			else				return RPC_REPLY_ERROR;		    default://			printf("debug: rpc-reply: %s\n", $msg->getName());			return $msg;		}	}	function xml_parse($msg)	{		$flags	= LIBXML_COMPACT || LIBXML_NOCDATA || LIBXML_NOERROR;		$msg	= trim(preg_replace('@<![\s\S]*?--[ \t\n\r]*>@', '', $msg));		$xml	= simplexml_load_string($msg, "SimpleXMLElement", $flags);//		printf("DEBUG recv: %s", $xml->asXML());		return $xml;	}	function recv()	{			while (($pos = strpos($this->buffer, "]]>]]>")) === FALSE) {			if (!($buf = fread($this->stream, 65536)))				return FALSE;			$this->buffer	.= $buf;		}		$parse		= explode("]]>]]>", $this->buffer, 2);		$this->buffer	= $parse[1];		return $this->xml_parse($parse[0]);	}	function send($xml)	{//		printf("DEBUG send: %s\n", $xml->asXML());		fprintf($this->stream, "%s]]>]]>", $xml->asXML());	}	function array2xml($array, $node)	{		foreach ($array as $key => $value) {			if (is_array($value))				$this->array2xml($value, $node->addChild($key));			else {				if ($value === TRUE)					$node->addChild($key);				else					$node->addChild($key, $value);			}		}	}	function hello($param)	{		$hello	= new simpleXMLElement("<hello></hello>");		$this->array2xml($param, $hello);		$this->send($hello);	}	function rpc($param)	{		$rpc	= new simpleXMLElement("<rpc></rpc>");		$this->array2xml($param, $rpc);		$this->send($rpc);		return $this->parse_rpc_reply($this->recv());	}	function lock()	{		$rpc['lock']['target']['candidate']		= TRUE;		return $this->rpc($rpc);	}	function unlock()	{		$rpc['unlock']['target']['candidate']		= TRUE;		return $this->rpc($rpc);	}	function validate($source = "candidate")	{		$rpc['validate']['source'][$source]		= TRUE;		return $this->rpc($rpc);	}	function discard_changes()	{		$rpc['discard-changes'] = TRUE;		return $this->rpc($rpc);	}	function get_config($source = "running", $filter = NULL)	{		$rpc['get-config']['source'][$source]		= TRUE;		if ($filter)			$rpc['get-config']['filter']		= $filter;		return $this->rpc($rpc);	}	function copy_config($url, $operation = "merge", $error = "error", $target = "candidate")	{		$rpc['edit-config']['target'][$target]			= TRUE;		$rpc['edit-config']['default-operation']		= $operation;		$rpc['edit-config']['error-option']			= $error;		$rpc['edit-config']['url']				= $url;		return $this->rpc($rpc);	}	function edit_config($config, $type = "url format=\"text\"", $operation = "merge", $error = "stop-on-error", $target = "candidate")	{		$rpc['edit-config']['target'][$target]		= TRUE;		$rpc['edit-config']['default-operation']	= $operation;		$rpc['edit-config']['error-option']		= $error;		if ($type == "config")			$rpc['edit-config'][$type]['configuration']		= $config;		else if ($type == "config-text")			$rpc['edit-config'][$type]['configuration-text']	= $config;		else			$rpc['edit-config'][$type]		= $config;		return $this->rpc($rpc);	}	function commit()	{		$rpc['commit']					= TRUE;		return $this->rpc($rpc);	}	function close()	{		$rpc['close-session']				= TRUE;		$result	= $this->rpc($rpc);		fclose($this->ssh);		return $result;	}}	?>