perl で旧来の GeoIP モジュールを使っていたプログラムを GeoLite2 対応に変更する方法です。
use Geo::IP;
$geoip = Geo::IP->new(GEOIP_STANDARD);
# IPアドレスで解決
$result = $geoip->country_code_by_addr($ip);
# ホスト名で解決
$result = $geoip->country_code_by_name($host);
use GeoIP2::Database::Reader;
my $reader = GeoIP2::Database::Reader->new(
file => "/usr/share/GeoLite2/GeoLite2-Country.mmdb",
locales => [ 'en', 'ja', ]
);
# IPアドレスで解決
my $country = $reader->country( ip => $ip )->country->iso_code();
# (ホスト名で解決する方法は標準では提供されていません)
プログラムを簡単に修正するためのモジュールを作成しました。
MaxMind GeoLite2の利用方法
の方法でデータベースやコンフィグを設定している前提です。
そうでなければ以下の ConfigReader::Simple の行は削除し
$config->get("MMDB")
をデータベースファイル名に変更してください。
use ConfigReader::Simple;
...
my $config = ConfigReader::Simple->new("/usr/share/GeoLite2/config");
my $geoip = GeoIP2::Database::Reader->new(
file => $config->get("MMDB"),
locales => [ 'en', 'ja', ]
);
GeoIP_emulate.pm は以下で表示されるエラーメッセージの @INC のディレクトリのどこかに設置してください。
perl -e 'use no_such_module'
そして perl のプログラムを次のように修正してください。
use Geo::IP;
$geoip = Geo::IP->new(GEOIP_STANDARD);
↓
use GeoIP_emulate;
$geoip = GeoIP_emulate->new();
GeoIP_emulate.pm をプログラムと同じディレクトリに置く場合は、上記より前に以下を追加してください。
use FindBin;
use lib $FindBin::Bin;
(以上)