#!/usr/bin/perl use strict; use Infoblox; my $result; my $members; my $member; my $convert; #Creates a new session object, used to fetch data and to push modifications my $session = Infoblox::Session->new( master => "infoblox.yourdomain.com", username => "testuser", password => "test" ); #Fail if you cant connect if ($session->status_code()) { die("Construct session failed: ", $session->status_code() . ":" . $session->status_detail()); } print "Session created successfully\n"; #Get all Networks and Ranges, store results in arrays my @network_result_array = $session->search( "object" => "Infoblox::DHCP::Network" ); my @range_result_array = $session->search( "object" => "Infoblox::DHCP::Range" ); #dumps all the current "networks" in the IB DB to STDOUT print "\n\n******************************************************\n"; print "* BEGIN NETWORK DUMP\n"; print "******************************************************\n"; foreach my $result (@network_result_array) { print $result->network(); $members=$result->members(); foreach $member (@$members) { print ", "; print $member->name(); } print "\n"; } #dumps all the current "ranges" in the IB DB to STDOUT print "\n\n******************************************************\n"; print "* BEGIN RANGE DUMP\n"; print "******************************************************\n"; foreach $result (@range_result_array) { print $result->network(); $member=$result->member(); if (defined $member) { print ", "; print $member->name(); } else { print ", Failover Set: "; $member=$result->failover_assoc(); print $member; } print "\n"; } #Creates two Infoblox DHCP Member Objects to be used as attributes pushed to each network my $member1 = Infoblox::DHCP::Member->new( name => "infoblox.yourdomain.com", ipv4addr => "10.0.0.1" ); my $member2 = Infoblox::DHCP::Member->new( name => "infobloxbackup.yourdomain.com", ipv4addr => "10.0.1.1" ); my $memberset = [$member1,$member2]; #Starts the process of altering every network to have members of infoblox and infobloxbackup(from above) print "\n\n******************************************************\n"; print "* BEGIN NETWORK CONVERSION\n"; print "******************************************************\n"; foreach $result (@network_result_array) { $members=$result->members(); $convert=0; foreach $member (@$members) { if($member->name() eq "infoblox.yourdomain.com") { #if contains infoblox.yourdomain.com, mark it for conversion $convert=1; } elsif($member->name() eq "infobloxdonttouch.yourdomain.com") { #if contains infobloxdonttouch, mark to not convert and break out of loop $convert=0; last; } } #if marked for conversion, do so if($convert==1) { print "Converting " . $result->network(); #the if statement pushed the memberset to the network... #but its not actually modified on the appliance til later(see below) if($result->members($memberset)) { #modifies the network on the appliance, displays "ok" if successful if($session->modify($result)) { print "...ok!\n"; } else { #catch some errors print "...FAILED to MODIFY!!!\n"; print "Status Code: " . $session->status_code(); print "\nStatus Detail: " . $session->status_detail() . "\n"; } } else { print "...FAILED!!!\n"; } } elsif($convert==0) { print "Skipping " . $result->network() . ", either doesn't contain infoblox.yourdomain.com or contains infobloxdonttouch\n"; } } print "\n\n******************************************************\n"; print "* BEGIN RANGE CONVERSION\n"; print "******************************************************\n"; #same as above, but for converting the "ranges" you must assign them to a pre-configured #failover set, I've used "FAILOVER-SET" as the name in this example script foreach $result (@range_result_array) { $member=$result->member(); if (defined $member) { if ($member->name() eq "infoblox.yourdomain.com") { #If range is assigned to infoblox.yourdomain.com, assign it to the failover set print "Converting " . $result->network; if ($result->failover_assoc("FAILOVER-SET")) { if($session->modify($result)) { print "...ok!\n"; } else { print "...FAILED to MODIFY!!!\n"; print "Status Code: " . $session->status_code(); print "\nStatus Detail: " . $session->status_detail() . "\n"; } } else { print "...FAILED!!!!\n"; } } else { #If its assigned to something but not infoblox.yourdomain.com, skip it print "Skipping " . $result->network . ", because it isn't currently assigned to infoblox.yourdomain.com\n"; } } else { #If its not assigned to any member currently, skip it print "Skipping " . $result->network . ", because it is not assigned to a member, or is already in a failover set.\n"; } } #Get a fresh session and all related session data $session = Infoblox::Session->new( master => "infoblox.yourdomain.com", username => "testuser", password => "test" ); @network_result_array = $session->search( "object" => "Infoblox::DHCP::Network", ); @range_result_array = $session->search( "object" => "Infoblox::DHCP::Range", ); print "\n\n******************************************************\n"; print "* BEGIN POST-OP NETWORK DUMP\n"; print "******************************************************\n"; foreach my $result (@network_result_array) { print $result->network(); $members=$result->members(); foreach $member (@$members) { print ", "; print $member->name(); } print "\n"; } print "\n\n******************************************************\n"; print "* BEGIN POST-OP RANGE DUMP\n"; print "******************************************************\n"; foreach $result (@range_result_array) { print $result->network(); $member=$result->member(); if (defined $member) { print " , "; print $member->name(); } else { print " , Failover Set: "; $member=$result->failover_assoc(); print $member; } print "\n"; }