in reply to Re^2: HTTP PUT Request with separate values in csv in thread HTTP PUT Request with separate values in csv
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
Re^4: HTTP PUT Request with separate values in csv
by StayCalm (Novice) on May 17, 2018 at 14:14 UTC
|
| [reply] |
Re^4: HTTP PUT Request with separate values in csv
by StayCalm (Novice) on May 24, 2018 at 13:28 UTC
|
One more question
I want to expand this Service with DELETE request
In this case my output2.csv should have this look:
output2.csv (id,name,description,ip) - Secondary System
01,TEST_1,,10.56.7.80
02,TEST_2,bla,10.57.80.9
03,TEST_3,,10.60.251.9
output1.csv (name,ip) - Primary System
TEST_1,10.56.7.80
TEST_6,10.66.251.9
TEST_5,10.66.81.9
I should check, if there is device in Secondary System, that absent in Primary System with out description.
In my case thist is TEST_3
I should delete such devices
I've tried to do it with the previous example, but I do not know perl really good.....
#!/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;
my %file2 = () ;
my %ip2name = ();
open $fh, '<', $filename[1]; # using autodie
while (<$fh>){
chomp;
my ($id,$name,$description,$ip) = split /\s*,\s*/;
$file2{$name} = [$id,$ip];
# $ip2name{$ip} = [$id,$name];
}
close $fh;
# determine updates and additions requires
my @delete =();
foreach my $name (sort keys %file2) {
my $ip1 = $file2{$name};
if ( not exists $file1{$name} ){
# check if ip exists
if ( $description=null ){
my $id = $ip2name{$ip1};
print "DELETE name : '$name'\n";
push @delete,[$id,$name,$description,$ip]
}
}
}
my $ua = LWP::UserAgent->new(
ssl_opts=> {
# SSL_verify_mode => SSL_VERIFY_NONE,
verify_hostname => 0,}
);
for (@delete){
my ($id,$name,$description,$ip1) = @$_;
my $uri="https://hostname:9060/ers/config/networkdevice/$id";
my $req = HTTP::Request->new('DELETE', $uri,
[Accept=>'application/vnd.com.cisco.ise.network.networkdevice.1.1
++xml',
Content_Type=>'application/vnd.com.cisco.ise.network.networkdevic
+e.1.1+xml; charset=utf-8']);
$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";
}
}
}
There is no Problem this the Server, when I'm doing multiply DELETE separately
I think my promlem is here:
foreach my $name (sort keys %file2) {
my $ip1 = $file2{$name};
if ( not exists $file1{$name} ){
# check if ip exists
if ($description=null){
my $id = $ip2name{$ip1};
print "DELETE name : '$name'\n";
push @delete,[$id,$name,$description,$ip]
}
}
| [reply] [d/l] [select] |
|
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use XML::Twig;
use autodie;
use Data::Dumper;
my @filename = ('output1.csv', 'output2.csv');
#TEST_1,10.56.7.80
#TEST_6,10.66.251.9
#TEST_5,10.66.81.9
my %file1 = () ;
open my $fh, '<', $filename[0]; # using autodie
while (<$fh>){
chomp;
my ($name,$ip) = split /\s*,\s*/;
$file1{$name} = $ip;
}
close $fh;
#01,TEST_1,,10.56.7.80
#02,TEST_2,bla,10.57.80.9
#03,TEST_3,,10.60.251.9
my %file2 = () ;
open $fh, '<', $filename[1]; # using autodie
while (<$fh>){
chomp;
my ($id,$name,$description,$ip) = split /\s*,\s*/;
$file2{$name} = [$id,$description,$ip];
}
close $fh;
# determine deletes requires
my @delete = ();
foreach my $name (sort keys %file2) {
if ( not exists $file1{$name} ){
# check if description exists
my $id = $file2{$name}[0];
my $description = $file2{$name}[1] || '';
my $ip = $file2{$name}[2];
if ( $description eq '' ){
print "DELETE name : '$name'\n";
push @delete,[$id,$name,$description,$ip]
}
}
}
print Dumper \@delete;
poj | [reply] [d/l] |
|
|