#!/usr/bin/perl # Copyright 2015-2016 Infoblox, Inc. All Rights Reserved. # # Disclaimer: # THIS SOFTWARE IS PROVIDED BY INFOBLOX AND CONTRIBUTORS ``AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL INFOBLOX OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use LWP::UserAgent; use LWP::Protocol::https; use JSON::Parse 'parse_json'; use DateTime; # # return all the grid DHCP leases using WAPI # # output looks like this: # # lease 10.128.2.219 { # starts 2 2006/08/15 16:09:09; # ends 2 2006/08/15 20:09:09; # tstp 2 2006/08/15 20:09:09; # binding state free; # hardware ethernet 00:02:a5:ba:53:9b; # uid "\001\000\002\245\272S\233"; # } # # # infoblox credentials # $ib_user = 'riverbed'; $ib_pass = 'infoblox'; $ib_addr = '10.100.1.17'; $ib_netview = 'default'; # # script variable declaration # my $fields = "address,starts,ends,tstp,binding_state,hardware,uid"; # ignore self-signed certs $ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0; # requests per page my $ps = 1000; sub parse_lease { my ($lease_obj) = @_; printf "lease $address %s{\n", $lease_obj->{"address"}; if (defined $lease_obj->{"starts"}) { printf " starts %s;\n", timestamp($lease_obj->{"starts"}); } if (defined $lease_obj->{"ends"}) { printf " ends %s;\n", timestamp($lease_obj->{"ends"}); } if (defined $lease_obj->{"tstp"}) { printf " tstp %s;\n", timestamp($lease_obj->{"tstp"}); } printf " binding state %s;\n", lc($lease_obj->{"binding_state"}); printf " hardware ethernet %s;\n", $lease_obj->{"hardware"}; if (defined $lease_obj->{"uid"}) { printf " uid %s;\n", $lease_obj->{"uid"}; } printf "}\n\n"; } sub timestamp { my ($utime) = @_; #in: 1426701488 #out: 3 2015/03/18 17:58:08; my $dt = DateTime->from_epoch(epoch => $utime); return $dt->day_of_week ." " . $dt->ymd('/') . " " . $dt->hms; } # search for lease objects my $req = HTTP::Request->new(GET => "https://$ib_addr/wapi/v1.5/lease?_paging=1&_return_as_object=1&_return_fields=$fields&_max_results=$ps"); $req->content_type('application/json'); $req->authorization_basic($ib_user, $ib_pass); $req->content("{ \"network_view\":\"$ib_netview\", \"protocol\":\"IPV4\" }"); my $ua = LWP::UserAgent->new; my $res = $ua->request($req); my $content = parse_json($res->{"_content"}); my $next_page_id = $content->{"next_page_id"}; my $results = $content->{"result"}; foreach my $lease ( @$results ) { parse_lease($lease); } while ($next_page_id ne "") { my $req = HTTP::Request->new(GET => "https://$ib_addr/wapi/v1.5/lease?_page_id=$next_page_id"); $req->content_type('application/json'); $req->authorization_basic($ib_user, $ib_pass); $req->content("{ \"network_view\":\"$ib_netview\", \"protocol\":\"IPV4\" }"); $ua = LWP::UserAgent->new; $res = $ua->request($req); $content = parse_json($res->{"_content"}); $next_page_id = $content->{"next_page_id"}; $results = $content->{"result"}; foreach my $lease ( @$results ) { parse_lease($lease); } }