Consider dividing the task into 2 steps so that you can debug each independently. First identify the updates required and store them in arrays ;
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use XML::Twig;
use autodie;
use Data::Dumper;
my @filename = ('output1.csv', 'output2.csv');
my %file1 = () ;
open my $fh, '<', $filename[0]; # using autodie
while (<$fh>){
chomp;
my ($name,$ip) = split /\s*,\s*/;
$file1{$name} = $ip;
}
close $fh;
#%file1 = (
# TEST_1 => '10.56.7.80',
# TEST_3 => '10.66.78.10',
# TEST_4 => '10.66.81.9',
# TEST_2 => '10.67.9.12',
#);
my %file2 = () ;
my %ip2name = ();
open $fh, '<', $filename[1]; # using autodie
while (<$fh>){
chomp;
my ($id,$name,$ip) = split /\s*,\s*/;
$file2{$name} = [$id,$ip];
$ip2name{$ip} = [$id,$name];
}
close $fh;
#%file2 = (
# TEST_1 => ['01','10.56.7.80'],
# TEST_3 => ['02','10.66.251.9'],
# TEST_5 => ['03','10.66.81.9'],
#);
print Dumper \%file1,\%file2,\%ip2name;
# determine updates and additions requires
my @updateIP =();
my @updateName=();
my @add = ();
foreach my $name (sort keys %file1) {
my $ip1 = $file1{$name};
if ( not exists $file2{$name} ){
# check if ip exists
if ( not exists $ip2name{$ip1} ){
print "ADD name : '$name' '$ip1'\n";
push @add,[undef,$name,$ip1];
} else {
my $id2 = $ip2name{$ip1}[0];
my $name2 = $ip2name{$ip1}[1];
print "UPDATE NAME change id '$id2' name from '$name2' to '$nam
+e'\n";
push @updateName,[$id2, $name, $ip1];
}
next;
}
my $ip2 = $file2{$name}[1];
if ($ip1 eq $ip2) {
print "MATCHED device '$name', '$ip1'\n";
} else {
my $id2 = $file2{$name}[0];
print "UPDATE IP change '$name' id '$id2' ip from '$ip2' to '$ip1'
+ \n";
push @updateIP,[$id2,$name,$ip1];
}
}
print Dumper \@add,\@updateIP,\@updateName;
When that is working add on implementing the changes
# read XML template
my $xml = XML::Twig->new->parse( \*DATA );
$xml->set_pretty_print('indented_a');
#Create a user agent object
my $ua = LWP::UserAgent->new(
ssl_opts=> {
# SSL_verify_mode => SSL_VERIFY_NONE,
verify_hostname => 0,}
);
# apply updates
my $uri = "https://hostname:9060/ers/config/networkdevice/";
my $header = [
Accept => 'application/vnd.com.cisco.ise.network.networkdevice.1.1+x
+ml',
Content_Type => 'application/vnd.com.cisco.ise.network.networkdevice
+.1.1+xml; charset=utf-8'];
for (@updateIP){
my ($id,$name,$ip) = @$_;
print "-----
Updating $id, $name to $ip\n";
$xml->root->set_att('name', $name);
$xml->get_xpath('//ipaddress',0)->set_text($ip);
my $req = HTTP::Request->new('PUT', $uri.$id, $header, $xml->sprint)
+;
$req->authorization_basic("user", "user");
print $req->as_string; # testing
#my $res = $ua->request($req);
#if ($res->is_success) {
# print $res->status_line, "\n";
#} else {
# print $res->status_line, "\n";
#}
print "-----\n"
}
__DATA__
<device name="example">
<ipaddress>0.0.0.0</ipaddress>
</device>
Note, I have only shown the ip updates, the additions and name changes you need to complete yourself
poj