Perl Local Lb Rule
Problem this snippet solves:
This Perl script illustrates how to use the methods in the LocalLB Rule interface for managing iRules.
Code :
#!/usr/bin/perl #---------------------------------------------------------------------------- # The contents of this file are subject to the "END USER LICENSE AGREEMENT # FOR F5 Software Development Kit for iControl"; you may not use this file # except in compliance with the License. The License is included in the # iControl Software Development Kit. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # # The Original Code is iControl Code and related documentation # distributed by F5. # # The Initial Developer of the Original Code is F5 Networks, # Inc. Seattle, WA, USA. Portions created by F5 are Copyright (C) 1996-2010 # F5 Networks, Inc. All Rights Reserved. iControl (TM) is a registered # trademark of F5 Networks, Inc. # # Alternatively, the contents of this file may be used under the terms # of the GNU General Public License (the "GPL"), in which case the # provisions of GPL are applicable instead of those above. If you wish # to allow use of your version of this file only under the terms of the # GPL and not to allow others to use your version of this file under the # License, indicate your decision by deleting the provisions above and # replace them with the notice and other provisions required by the GPL. # If you do not delete the provisions above, a recipient may use your # version of this file under either the License or the GPL. #---------------------------------------------------------------------------- #use SOAP::Lite + trace => qw(method debug); use SOAP::Lite; use File::Basename; use Math::BigInt; #---------------------------------------------------------------------------- # Validate Arguments #---------------------------------------------------------------------------- my $sHost = $ARGV[0]; my $sUID = $ARGV[1]; my $sPWD = $ARGV[2]; my $sCmd = $ARGV[3]; my $sArg1 = $ARGV[4]; my $sArg2 = $ARGV[5]; my $sArg3 = $ARGV[6]; #============================================================================ sub usage() #============================================================================ { print "Usage: LocalLBRule.pl host uid pwd [options] \n"; print " [options]\n"; print " list - List all iRules\n"; print " backup dirname - Backup all iRules to specified local directory\n"; print " load filename - Load single iRule from specified filename (iRule name from filename)\n"; print " get iRulename - Display specified iRule\n"; print " delete iRulename - Delete specified iRule\n"; print " stats iRulename - Get Statistics for specified iRule\n"; - exit; } if ( ($sHost eq "") or ($sUID eq "") or ($sPWD eq "") ) { usage(); } #---------------------------------------------------------------------------- # Transport Information #---------------------------------------------------------------------------- sub SOAP::Transport::HTTP::Client::get_basic_credentials--> { return "$sUID" => "$sPWD"; } sub SOAP::Deserializer::typecast--> { my ($self, $value, $name, $attrs, $children, $type) = @_; my $retval = undef; if ( "{urn:iControl}Common.StatisticType" eq $type ) { $retval = $value; } return $retval; } $LocalLBRule = SOAP::Lite -> uri('urn:iControl:LocalLB/Rule') -> readable(1) -> proxy("https://$sHost/iControl/iControlPortal.cgi"); #============================================================================ sub getiRuleDefinitions() #============================================================================ { my($rulename) = (@_); if ( $rulename eq "" ) { $soapResponse = $LocalLBRule->query_all_rules(); &checkResponse($soapResponse); @RuleDefinitionList = @{$soapResponse->result}; return @RuleDefinitionList; } else { $soapResponse = $LocalLBRule->query_rule( SOAP::Data->name(rule_names => [$rulename]) ); &checkResponse($soapResponse); @RuleDefinitionList = @{$soapResponse->result}; $RuleDefinition = @RuleDefinitionList[0]; return $RuleDefinition; } } #============================================================================ sub getiRuleList() #============================================================================ { @RuleDefinitionList = &getiRuleDefinitions(); my $i = 0; print "-----------------\n"; print "iRule List\n"; print "-----------------\n"; foreach $RuleDefinition (@RuleDefinitionList) { $rule_name = $RuleDefinition->{"rule_name"}; $rule_definition = $RuleDefinition->{"rule_definition"}; if ( ! ($rule_name =~ m/_sys/) ) { print "[$i] $rule_name\n"; #print "Details: $rule_definition\n"; $i++; } } } #============================================================================ sub backupiRules() #============================================================================ { my($dir) = (@_); my $localFile = ""; my @RuleDefinitionList = &getiRuleDefinitions(); unless(-d $dir) { mkdir $dir; } foreach $RuleDefinition (@RuleDefinitionList) { $rule_name = $RuleDefinition->{"rule_name"}; $rule_definition = $RuleDefinition->{"rule_definition"}; if ( ! ($rule_name =~ m/_sys/) ) { $localFile = "${dir}/${rule_name}.tcl"; print "Creating ${localFile}...\n"; open (LOCAL_FILE, ">$localFile") or die("Can't open $localFile for output: $!"); print LOCAL_FILE $rule_definition; close (LOCAL_FILE); } } } #============================================================================ sub loadiRule() #============================================================================ { my($file) = (@_); my $file_data; my $chunk_size = 64*1024; open(LOCAL_FILE, "<$file") or die("Can't open $localFile for input: $!"); $bytes_read = read(LOCAL_FILE, $file_data, $chunk_size); close(LOCAL_FILE); $iRuleName = &basename($file); $iRuleName =~ s/.tcl$//g; $iRuleDefinition = { rule_name => $iRuleName, rule_definition => $file_data }; my $exists = &doesiRuleExist($iRuleName); if ( $exists ) { # Modify existing iRule $soapResponse = $LocalLBRule->modify_rule( SOAP::Data->name(rules => [$iRuleDefinition]) ); &checkResponse($soapResponse); print "iRule $iRuleName successfully updated\n"; } else { # Create new iRule $soapResponse = $LocalLBRule->create( SOAP::Data->name(rules => [$iRuleDefinition]) ); &checkResponse($soapResponse); print "iRule $iRuleName successfully created\n"; } } #============================================================================ sub getiRule() #============================================================================ { my($name) = (@_); $RuleDefinition = &getiRuleDefinitions($name); $rule_name = $RuleDefinition->{"rule_name"}; $rule_definition = $RuleDefinition->{"rule_definition"}; print "$rule_definition\n"; } #============================================================================ sub build64() #============================================================================ { ($UInt64) = (@_); $low = $UInt64->{"low"}; $high = $UInt64->{"high"}; # For some reason this doesn't work... #$value64 = Math::BigInt->new($high)->blsft(32)->bxor($low); $value64 = Math::BigInt->new(Math::BigInt->new($high)->blsft(32))->bxor($low); return $value64; } #============================================================================ sub getiRuleStats() #============================================================================ { my($name) = (@_); $soapResponse = $LocalLBRule->get_statistics( SOAP::Data->name(rule_names => [$name]) ); &checkResponse($soapResponse); my $RuleStatistics = $soapResponse->result; my @statistics = @{$RuleStatistics->{"statistics"}}; foreach $RuleStatisticEntry (@statistics) { $rule_name = $RuleStatisticEntry->{"rule_name"}; $event_name = $RuleStatisticEntry->{"event_name"}; $priority = $RuleStatisticEntry->{"priority"}; @StatisticA = @{$RuleStatisticEntry->{"statistics"}}; print "--------------------------------------\n"; print "RULE '$rule_name' STATISTICS\n"; print "-------------------- + ---------------\n"; foreach $Statistic (@StatisticA) { $type = $Statistic->{"type"}; $type =~ s/STATISTIC_RULE_//g; $value = &build64($Statistic->{"value"}); printf "%20s | %s\n", $type, $value; } print "-------------------- + ---------------\n"; } } #============================================================================ sub deleteiRule() #============================================================================ { my($name) = (@_); $soapResponse = $LocalLBRule->delete_rule( SOAP::Data->name(rule_names => [$name]) ); &checkResponse($soapResponse); print "iRule '$name' successfully deleted.\n"; } #============================================================================ sub doesiRuleExist() #============================================================================ { my($name) = (@_); my $exists = 0; if ( ! $name eq "" ) { my @RuleDefinitionList = &getiRuleDefinitions(); foreach $RuleDefinition (@RuleDefinitionList) { $rule_name = $RuleDefinition->{"rule_name"}; if ( $rule_name eq $name ) { $exists = 1; break; } } } return $exists; } #============================================================================ sub checkResponse() #============================================================================ { my ($soapResponse) = (@_); if ( $soapResponse->fault ) { print $soapResponse->faultcode, " ", $soapResponse->faultstring, "\n"; exit(); } } #============================================================================ # Main application code #============================================================================ if ( $sCmd eq "") { &usage; } elsif ( $sCmd eq "list" ) { &getiRuleList(); } elsif ( $sCmd eq "backup" ) { if ( $sArg1 eq "" ) { &usage(); } &backupiRules($sArg1); } elsif ( $sCmd eq "load" ) { if ( $sArg1 eq "" ) { &usage(); } &loadiRule($sArg1); } elsif ( $sCmd eq "get" ) { if ( $sArg1 eq "" ) { &usage(); } &getiRule($sArg1); } elsif ( $sCmd eq "delete" ) { if ( $sArg1 eq "" ) { &usage(); } &deleteiRule($sArg1); } elsif ( $sCmd eq "stats" ) { if ( $sArg1 eq "" ) { &usage(); } &getiRuleStats($sArg1); } else { &usage(); }
Published Mar 08, 2015
Version 1.0CodeCentral_194
Cirrus
Joined May 05, 2019
CodeCentral_194
Cirrus
Joined May 05, 2019
No CommentsBe the first to comment