Bulk Nat Creation
Problem this snippet solves:
Summary: This iControl script will bulk create NATs based on the contents of an input file.
This iControl script will read the contents of an input file containing nat origin:destination pairs and bulk create NATs based on those values.
How to use this snippet:
Syntax
NAT.pl bigip port username password create input_filename
NAT.pl bigip port username password delete_all
Input File: NAT.txt
1.1.1.1,2.2.2.1
1.1.1.2,2.2.2.2
1.1.1.3,2.2.2.3
1.1.1.4,2.2.2.4
1.1.1.5,2.2.2.5
iControl Script NAT.pl
Code :
#!/usr/bin/perl
#use SOAP::Lite + trace => qw(method debug);
use SOAP::Lite;
use MIME::Base64;
use Benchmark;
BEGIN { push (@INC, ".."); }
use iControlTypeCast;
#----------------------------------------------------------------------------
# Validate Arguments
#----------------------------------------------------------------------------
my $sHost = $ARGV[0];
my $sPort = $ARGV[1];
my $sUID = $ARGV[2];
my $sPWD = $ARGV[3];
my $sCommand = $ARGV[4];
my $sArg1 = $ARGV[5];
my $sArg2 = $ARGV[6];
my $sProtocol = "https";
if ( ("80" eq $sPort) or ("8080" eq $sPort) )
{
$sProtocol = "http";
}
if ( ($sHost eq "") or ($sPort eq "") or ($sUID eq "") or ($sPWD eq "") )
{
&usage();
}
sub usage()
{
my ($sCmd) = @_;
print "Usage: i_Nat_v3.pl host port uid pwd command [options]\n";
print " -----------------------------------------------------------\n";
if ( ($sCmd eq "") or ($sCmd eq "delete_all") )
{
print " delete_all - Deletes all NATs\n";
}
if ( ($sCmd eq "") or ($sCmd eq "create") )
{
print " create File Name - create NATs that in a file\n";
}
exit();
}
#----------------------------------------------------------------------------
# Transport Information
#----------------------------------------------------------------------------
sub SOAP::Transport::HTTP::Client::get_basic_credentials-->
{
return "$sUID" => "$sPWD";
}
$NAT = SOAP::Lite
-> uri('urn
-> proxy("$sProtocol://$sHost:$sPort/iControl/iControlPortal.cgi");
eval { $NAT->transport->http_request->header
(
'Authorization' =>
'Basic ' . MIME::Base64::encode("$sUID:$sPWD", '')-->
); };
if ( $sCommand eq "delete_all" )
{
&delete_nat();
}
elsif ( $sCommand eq "create" )
{
&create_NAT();
}
else
{
&usage();
}
#----------------------------------------------------------------------------
# checkResponse
#----------------------------------------------------------------------------
sub checkResponse()
{
my ($soapResponse) = (@_);
if ( $soapResponse->fault )
{
print $soapResponse->faultcode, " ", $soapResponse->faultstring, "\n";
exit();
}
}
#----------------------------------------------------------------------------
# delete_all
#----------------------------------------------------------------------------
sub delete_nat()
{
$soapResponse = $NAT->delete_all_nats();
}
#----------------------------------------------------------------------------
# create
#----------------------------------------------------------------------------
sub create_NAT()
{
#Read a file and print out the input
#$FILE is the input file name
($FILE) = $sArg1;
#$FP is a file point to the file provide in the command line
$ST = 1;
$VNAME = "";
$VLN = { state => $ST, vlans => $VNAME };
push @VLNSTRUCT, $VLN;
$UNITID = 1;
$CNT = 1;
open(FP, $FILE) || die "Cannot open file $FILE:\n";
$STIME = new Benchmark;
$NUM_IN_BATCH = 50;
$cur_count = 0;
while ()
{
/,/;
$ORGIP = $`;
chomp ($ORGIP);
$NATIP = $';
chomp ($NATIP);
#print "$ORGIP $NATIP\n";
$IPSTRUC = { translation_address => $NATIP, original_address => $ORGIP };
push @NATDEFLISTS, $IPSTRUC;
push @UNITIDLISTS, $UNITID;
push @VLANSLISTS, $VLN;
$cur_count++;
if ( $cur_count >= $NUM_IN_BATCH )
{
$soapResponse = $NAT->create
(
SOAP::Data->name ( nat_definitions => [@NATDEFLISTS] ),
SOAP::Data->name ( unit_ids => ( [@UNITIDLISTS] ) ),
SOAP::Data->name ( vlans => [@VLANSLISTS] )
);
&checkResponse($soapResponse);
splice(@NATDEFLISTS);
splice(@UNITIDLISTS);
splice(@VLANSLISTS);
$cur_count = 0;
}
}
if ($cur_count > 0)
{
$soapResponse = $NAT->create
(
SOAP::Data->name ( nat_definitions => [@NATDEFLISTS] ),
SOAP::Data->name ( unit_ids => ( [@UNITIDLISTS] ) ),
SOAP::Data->name ( vlans => [@VLANSLISTS] )
);
&checkResponse($soapResponse);
}
$ETIME = new Benchmark;
print "Took ", timestr(timediff($ETIME, $STIME));
close FP;
} Updated Jun 06, 2023
Version 2.0CodeCentral_194
Cirrostratus
Joined May 05, 2019
No CommentsBe the first to comment