I am intrested in the 4th field entry value and how many (count) they are per $subnet=
I get a report on how many types etc... works great,
But I need it to also do another task, when I run this script I could run into a senerio like this:
Error 48: This subnet does not exist.
146.149.0.0
getobjectlst.exe :146.149.0.0: Error code = 48
If I get an message like that, I need the script to engage in another routine;
If that subnet has that error 48" this subnet does not exist" then and run another cli called "getsubnetlst.exe" like so
This will produce relatively the same output as in the first code:
"East" "146.149.1.0" "N" "" "146.149.0.0" " " " " "255.255.255.128"
"West-Subnet" "146.149.16.0" "Y" "" "146.149.0.0" " " " " "255.255.255.252"
"North Subnet" "146.149.16.128" "Y" "" "146.149.0.0" " " " " "255.255.255.240"
"Asia D-NAT" "146.149.22.0" "Y" "" "146.149.0.0" " Japan" " " "255.255.255.0"
Then I need to run the same cli getobjectlst.exe and reference the subnet address in the second whitespace(146.149.1.0) for each one that It reports like on the above script on line 11
For the report, I need it to be outputed as csv so I can import it into a spreadsheet, I envision it like so
( never mind on the header, I will create those in excel, but wanted to show.
Subnet Static DHCP Unused
146.149.16.0 363 0 57
I guess the output could be like this, then I will copy/paste it.
146.149.16.0,363,0,157
Then loop and do it all until its done.
Thanks for your help in advance !
This is what I have thus far, but it does not work right. I am not a perl expert so any help would be awesome !
Thanks
Code:
#!perl
open(my $log, ">log-subnet.txt") or die "Could not open log: $!\n";
##### Step 1, read subnets
open(my $in, "<m-names2.txt") or die "Could not open m-names.txt: $!\n";
while(<$in>) {
next unless /(.*?)\/(.*)$/;
my $subnet = $1;
print "Checking $subnet\n";
my @dnsoptions = `./getobjectlst.exe -u Xxx-p Xxx -a $subnet -o rich`;
my %counts;
foreach my $line (@dnsoptions) {
my @f = split/"\s+"/, $line;
$counts{$f[3]}++;
}
elsif ($line =~ /^\s*Error 48: This subnet does not exist.=([^\r\n]+)/) {
my @subnetpart2 = `./getsubnetlst.exe -u Xxx -p Xxx -a $subnet -t netwrok -o rich`;
my @f = split/"\s+"/, $line;
$counts{$f[3]}++;
}
printf $log "%s,%d,%d,%d\n", $subnet, ($counts{Static} or 0), ($counts{DHCP} or 0), ($counts{Unused} or 0);
close($log);
Maybe something like this. Please go through the script comments carefully to understand the flow of logic.
Code:
#!perl -w
my %counts;
my @subnettype;
my @dnsoptions;
my @dnsoptions2;
my @subnetpart2;
my $snetpart2;
my $subnet;
open(my $log, ">log-subnet.txt") or die "Could not open log: $!\n";
printf $log "Subnet,Static,DHCP,Unused\n";
##### Step 1, read subnets
open(my $in, "<m-names2.txt") or die "Could not open m-names2.txt: $!\n";
while(<$in>) {
next unless /(.*?)\/(.*)$/;
$subnet = $1;
print "Checking $subnet\n";
@dnsoptions = `./getobjectlst.exe -u Xxx-p Xxx -a $subnet -o rich`;
# Now, at this point, we may have "Error 48" in @dnsoptions, or we may have
# the nicely formatted output. We'll have to check for both cases here.
# Let's check the unsuccessful case first. The condition below checks if
# the first element of @dnsoptions array has the following text in it -
# "Error 48: This subnet does not exist." in it.
if ($dnsoptions[0] =~ /Error 48: This subnet does not exist./) {
# call "getsubnetlst.exe", passing $subnet as one of the parameters
@subnetpart2 = `./getsubnetlst.exe -u Xxx -p Xxx -a $subnet -t netwrok -o rich`;
# now loop through each element of the array @subnetpart2, which looks like this -
# ##########################################################################
# "East" "146.149.1.0" "N" "" "146.149.0.0" " " " " "255.255.255.128"
# ##########################################################################
# pick up the 2nd field from the left (e.g. 146.149.1.0 above), and pass it as
# a parameter to the cli "getobjectlst.exe".
foreach my $line (@subnetpart2) {
# get the 2nd field from the left
$snetpart2 = (split/"\s+"/, $line)[1];
# and now pass it to "getobjectlst.exe"; assign the output to
# the array @dnsoptions2
@dnsoptions2 = `./getobjectlst.exe -u Xxx-p Xxx -a $snetpart2 -o rich`;
# find out counts of each subnettype (4th field from left)
foreach my $line (@dnsoptions2) {
@subnettype = split/"\s+"/, $line;
$counts{$subnettype[3]}++;
}
}
} else # successful output from getobjectlst.exe
{
# find out counts of each subnettype (4th field from left)
foreach my $line (@dnsoptions) {
@subnettype = split/"\s+"/, $line;
$counts{$subnettype[3]}++;
}
}
printf $log "%s,%d,%d,%d\n", $subnet, ($counts{Static} or 0), ($counts{DHCP} or 0), ($counts{Unused} or 0);
%counts = ();
}
close($in);
close($log);
Hope that helps,
tyler_durden
_______________________________________________________________________________________
"If you don't claim your humanity you will become a statistic. You have been warned."
Error 48: This subnet does not exist.
10.2.0.0
getobjectlst.exe :10.2.0.0: Error code = 48
Use of uninitialized value $dnsoptions[0] in pattern match (m//) at update-enhan.pl line 23, <$in> line 3
I made some mods on your code, have a look, but I still get that error that the subnet does not exists.
Code:
#!perl -w
my %counts;
my @subnettype;
my @dnsoptions;
my @dnsoptions2;
my @subnetpart2;
my $snetpart2;
my $subnet;
open(my $log, ">log-external-.txt") or die "Could not open log: $!\n";
printf $log "Subnet,Static,DHCP,Unused\n";
##### Step 1, read subnets
open(my $in, "<m-names.txt") or die "Could not open m-names2.txt: $!\n";
while(<$in>) {
#next unless /(.*?)\/(.*)$/;
#next unless /(.*?)$/;
chomp;
$subnet = $_;
print "Checking $subnet\n";
@dnsoptions = `./getobjectlst.exe -u xx -p xx -a $subnet -o Rich`;
# Now, at this point, we may have "Error 48" in @dnsoptions, or we may have
# the nicely formatted output. We'll have to check for both cases here.
# Let's check the unsuccessful case first. The condition below checks if
# the first element of @dnsoptions array has the following text in it -
# "Error 48: This subnet does not exist." in it.
foreach my $line (@dnsoptions) {
if ($line =~ /^\s*Error 48: This subnet does not exist./) {
# call "getsubnetlst.exe", passing $subnet as one of the parameters
@subnetpart2 = `./getsubnetlst.exe -u xx-p xx -a $subnet -t network -o Rich`;
# now loop through each element of the array @subnetpart2, which looks like this -
# ##########################################################################
# "East" "146.149.1.0" "N" "" "146.149.0.0" " " " " "255.255.255.128"
# ##########################################################################
# pick up the 2nd field from the left (e.g. 146.149.1.0 above), and pass it as
# a parameter to the cli "getobjectlst.exe".
foreach my $line (@subnetpart2) {
# get the 2nd field from the left
$snetpart2 = (split/"\s+"/, $line)[1];
# and now pass it to "getobjectlst.exe"; assign the output to
# the array @dnsoptions2
@dnsoptions2 = `./getobjectlst.exe -u xx -p xx -a $snetpart2 -o Rich`;
# find out counts of each subnettype (4th field from left)
foreach my $line (@dnsoptions2) {
@subnettype = split/"\s+"/, $line;
$counts{$subnettype[3]}++;
}
}
} else # successful output from getobjectlst.exe
{
# find out counts of each subnettype (4th field from left)
foreach my $line (@dnsoptions) {
@subnettype = split/"\s+"/, $line;
$counts{$subnettype[3]}++;
}
}
printf $log "%s,%d,%d,%d\n", $subnet, ($counts{Static} or 0), ($counts{DHCP} or 0), ($counts{Unused} or 0);
%counts = ();
}
}
close($in);
close($log);
Do you think we need more info on this line, to match the line, looks like its calling the subnet where the error is:
foreach my $line (@dnsoptions) {
if ($line =~ /^\s*Error 48: This subnet does not exist./) {
Error 48: This subnet does not exist.
146.149.0.0/16
...
Error 48: This subnet does not exist.
10.2.0.0
getobjectlst.exe :10.2.0.0: Error code = 48
Use of uninitialized value $dnsoptions[0] in pattern match (m//) at update-enhan.pl line 23, <$in> line 3
A couple of points here:
(1) I think the error is being thrown because the list @dnsoptions is undefined, i.e. the executable "getobjeclst.exe" probably returns a zero-length string in some cases.
(2) Again, it's quite possible that the output of "getobjectlst.exe" is something like this:
HTML Code:
Error 48: This subnet does not exist.
146.149.0.0
getobjectlst.exe :146.149.0.0: Error code = 48
i.e. the first line could be blank. In such a case, $dnsoptions[0] would be equal to "\n". Hence a comparison like this:
Code:
if ($dnsoptions[0] =~ /Error 48: This subnet does not exist./) {
would fail, because the string "Error 48: This subnet does not exist." is in $dnsoptions[1], or maybe in $dnsoptions[2] etc.
(3) The logic you explained is as follows:
(a) take a subnet from "m-names2.txt", and pass it to "getobjectlst.exe"
(b) if an error is thrown, pass that subnet to "getsubnetlst.exe".
(c) loop through the output of "getsubnetlst.exe", pick the 2nd token, and call "getobjectlst.exe" with that as parameter.
Now, what if "getsubnetlst.exe" itself fails, or returns a null string ? The current script does not take care of that scenario.
For problem # (1) above, I assume you just want to iterate to the next subnet value, maybe after printing an error message.
For problem # (2) above, you'll need to see if the string "Error 48: This subnet does not exist." occurs in any element of the list @dnsoptions (and not just in $dnsoptions[0]). You could join all elements of the list into a single string, and check for the occurrence of that error message in that string.
So the modification for (1) and (2) is as follows:
Code:
...
if (not defined($dnsoptions[0])) {
print "dnsoptions is null or undefined, going on to the next subnet\n";
next;
}
if (join(" ",@dnsoptions) =~ /Error 48: This subnet does not exist./) {
...
HTH,
tyler_durden
____________________________________________________
"Only after disaster can we be resurrected."
Hi Gurus,
I need to build a wrapper script which will be passing the loading date and the data file name (provides option to the user to load a single data file or load all the data files) to the actual loader data_load.ksh to load in the database.
1. I want to execute the loader script... (6 Replies)
Hi friends,
i am working in ksh88. i am running the follwing wapper script in background to run two jobs parallely((eg nohup wrapper.ksh &)::
wrapper.ksh
########################
#!/bin/ksh
nohup ./pii_insert.ksh /nsing83/p2/test &
nohup ./pii_update.ksh... (1 Reply)
I have a KSH script that I want to call in a loop for each row in the above table
---
new_script.ksh (psuedo code)
the contents on this new script would be something like below...
for t in (select table_name,schema_name from laod_table)
loop
/bin/load_table.ksh t.table_name... (4 Replies)
Hi,
I am writing a wrapper script(wrap_script.sh) to one of the main scripts (main_script.sh)
The main script is executed as following:
./main_script.sh <LIST> <STARTDATE> <ENDDATE>
looks for a parameter which is a LIST(consists of different list names that need to be processed), START/END... (0 Replies)
I have tried looking through wrapper scripts throughout the forum, but I don't think they were able to answer my question (either that or I'm just confused).
Basically, I have a Perl script that I want to run in parallel 4 times with parameters, wait for all of them to finish, then run another... (8 Replies)
Hi,
I am in need of way to facilitate this senerio in a perl script.
I have CLI ( command line interface) which I run like so:
kip-tepltist -u Xxx -p Xxx
Which produces tones of names from each template it found:
194Iselin-NJ
33-IDFLB-North-611-Woodward-8600 ... (5 Replies)
Hello,
I have the below wrapper script:
#!/usr/bin/perl -w
if ($^O eq 'MSWin32' ) {
$subnet = 'c:\path\to\subnet.txt';
}
else {
$subnet = '/opt/qip/wrapper-del-sub';
}
open FH1, 'jj-deleted-subnets.txt' or die "Can't open 'jj-deleted-subnets.txt'
... (0 Replies)
Hi Guys, I am trying write a wrapper script but I don't have any idea. I have 4 different korn shell scripts and all of them needs some parameters from command line (positional parameter). My script cant be interactive because its supposed to be automated. I am confused how can I write a wrapper... (6 Replies)
hi guys,
I have a requirement to run a script 4 times with different parameter values.
the 4 jobs have to run parallely which actually access different data of same table and deletes.
how can i achieve this.................?
Thanks in advance (1 Reply)