Thread letzte IP Adresse zu Array von NetAddr::IP Objekten hinzufügen
(3 answers)
Opened by Roland at 2013-06-10 18:41
Hallo!
Ich hab ein recht konkretes Problem, bei dem mir vielleicht ein NetAddr::IP- oder Net::IP-Guru helfen kann ;-) Ich versuche ein Tool zu schreiben, das es uns einfacher macht ein paar ACLs zu verwalten. In der Datenbank mit den Netzen sind bestimmten Elementen immer /17 Netze zugeordnet, aber die letzte Adresse (wird zu Testzwecken verwendet) fehlt. Eine ACL für z.B. den Range 10.172.0.0 - 10.172.127.254 besteht dann in Netzen gesehen aus je einem /18 /19 /20 .. /32. Ich würde das Netz gerne um die fehlende letze Adresse ergänzen, falls es sich um einen solchen Fall handelt. Bitte schlachtet mich nicht gleich für meinen Code, aber das hier ist, was ich bisher versucht habe (inkl. der Testadressen): Code (perl): (dl
)
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"; } Das ganze scheitert aber leider an Zeile 13+14. Ich nehm mal an, dass man das "/17" nicht einfach mal so dazuschreiben kann. Insgesamt finde ich meine Lösung auch nicht so schön, aber mir ist nichts besseres eingefallen um die letzte Adresse rauszufinden und zu einem Vergleich hinzuzufügen. Wäre super nett, wenn mir da jemand vielleicht nen Tipp oder besseren Weg aufzeigen könnte. vielen Dank Roland Last edited: 2013-06-10 18:51:27 +0200 (CEST) |