PHP Code:
class simpleXMLapi extends xmlapi{
private $user = '';
private $acct = '';
private $authstr = '';
private $ip = '';
private $port = 2087;
private $respType = '/xml-api/';
private $hideAuth = true;
public $cInfo = array();
public $err = array();
protected $lastResponse;
public function simpleXMLapi($account, $user, $passOrHash, $ipOrDom){
$this->user = $user;
$this->acct = $account;
$this->ip = $ipOrDom;
//set the auth string based on password recieved
$this->authstr = (strlen($passOrHash) < 20) ?
'Authorization: Basic ' . base64_encode($user .':'. $passOrHash) :
'Authorization: Basic ' . $passOrHash;
}
public function api2_query($module, $function, $args){
if(!is_array($args)){
array_push($this->err, 'Invalid $args sent. Must be an array with key=>value pairs');
return false;
}
//setup args for
$args['user'] = $this->acct;
$args['cpanel_xmlapi_module'] = $module;
$args['cpanel_xmlapi_func'] = $function;
$args['cpanel_xmlapi_apiversion'] = '2';
//build url
$url = 'https://' . $this->ip . ':' . $this->port . $this->respType . 'cpanel';
//perform the Curl Request
$result = $this->curl_query($url, $args, $this->authstr);
}
public function api_query($function, $args=array()){
//build url
$url = 'https://' . $this->ip . ':' . $this->port . $this->respType . $function;
return $this->curl_query($url,$args, $this->authstr);
}
private function curl_query( $url, $args, $authstr ) {
//for Curl post need the key=>value ina string of key=val&ke2=val2
$poststr = http_build_query($args, '', '&');
$header[0] = $authstr . "\r\n";
$header[0] .= 'Content-Type: application/x-www-form-urlencoded';
$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);//allow self-signed certs
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// return content of transfer
curl_setopt($curl, CURLOPT_URL, $url); //set url
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_POST, count($args)); //send number of post vars via the header
curl_setopt($curl, CURLOPT_POSTFIELDS, $poststr); //send the post var string
$content = curl_exec($curl);
//collect data about the transaction...pushed to $this->err array
$this->gatherCurlData(curl_errno($curl), curl_error($curl), curl_getinfo($curl), $header, $url, $authstr, $poststr, $content);
//close connection
curl_close($curl);
$this->lastResponse = $content;
return $content;
}
public function getParsedArray(){
return $this->my_xml2array($this->lastResponse);
}
public function getUnparsedResponse(){
return $this->lastResponse;
}
/**
* Used to parse the response
* @param $search
* @return unknown_type
*/
public function getParsedResponse($search = array('event','result')){
if(strlen($this->lastResponse) == 0){array_push($this->err,'No data to parse');return false;}
$parsed = $this->my_xml2array($this->lastResponse);
$name = array_shift($search);
return $this->findXMLinfo($parsed,$name,$search);
}
/**
* XML can be a little tricky, so this just finds the data we are looking for
* such as did it work or not...aka $search=array('cpanelresult','event','result')
* @param $arr Array An xml doc put into array format via my_xml2array
* @param $name String The name of the xml node
* @param $search String The nested xml node(s) you are searching for
* @return mixed The value node of the inner most xml search node
*/
private function findXMLinfo($arr, $name, $search){
foreach($arr as $val){
if($val['name'] == $name){
if(count($search) && !isset($val['value'])){
$temp = array_shift($search);
return $this->findXMLinfo($val, $temp, $search);
}else{
return $val['value'];
}
}
}
}
/**
* Function used to seperate out the gathering of data from the curl_query method
* @param $errnum
* @param $errmsg
* @param $info
* @param $header
* @param $url
* @param $authstr
* @param $poststr
* @param $content
* @return unknown_type
*/
private function gatherCurlData($errnum, $errmsg, $info, $header, $url, $authstr, $poststr, $content){
//put errors and transaction info to $this->err collector
array_push($this->cInfo,"URL used:\n\t$url");
array_push($this->cInfo,"HEADER used:\n".http_build_query($header,'',"\n"));
array_push($this->cInfo,"Post String Used:\n\t$poststr");
array_push($this->cInfo,"Curl Response:\n\t".$content);
if(!$this->hideAuth) array_push($this->err,"Auth Used:\n\t$authstr");
array_push($this->err,"Curl Error: \n\t".$errnum.':'.$errmsg);
array_push($this->err,"Curl Info Returned : \n\t".http_build_query($info,'',"\n"));
return true;
}
/**
* Prints Errors stored in the array $this->err
* @return unknown_type
*/
public function printErrors(){
$str = '';
foreach($this->err as $err){
$str .= "$err\n************************************************\n";
}
$str = preg_replace('/(\n|\r)/',"<br/>\n",$str);
echo $str;
}
public function printCurlInfo(){
$str = '';
foreach($this->cInfo as $info){
$str .= "$info\n************************************************\n";
}
$str = preg_replace('/(\n|\r)/',"<br/>\n",$str);
echo $str;
}
function my_xml2array($contents)
{
$xml_values = array();
$parser = xml_parser_create('');
if(!$parser)
return false;
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, trim($contents), $xml_values);
xml_parser_free($parser);
if (!$xml_values)
return array();
$xml_array = array();
$last_tag_ar =& $xml_array;
$parents = array();
$last_counter_in_tag = array(1=>0);
foreach ($xml_values as $data)
{
switch($data['type'])
{
case 'open':
$last_counter_in_tag[$data['level']+1] = 0;
$new_tag = array('name' => $data['tag']);
if(isset($data['attributes']))
$new_tag['attributes'] = $data['attributes'];
if(isset($data['value']) && trim($data['value']))
$new_tag['value'] = trim($data['value']);
$last_tag_ar[$last_counter_in_tag[$data['level']]] = $new_tag;
$parents[$data['level']] =& $last_tag_ar;
$last_tag_ar =& $last_tag_ar[$last_counter_in_tag[$data['level']]++];
break;
case 'complete':
$new_tag = array('name' => $data['tag']);
if(isset($data['attributes']))
$new_tag['attributes'] = $data['attributes'];
if(isset($data['value']) && trim($data['value']))
$new_tag['value'] = trim($data['value']);
$last_count = count($last_tag_ar)-1;
$last_tag_ar[$last_counter_in_tag[$data['level']]++] = $new_tag;
break;
case 'close':
$last_tag_ar =& $parents[$data['level']];
break;
default:
break;
};
}
return $xml_array;
}
}