Sample Zone Commands

Here’s a PERL example using SOAP::WSDL and the libraries from wsdl2perl.pl to:

  • Log in to the API to establish a Session [SessionLogin]
  • Get a List of existing Zones [GetZones]
  • Create a new zone [CreateZone]
  • Add A Records and MX Records [CreateARecord CreateMXRecord]
  • Create a new node with an A record [CreateARecord]
  • Publish the Zone [PublishZone]
  • Logout [SessionLogout]
#! /usr/bin/perl -lw
#
# A simple example script for SOAP::WSDL 
# local libraries generated with 
#     wsdl2perl.pl -b ./lib https://api2.dynect.net/wsdl/3.0.0/Dynect.wsdl

use lib './lib';

use MyInterfaces::Dynect::DynectSOAP;

my $debug = 0; # control some output

# create our interface client
my $interface = MyInterfaces::Dynect::DynectSOAP->new();

my $auth = {
        'customer_name' => $customer_name,
		'user_name' => $user_name,
        'password' => $password,
        'fault_incompat' => 1, # some libs choke on the SOAP-FAULT envelope
};


# login
my $response = $interface->SessionLogin($auth);
&check_fault($response);

# check the status of the call
unless ($response->get_status() eq "success") { 
	&output_messages($response);
	# can't continue without a login token
	exit(1);
}

# need the token for all calls, so let's get it
my $token = $response->get_data()->get_token();

print "Login Status: " . $response->get_status() if $debug;
print "Login Token: " . $token if $debug;

# args we always need
my $args = {
	'token' => $token,
	'fault_incompat' => 1,
};

# simple Get a List of existing zones
$response = $interface->GetZones($args);
&check_fault($response);

my $zones = $response->get_data();
if ($debug) {
	for my $zone (@$zones) { 
		print "Zone: " . $zone->get_zone();
	}
}

# let's create a zone
my $zone_args = {
	'zone' => 'api' . &genRandomString(5) . '.net',
	'ttl'  => 3600, # default tll for all records
	'rname' => 'hostmaster@firstzoneapi.com', # responsible party
	%$args, # we always need these
};

$response = $interface->CreateZone($zone_args);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	print ">>> Create Zone:";
	&output_messages($response);
}

my $zone_name = $response->get_data()->get_zone();
print $zone_name if $debug;

# add some standard records
# A record at the root
$response = $interface->CreateARecord( { 
	token =>  $token,
	fault_incompat => 1,  
	fqdn => $zone_name,
	zone =>  $zone_name,
	ttl =>  '3600',
	rdata =>  { 
		address => '192.16.12.13',
	},
},);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	print ">>> Create A Record:";
	&output_messages($response);
}


# MX Records at the root
my $mx_args = {
	fqdn =>  $zone_name,
	zone =>  $zone_name,
	rdata =>  { 
		preference =>  10,
		exchange =>  'gmail.google.com',
		},
	%$args,
};

$response = $interface->CreateMXRecord($mx_args);

&check_fault($response);

unless ($response->get_status() eq "success") { 
	print ">>> Create MX Record";
	&output_messages($response);
}

$mx_args->{'rdata'} = {'preference' => 20, exchange => 'mail.dyndns.com'};

$response = $interface->CreateMXRecord($mx_args);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	&output_messages($response);
}


# publish that zone
$response = $interface->PublishZone(
	{ %$args,
	'zone' => $zone_name,
	},
);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	&output_messages($response);
}

# let's add a new node with an A record
$response = $interface->CreateARecord( { 
	token =>  $token,
	fault_incompat => 1,  
	fqdn => 'www.' . $zone_name,
	zone =>  $zone_name,
	ttl =>  '3600',
	rdata =>  { 
		address => '192.116.112.113',
	},
},);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	print ">>> Create A Record at www node:";
	&output_messages($response);
}

 
# publish that zone
$response = $interface->PublishZone(
	{ %$args,
	'zone' => $zone_name,
	},
);
&check_fault($response);

unless ($response->get_status() eq "success") { 
	&output_messages($response);
}

#  an example of a bad call, and the response
#  the error here is that the fqdn (host name) is not in the same zone
#  as the zone argument
my $cname_args = {
	%$args,
	'fqdn' => 'web1.' . $zone_name,
	'zone' => 'boguszone.com',
	'ttl'  => '60',
	'rdata' => { cname => 'www.' . $zone_name,},
};

$response = $interface->CreateCNAMERecord($cname_args);
&check_fault($response);
unless ($response->get_status() eq "success") { 
	print ">>> Create CNAME Record:";
	&output_messages($response);
}

#logout
$response = $interface->SessionLogout( $args );
unless ($response->get_status() eq "success") { 
	&output_messages($response);
}
print "<<<<< All Done >>>>>>>n";

# some helper functions
=pod
check_fault 
	evaluates the SOAP response for SOAP::WSDL::SOAP::Typelib::Fault11
	SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context
	for 'fault_incompat' libraries,  the way to get this info is from the
		response->get_status() which will be 'failure', then 
		check the messages

output_messages 
	will print out any messages returned from the API

=cut

sub check_fault {
	my $response = shift;
	if (!$response) {
		die "Error calling SOAP method: ", $response->get_faultstring();
	}
}

sub output_messages {
	my $response = shift;
	
	print "Got a status code of " . $response->get_status();
	my $messages = $response->get_msgs();

	foreach $message (@$messages) {
		print "message:";
		print "  source: " . $message->get_source();
		print "  lvl: " . $message->get_lvl();
		print "  err_cd: " . $message->get_err_cd() if $message->get_err_cd();
		print "  info: " . $message->get_info();
	}
}

sub genRandomString {
	my ($max_length) = @_;
	$max_length ||= 10;
	return join('', map { chr(int(rand(26)) + ord('a')) } (1..$max_length));
}

Sample RTTM Creation

Here’s a PERL example using SOAP::WSDL and the libraries from wsdl2perl.pl to:

  • Log in to the API to establish a Session [SessionLogin]
  • Create an RTTM service on a new node [CreateRTTM]

    Note: This script assumes an existing published zone in Dynect
  • Examine some of the information about the new service
  • Logout [SessionLogout]
#! /usr/bin/perl -lw
#
# A simple example script for SOAP::WSDL rttm
# local libraries generated with 
#	wsdl2perl.pl -b ./lib https://api2.dynect.net/wsdl/3.0.0/Dynect.wsdl 

use lib './lib';

use MyInterfaces::Dynect::DynectSOAP;

# create our interface client
my $interface = MyInterfaces::Dynect::DynectSOAP->new();

my $auth = {
        'customer_name' => $customer_name,
		'user_name' => $user_name,
        'password' => $password,
        'fault_incompat' => 1, # some libs choke on the SOAP-FAULT envelope
};


# login
my $response = $interface->SessionLogin($auth);
&check_fault($response);

# check the status of the call
unless ($response->get_status() eq "success") { 
	&output_messages($response);
	# can't continue without a login token
	exit(1);
}

# need the token for all calls, so let's get it
my $token = $response->get_data()->get_token();

# args we always need
my $args = {
	'token' => $token,
	'fault_incompat' => 1,
};

# define the paramters for the RTTM service
my $zone = 'apitest.com'; # an existing, published zone in Dynect
my $host = 'rttm';
my $fqdn = join '.' , $host , $zone;

my $pool = [ # define the array of address to monitor/serve
 { 
	 'address' => '1.2.3.4',
	 'serve_mode' => 'obey',
 },
 { 
	 'address' => '2.2.3.4',
	 'serve_mode' => 'obey',
 },
 { 
	 'address' => '3.2.3.4',
	 'serve_mode' => 'obey',
 },
 { 
	 'address' => '4.2.3.4',
	 'serve_mode' => 'obey',
 },
 { 
	 'address' => '5.2.3.4',
	 'serve_mode' => 'obey',
 },
];

my $global_region = { 
	'region_code' => 'global', 
	'failover_mode' => 'ip', 
	'failover_data' => '127.0.0.1', 
	'serve_count' => 2, 
	'pool_count' => 4, 
	'failover_count' => 1, 
	'pool' => $pool,
};

# monitoring interval in minutes
my $health_monitor = { 'protocol' => 'PING', 'interval' => 1, };
my $performance_monitor = { 'protocol' => 'HTTP', 'interval' => 10, };

# ok, build up the service args
my $rttm_args = {
	'zone' => $zone,
	'fqdn' => $fqdn,
	'ttl'  => '30', # must be < .5 * $health_monitor->{'interval'}
	'notify_events' => 'ip,svc', # when to send notifications
	'contact_nickname' => 'api', # existing contact nickname
	'region' => [ $global_region, ],
	'monitor' => $health_monitor,
	'performance_monitor' =>  $performance_monitor, 
	'token' => $token,
	'fault_incompat' => 1,
};


$response = $interface->CreateRTTM($rttm_args);
&check_fault($response);

# check the status of the call
unless ($response->get_status() eq "success") { &output_messages($response); } 

my $rttm_add = $response->get_data();

my $perf_mon = $rttm_add->get_performance_monitor();
print $perf_mon;

# since in this instance the global pool will automatically populate the regions
# let's grab the global pool and examine some data
#
my $regions = $rttm_add->get_region;
for my $r (@$regions) {
	next unless $r->get_region_code eq 'global';
	$global_region = $r;
}

print "Pool Count: " . $global_region->get_pool_count;
print "Region Status: " . $global_region->get_status;



#logout
$response = $interface->SessionLogout( $args );
unless ($response->get_status() eq "success") { 
	&output_messages($response);
}
print "<<<<< All Done >>>>>>>n";

# some helper functions
=pod
check_fault 
	evaluates the SOAP response for SOAP::WSDL::SOAP::Typelib::Fault11
	SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context
	for 'fault_incompat' libraries,  the way to get this info is from the
		response->get_status() which will be 'failure', then 
		check the messages

output_messages 
	will print out any messages returned from the API

=cut

sub check_fault {
	my $response = shift;
	if (!$response) {
		die "Error calling SOAP method: ", $response->get_faultstring();
	}
}

sub output_messages {
	my $response = shift;
	
	print "Got a status code of " . $response->get_status();
	my $messages = $response->get_msgs();

	foreach $message (@$messages) {
		print "message:";
		print "  source: " . $message->get_source();
		print "  lvl: " . $message->get_lvl();
		print "  err_cd: " . $message->get_err_cd() if $message->get_err_cd();
		print "  info: " . $message->get_info();
	}
}

sub genRandomString {
	my ($max_length) = @_;
	$max_length ||= 10;
	return join('', map { chr(int(rand(26)) + ord('a')) } (1..$max_length));
}


Sample Get RTTM Commands

Here’s a PERL example using SOAP::WSDL and the libraries from wsdl2perl.pl to:

  • Log in to the API to establish a Session [SessionLogin]
  • Get details of an existing RTTM Service [GetOneRTTM]
  • Examine some of the data
  • Logout [SessionLogout]
#! /usr/bin/perl -lw
#
# A simple example script for SOAP::WSDL rttm
# local libraries generated with 
#	wsdl2perl.pl -b ./lib https://api2.dynect.net/wsdl/3.0.0/Dynect.wsdl 

use lib './lib';

use MyInterfaces::Dynect::DynectSOAP;

# create our interface client
my $interface = MyInterfaces::Dynect::DynectSOAP->new();

my $auth = {
	'customer_name' => $customer_name,
	'user_name' => $nser_name,
	'password' => $password,
	'fault_incompat' => 1, # some libs choke on the SOAP-FAULT envelope
};


# login
my $response = $interface->SessionLogin($auth);
&check_fault($response);

# check the status of the call
unless ($response->get_status() eq "success") { 
	&output_messages($response);
	# can't continue without a login token
	exit(1);
}

# need the token for all calls, so let's get it
my $token = $response->get_data()->get_token();

# args we always need
my $args = {
	'token' => $token,
	'fault_incompat' => 1,
};

# define the paramters for the RTTM service
my $zone = 'apitest.com'; # an existing, published zone in Dynect
my $host = 'rttm'; # host with an existing RTTM service
my $fqdn = join '.' , $host , $zone;

my $rttm_args = {
	%$args,
	zone => $zone,
	fqdn => $fqdn,
};

print ">>>> Calling GetOneRTTM <<<<<<";

$response = $interface->GetOneRTTM($rttm_args);
&check_fault($response);

# check the status of the call
unless ($response->get_status() eq "success") { &output_messages($response); } 

print "Examine some bits of the Response: ";
print "Monitor: " . $response->get_data()->get_monitor();

my $region = $response->get_data()->get_region();

for my $r (@$region) {
	print "Regsion: " . $r->get_region_code();
	print "Regsion Status: " . $r->get_status();
}

#logout
$response = $interface->SessionLogout( $args );
unless ($response->get_status() eq "success") { 
	&output_messages($response);
}
print "<<<<< All Done >>>>>>>n";

# some helper functions
=pod
check_fault 
	evaluates the SOAP response for SOAP::WSDL::SOAP::Typelib::Fault11
	SOAP::WSDL::SOAP::Typelib::Fault11 objects are false in boolean context
	for 'fault_incompat' libraries,  the way to get this info is from the
		response->get_status() which will be 'failure', then 
		check the messages

output_messages 
	will print out any messages returned from the API

=cut

sub check_fault {
	my $response = shift;
	if (!$response) {
		die "Error calling SOAP method: ", $response->get_faultstring();
	}
}

sub output_messages {
	my $response = shift;
	
	print "Got a status code of " . $response->get_status();
	my $messages = $response->get_msgs();

	foreach $message (@$messages) {
		print "message:";
		print "  source: " . $message->get_source();
		print "  lvl: " . $message->get_lvl();
		print "  err_cd: " . $message->get_err_cd() if $message->get_err_cd();
		print "  info: " . $message->get_info();
	}
}

sub genRandomString {
	my ($max_length) = @_;
	$max_length ||= 10;
	return join('', map { chr(int(rand(26)) + ord('a')) } (1..$max_length));
}



Get Message Info

A <msgs> element is a list of zero or more messages with sub-elemnts

  • SOURCE: A debugging field. If reporting an error to your Dynect Concierge, be sure to include this.
  • LEVEL: The severity of the message. One of: ‘FATAL’, ‘ERROR’, ‘WARN’, or ‘INFO’
  • INFO: The actual message itself.
  • ERR_CD: An error code (if appropriate) regarding the message.

Here’s an example of a Perl utility function to take a response and gather
info from each of the messages element (uses SOAP::WSDL get_DATA methods)

sub output_messages {
	my $response = shift;
	
	print "Got a status code of " . $response->get_status();

	# grab a reference to the list of messages
	my $messages = $response->get_msgs();

	foreach $message (@$messages) {
		print "message:";
		print "  source: " . $message->get_source();
		print "  lvl: " . $message->get_lvl();
		print "  info: " . $message->get_info();
		print "  err_cd: " . $message->get_err_cd() if $message->get_err_cd();
	}
}

In the case of a successful call, the <msgs> will contain only one element,
SOAP::WSDL helpfully flatten this for you, so you can access the message INFO thusly:

$result->get_msgs()->get_info();

or

my $messages = $response->get_msgs();
$message->get_info();