diff --git a/system/application/libraries/Dynect_API.php b/system/application/libraries/Dynect_API.php index 0d31865..a4e5f55 100644 --- a/system/application/libraries/Dynect_API.php +++ b/system/application/libraries/Dynect_API.php @@ -1,428 +1,366 @@ -CI =& get_instance(); + protected $base_url = 'https://api2.dynect.net/wsdl/current/Dynect.wsdl'; + protected $client; // The SOAP client + protected $token = null; // Dynect login token + protected $messages = array(); + protected $error_function = null; - $this->client = new SoapClient($this->base_url, array('cache_wsdl' => 0)); //Connect to the WSDL - - log_message('debug', 'Dynect_API Class Initialized'); + protected $allowed_records = array('A', 'AAAA', 'CNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NS', 'PTR', 'RP', 'SOA', 'SRV', 'TXT'); + + public function __construct($url = null) { + + if($url) { + $this->base_url = $url; } - // -------------------------------------------------------------------- + $this->client = new SoapClient($this->base_url, array('cache_wsdl' => 1)); //Connect to the WSDL + } + public function setErrorFunction($error_function) { + $this->error_function = $error_function; + } - function login() { + protected function error($message) { + $this->messages[] = $message; - /* ########################## + // If we've been given a custom error function, use it. + // Eg for Drupal, you can pass in drupal_set_message to setErrorFunction() + if($this->error_function) { + $error_function = $this->error_function; + $error_function($message); + } + } - Logging In - ------------ - To log in to the dynect API you must call SessionLogin with customer name, username and password + public function getErrors() { + return $this->messages; + } - Some Returned Values - status - success or failure - data->token - to be used with all other commands + public function login($customer_name, $user_name, $password) { - ** Complete Documentations can be found at - https://manage.dynect.net/help/docs/api2/soap/ + $parameters = array( + 'parameters' => array( + 'user_name'=> $user_name, + 'customer_name' => $customer_name, + 'password' => $password, + ), + ); - ########################## */ + $result = $this->soapCall('SessionLogin', $parameters); - if(!isset($this->user_name) || !isset($this->customer_name) || !isset($this->password)) { - show_error('You must set your username, customer name, and password in application/config/dynect_api.php in order to login.'); - } - else { + if($result && ($result->status == 'success')){ + $this->token = $result->data->token; + return true; + } + else { + // This case seems to be handled adequately by catching the soapfault above. + // Dynect's servers return HTTP 500 on failed login -> soapfault. + } + } - $parameters = array( - 'parameters' => array( - 'user_name'=> $this->user_name, - 'customer_name' => $this->customer_name, - 'password' => $this->password - ) - ); + function get_all_records($zone, $fqdn) { - $result = $this->client->__soapCall('SessionLogin',$parameters); + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'zone' => $zone, + 'fqdn' => $fqdn, + ) + ); - if(is_soap_fault($result)){ - trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR); - die(); - } + $result = $this->soapCall('GetANYRecords', $parameters); - if($result->status == 'success'){ - $this->token = $result->data->token; - return true; - } else { - log_message('error', 'Dynect_API could not log in. Result status: '.$result->status); - die(); - } - - } // end if isset user_name - } // end login - - function get_all_records($zone, $fqdn) { - - /* ########################## - - Getting All Records on a zone - ------------ - To get a list of all records send a GetANYRecords command with the token, zone, and fqdn as paramters - - Some Returned Values - status - success or failure - data - object containing a list record type containers each with the rdata, fqdn, record_type, ttl and zone - - ** Complete Documentations can be found at - https://manage.dynect.net/help/docs/api2/soap/ - - ########################## */ - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'zone' => $zone, - 'fqdn' => $fqdn - ) - ); - - echo 'Retrieving all Records
'; - echo '--------------------------
'; - $result = $this->client->__soapCall('GetANYRecords',$parameters); - - if(is_soap_fault($result)){ - trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return $result->data; - } else { - die('Unable to Get records'); - } - - } // end get_record - + if($result && ($result->status == 'success')){ + return $result->data; + } + else { + return false; + } + } /** - * Create a Zone - * - * @access public - * @param Name of the zone - * @param Administrative contact for this zone - * @param Default TTL (in seconds) for records in the zone - * @return void - */ - function create_zone($zone, $rname, $ttl = 3600) { +* Create a Zone +* +* @access public +* @param Name of the zone +* @param Administrative contact for this zone +* @param Default TTL (in seconds) for records in the zone +* @return void +*/ + public function create_zone($zone, $rname, $ttl = 3600) { - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'zone' => $zone, - 'rname' => $rname, - 'ttl' => $ttl - ) - ); + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'zone' => $zone, + 'rname' => $rname, + 'ttl' => $ttl, + ), + ); - try{ - $result = $this->client->__soapCall('CreateZone',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->detail,true)." )", E_USER_ERROR); - die(); + $result = $this->soapCall('CreateZone', $parameters); + + if($result && ($result->status == 'success')) { + return $result->data; + } + else { + return false; + } + } + + public function get_node_list($zone) { + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'zone' => $zone, + ), + ); + + $result = $this->soapCall('GetNodeList', $parameters); + + if($result && ($result->status == 'success')) { + return $result->data; + } + else { + return false; + } + } + + public function delete_zone($zone) { + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'zone' => $zone, + ), + ); + + $result = $this->soapCall('DeleteOneZone', $parameters); + return ($result && ($result->status == 'success')); + } + +/** + * Publish a Zone + * + * @access public + * @param Name of the zone + * @return boolean (true = success) +*/ + public function publish_zone($zone) { + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'zone' => $zone, + ) + ); + + $result = $this->soapCall('PublishZone', $parameters); + return ($result && ($result->status == 'success')); + } + + +/** + * Delete Records - Deletes all records at fqdn of type + * + * @access public + * @param Type of record to delete (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) + * @param Name of zone to delete records from + * @param Name of node to delete records from + * @return bool (true=success) +*/ + public function delete_records($type, $zone, $fqdn) { + + if(!in_array($type, $this->allowed_records)) { + $this->error('Supplied record type ' . $type . ' is not in the allowed list.'); + return false; + } + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'fqdn' => $fqdn, + 'zone' => $zone, + ), + ); + + $result = $this->soapCall('Delete'.$type.'Records', $parameters); + return ($result && ($result->status == 'success')); + } + + +/** + * Create Record + * + * @access public + * @param Type of record to create (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) + * @param Name of zone to add the record to + * @param Name of node to add the record to + * @param RData defining the record to add + * + * @return array data + string fqdn Fully qualified domain name of a node in the zone + hash rdata RData defining the record + (response data) + string record_type The RRType of the record + string ttl TTL for the record. + string zone Name of the zone + */ + + public function create_record($type, $zone, $fqdn, $rdata) { + + if(!in_array($type, $this->allowed_records)) { + $this->error('Supplied record type ' . $type . ' is not in the allowed list.'); + return false; + } + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'fqdn' => $fqdn, + 'zone' => $zone, + 'rdata' => $rdata, + ), + ); + + $result = $this->soapCall('Create'.$type.'Record', $parameters); + + if($result && ($result->status == 'success')){ + return $result->data; + } + else { + return false; + } + } + +/** + * Get Records + * + * @access public + * @param Type of record to get (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) + * @param Name of zone to get the record of + * @param Name of node to get the record of + * @return array data +string fqdn Fully qualified domain name of a node in the zone +hash rdata RData defining the record +(response data) +string record_type The RRType of the record +string ttl TTL for the record. +string zone Name of the zone + */ + + public function get_records($type, $zone, $fqdn) { + + if(!in_array($type, $this->allowed_records)) { + $this->error('Supplied record type ' . $type . ' is not in the allowed list.'); + return false; + } + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + 'fqdn' => $fqdn, + 'zone' => $zone, + ) + ); + + $result = $this->soapCall('Get'.$type.'Records', $parameters); + + if($result && ($result->status == 'success')) { + return $this->rtn($result->data); + } + else { + return false; + } + } + + /** + * Get all Zones + * + * @access public + * @return zone data + */ + + public function get_zones() { + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + ), + ); + + $result = $this->soapCall('GetZones', $parameters); + + if($result && ($result->status == 'success')) { + // Normalise records to an array of objects. + return $this->rtn($result->data); + } + else { + return false; + } + } + + public function logout() { + + $parameters = array( + 'parameters' => array( + 'token'=> $this->token, + ), + ); + + $result = $this->soapCall('SessionLogout', $parameters); + return ($result && ($result->status == 'success')); + } + + /** + * A wrapper around $this->client->__soapCall that handles exceptions and logs + * them as messages. + * @param string $method + * @param array $parameters + */ + + protected function soapCall($method, $parameters) { + try{ + $result = $this->client->__soapCall($method, $parameters); + } + catch (SoapFault $ex) { + // Log all the messages: + foreach($ex->detail->ErrorResponse->enc_value->msgs as $message) { + $this->error($message->info); } + return false; + } + return $result; + } - if($result->status == 'success'){ - return $result->data; - } else { - die('Unable to create zone'); - } + /** + * DynECT's API has a habit of returning a single object for a single result, + * or an array of objects for multiple results. This is kind of annoying as + * we can't safely interate over the result. This method normalises the result + * to an array. + */ - } // end create_zone - - /** - * Delete a Zone - * - * @access public - * @param Name of the zone - * @return boolean (true = success) - */ - function delete_zone($zone) { + protected function rtn($return) { + if(is_array($return)) { + return $return; + } + else { + return array($return); + } + } +} - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'zone' => $zone - ) - ); - - try{ - $result = $this->client->__soapCall('DeleteOneZone',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->detail,true)." )", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return true; - } else { - die('Unable to delete zone'); - } - - } // end delete_zone - - - /** - * Publish a Zone - * - * @access public - * @param Name of the zone - * @return boolean (true = success) - */ - function publish_zone($zone) { - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'zone' => $zone - ) - ); - - try{ - $result = $this->client->__soapCall('PublishZone',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->detail,true)." )", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return true; - } else { - die('Unable to publish zone'); - } - - } // end publish_zone - - - /** - * Delete Records - Deletes all records at fqdn of type - * - * @access public - * @param Type of record to delete (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) - * @param Name of zone to delete records from - * @param Name of node to delete records from - * @return bool (true=success) - */ - function delete_records($type, $zone, $fqdn) { - if(in_array($type, array('A', 'AAAA', 'CNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NS', 'PTR', 'RP', 'SOA', 'SRV', 'TXT'))) { - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'fqdn' => $fqdn, - 'zone' => $zone - ) - ); - - try{ - $result = $this->client->__soapCall('Delete'.$type.'Records',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->detail,true)." )", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return true; - } else { - die('Unable to create '.$type.' record.'); - } - - } - } // end delete_records - - - /** - * Create Record - * - * @access public - * @param Type of record to create (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) - * @param Name of zone to add the record to - * @param Name of node to add the record to - * @param RData defining the record to add - * @return array data - string fqdn Fully qualified domain name of a node in the zone - hash rdata RData defining the record - (response data) - string record_type The RRType of the record - string ttl TTL for the record. - string zone Name of the zone - */ - function create_record($type, $zone, $fqdn, $rdata) { - if(in_array($type, array('A', 'AAAA', 'CNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NS', 'PTR', 'RP', 'SOA', 'SRV', 'TXT'))) { - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'fqdn' => $fqdn, - 'zone' => $zone, - 'rdata' => $rdata - ) - ); - - try{ - $result = $this->client->__soapCall('Create'.$type.'Record',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->detail,true)." )", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return $result->data; - } else { - die('Unable to create '.$type.' record.'); - } - - } - } // end create_record - - - /** - * Get Records - * - * @access public - * @param Type of record to get (A, AAAA, CNAME, DNSKEY, DS, KEY, LOC, MX, NS, PTR, RP, SOA, SRV, TXT) - * @param Name of zone to get the record of - * @param Name of node to get the record of - * @return array data - string fqdn Fully qualified domain name of a node in the zone - hash rdata RData defining the record - (response data) - string record_type The RRType of the record - string ttl TTL for the record. - string zone Name of the zone - */ - function get_records($type, $zone, $fqdn) { - if(in_array($type, array('A', 'AAAA', 'CNAME', 'DNSKEY', 'DS', 'KEY', 'LOC', 'MX', 'NS', 'PTR', 'RP', 'SOA', 'SRV', 'TXT'))) { - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token, - 'fqdn' => $fqdn, - 'zone' => $zone - ) - ); - - try{ - $result = $this->client->__soapCall('Get'.$type.'Records',$parameters); - } - catch (SoapFault $ex) { - trigger_error("SOAP Fault: ( ".var_export($ex->faultstring,true)." )", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return $result->data; - } else { - die('Unable to get '.$type.' records.'); - } - - } - } // end get_records - - - /** - * Get all Zones - * - * @access public - * @return zone data - */ - function get_zones() { - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token - ) - ); - - $result = $this->client->__soapCall('GetZones',$parameters); - - if(is_soap_fault($result)){ - trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR); - die(); - } - - if($result->status == 'success'){ - return $result->data; - } else { - die('Unable to get zones'); - } - - } // end get_zones - - - function logout() { - /* ########################## - - Logging Out - ------------ - To log in to the dynect API you must call SessionLogout with the token received at login - - Some Returned Values - status - success or failure - - ** Complete Documentations can be found at - https://manage.dynect.net/help/docs/api2/soap/ - - ########################## */ - - $parameters = array( - 'parameters' => array( - 'token'=> $this->token - ) - ); - - $result = $this->client->__soapCall('SessionLogout',$parameters); - - if(is_soap_fault($result)){ - trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR); - die(); - } - - $message = $result->msgs; - - if($result->status != 'success'){ - log_message('error','Dynect_API unable to log out.'); - } - } // end logout - - -} // end class