<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Export Script: VM300 export all Config / Rulesets / Policy etc to excel. Error 500 in Automation/API Discussions</title>
    <link>https://live.paloaltonetworks.com/t5/automation-api-discussions/export-script-vm300-export-all-config-rulesets-policy-etc-to/m-p/192807#M1529</link>
    <description>&lt;P&gt;Palo Gurus,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Unit: VM-300&lt;/P&gt;&lt;P&gt;OS:&amp;nbsp;PAN-OS® 8.0 release (current)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need some help on a Perl script, that has been edited for security (IP, user etc), where I am able to:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Setup and API Admin, grant all permissions, use password without special charaters,&lt;/LI&gt;&lt;LI&gt;Setup an Admin Role for API user&lt;/LI&gt;&lt;LI&gt;Connect via https and test API to get the "key"to ensure credentials work, no errors there...&lt;BR /&gt;(&amp;nbsp;https://&amp;lt;hostname&amp;gt;/api/?type=keygen&amp;amp;user=&amp;lt;username&amp;gt;&amp;amp;password=&amp;lt;password&amp;gt; )&lt;/LI&gt;&lt;LI&gt;Installed Perl ( &lt;A href="https://learn.perl.org/installing/windows.html" target="_blank"&gt;https://learn.perl.org/installing/windows.html&lt;/A&gt; ) on Jump Box&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Jump Box is not domain joined and can reach&amp;nbsp;the PaloAlto Unit. via https: ..&lt;/P&gt;&lt;P&gt;When running script, under debug in the Perl IDE, it runs, acquires the API key, then suddenly stops with a 500 error&lt;/P&gt;&lt;P&gt;If i manually change the my $key and code the actual key from webpage, its then created a blank excel, and posts 500 error again.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;Getting the key..&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;500 Can't connect to 127.0.0.1:443&lt;/FONT&gt; &lt;EM&gt;&amp;lt; not the real IP of the Palo of course..&lt;/EM&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;Press any key to continue . . .&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt; 

use LWP::UserAgent;
use Excel::Writer::XLSX;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
use strict;

 

my $username="APIAdmin2017Sample";
my $password="notmypass";
my $paloIP = "127.0.0.1";

 

#get the key 
my $paloRESTaddr="https://$paloIP/api/?";
my $key=GetTheKey($paloRESTaddr, $username, $password);
my $datestring = localtime();
print "Local date and time: $datestring\n";

my $excelfile="Palo_Alto.xlsx";

 

#creating workbook
print "Creating the xlsx file...\n";
my $workbook = Excel::Writer::XLSX-&amp;gt;new( $excelfile );
die "Problems creating new Excel file: $!" unless defined $workbook;

 

my @addr_objects;

my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/address";
GetAddrObjects ($paloRESTaddr,$request, \@addr_objects, "vsys");

$request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/shared/address";
GetAddrObjects ($paloRESTaddr,$request, \@addr_objects, "shared");

AddrObjectsToXls (\@addr_objects,$workbook );


my @rullarray;
GetNATRules($paloRESTaddr,$key, \@rullarray);

 

#NatRulesToTxt(\@rullarray);
NatRulesToXLS(\@rullarray, $workbook);

my @rullaray_sec;

GetSecurityRules ($paloRESTaddr,$key, \@rullaray_sec);

SecurityRulesToXLS (\@rullaray_sec, $workbook);

 


######sub begin here############
sub AddrObjectsToXls
{
my $objectarray_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('Address Objects');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Object Name','Address','Tags','Description','Dev' );
CreateHeaders(0, $wrksheet, \@headers, $bold);
my @addr= @{$objectarray_ref};
my $row=1;
foreach my $i (0..$#addr) 
{
my $col=0;
print "$i"."==";
my $format = $workbook-&amp;gt;add_format();
my $name=${addr[$i]}{'Name'};
$wrksheet-&amp;gt;write($row,$col, $name, $format);
$col++;

my $address=${addr[$i]}{'Address'};
$wrksheet-&amp;gt;write($row,$col, $address, $format);
$col++;

my $tags=${addr[$i]}{'Tags'};
$wrksheet-&amp;gt;write($row,$col, $tags, $format);
$col++;

my $desc=${addr[$i]}{'Description'};
$wrksheet-&amp;gt;write($row,$col, $desc, $format);
$col++;

my $dev=${addr[$i]}{'Dev'};
$wrksheet-&amp;gt;write($row,$col, $dev, $format);
$col++;
$row++;

}
}

sub GetAddrObjects
{
my $host=$_[0];
my $request=$_[1];
my $objectarray_ref=$_[2];
my $which=$_[3];

my $reply=SendREST("\nGetting the $which address objects..\n",$host,$request);
#if ($which=~/shared/)
#{
# print $reply;
# exit;
#}

$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
my $addrobjects='';
$reply=~m/\&amp;lt;result\&amp;gt;.*\&amp;lt;address\&amp;gt;(.*)\&amp;lt;\/address\&amp;gt;\&amp;lt;\/result\&amp;gt;/;
if ($1)
{
$addrobjects=$1;
}
else
{
print "No address objects";
return;
}
#print $addrobjects;
while ($addrobjects=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{
my $addr_obj_txt=$2;
my %addr_obj_hash;
$addr_obj_hash{'Name'}=$1;
$addr_obj_hash{'Dev'}=$which;

my $address='';
if (($addr_obj_txt=~m/\&amp;lt;ip\-netmask\&amp;gt;(.*)\&amp;lt;\/ip\-netmask\&amp;gt;/) || ($addr_obj_txt=~m/\&amp;lt;ip\-range\&amp;gt;(.*)\&amp;lt;\/ip\-range\&amp;gt;/) || ($addr_obj_txt=~m/\&amp;lt;fqdn\&amp;gt;(.*)\&amp;lt;\/fqdn\&amp;gt;/))
{
$addr_obj_hash{'Address'}=$1; 
#print "\\\\\\\\\\\\\\".$1."\n";
}
if ($addr_obj_txt=~m/\&amp;lt;tag&amp;gt;(.*)\&amp;lt;\/tag\&amp;gt;/)
{
my @tags;
my $tags_txt=$1;
GetMembers ($tags_txt, \@tags);
$addr_obj_hash{'Tags'}=ArrayToString(\@tags);
}

if ($addr_obj_txt=~m/\&amp;lt;description&amp;gt;(.*)\&amp;lt;\/description\&amp;gt;/)
{
$addr_obj_hash{'Description'}= $1;
}
push @{$objectarray_ref}, \%addr_obj_hash;
}

}

sub SecurityRulesToXLS
{
my $rul_arr_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('Security Policies');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Rule #','Policy Name','Source Zone', 'Source Address', 'Source User','Hip Profile','Destination Zone','Destination Address', 'Service', 'Application', 'Action', 'Profile', 'Category','QoS','Log', 'Schedule','Option', 'Disabled');
CreateHeaders(0, $wrksheet, \@headers, $bold);
my @rules= @{$rul_arr_ref};
my $row=1;
foreach my $i (0..$#rules) 
{
my $col=0;
print "$i"."==";
my $rule_num=$i+1;

my $dis=${rules[$i]}{'Disabled'};
my $action=${rules[$i]}{'Action'};
my $format = $workbook-&amp;gt;add_format();
if ($dis=~m/yes/)
{

$format-&amp;gt;set_italic(1);

}
else
{
$format-&amp;gt;set_italic(0);
if ($action=~m/allow/)
{
$format-&amp;gt;set_color('green');
#print "!!!"
}
else
{
$format-&amp;gt;set_color('red');

}
}

$wrksheet-&amp;gt;write($row,$col, $rule_num, $format);
$col++;
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Name'},$format);
$col++;
my $from_ar_ref=${rules[$i]}{'From'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($from_ar_ref),$format);
$col++;
my $src_ar_ref=${rules[$i]}{'Source'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_ar_ref),$format);
$col++;

my $src_user_ref=${rules[$i]}{'S_user'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_user_ref),$format);
$col++;

my $h_profile_ref=${rules[$i]}{'H_profile'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($h_profile_ref),$format);
$col++;

my $to_ar_ref=${rules[$i]}{'To'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($to_ar_ref),$format);
$col++;
my $dst_ar_ref=${rules[$i]}{'Destination'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($dst_ar_ref),$format);
$col++;

my $srv_ar_ref=${rules[$i]}{'Service'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($srv_ar_ref),$format);
$col++;

my $app_ar_ref=${rules[$i]}{'Application'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($app_ar_ref),$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,$action,$format);
$col++;

my $profile=${rules[$i]}{'Profile'};
$wrksheet-&amp;gt;write($row,$col,$profile,$format);
$col++;

my $category_ref=${rules[$i]}{'Category'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($category_ref),$format);
$col++;

my $qos=${rules[$i]}{'QoS'};
$wrksheet-&amp;gt;write($row,$col,$qos,$format);
$col++;

my $log=${rules[$i]}{'Log'};
$wrksheet-&amp;gt;write($row,$col,$log,$format);
$col++;

my $schedule=${rules[$i]}{'Schedule'};
$wrksheet-&amp;gt;write($row,$col,$schedule,$format);
$col++;

my $sec_opt=${rules[$i]}{'SecOptions'};
$wrksheet-&amp;gt;write($row,$col,$sec_opt,$format);
$col++;

if ($dis=~m/yes/)
{
$wrksheet-&amp;gt;write($row,$col,$dis,$format);
}
$col++;

$row++;
}
}

sub GetSecurityRules
{
my $host=$_[0];
my $key=$_[1];
my $rullarray_ref=$_[2];
my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/rulebase/security";
my $reply=SendREST("\nGetting the security rules..",$host,$request);
$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
$reply=~m/\&amp;lt;security\&amp;gt;.*\&amp;lt;rules\&amp;gt;(.*)\&amp;lt;\/rules\&amp;gt;\&amp;lt;\/security\&amp;gt;/;
my $rules='';
if ($1)
{
$rules=$1;
}
else
{
print "No Security rules";
return;
}
while ($rules=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{
my $rule_txt=$2;
my %rule_hash;
$rule_hash{'Name'}=$1;

#getting source zone
my @from_mem;
my $from_regexp="\&amp;lt;from\&amp;gt;(.*?)\&amp;lt;\/from\&amp;gt;";
RunRegexp ($from_regexp, $rule_txt, \@from_mem );
$rule_hash{'From'}=\@from_mem;

#getting destination zone
my @to_mem;
my $to_regexp="\&amp;lt;to\&amp;gt;(.*?)\&amp;lt;\/to\&amp;gt;";
RunRegexp( $to_regexp, $rule_txt, \@to_mem);
$rule_hash{'To'}=\@to_mem;

#getting source address
my @source_mem;
my $source_regexp="\&amp;lt;source\&amp;gt;(.*?)\&amp;lt;\/source\&amp;gt;";
RunRegexp( $source_regexp, $rule_txt, \@source_mem);
$rule_hash{'Source'}=\@source_mem;

#getting destination address
my @dest_mem;
my $dest_regexp="\&amp;lt;destination\&amp;gt;(.*?)\&amp;lt;\/destination\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@dest_mem);
$rule_hash{'Destination'}=\@dest_mem;

#getting application
my @app_mem;
$dest_regexp="\&amp;lt;application\&amp;gt;(.*?)\&amp;lt;\/application\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@app_mem);
$rule_hash{'Application'}=\@app_mem;

#getting service
my @serv_mem;
$dest_regexp="\&amp;lt;service\&amp;gt;(.*?)\&amp;lt;\/service\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@serv_mem);
$rule_hash{'Service'}=\@serv_mem;

$rule_hash{'Action'}=GetAction($rule_txt);

$rule_hash{'Profile'}=GetProfile($rule_txt);

#log
$rule_hash{'Log'}=GetLog($rule_txt);

#source-user
my @s_user;
$dest_regexp="\&amp;lt;source\-user\&amp;gt;(.*?)\&amp;lt;\/source\-user\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@s_user);
$rule_hash{'S_user'}=\@s_user;

#hip-profile
my @h_profile;
$dest_regexp="\&amp;lt;hip\-profiles\&amp;gt;(.*?)\&amp;lt;\/hip\-profiles\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@h_profile);
$rule_hash{'H_profile'}=\@h_profile;

#category
my @category;
$dest_regexp="\&amp;lt;category\&amp;gt;(.*?)\&amp;lt;\/category\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@category);
$rule_hash{'Category'}=\@category;

$rule_hash{'QoS'}=GetQoS($rule_txt);
$rule_hash{'Schedule'}=GetSchedule($rule_txt);
$rule_hash{'SecOptions'}=GetSecOptions($rule_txt);
$rule_hash{'Disabled'}=GetDisabled($rule_txt);
push @{$rullarray_ref}, \%rule_hash;

}

}

sub NatRulesToXLS
{
my $rul_arr_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('NAT POlicies');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Rule #','Policy Name','Source Zone', 'Source Address', 'Destination Zone','Destination Address','Destination Interface', 'Service', 'Source Translation', 'Destination Translation', 'Disabled');
CreateHeaders(0, $wrksheet, \@headers, $bold);

my @rules= @{$rul_arr_ref};
my$row=1;
foreach my $i (0..$#rules) 
{

my $col=0;
print "$i"."==";
my $rule_num=$i+1;

my $dis=${rules[$i]}{'Disabled'};
my $format = $workbook-&amp;gt;add_format();
if ($dis=~m/yes/)
{

$format-&amp;gt;set_italic(1);
}
else
{
$format-&amp;gt;set_italic(0);
}

$wrksheet-&amp;gt;write($row,$col, $rule_num, $format);
$col++;
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Name'},$format);
$col++;
my $from_ar_ref=${rules[$i]}{'From'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($from_ar_ref),$format);
$col++;
my $src_ar_ref=${rules[$i]}{'Source'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_ar_ref),$format);
$col++;
my $to_ar_ref=${rules[$i]}{'To'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($to_ar_ref),$format);
$col++;
my $dst_ar_ref=${rules[$i]}{'Destination'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($dst_ar_ref),$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'To-Interface'},$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Service'},$format);
$col++;


my $src_tr_type=${rules[$i]}{'Source_Trans_type'};
if ($src_tr_type!~/none/)
{
my $addon=${rules[$i]}{'Source_Trans_addon'};
my $wr=$src_tr_type.", ".$addon;
$wrksheet-&amp;gt;write($row,$col, $wr,$format);

}
else
{
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Source_Trans_type'},$format);

}
$col++;

my $dst_tr_type=${rules[$i]}{'Dest_Trans_type'};
#print "$dst_tr_type---col=$col----row=$row\n";
if ($dst_tr_type!~/none/)
{
my $addon=${rules[$i]}{'Dest_Trans_addon'};
$wrksheet-&amp;gt;write($row,$col, $addon,$format);

}
else
{
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Dest_Trans_type'},$format);

}
$col++;


if ($dis=~m/yes/)
{
$wrksheet-&amp;gt;write($row,$col,$dis,$format);
}

$row++;
}


}

sub NatRulesToTxt
{
my $rul_arr_ref=$_[0];
my @rules= @{$rul_arr_ref};
foreach my $i (0..$#rules) 
{
my $from_ar_ref=${rules[$i]}{'From'};
my @from=@{$from_ar_ref};
my $from_txt='==';
foreach my $n (0..$#from) 
{
$from_txt=$from_txt.$from[$n]." ";

}
$from_txt=$from_txt."==";
my $output=$i." ".${rules[$i]}{'Name'}." ".$from_txt."\n";
print $output;

}


}


sub GetNATRules
#retrives NAT rules
{
my $host=$_[0];
my $key=$_[1];
my $rullarray_ref=$_[2];

#push @{$rullarray_ref}, 'onee';
#push @{$rullarray_ref}, 'twoee';

my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/rulebase/nat";
my $reply=SendREST("\nGetting the nat rules..",$host,$request);
$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
$reply=~m/\&amp;lt;nat\&amp;gt;.*\&amp;lt;rules\&amp;gt;(.*)\&amp;lt;\/rules\&amp;gt;\&amp;lt;\/nat\&amp;gt;/;
my $rules;
if ($1)
{
$rules=$1;
}
else
{
print "No NAT rules";
return;
}
while ($rules=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{

#print $1."\n";
my $rule_txt=$2;
my %rule_hash;
$rule_hash{'Name'}=$1;
#getting source zone
my @from_mem;
my $from_regexp="\&amp;lt;from\&amp;gt;(.*?)\&amp;lt;\/from\&amp;gt;";
RunRegexp ($from_regexp, $rule_txt, \@from_mem );
$rule_hash{'From'}=\@from_mem;

#getting destination zone
my @to_mem;
my $to_regexp="\&amp;lt;to\&amp;gt;(.*?)\&amp;lt;\/to\&amp;gt;";
RunRegexp( $to_regexp, $rule_txt, \@to_mem);
$rule_hash{'To'}=\@to_mem;

#getting source address
my @source_mem;
my $source_regexp="\&amp;lt;source\&amp;gt;(.*?)\&amp;lt;\/source\&amp;gt;";
RunRegexp( $source_regexp, $rule_txt, \@source_mem);
$rule_hash{'Source'}=\@source_mem;

#getting destination address
my @dest_mem;
my $dest_regexp="\&amp;lt;destination\&amp;gt;(.*?)\&amp;lt;\/destination\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@dest_mem);
$rule_hash{'Destination'}=\@dest_mem;

#getting non-member stuff
my %non_member_stuff;
GetNonMeberStuff(\%non_member_stuff, $rule_txt );
$rule_hash{'Service'}=$non_member_stuff{'service'};
$rule_hash{'To-Interface'}=$non_member_stuff{'To-Interface'};

#source translation
my %source_translation;
GetSourceTranslation(\%source_translation, $rule_txt );
$rule_hash{'Source_Trans_type'}=$source_translation{'type'};
$rule_hash{'Source_Trans_addon'}=$source_translation{'addon'};

#destination translation
my %destination_translation;
GetDestinationTranslation(\%destination_translation, $rule_txt);
$rule_hash{'Dest_Trans_type'}=$destination_translation{'type'};
$rule_hash{'Dest_Trans_addon'}=$destination_translation{'addon'};

$rule_hash{'Disabled'}=GetDisabled($rule_txt);

push @{$rullarray_ref}, \%rule_hash;
}

}

sub GetSecOptions
{
my $rule_txt=$_[0];
my $SecOptions='';
if ($rule_txt=~m/\&amp;lt;option\&amp;gt;(.*)\&amp;lt;\/option\&amp;gt;/)
{
my $option=$1;
if ($option=~m/\&amp;lt;disable\-server\-response\-inspection\&amp;gt;(.*)\&amp;lt;\/disable\-server\-response\-inspection\&amp;gt;/)
{
if ($1=~m/yes/)
{
$SecOptions="disable-server-response-inspection=yes"

}

}

}
return $SecOptions;
}
sub GetSchedule
{
my $rule_txt=$_[0];
my $schedule='';
if ($rule_txt=~m/\&amp;lt;schedule\&amp;gt;(.*)\&amp;lt;\/schedule\&amp;gt;/)
{

$schedule=$1;
}
return $schedule;
}

sub GetQoS
{
my $rule_txt=$_[0];
my $qos='';
my $q='';
if($rule_txt=~m/\&amp;lt;qos\&amp;gt;(.*)\&amp;lt;\/qos\&amp;gt;/)
{
$q=$1;
if ($q=~m/\&amp;lt;marking\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;(.*?)\&amp;lt;\/(?:.*?)\&amp;gt;\s+\&amp;lt;\/marking\&amp;gt;/)
{
$qos=$1."=".$2;

}
elsif ($q=~m/\&amp;lt;marking\&amp;gt;\s+\&amp;lt;(.*?)\/\&amp;gt;\s+\&amp;lt;\/marking\&amp;gt;/)
{
$qos=$1;
}
}


return $qos;
}

sub GetLog
{
my $rule_txt=$_[0];
my $log='';
$rule_txt=~m/\&amp;lt;log\-start\&amp;gt;(.*)\&amp;lt;\/log\-start\&amp;gt;/;
if ($1=~m/yes/)
{
$log="log at start";

}
$rule_txt=~m/\&amp;lt;log\-end\&amp;gt;(.*)\&amp;lt;\/log\-end\&amp;gt;/;
if ($1=~m/yes/)
{

$log=$log."; log at end";
}
$log=~s/^;\s//;
#print "-----------//-----------\n";
#print $log."\n";
return $log;
}


sub GetProfile
{
my $rule_txt=$_[0];
my $profile='';
my $ret='';
$rule_txt=~m/\&amp;lt;profile-setting\&amp;gt;(.*)\&amp;lt;\/profile-setting\&amp;gt;/;
if ($1)
{
$profile=$1;

if ($profile=~m/\&amp;lt;profiles\&amp;gt;(.*)\&amp;lt;\/profiles\&amp;gt;/)
{
$profile=$1;

my $url_filt="\&amp;lt;url\-filtering\&amp;gt;(.*?)\&amp;lt;\/url\-filtering\&amp;gt;";
if ($profile=~m/$url_filt/)
{
my @url_filt;
RunRegexp( $url_filt, $profile, \@url_filt);
$ret=$ret."url filtering=".ArrayToString(\@url_filt)."; ";

}
my $virus="\&amp;lt;virus\&amp;gt;(.*?)\&amp;lt;\/virus\&amp;gt;";
if ($profile=~m/$virus/)
{
my @virus;
RunRegexp( $virus, $profile, \@virus);
$ret=$ret."virus=".ArrayToString(\@virus)."; ";


}

my $spyware="\&amp;lt;spyware\&amp;gt;(.*?)\&amp;lt;\/spyware\&amp;gt;";
if ($profile=~m/$spyware/)
{
my @spyware;
RunRegexp( $spyware, $profile, \@spyware);
$ret=$ret."spyware=".ArrayToString(\@spyware)."; ";

}

my $vulnerability="\&amp;lt;vulnerability\&amp;gt;(.*?)\&amp;lt;\/vulnerability\&amp;gt;";
if ($profile=~m/$vulnerability/)
{
my @vulnerability;
RunRegexp( $vulnerability, $profile, \@vulnerability);
$ret=$ret."vulnerability=".ArrayToString(\@vulnerability)."; ";

}

my $wildfire="\&amp;lt;wildfire\-analysis\&amp;gt;(.*?)\&amp;lt;\/wildfire\-analysis\&amp;gt;";
if ($profile=~m/$wildfire/)
{
my @wildfire;
RunRegexp( $wildfire, $profile, \@wildfire);
$ret=$ret."wildfire=".ArrayToString(\@wildfire)."; ";

}

my $data_filt="\&amp;lt;data\-filtering&amp;gt;(.*?)\&amp;lt;\/data\-filtering&amp;gt;";
if ($profile=~m/$data_filt/)
{
my @data_filt;
RunRegexp( $data_filt, $profile, \@data_filt);
$ret=$ret."data filtering=".ArrayToString(\@data_filt)."; ";

}

my $file_blck="\&amp;lt;file\-blocking&amp;gt;(.*?)\&amp;lt;\/file\-blocking";
if ($profile=~m/$file_blck/)
{
my @file_blck;
RunRegexp( $file_blck, $profile, \@file_blck);
$ret=$ret."file blocking=".ArrayToString(\@file_blck)."; ";

}
}
elsif ($profile=~m/\&amp;lt;group\&amp;gt;(.*)\&amp;lt;\/group\&amp;gt;/)
{
$profile=$1;
my @group;
GetMembers($profile,\@group);
$ret=$ret."Group=".ArrayToString(\@group)."; ";
}
}
#print $ret."\n";
return $ret;
}

sub GetAction
{
my $rule_txt=$_[0];
my $action='';
$rule_txt=~m/\&amp;lt;action\&amp;gt;(.*)\&amp;lt;\/action\&amp;gt;/;
$action=$1;
return $action;
}


sub GetDisabled
{
my $rule_txt=$_[0];
my $dis='';
$rule_txt=~m/\&amp;lt;disabled\&amp;gt;(.*)\&amp;lt;\/disabled\&amp;gt;/;
if ($1=~m/yes/)
{
$dis='yes';
}
else
{
$dis='no';
}
return $dis;
}

sub GetDestinationTranslation
{
my $destination_translation_ref=$_[0];
my $rule_txt=$_[1];
if ($rule_txt!~/destination\-translation/)
{
${$destination_translation_ref}{'type'}='none';


}
else
{
#$rule_txt=~m/&amp;lt;destination-translation&amp;gt;\s*&amp;lt;translated-port&amp;gt;(.*)&amp;lt;\/translated-port&amp;gt;\s*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/destination-translation&amp;gt;/;
my $dest_tr='';
$rule_txt=~m/destination\-translation&amp;gt;.*&amp;lt;translated\-address&amp;gt;(.*)&amp;lt;\/translated\-address&amp;gt;.*&amp;lt;\/destination\-translation&amp;gt;/;
$dest_tr="address: $1";
if ($rule_txt=~m/destination\-translation&amp;gt;.*&amp;lt;translated\-port&amp;gt;(.*)&amp;lt;\/translated\-port&amp;gt;.*&amp;lt;\/destination\-translation&amp;gt;/)
{

$dest_tr=$dest_tr.",port: $1";
}
#print $rule_txt."\n";
#exit;
${$destination_translation_ref}{'addon'}=$dest_tr;
}

}



sub GetSourceTranslation
{
my $source_translation_ref=$_[0];
my $rule_txt=$_[1];
#print "----------\n";
#print $rule_txt;
#print "----------\n";
if ($rule_txt!~/source\-translation/)
{
${$source_translation_ref}{'type'}='none';

}
else
{
#print $rule_txt;
#exit;
$rule_txt=~m/\&amp;lt;source\-translation\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;/;
${$source_translation_ref}{'type'}=$1;
my $type=$1;
if ($type=~m/dynamic-ip-and-port/)
{
$rule_txt=~m/\&amp;lt;dynamic-ip-and-port\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;/;
#${$source_translation_ref}{'addon'}=$1;
my $d_ip_a_port=$1;
#print "+++++++++++ $d_ip_a_port +++++++++++++++\n";

if ($d_ip_a_port=~m/translated\-address/)
{
my @tr_add;
$rule_txt=~m/\&amp;lt;dynamic-ip-and-port&amp;gt;\s+\&amp;lt;translated\-address\&amp;gt;(.*)\&amp;lt;\/translated\-address\&amp;gt;/;
my $mem=$1;
GetMembers($mem,\@tr_add);
#print Dumper @tr_add;
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
elsif ($d_ip_a_port=~m/interface\-address/)
{
$rule_txt=~m/\&amp;lt;source-translation\&amp;gt;\s*\&amp;lt;dynamic-ip-and-port\&amp;gt;\s*\&amp;lt;interface\-address&amp;gt;\s*&amp;lt;interface&amp;gt;(.*?)&amp;lt;\/interface&amp;gt;\s*&amp;lt;ip&amp;gt;(.*?)&amp;lt;\/ip&amp;gt;\s*&amp;lt;\/interface-address&amp;gt;/;
${$source_translation_ref}{'addon'}="$1, $2";


}

}
elsif ($type=~m/dynamic-ip/)
{
my @tr_add;
#print $rule_txt;
#exit;
$rule_txt=~m/&amp;lt;dynamic-ip&amp;gt;.*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/dynamic-ip&amp;gt;\s*&amp;lt;\/source-translation&amp;gt;/;
my $mem=$1;
GetMembers($mem,\@tr_add);

if ($rule_txt=~m/\&amp;lt;dynamic-ip\&amp;gt;.*\&amp;lt;fallback\&amp;gt;/)
{
if ($rule_txt=~m/\&amp;lt;fallback&amp;gt;\s*\&amp;lt;interface-address\&amp;gt;\s*&amp;lt;ip&amp;gt;(.*)&amp;lt;\/ip&amp;gt;\s*&amp;lt;interface&amp;gt;(.*)&amp;lt;\/interface&amp;gt;\s*&amp;lt;\/interface-address&amp;gt;\s*&amp;lt;\/fallback\&amp;gt;/)
{
#print "$1 $2";
#exit;
push @tr_add, "Fall-back interface address: $1";
push @tr_add, "Fall-back interface : $2";
}
elsif ($rule_txt=~m/\&amp;lt;fallback&amp;gt;\s*\&amp;lt;translated\-address\&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/fallback\&amp;gt;/)
{
#print $rule_txt;
#exit;
my @t2;
my $mem=$1;
GetMembers($mem,\@t2);
$mem=ArrayToString(\@t2);
push @tr_add, "Fallback address: $mem";

}
}
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
elsif ($type=~m/static-ip/)
{
my @tr_add;
#print $rule_txt."\n";
#exit;
$rule_txt=~m/&amp;lt;static-ip&amp;gt;.*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;.*&amp;lt;\/static-ip&amp;gt;/;
push @tr_add, "$1";
$rule_txt=~m/&amp;lt;static-ip&amp;gt;.*&amp;lt;bi\-directional&amp;gt;(.*)&amp;lt;\/bi\-directional&amp;gt;.*&amp;lt;\/static-ip&amp;gt;/;
push @tr_add, "bi-directional: $1";
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
}


}


sub GetNonMeberStuff
{
my $non_member_stuff_ref=$_[0];
my $rule_txt=$_[1];
#get service
#doing through the array, because we already have sub for that...we don't need array, but I am too lazy to rewrite the sub
my @array;
my $regexp="\&amp;lt;service\&amp;gt;(.*?)\&amp;lt;\/service\&amp;gt;";
RunRegexp( $regexp, $rule_txt, \@array);
my $variab= pop @array;
${$non_member_stuff_ref}{'service'}=$variab;

$regexp="\&amp;lt;to\-interface\&amp;gt;(.*?)\&amp;lt;\/to\-interface\&amp;gt;";
RunRegexp( $regexp, $rule_txt, \@array);
$variab= pop @array;
${$non_member_stuff_ref}{'To-Interface'}=$variab;

}



sub RunRegexp
{
my $regexp=$_[0];
my $rule_txt=$_[1];
my $mem_array_ref=$_[2];
#print $rule_txt."\n";
#print "-------//-------------//--------";
#print $regexp."\n\n";
#exit;

while ($rule_txt=~m/$regexp/gs)
{
my $mem=$1;
#print "=========RunRegexp=============="."\n";
#print $mem."\n";
#exit;
GetMembers($mem,$mem_array_ref);
#print ArrayToString (@{$mem_array_ref});
#print "\n";
#print "\n";
}
}


sub GetMembers
#pushes the array with members from the text
#if there is no members, pushes the text itself
{
my $txt=$_[0];
my $array_ref=$_[1];
if ($txt=~m/member/)
{
while ($txt=~m/\&amp;lt;member\&amp;gt;(.*?)\&amp;lt;\/member\&amp;gt;/gs)
{
#print $1."\n";
#push the member into the array
push @{$array_ref}, $1;
}

}
else
{
#as long as we do not have members, push the whole thing into the array
push @{$array_ref}, $txt;

}

}


sub GetTheKey
#retrievs the key
{
my $host=$_[0];
my $username=$_[1];
my $password=$_[2];
my $request="type=keygen&amp;amp;user=$username&amp;amp;password=$password";
my $reply=SendREST("Getting the key..",$host,$request);
if ($reply=~m/\&amp;lt;key\&amp;gt;(.*)\&amp;lt;\/key\&amp;gt;/)
{
my $key=$1;
return $key;
}
else
{
print "Error while getting the key\n";
print $reply."\n";
exit;
}


}

sub SendREST
#sends RESTful request and returns a response
{
my $reason=$_[0];
my $host=$_[1];
my $request=$_[2];
my $restline="$paloRESTaddr$request";
#print $restline;
#exit;
my $ua = LWP::UserAgent-&amp;gt;new;
$ua-&amp;gt;timeout(10);
$ua-&amp;gt;ssl_opts( verify_hostnames =&amp;gt; 0 ); 
#$ua-&amp;gt;env_proxy;
print "$reason\n";
my $response = $ua-&amp;gt;get($restline);
my $reply='';
if ($response-&amp;gt;is_success) {
$reply= $response-&amp;gt;decoded_content; 
if ($reply=~m/error/)
{
print $reply;
exit;
}

}
else {
$reply= $response-&amp;gt;status_line;
print $reply."\n";
exit;
}
return $reply;
}

sub CreateHeaders
#creates headers , on row (starts from 0) 
{
my $row=$_[0];
my $wrksheet=$_[1];
my $headers_ref=$_[2];
my $bold=$_[3];
foreach my $i (0..$#{$headers_ref}) 
{
my $header=shift @{$headers_ref};
$wrksheet-&amp;gt;write_rich_string( $row, $i, $bold, $header );
$i++; 
}

}

sub ArrayToString
{
my $ar_ref=$_[0];
my @from=@{$ar_ref};
my $m_txt='';
foreach my $n (0..$#from) 
{
$m_txt=$m_txt.$from[$n].", ";
}
#remove two last characters (last comma and space)
$m_txt=~s/..$//; 
return $m_txt
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 22 Dec 2017 00:18:02 GMT</pubDate>
    <dc:creator>TSchouwstra</dc:creator>
    <dc:date>2017-12-22T00:18:02Z</dc:date>
    <item>
      <title>Export Script: VM300 export all Config / Rulesets / Policy etc to excel. Error 500</title>
      <link>https://live.paloaltonetworks.com/t5/automation-api-discussions/export-script-vm300-export-all-config-rulesets-policy-etc-to/m-p/192807#M1529</link>
      <description>&lt;P&gt;Palo Gurus,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Unit: VM-300&lt;/P&gt;&lt;P&gt;OS:&amp;nbsp;PAN-OS® 8.0 release (current)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need some help on a Perl script, that has been edited for security (IP, user etc), where I am able to:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Setup and API Admin, grant all permissions, use password without special charaters,&lt;/LI&gt;&lt;LI&gt;Setup an Admin Role for API user&lt;/LI&gt;&lt;LI&gt;Connect via https and test API to get the "key"to ensure credentials work, no errors there...&lt;BR /&gt;(&amp;nbsp;https://&amp;lt;hostname&amp;gt;/api/?type=keygen&amp;amp;user=&amp;lt;username&amp;gt;&amp;amp;password=&amp;lt;password&amp;gt; )&lt;/LI&gt;&lt;LI&gt;Installed Perl ( &lt;A href="https://learn.perl.org/installing/windows.html" target="_blank"&gt;https://learn.perl.org/installing/windows.html&lt;/A&gt; ) on Jump Box&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;Jump Box is not domain joined and can reach&amp;nbsp;the PaloAlto Unit. via https: ..&lt;/P&gt;&lt;P&gt;When running script, under debug in the Perl IDE, it runs, acquires the API key, then suddenly stops with a 500 error&lt;/P&gt;&lt;P&gt;If i manually change the my $key and code the actual key from webpage, its then created a blank excel, and posts 500 error again.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;Getting the key..&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;500 Can't connect to 127.0.0.1:443&lt;/FONT&gt; &lt;EM&gt;&amp;lt; not the real IP of the Palo of course..&lt;/EM&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;Press any key to continue . . .&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt; 

use LWP::UserAgent;
use Excel::Writer::XLSX;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
use strict;

 

my $username="APIAdmin2017Sample";
my $password="notmypass";
my $paloIP = "127.0.0.1";

 

#get the key 
my $paloRESTaddr="https://$paloIP/api/?";
my $key=GetTheKey($paloRESTaddr, $username, $password);
my $datestring = localtime();
print "Local date and time: $datestring\n";

my $excelfile="Palo_Alto.xlsx";

 

#creating workbook
print "Creating the xlsx file...\n";
my $workbook = Excel::Writer::XLSX-&amp;gt;new( $excelfile );
die "Problems creating new Excel file: $!" unless defined $workbook;

 

my @addr_objects;

my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/address";
GetAddrObjects ($paloRESTaddr,$request, \@addr_objects, "vsys");

$request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/shared/address";
GetAddrObjects ($paloRESTaddr,$request, \@addr_objects, "shared");

AddrObjectsToXls (\@addr_objects,$workbook );


my @rullarray;
GetNATRules($paloRESTaddr,$key, \@rullarray);

 

#NatRulesToTxt(\@rullarray);
NatRulesToXLS(\@rullarray, $workbook);

my @rullaray_sec;

GetSecurityRules ($paloRESTaddr,$key, \@rullaray_sec);

SecurityRulesToXLS (\@rullaray_sec, $workbook);

 


######sub begin here############
sub AddrObjectsToXls
{
my $objectarray_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('Address Objects');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Object Name','Address','Tags','Description','Dev' );
CreateHeaders(0, $wrksheet, \@headers, $bold);
my @addr= @{$objectarray_ref};
my $row=1;
foreach my $i (0..$#addr) 
{
my $col=0;
print "$i"."==";
my $format = $workbook-&amp;gt;add_format();
my $name=${addr[$i]}{'Name'};
$wrksheet-&amp;gt;write($row,$col, $name, $format);
$col++;

my $address=${addr[$i]}{'Address'};
$wrksheet-&amp;gt;write($row,$col, $address, $format);
$col++;

my $tags=${addr[$i]}{'Tags'};
$wrksheet-&amp;gt;write($row,$col, $tags, $format);
$col++;

my $desc=${addr[$i]}{'Description'};
$wrksheet-&amp;gt;write($row,$col, $desc, $format);
$col++;

my $dev=${addr[$i]}{'Dev'};
$wrksheet-&amp;gt;write($row,$col, $dev, $format);
$col++;
$row++;

}
}

sub GetAddrObjects
{
my $host=$_[0];
my $request=$_[1];
my $objectarray_ref=$_[2];
my $which=$_[3];

my $reply=SendREST("\nGetting the $which address objects..\n",$host,$request);
#if ($which=~/shared/)
#{
# print $reply;
# exit;
#}

$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
my $addrobjects='';
$reply=~m/\&amp;lt;result\&amp;gt;.*\&amp;lt;address\&amp;gt;(.*)\&amp;lt;\/address\&amp;gt;\&amp;lt;\/result\&amp;gt;/;
if ($1)
{
$addrobjects=$1;
}
else
{
print "No address objects";
return;
}
#print $addrobjects;
while ($addrobjects=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{
my $addr_obj_txt=$2;
my %addr_obj_hash;
$addr_obj_hash{'Name'}=$1;
$addr_obj_hash{'Dev'}=$which;

my $address='';
if (($addr_obj_txt=~m/\&amp;lt;ip\-netmask\&amp;gt;(.*)\&amp;lt;\/ip\-netmask\&amp;gt;/) || ($addr_obj_txt=~m/\&amp;lt;ip\-range\&amp;gt;(.*)\&amp;lt;\/ip\-range\&amp;gt;/) || ($addr_obj_txt=~m/\&amp;lt;fqdn\&amp;gt;(.*)\&amp;lt;\/fqdn\&amp;gt;/))
{
$addr_obj_hash{'Address'}=$1; 
#print "\\\\\\\\\\\\\\".$1."\n";
}
if ($addr_obj_txt=~m/\&amp;lt;tag&amp;gt;(.*)\&amp;lt;\/tag\&amp;gt;/)
{
my @tags;
my $tags_txt=$1;
GetMembers ($tags_txt, \@tags);
$addr_obj_hash{'Tags'}=ArrayToString(\@tags);
}

if ($addr_obj_txt=~m/\&amp;lt;description&amp;gt;(.*)\&amp;lt;\/description\&amp;gt;/)
{
$addr_obj_hash{'Description'}= $1;
}
push @{$objectarray_ref}, \%addr_obj_hash;
}

}

sub SecurityRulesToXLS
{
my $rul_arr_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('Security Policies');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Rule #','Policy Name','Source Zone', 'Source Address', 'Source User','Hip Profile','Destination Zone','Destination Address', 'Service', 'Application', 'Action', 'Profile', 'Category','QoS','Log', 'Schedule','Option', 'Disabled');
CreateHeaders(0, $wrksheet, \@headers, $bold);
my @rules= @{$rul_arr_ref};
my $row=1;
foreach my $i (0..$#rules) 
{
my $col=0;
print "$i"."==";
my $rule_num=$i+1;

my $dis=${rules[$i]}{'Disabled'};
my $action=${rules[$i]}{'Action'};
my $format = $workbook-&amp;gt;add_format();
if ($dis=~m/yes/)
{

$format-&amp;gt;set_italic(1);

}
else
{
$format-&amp;gt;set_italic(0);
if ($action=~m/allow/)
{
$format-&amp;gt;set_color('green');
#print "!!!"
}
else
{
$format-&amp;gt;set_color('red');

}
}

$wrksheet-&amp;gt;write($row,$col, $rule_num, $format);
$col++;
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Name'},$format);
$col++;
my $from_ar_ref=${rules[$i]}{'From'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($from_ar_ref),$format);
$col++;
my $src_ar_ref=${rules[$i]}{'Source'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_ar_ref),$format);
$col++;

my $src_user_ref=${rules[$i]}{'S_user'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_user_ref),$format);
$col++;

my $h_profile_ref=${rules[$i]}{'H_profile'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($h_profile_ref),$format);
$col++;

my $to_ar_ref=${rules[$i]}{'To'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($to_ar_ref),$format);
$col++;
my $dst_ar_ref=${rules[$i]}{'Destination'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($dst_ar_ref),$format);
$col++;

my $srv_ar_ref=${rules[$i]}{'Service'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($srv_ar_ref),$format);
$col++;

my $app_ar_ref=${rules[$i]}{'Application'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($app_ar_ref),$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,$action,$format);
$col++;

my $profile=${rules[$i]}{'Profile'};
$wrksheet-&amp;gt;write($row,$col,$profile,$format);
$col++;

my $category_ref=${rules[$i]}{'Category'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($category_ref),$format);
$col++;

my $qos=${rules[$i]}{'QoS'};
$wrksheet-&amp;gt;write($row,$col,$qos,$format);
$col++;

my $log=${rules[$i]}{'Log'};
$wrksheet-&amp;gt;write($row,$col,$log,$format);
$col++;

my $schedule=${rules[$i]}{'Schedule'};
$wrksheet-&amp;gt;write($row,$col,$schedule,$format);
$col++;

my $sec_opt=${rules[$i]}{'SecOptions'};
$wrksheet-&amp;gt;write($row,$col,$sec_opt,$format);
$col++;

if ($dis=~m/yes/)
{
$wrksheet-&amp;gt;write($row,$col,$dis,$format);
}
$col++;

$row++;
}
}

sub GetSecurityRules
{
my $host=$_[0];
my $key=$_[1];
my $rullarray_ref=$_[2];
my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/rulebase/security";
my $reply=SendREST("\nGetting the security rules..",$host,$request);
$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
$reply=~m/\&amp;lt;security\&amp;gt;.*\&amp;lt;rules\&amp;gt;(.*)\&amp;lt;\/rules\&amp;gt;\&amp;lt;\/security\&amp;gt;/;
my $rules='';
if ($1)
{
$rules=$1;
}
else
{
print "No Security rules";
return;
}
while ($rules=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{
my $rule_txt=$2;
my %rule_hash;
$rule_hash{'Name'}=$1;

#getting source zone
my @from_mem;
my $from_regexp="\&amp;lt;from\&amp;gt;(.*?)\&amp;lt;\/from\&amp;gt;";
RunRegexp ($from_regexp, $rule_txt, \@from_mem );
$rule_hash{'From'}=\@from_mem;

#getting destination zone
my @to_mem;
my $to_regexp="\&amp;lt;to\&amp;gt;(.*?)\&amp;lt;\/to\&amp;gt;";
RunRegexp( $to_regexp, $rule_txt, \@to_mem);
$rule_hash{'To'}=\@to_mem;

#getting source address
my @source_mem;
my $source_regexp="\&amp;lt;source\&amp;gt;(.*?)\&amp;lt;\/source\&amp;gt;";
RunRegexp( $source_regexp, $rule_txt, \@source_mem);
$rule_hash{'Source'}=\@source_mem;

#getting destination address
my @dest_mem;
my $dest_regexp="\&amp;lt;destination\&amp;gt;(.*?)\&amp;lt;\/destination\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@dest_mem);
$rule_hash{'Destination'}=\@dest_mem;

#getting application
my @app_mem;
$dest_regexp="\&amp;lt;application\&amp;gt;(.*?)\&amp;lt;\/application\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@app_mem);
$rule_hash{'Application'}=\@app_mem;

#getting service
my @serv_mem;
$dest_regexp="\&amp;lt;service\&amp;gt;(.*?)\&amp;lt;\/service\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@serv_mem);
$rule_hash{'Service'}=\@serv_mem;

$rule_hash{'Action'}=GetAction($rule_txt);

$rule_hash{'Profile'}=GetProfile($rule_txt);

#log
$rule_hash{'Log'}=GetLog($rule_txt);

#source-user
my @s_user;
$dest_regexp="\&amp;lt;source\-user\&amp;gt;(.*?)\&amp;lt;\/source\-user\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@s_user);
$rule_hash{'S_user'}=\@s_user;

#hip-profile
my @h_profile;
$dest_regexp="\&amp;lt;hip\-profiles\&amp;gt;(.*?)\&amp;lt;\/hip\-profiles\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@h_profile);
$rule_hash{'H_profile'}=\@h_profile;

#category
my @category;
$dest_regexp="\&amp;lt;category\&amp;gt;(.*?)\&amp;lt;\/category\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@category);
$rule_hash{'Category'}=\@category;

$rule_hash{'QoS'}=GetQoS($rule_txt);
$rule_hash{'Schedule'}=GetSchedule($rule_txt);
$rule_hash{'SecOptions'}=GetSecOptions($rule_txt);
$rule_hash{'Disabled'}=GetDisabled($rule_txt);
push @{$rullarray_ref}, \%rule_hash;

}

}

sub NatRulesToXLS
{
my $rul_arr_ref=$_[0];
my $workbook=$_[1];
my $wrksheet = $workbook-&amp;gt;add_worksheet('NAT POlicies');
my $bold = $workbook-&amp;gt;add_format( bold =&amp;gt; 1 );
my @headers=('Rule #','Policy Name','Source Zone', 'Source Address', 'Destination Zone','Destination Address','Destination Interface', 'Service', 'Source Translation', 'Destination Translation', 'Disabled');
CreateHeaders(0, $wrksheet, \@headers, $bold);

my @rules= @{$rul_arr_ref};
my$row=1;
foreach my $i (0..$#rules) 
{

my $col=0;
print "$i"."==";
my $rule_num=$i+1;

my $dis=${rules[$i]}{'Disabled'};
my $format = $workbook-&amp;gt;add_format();
if ($dis=~m/yes/)
{

$format-&amp;gt;set_italic(1);
}
else
{
$format-&amp;gt;set_italic(0);
}

$wrksheet-&amp;gt;write($row,$col, $rule_num, $format);
$col++;
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Name'},$format);
$col++;
my $from_ar_ref=${rules[$i]}{'From'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($from_ar_ref),$format);
$col++;
my $src_ar_ref=${rules[$i]}{'Source'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($src_ar_ref),$format);
$col++;
my $to_ar_ref=${rules[$i]}{'To'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($to_ar_ref),$format);
$col++;
my $dst_ar_ref=${rules[$i]}{'Destination'};
$wrksheet-&amp;gt;write($row,$col,ArrayToString($dst_ar_ref),$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'To-Interface'},$format);
$col++;

$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Service'},$format);
$col++;


my $src_tr_type=${rules[$i]}{'Source_Trans_type'};
if ($src_tr_type!~/none/)
{
my $addon=${rules[$i]}{'Source_Trans_addon'};
my $wr=$src_tr_type.", ".$addon;
$wrksheet-&amp;gt;write($row,$col, $wr,$format);

}
else
{
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Source_Trans_type'},$format);

}
$col++;

my $dst_tr_type=${rules[$i]}{'Dest_Trans_type'};
#print "$dst_tr_type---col=$col----row=$row\n";
if ($dst_tr_type!~/none/)
{
my $addon=${rules[$i]}{'Dest_Trans_addon'};
$wrksheet-&amp;gt;write($row,$col, $addon,$format);

}
else
{
$wrksheet-&amp;gt;write($row,$col,${rules[$i]}{'Dest_Trans_type'},$format);

}
$col++;


if ($dis=~m/yes/)
{
$wrksheet-&amp;gt;write($row,$col,$dis,$format);
}

$row++;
}


}

sub NatRulesToTxt
{
my $rul_arr_ref=$_[0];
my @rules= @{$rul_arr_ref};
foreach my $i (0..$#rules) 
{
my $from_ar_ref=${rules[$i]}{'From'};
my @from=@{$from_ar_ref};
my $from_txt='==';
foreach my $n (0..$#from) 
{
$from_txt=$from_txt.$from[$n]." ";

}
$from_txt=$from_txt."==";
my $output=$i." ".${rules[$i]}{'Name'}." ".$from_txt."\n";
print $output;

}


}


sub GetNATRules
#retrives NAT rules
{
my $host=$_[0];
my $key=$_[1];
my $rullarray_ref=$_[2];

#push @{$rullarray_ref}, 'onee';
#push @{$rullarray_ref}, 'twoee';

my $request="type=config&amp;amp;action=show&amp;amp;key=$key&amp;amp;xpath=/config/devices/entry/vsys/entry/rulebase/nat";
my $reply=SendREST("\nGetting the nat rules..",$host,$request);
$reply=~ s/\R//g;
#remove line breaks
$reply=~s/\s+/ /g ;
#remove exessive whitespaces
$reply=~m/\&amp;lt;nat\&amp;gt;.*\&amp;lt;rules\&amp;gt;(.*)\&amp;lt;\/rules\&amp;gt;\&amp;lt;\/nat\&amp;gt;/;
my $rules;
if ($1)
{
$rules=$1;
}
else
{
print "No NAT rules";
return;
}
while ($rules=~m/\&amp;lt;entry name\=\"(.*?)\"\&amp;gt;(.*?)\&amp;lt;\/entry\&amp;gt;/gs)
{

#print $1."\n";
my $rule_txt=$2;
my %rule_hash;
$rule_hash{'Name'}=$1;
#getting source zone
my @from_mem;
my $from_regexp="\&amp;lt;from\&amp;gt;(.*?)\&amp;lt;\/from\&amp;gt;";
RunRegexp ($from_regexp, $rule_txt, \@from_mem );
$rule_hash{'From'}=\@from_mem;

#getting destination zone
my @to_mem;
my $to_regexp="\&amp;lt;to\&amp;gt;(.*?)\&amp;lt;\/to\&amp;gt;";
RunRegexp( $to_regexp, $rule_txt, \@to_mem);
$rule_hash{'To'}=\@to_mem;

#getting source address
my @source_mem;
my $source_regexp="\&amp;lt;source\&amp;gt;(.*?)\&amp;lt;\/source\&amp;gt;";
RunRegexp( $source_regexp, $rule_txt, \@source_mem);
$rule_hash{'Source'}=\@source_mem;

#getting destination address
my @dest_mem;
my $dest_regexp="\&amp;lt;destination\&amp;gt;(.*?)\&amp;lt;\/destination\&amp;gt;";
RunRegexp( $dest_regexp, $rule_txt, \@dest_mem);
$rule_hash{'Destination'}=\@dest_mem;

#getting non-member stuff
my %non_member_stuff;
GetNonMeberStuff(\%non_member_stuff, $rule_txt );
$rule_hash{'Service'}=$non_member_stuff{'service'};
$rule_hash{'To-Interface'}=$non_member_stuff{'To-Interface'};

#source translation
my %source_translation;
GetSourceTranslation(\%source_translation, $rule_txt );
$rule_hash{'Source_Trans_type'}=$source_translation{'type'};
$rule_hash{'Source_Trans_addon'}=$source_translation{'addon'};

#destination translation
my %destination_translation;
GetDestinationTranslation(\%destination_translation, $rule_txt);
$rule_hash{'Dest_Trans_type'}=$destination_translation{'type'};
$rule_hash{'Dest_Trans_addon'}=$destination_translation{'addon'};

$rule_hash{'Disabled'}=GetDisabled($rule_txt);

push @{$rullarray_ref}, \%rule_hash;
}

}

sub GetSecOptions
{
my $rule_txt=$_[0];
my $SecOptions='';
if ($rule_txt=~m/\&amp;lt;option\&amp;gt;(.*)\&amp;lt;\/option\&amp;gt;/)
{
my $option=$1;
if ($option=~m/\&amp;lt;disable\-server\-response\-inspection\&amp;gt;(.*)\&amp;lt;\/disable\-server\-response\-inspection\&amp;gt;/)
{
if ($1=~m/yes/)
{
$SecOptions="disable-server-response-inspection=yes"

}

}

}
return $SecOptions;
}
sub GetSchedule
{
my $rule_txt=$_[0];
my $schedule='';
if ($rule_txt=~m/\&amp;lt;schedule\&amp;gt;(.*)\&amp;lt;\/schedule\&amp;gt;/)
{

$schedule=$1;
}
return $schedule;
}

sub GetQoS
{
my $rule_txt=$_[0];
my $qos='';
my $q='';
if($rule_txt=~m/\&amp;lt;qos\&amp;gt;(.*)\&amp;lt;\/qos\&amp;gt;/)
{
$q=$1;
if ($q=~m/\&amp;lt;marking\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;(.*?)\&amp;lt;\/(?:.*?)\&amp;gt;\s+\&amp;lt;\/marking\&amp;gt;/)
{
$qos=$1."=".$2;

}
elsif ($q=~m/\&amp;lt;marking\&amp;gt;\s+\&amp;lt;(.*?)\/\&amp;gt;\s+\&amp;lt;\/marking\&amp;gt;/)
{
$qos=$1;
}
}


return $qos;
}

sub GetLog
{
my $rule_txt=$_[0];
my $log='';
$rule_txt=~m/\&amp;lt;log\-start\&amp;gt;(.*)\&amp;lt;\/log\-start\&amp;gt;/;
if ($1=~m/yes/)
{
$log="log at start";

}
$rule_txt=~m/\&amp;lt;log\-end\&amp;gt;(.*)\&amp;lt;\/log\-end\&amp;gt;/;
if ($1=~m/yes/)
{

$log=$log."; log at end";
}
$log=~s/^;\s//;
#print "-----------//-----------\n";
#print $log."\n";
return $log;
}


sub GetProfile
{
my $rule_txt=$_[0];
my $profile='';
my $ret='';
$rule_txt=~m/\&amp;lt;profile-setting\&amp;gt;(.*)\&amp;lt;\/profile-setting\&amp;gt;/;
if ($1)
{
$profile=$1;

if ($profile=~m/\&amp;lt;profiles\&amp;gt;(.*)\&amp;lt;\/profiles\&amp;gt;/)
{
$profile=$1;

my $url_filt="\&amp;lt;url\-filtering\&amp;gt;(.*?)\&amp;lt;\/url\-filtering\&amp;gt;";
if ($profile=~m/$url_filt/)
{
my @url_filt;
RunRegexp( $url_filt, $profile, \@url_filt);
$ret=$ret."url filtering=".ArrayToString(\@url_filt)."; ";

}
my $virus="\&amp;lt;virus\&amp;gt;(.*?)\&amp;lt;\/virus\&amp;gt;";
if ($profile=~m/$virus/)
{
my @virus;
RunRegexp( $virus, $profile, \@virus);
$ret=$ret."virus=".ArrayToString(\@virus)."; ";


}

my $spyware="\&amp;lt;spyware\&amp;gt;(.*?)\&amp;lt;\/spyware\&amp;gt;";
if ($profile=~m/$spyware/)
{
my @spyware;
RunRegexp( $spyware, $profile, \@spyware);
$ret=$ret."spyware=".ArrayToString(\@spyware)."; ";

}

my $vulnerability="\&amp;lt;vulnerability\&amp;gt;(.*?)\&amp;lt;\/vulnerability\&amp;gt;";
if ($profile=~m/$vulnerability/)
{
my @vulnerability;
RunRegexp( $vulnerability, $profile, \@vulnerability);
$ret=$ret."vulnerability=".ArrayToString(\@vulnerability)."; ";

}

my $wildfire="\&amp;lt;wildfire\-analysis\&amp;gt;(.*?)\&amp;lt;\/wildfire\-analysis\&amp;gt;";
if ($profile=~m/$wildfire/)
{
my @wildfire;
RunRegexp( $wildfire, $profile, \@wildfire);
$ret=$ret."wildfire=".ArrayToString(\@wildfire)."; ";

}

my $data_filt="\&amp;lt;data\-filtering&amp;gt;(.*?)\&amp;lt;\/data\-filtering&amp;gt;";
if ($profile=~m/$data_filt/)
{
my @data_filt;
RunRegexp( $data_filt, $profile, \@data_filt);
$ret=$ret."data filtering=".ArrayToString(\@data_filt)."; ";

}

my $file_blck="\&amp;lt;file\-blocking&amp;gt;(.*?)\&amp;lt;\/file\-blocking";
if ($profile=~m/$file_blck/)
{
my @file_blck;
RunRegexp( $file_blck, $profile, \@file_blck);
$ret=$ret."file blocking=".ArrayToString(\@file_blck)."; ";

}
}
elsif ($profile=~m/\&amp;lt;group\&amp;gt;(.*)\&amp;lt;\/group\&amp;gt;/)
{
$profile=$1;
my @group;
GetMembers($profile,\@group);
$ret=$ret."Group=".ArrayToString(\@group)."; ";
}
}
#print $ret."\n";
return $ret;
}

sub GetAction
{
my $rule_txt=$_[0];
my $action='';
$rule_txt=~m/\&amp;lt;action\&amp;gt;(.*)\&amp;lt;\/action\&amp;gt;/;
$action=$1;
return $action;
}


sub GetDisabled
{
my $rule_txt=$_[0];
my $dis='';
$rule_txt=~m/\&amp;lt;disabled\&amp;gt;(.*)\&amp;lt;\/disabled\&amp;gt;/;
if ($1=~m/yes/)
{
$dis='yes';
}
else
{
$dis='no';
}
return $dis;
}

sub GetDestinationTranslation
{
my $destination_translation_ref=$_[0];
my $rule_txt=$_[1];
if ($rule_txt!~/destination\-translation/)
{
${$destination_translation_ref}{'type'}='none';


}
else
{
#$rule_txt=~m/&amp;lt;destination-translation&amp;gt;\s*&amp;lt;translated-port&amp;gt;(.*)&amp;lt;\/translated-port&amp;gt;\s*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/destination-translation&amp;gt;/;
my $dest_tr='';
$rule_txt=~m/destination\-translation&amp;gt;.*&amp;lt;translated\-address&amp;gt;(.*)&amp;lt;\/translated\-address&amp;gt;.*&amp;lt;\/destination\-translation&amp;gt;/;
$dest_tr="address: $1";
if ($rule_txt=~m/destination\-translation&amp;gt;.*&amp;lt;translated\-port&amp;gt;(.*)&amp;lt;\/translated\-port&amp;gt;.*&amp;lt;\/destination\-translation&amp;gt;/)
{

$dest_tr=$dest_tr.",port: $1";
}
#print $rule_txt."\n";
#exit;
${$destination_translation_ref}{'addon'}=$dest_tr;
}

}



sub GetSourceTranslation
{
my $source_translation_ref=$_[0];
my $rule_txt=$_[1];
#print "----------\n";
#print $rule_txt;
#print "----------\n";
if ($rule_txt!~/source\-translation/)
{
${$source_translation_ref}{'type'}='none';

}
else
{
#print $rule_txt;
#exit;
$rule_txt=~m/\&amp;lt;source\-translation\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;/;
${$source_translation_ref}{'type'}=$1;
my $type=$1;
if ($type=~m/dynamic-ip-and-port/)
{
$rule_txt=~m/\&amp;lt;dynamic-ip-and-port\&amp;gt;\s+\&amp;lt;(.*?)\&amp;gt;/;
#${$source_translation_ref}{'addon'}=$1;
my $d_ip_a_port=$1;
#print "+++++++++++ $d_ip_a_port +++++++++++++++\n";

if ($d_ip_a_port=~m/translated\-address/)
{
my @tr_add;
$rule_txt=~m/\&amp;lt;dynamic-ip-and-port&amp;gt;\s+\&amp;lt;translated\-address\&amp;gt;(.*)\&amp;lt;\/translated\-address\&amp;gt;/;
my $mem=$1;
GetMembers($mem,\@tr_add);
#print Dumper @tr_add;
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
elsif ($d_ip_a_port=~m/interface\-address/)
{
$rule_txt=~m/\&amp;lt;source-translation\&amp;gt;\s*\&amp;lt;dynamic-ip-and-port\&amp;gt;\s*\&amp;lt;interface\-address&amp;gt;\s*&amp;lt;interface&amp;gt;(.*?)&amp;lt;\/interface&amp;gt;\s*&amp;lt;ip&amp;gt;(.*?)&amp;lt;\/ip&amp;gt;\s*&amp;lt;\/interface-address&amp;gt;/;
${$source_translation_ref}{'addon'}="$1, $2";


}

}
elsif ($type=~m/dynamic-ip/)
{
my @tr_add;
#print $rule_txt;
#exit;
$rule_txt=~m/&amp;lt;dynamic-ip&amp;gt;.*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/dynamic-ip&amp;gt;\s*&amp;lt;\/source-translation&amp;gt;/;
my $mem=$1;
GetMembers($mem,\@tr_add);

if ($rule_txt=~m/\&amp;lt;dynamic-ip\&amp;gt;.*\&amp;lt;fallback\&amp;gt;/)
{
if ($rule_txt=~m/\&amp;lt;fallback&amp;gt;\s*\&amp;lt;interface-address\&amp;gt;\s*&amp;lt;ip&amp;gt;(.*)&amp;lt;\/ip&amp;gt;\s*&amp;lt;interface&amp;gt;(.*)&amp;lt;\/interface&amp;gt;\s*&amp;lt;\/interface-address&amp;gt;\s*&amp;lt;\/fallback\&amp;gt;/)
{
#print "$1 $2";
#exit;
push @tr_add, "Fall-back interface address: $1";
push @tr_add, "Fall-back interface : $2";
}
elsif ($rule_txt=~m/\&amp;lt;fallback&amp;gt;\s*\&amp;lt;translated\-address\&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;\s*&amp;lt;\/fallback\&amp;gt;/)
{
#print $rule_txt;
#exit;
my @t2;
my $mem=$1;
GetMembers($mem,\@t2);
$mem=ArrayToString(\@t2);
push @tr_add, "Fallback address: $mem";

}
}
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
elsif ($type=~m/static-ip/)
{
my @tr_add;
#print $rule_txt."\n";
#exit;
$rule_txt=~m/&amp;lt;static-ip&amp;gt;.*&amp;lt;translated-address&amp;gt;(.*)&amp;lt;\/translated-address&amp;gt;.*&amp;lt;\/static-ip&amp;gt;/;
push @tr_add, "$1";
$rule_txt=~m/&amp;lt;static-ip&amp;gt;.*&amp;lt;bi\-directional&amp;gt;(.*)&amp;lt;\/bi\-directional&amp;gt;.*&amp;lt;\/static-ip&amp;gt;/;
push @tr_add, "bi-directional: $1";
${$source_translation_ref}{'addon'}=ArrayToString(\@tr_add);
}
}


}


sub GetNonMeberStuff
{
my $non_member_stuff_ref=$_[0];
my $rule_txt=$_[1];
#get service
#doing through the array, because we already have sub for that...we don't need array, but I am too lazy to rewrite the sub
my @array;
my $regexp="\&amp;lt;service\&amp;gt;(.*?)\&amp;lt;\/service\&amp;gt;";
RunRegexp( $regexp, $rule_txt, \@array);
my $variab= pop @array;
${$non_member_stuff_ref}{'service'}=$variab;

$regexp="\&amp;lt;to\-interface\&amp;gt;(.*?)\&amp;lt;\/to\-interface\&amp;gt;";
RunRegexp( $regexp, $rule_txt, \@array);
$variab= pop @array;
${$non_member_stuff_ref}{'To-Interface'}=$variab;

}



sub RunRegexp
{
my $regexp=$_[0];
my $rule_txt=$_[1];
my $mem_array_ref=$_[2];
#print $rule_txt."\n";
#print "-------//-------------//--------";
#print $regexp."\n\n";
#exit;

while ($rule_txt=~m/$regexp/gs)
{
my $mem=$1;
#print "=========RunRegexp=============="."\n";
#print $mem."\n";
#exit;
GetMembers($mem,$mem_array_ref);
#print ArrayToString (@{$mem_array_ref});
#print "\n";
#print "\n";
}
}


sub GetMembers
#pushes the array with members from the text
#if there is no members, pushes the text itself
{
my $txt=$_[0];
my $array_ref=$_[1];
if ($txt=~m/member/)
{
while ($txt=~m/\&amp;lt;member\&amp;gt;(.*?)\&amp;lt;\/member\&amp;gt;/gs)
{
#print $1."\n";
#push the member into the array
push @{$array_ref}, $1;
}

}
else
{
#as long as we do not have members, push the whole thing into the array
push @{$array_ref}, $txt;

}

}


sub GetTheKey
#retrievs the key
{
my $host=$_[0];
my $username=$_[1];
my $password=$_[2];
my $request="type=keygen&amp;amp;user=$username&amp;amp;password=$password";
my $reply=SendREST("Getting the key..",$host,$request);
if ($reply=~m/\&amp;lt;key\&amp;gt;(.*)\&amp;lt;\/key\&amp;gt;/)
{
my $key=$1;
return $key;
}
else
{
print "Error while getting the key\n";
print $reply."\n";
exit;
}


}

sub SendREST
#sends RESTful request and returns a response
{
my $reason=$_[0];
my $host=$_[1];
my $request=$_[2];
my $restline="$paloRESTaddr$request";
#print $restline;
#exit;
my $ua = LWP::UserAgent-&amp;gt;new;
$ua-&amp;gt;timeout(10);
$ua-&amp;gt;ssl_opts( verify_hostnames =&amp;gt; 0 ); 
#$ua-&amp;gt;env_proxy;
print "$reason\n";
my $response = $ua-&amp;gt;get($restline);
my $reply='';
if ($response-&amp;gt;is_success) {
$reply= $response-&amp;gt;decoded_content; 
if ($reply=~m/error/)
{
print $reply;
exit;
}

}
else {
$reply= $response-&amp;gt;status_line;
print $reply."\n";
exit;
}
return $reply;
}

sub CreateHeaders
#creates headers , on row (starts from 0) 
{
my $row=$_[0];
my $wrksheet=$_[1];
my $headers_ref=$_[2];
my $bold=$_[3];
foreach my $i (0..$#{$headers_ref}) 
{
my $header=shift @{$headers_ref};
$wrksheet-&amp;gt;write_rich_string( $row, $i, $bold, $header );
$i++; 
}

}

sub ArrayToString
{
my $ar_ref=$_[0];
my @from=@{$ar_ref};
my $m_txt='';
foreach my $n (0..$#from) 
{
$m_txt=$m_txt.$from[$n].", ";
}
#remove two last characters (last comma and space)
$m_txt=~s/..$//; 
return $m_txt
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 22 Dec 2017 00:18:02 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/automation-api-discussions/export-script-vm300-export-all-config-rulesets-policy-etc-to/m-p/192807#M1529</guid>
      <dc:creator>TSchouwstra</dc:creator>
      <dc:date>2017-12-22T00:18:02Z</dc:date>
    </item>
  </channel>
</rss>

