#!/bin/sh # $Id: squid-buildua,v 1.4 2004/02/19 18:12:19 i Exp $ # Формирование списка сетей UA-IX для дальнейшего использования # например в squid acl # Чего делает: # - лезет по ссылке $url за списком сетей в CIDR формате # - вычисляем мелкие блоки, для которых уже есть бОльшие префиксы # - формирует файл $net. # # ЗЫ: алгоритм работы с масками передран со скрипта на colocall.net # спасибо им за сыкономленные пару минут времени :) # url='http://www.colocall.net/ua/?list' out="./ua-nets.tmp" net="./ua-nets.net" fetch="/usr/local/bin/curl -s -o '$out' '$url'" eval $fetch # cp -v "$net" "$out" if [ $? ]; then sort -t / +1 +0 "$out" | perl -e ' my %ip; my $verbose = 0; my @nets = <>; BLOCK: foreach $l (@nets){ chomp $l; next BLOCK unless $l =~ /^(\d+\.\d+\.\d+\.\d+)\/(\d+)$/; # my ($cip,$mask)=split /\//, $l; my ($cip, $mask)=($1, $2); print STDERR ">> Read - $l ($cip / $mask\n" if $verbose; foreach $i (keys %ip){ my ($net,$msk)=split /\//, $i; my $poaddr=unpack("L",pack("C4",(split (/\./, $net)))); my $puaddr=unpack("L",pack("C4",(split (/\./, $cip)))); my $pmask=unpack("L",pack("B32",(1 x $msk))); if (($puaddr & $pmask)==($poaddr & $pmask)) { print STDERR "Network $cip/$mask already in $net/$msk\n" if $verbose; next BLOCK; } } $ip{$l}=($cip, $mask); print STDERR "Network $cip/$mask added\n" if $verbose; print "$cip/$mask\n"; } ' > "$out.tmp" cmp -s "$out.tmp" "$net" || ( echo Files changes... diff -u -0 --suppress-common-lines "$net" "$out" mv "$out.tmp" "$net" ) /bin/rm -f "$out" "$out.tmp" exit 0 else exit 127 fi # $Log: squid-buildua,v $ # Revision 1.4 2004/02/19 18:12:19 i # Added simple documentation and copyright # # Revision 1.3 2004/02/19 17:58:55 i # Added Log section :) #