#!/usr/bin/perl sub ip_to_number { my $ip = shift; unless($ip) {return undef;} $ip =~ s/\s//gs; $ip =~ s/\,/\./g; if ($ip =~ /^((([01]?\d{1,2})|(2([0-4]\d|5[0-5])))\.){3}(([01]?\d{1,2})|(2([0-4]\d|5[0-5])))$/) { my @bits = split /\./, $ip; my $ADDRESS = $bits[0]*256*256*256 + $bits[1]*256*256 + $bits[2]*256 + $bits[3]; return $ADDRESS; } else { return undef; } } print "Loading cities...\n"; my @cities = (); open IN, ") { chomp($kuku); my @mas = split /\t/, $kuku; $cities[$mas[0]]->{'city'} = $mas[1]; $cities[$mas[0]]->{'region'} = $mas[2]; $cities[$mas[0]]->{'district'} = $mas[3]; $cities[$mas[0]]->{'coordinates'} = $mas[4].",".$mas[5]; } close IN; print "Cities loaded\n"; print "Loading cidr_optim.txt...\n"; my @inetnums = (); my $i = 0; open IN, ") { chomp($kuku); my @mas = split /\t/, $kuku; $inetnums[$i]->{'start'} = $mas[0]; $inetnums[$i]->{'stop'} = $mas[1]; $inetnums[$i]->{'inetnum'} = $mas[2]; $inetnums[$i]->{'country'} = $mas[3]; $inetnums[$i]->{'cityid'} = $mas[4]; $i++; } close IN; print "Cities loaded. $i lines loaded\n"; print "Enter IP: "; while (my $record = ) { $record =~ s/\s//gs; my $ADDRESS = ip_to_number($record); if (defined($ADDRESS)) { my $MAXINDEX = $i; my $MININDEX = 0; my $isfinded = 0; my $cc = 0; # Iterations counter my $CURRENTINDEX; while ($MININDEX < $MAXINDEX) { $cc++; $CURRENTINDEX = int(($MININDEX + $MAXINDEX)/2); if ($ADDRESS < $inetnums[$CURRENTINDEX]->{'start'}) { $MAXINDEX = $CURRENTINDEX; next; } if ($ADDRESS > $inetnums[$CURRENTINDEX]->{'stop'}) { $MININDEX = $CURRENTINDEX + 1; next; } if (($inetnums[$CURRENTINDEX]->{'start'} <= $ADDRESS) && ($ADDRESS <= $inetnums[$CURRENTINDEX]->{'stop'})) { $isfinded = 1; last; } } print "IP: $record\n"; if ($isfinded) { print "Range: ".$inetnums[$CURRENTINDEX]->{'inetnum'}."\n"; print "Country: ".$inetnums[$CURRENTINDEX]->{'country'}."\n"; if ($inetnums[$CURRENTINDEX]->{'cityid'} ne "-") { my $id = $inetnums[$CURRENTINDEX]->{'cityid'}; print "City: ".$cities[$id]->{'city'}."\n"; print "Region: ".$cities[$id]->{'region'}."\n"; print "District: ".$cities[$id]->{'district'}."\n"; print "Coord: ".$cities[$id]->{'coordinates'}."\n"; } else { print "City: unknown\n"; } } else { print "Ip-address not found!\n"; } print "Iterations: ".$cc."\n"; } else { print "Incorrect IP address\n"; } print "\nEnter IP (Ctrl+C to exit): "; }