Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: How to include a variable in output for derived subnets

by poj (Priest)
on Jun 22, 2013 at 17:16 UTC ( #1040280=note: print w/ replies, xml ) Need Help??


in reply to How to include a variable in output for derived subnets

"My difficulty is I don't really understand well enough the code.."

Perhaps this demo program will help you

use strict; use Socket; my $len = '/29'; print "IP IPN Mask Subnet\n"; for my $i (1...31){ print_subnet('192.168.1.'.$i ,$len); } sub print_subnet { my ( $ip, $len ) = @_; my $ipn = unpack "N", Socket::inet_aton $ip; $len =~ s/^\///; my $maskn = 0xFFFFFFFF << ( 32 - $len ); my $subnet_ipn = $ipn & $maskn; my $subnet_ip = Socket::inet_ntoa pack "N", $subnet_ipn; printf "%-20s %s %x %s\n","$ip/$len",$ipn,$maskn,$subnet_ip; }
It should produce a table like this. Change len values to see effect.
IP IPN Mask Subnet 192.168.1.1/30 3232235777 3fffffffc 192.168.1.0 192.168.1.2/30 3232235778 3fffffffc 192.168.1.0 192.168.1.3/30 3232235779 3fffffffc 192.168.1.0 192.168.1.4/30 3232235780 3fffffffc 192.168.1.4 192.168.1.5/30 3232235781 3fffffffc 192.168.1.4 192.168.1.6/30 3232235782 3fffffffc 192.168.1.4 192.168.1.7/30 3232235783 3fffffffc 192.168.1.4 192.168.1.8/30 3232235784 3fffffffc 192.168.1.8 192.168.1.9/30 3232235785 3fffffffc 192.168.1.8 etc

You should be able to add the first comment like this

$subnets{"$ip,$len"}{ipn} = $ipn; $subnets{"$ip,$len"}{maskn} = $maskn; if ( $subnets{"$ip,$len"}{'comment'} eq '' ){ $subnets{"$ip,$len"}{'comment'} = $comment; }

Note : If you did this the comment would be erased by a later blank record

$subnets{"$ip,$len"} = { ipn => $ipn, maskn => $maskn };

To print it out use this

print "subnet,prefix,name\n"; print "$_,$subnet{$_}{'comment'}\n" for sort { $subnets{$a}{ipn} <=> $subnets{$b}{ipn} };
poj


Comment on Re: How to include a variable in output for derived subnets
Select or Download Code
Replies are listed 'Best First'.
Re^2: How to include a variable in output for derived subnets
by stroke (Novice) on Jun 24, 2013 at 11:09 UTC

    Hi poj,

    Thanks - that pretty much did the trick. I had to tweak the print code block a little as I got a compilation error, but it works a treat. Appreciate your assistance.

    As is the way - this has thrown up the next thing to fix - i found some subnet definitions don't end up with a name (the IPs have no comment), I guess I can iterate over the subnets hash and substitute any undef comments with a value. Initially, I did a find/replace in the output CSV file, but it would be nice to resolve it in the code. I'll have a look into this.

    The demo program is really useful, thanks. I need to have a proper look at it, but my initial guess as to how the original code is working out the subnets is that rather than doing any de-duplication of subets or similar, it is just populating a subnet address and prefix into the hash and if the same one already exists, it just get overwritten.

    Thanks again, appreciate your help.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1040280]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (11)
As of 2015-07-08 02:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls