не самый быстрый, и не самый оптимальный, но работающий перловый скрипт превращающий http://noc.ix.net.ua/ua-list.txt в удобоваримый для сквида вид.
<pre>
#!/usr/bin/perl
@uaix=<STDIN>;
#@uaix = ("192.168.0.0", "192.168.0.0/16");
undef @netz;
foreach $net (@uaix) {
chomp $net;
my ($addr,$mask)=split/\//,$net;
if ( $mask eq "" ) { $mask = 24; }
push (@netz, "$addr/$mask");
}
undef %saw;
@nethash{@netz} = ();
@uaix = sort keys %nethash;
foreach $net1 (@uaix) {
$overlapped = 0;
foreach $net2 (keys %nethash) {
if ((check4overlap($net1,$net2) == 1)and($net1 ne $net2)) { $overlapped = 1; }
}
if ($overlapped ==1) {
delete $nethash{$net1};
}
}
@uaix = sort keys %nethash;
foreach $net (@uaix) {
print "$net\n";
}
sub check4overlap {
($net1,$net2) =@_;
my ($addr1,$mask1)=split/\//,$net1;
my $paddrp1=pack("C4",(split (/\./, $addr1)));
my $paddr1=unpack("L",$paddrp1);
my $pmask1=unpack("L",pack("B32",(1 x $mask1)));
my $phmin1 = pack("B*",("0"x31) . "1") | $paddrp1;
my $phmax1 = pack("B*",("0"x $mask1) . ("1" x (31 - $mask1)) . "0" ) | $paddrp1;
my $pminaddr1 = unpack("L",$phmin1);
my $pmaxaddr1 = unpack("L",$phmax1);
my ($addr2,$mask2)=split/\//,$net2;
my $paddr2=unpack("L",pack("C4",(split (/\./, $addr2))));
my $pmask2=unpack("L",pack("B32",(1 x $mask2)));
my $ifmin1in2 = (($pminaddr1 & $pmask2)==($paddr2 & $pmask2));
my $ifmax1in2 = (($pmaxaddr1 & $pmask2)==($paddr2 & $pmask2));
if (($ifmin1in2==1)and($ifmax1in2==1)){
return 1;
}
return 0;
}
</pre> |