Шукати в цьому блозі

четвер, 2 лютого 2012 р.

geoip своими руками

Формируем текстовый файл:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
$ unzip GeoIPCountryCSV.zip
$ cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip.txt
Итоговый файл представляет из себя набор данных, разделённых запятыми, оформленных в три колонки:
  1. начальный ip-адрес диапазона, в десятичной нотации;
  2. конечный ip-адрес диапазона, в десятичной нотации;
  3. мнемонический код страны.
Перевод ip-адреса в десятичную нотацию и обратно:
my $in = "212.90.160.40";
my @a = split (/\./,$in);

my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
my $dotip = join ".",unpack("CCCC",pack("N",$decip));

print $decip," = ",$dotip,"\n";
Организовать простой поиск ip в организованной выше базе адресов можно, например, так:
#!/usr/bin/perl -w
use strict;

my $geoipdb = "./geoip.txt";
my $in = <>; chomp($in);

if ($in =~ m!\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b!) {
  my @a = split(/\./,$in);
  my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
  open FGEOIP, "<$geoipdb" || die "Can't open $geoipdb: $!\n";
  while (<FGEOIP>) {
    chomp;
    my ($bip,$eip,$c) = split(",");
    if ($decip>=$bip && $decip<=$eip) {
      print $in," is ",$c, "\n";
      last;
    }
  }
  close FGEOIP;
} else {
  print STDERR "Not IP on STDIN\n";
}
и использовать подобным образом:
$ echo 212.90.160.40 | fgeoip
212.90.160.40 is UA

2 коментарі:

sash-kan сказав...

http://unixforum.org/index.php?s=&showtopic=130571&view=findpost&p=1200406
с тебя бутылка

Alexander Russkih сказав...

Безусловно :) Как только окажусь в Питере или ты в Киеве :)