1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#our @ip = qw(10.172.0.0/17); our @ip = qw(10.144.128.0/18 10.144.192.0/19 10.144.224.0/20 10.144.240.0/21 10.144.248.0/22 10.144.252.0/23 10.144.254.0/24 10.144.255.0/25 10.144.255.128/26 10.144.255.192/27 10.144.255.224/28 10.144.255.240/29 10.144.255.248/30 10.144.255.252/31 10.144.255.254/32); print "IPs:".join(",",@ip)."\n"; foreach(@ip) {my $ip=NetAddr::IP->new($_);push(@ip_netaddr,$ip)}; @ip_netaddr=Compact(@ip_netaddr); #alle Netze als NetAddr::IP Objekt anlegen print join(",",@ip_netaddr)."\n"; foreach (@ip_netaddr) {if (my $ip=Net::IP->new($_)) {push(our @ip_netip,$ip)}} #alle Netze auch noch als Net::IP Objekt anlegen print "IP_OBJS:".join(",",@ip_netip)."\n"; foreach (@ip_netip) {our $count=$count+($_->Net::IP::size())}; #"zählen" der IP Adressen aller Netze if ($count eq "32767") { #/17 - eine /32 print "ADDR:".($ip_netaddr[0]->NetAddr::IP::addr())."\n"; my @check_nets = @ip_netaddr; push(@check_nets,($ip_netaddr[0]->NetAddr::IP::addr())/17->NetAddr::IP::broadcast()); #hier würde ich gerne das /18 in ein /17 "verwandeln um mir dessen "Broadcast-Adresse" zu holen (das ist die fehlende /32) if (($ip_netaddr[0]->NetAddr::IP::addr())/17 eq (Compact(@check_nets))) { #wenn die /32 hinzugefügt wurde und der passende Fall vorliegt, müssten jetzt beide Ausdrücke 10.172.0.0/17 sein... print "Found /17 - last /32 Information. Last address will be added. This results in".($ip_netaddr[0]->NetAddr::IP::addr()/17)."\n"; } } else { print "OK\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#! /usr/bin/env perl use strict; use warnings; use Net::IP::AddrRanges; use Net::CIDR::Lite; our @ip = qw(10.144.128.0/18 10.144.192.0/19 10.144.224.0/20 10.144.240.0/21 10.144.248.0/22 10.144.252.0/23 10.144.254.0/24 10.144.255.0/25 10.144.255.128/26 10.144.255.192/27 10.144.255.224/28 10.144.255.240/29 10.144.255.248/30 10.144.255.252/31 10.144.255.254/32); my $ranges = Net::IP::AddrRanges->new(); $ranges->add(@ip); my @ranges = $ranges->list_ranges; if ( 1 == @ranges ) { # good, we only expected a single range if ( "254" eq substr( $ranges[0], -3, 3 ) ) { $ranges->add( substr( $ranges[0], 0, -3 ) . '255' ); } } my $cidr = Net::CIDR::Lite->new; $cidr->add_range( $_ ) for $ranges->list_ranges; print join "\n", $cidr->list(), ""; __END__ Result: 10.144.128.0/17