IPアドレス<=>国、国<=>AS番号、IPアドレス<=>10進整数、IP/CIDR<=>maxIP,minIPの変換、検索ができるライブラリ(IPv4,IPv6両対応)

#ソース
##URL
https://github.com/INC-i/CCstuff

##各ファイルの説明
sqlディレクトリ : RIRデータベースの作成、テーブル検索に必要なSQLを格納
ccstuff.php : ライブラリ(PHP版)
ccstuff.py : ライブラリ(Python版)
iptocc : コマンド、詳細については下記、「標準入力のIPアドレス部分に国コード、国名を挿入」をご参照ください。
iso3166-1 : 国コードと国名の対応表
makerirdb : RIRデータベースを作成するコマンド
rirdb : makerirdbで作成したRIRデータベース。makerirdbで更新できます。
rirlist : 各RIRのURL
※makerirdbでエラーが発生した際は、URLが更新されている可能性がありますので、
　URLを修正することで、解消できる可能性があります。

#機能の概要

* IPアドレスから国、RIR、割り当て状態、割り当て日時を出力
* 国コードからIPアドレスを出力
　(.htaccessやiptablesなどのアクセス制御で利用可能)
* IPアドレス⇔整数の変換、正規表現でのマッチ、asnの検索など

#アピールポイント

* 国の特定が割りと速いかも
(標準入力のIPアドレス部分に国コード、国名を挿入することもストレスなく可能。
詳しくは、下記、「標準入力のIPアドレス部分に国コード、国名を挿入」を
ご参照ください。)
* IPv6にも対応
* 軽量(データベース含め、40MB程度(今のところ))
※1レコード、1IP、国ではなく1レコード、IP帯、国で登録されています。
　また、同じ国でIP帯が連続している場合はまとめています。
* 外部サーバーとの通信が発生しない(DB作成時のみ発生)
* データベースはコマンドで更新が可能

##2種類あります
* Python 2.6　で開発
* PHP 5.3 で開発 (RIRデータベース構築メソッドは含まない)

###動作環境
* Linuxで上のバージョンと互換性があれば、無問題かと存じます。

※RIRデータベースの作成、更新をされる場合、Pythonは必須です。

#使い方

##0.RIRデータベースの作成
※上記URLに作成済みのRIRデータベースがありますが、
　更新されたい場合などにご利用ください。

makerirdbコマンドでRIRデータベースの作成が可能です。
※実行には、ccstuff.pyが必要です。

`makerirdb [データベースファイル名]`
※データベースファイル名を省略した場合は、rirdbが作成されます。

###Python版では以下の方法でも可能です。
import ccstuff
obj = ccstuff.rir()
obj.createdb() または obj.createdb('データベース名')
※データベース名を指定しない場合、rirdbというファイル名で作成されます。

##1.インスタンス化
###Python版
import ccstuff
obj = ccstuff.rir() または obj = ccstuff.rir('dbファイルのパス') 
###PHP版
require_once 'ccstuff.php';
$obj = new RIR(); 
または　$obj = new RIR("dbファイルのパス");

※dbファイルを指定しない場合は、rirdbが存在すれば、読み込み、
　存在しなければ、PHP版では例外発生、Python版では、DBに接続しない。

※Python版では、set_db('dbファイルのパス')で後から接続可。

##2.IPアドレスから国を特定
###Python版
####IPv4の場合
obj.ipv4tocc('IPv4アドレス')
※戻り値は国2コード、str型です。
####IPv6の場合
obj.ipv6tocc('IPv6アドレス')
※戻り値は国2コード、str型です。
###PHP版
####IPv4の場合
$obj->ipv4tocc('IPv4アドレス');
※戻り値は国2コード
####IPv6の場合
$obj->ipv6tocc('IPv6アドレス');
※戻り値は国2コード

##3.国からIPアドレスのリストを出力
###Python版
####IPv4の場合
obj.cctoipv4s('JP')
※戻り値は、ip/cidrのリスト
####IPv6の場合
obj.cctoipv6s('JP')
※戻り値は、ip/cidrのリスト
###PHP版
####IPv4の場合
$obj->cctoipv4s('JP')
※戻り値は、ip/cidrの配列
####IPv6の場合
$obj->cctoipv6s('JP')
※戻り値は、ip/cidrの配列

##4.国コードから国名を特定
###Python版
obj.cctoname('JP')
※戻り値は国名の英語、日本語表記のリスト(要素はunicode型)
###PHP版
$obj->cctoname('JP')
※戻り値は国名の英語、日本語表記の配列(要素はstring型)

##5.標準入力のIPアドレス部分に国コード、国名を挿入

iptoccコマンドを利用します。
※ccstuff.pyが必要です。

###ご利用方法1
`iptocc IPアドレス`

出力内容:ip,国2コード,国名(英語)

###ご利用方法2
`コマンド1 | iptocc`

出力内容:コマンド1の標準出力のIPアドレスの部分に国コードと国名(英語)が挿入されます。

※-jを指定すると、国名が日本語になります。
※このコマンドはipv6には対応していません。

##6.IPアドレスから整数(10進数)への変換

###Python版
####IPv4の場合
obj.ipv4ton('255.255.255.255')
4294967295
####IPv6の場合
obj.ipv6ton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF')
340282366920938463463374607431768211455L
###PHP版
####IPv4の場合
echo $obj->ipv4ton('255.255.255.255');
4294967295
####IPv6の場合
echo $obj->ipv6ton('FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF');
340282366920938463463374607431768211455
※↑string型です

##7.整数(10進数)からIPアドレスへの変換

###Python版
####IPv4の場合
obj.ntoipv4(4294967295)
'255.255.255.255'
####IPv6の場合
obj.ntoipv6(340282366920938463463374607431768211455L)
'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
###PHP版
####IPv4の場合
echo $obj->ntoipv4(4294967295);
255.255.255.255
####IPv6の場合
※pythonと異なり、string型で渡す必要があります。
echo $obj->ntoipv6('340282366920938463463374607431768211455');
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

##8.IP/cidrからIPアドレスの最小、最大への変換
###Python版
####IPv4の場合
obj.getiprangebycidr('192.168.1.0/24')
['192.168.1.0', '192.168.1.255']
####IPv6の場合
obj.getiprangebycidr('0000:0000:0000:0000:0000:0000:0000:0000/124')
['0000:0000:0000:0000:0000:0000:0000:0000', '0000:0000:0000:0000:0000:0000:0000:000f']
###PHP版
####IPv4の場合
var_dump($obj->getiprangebycidr('192.168.1.0/24'));
array(2) {
  [0]=>
  string(11) "192.168.1.0"
  [1]=>
  string(13) "192.168.1.255"
}
####IPv6の場合
var_dump($obj->getiprangebycidr("0000:0000:0000:0000:0000:0000:0000:0000/124"));
array(2) {
  [0]=>
  string(39) "0000:0000:0000:0000:0000:0000:0000:0000"
  [1]=>
  string(39) "0000:0000:0000:0000:0000:0000:0000:000f"
}
##9.IPアドレスの最小、最大からIP/cidrへの変換
###Python版
####IPv4の場合
obj.getcidrsbyiprange('192.168.1.0', '192.168.1.255')
['192.168.1.0/24']
####IPv6の場合
obj.getcidrsbyiprange('::0', '::f')
['0000:0000:0000:0000:0000:0000:0000:0000/124']
###PHP版
####IPv4の場合
var_dump($obj->getcidrsbyiprange('192.168.1.0', '192.168.1.255'));
array(1) {
  [0]=>
  string(14) "192.168.1.0/24"
}
####IPv6の場合
var_dump($obj->getcidrsbyiprange('::0', '::f'));
array(1) {
  [0]=>
  string(43) "0000:0000:0000:0000:0000:0000:0000:0000/124"
}

##10.AS番号から国コードを検索
###Python版
obj.asntocc(173)
u'JP'
###PHP版
echo $obj->asntocc(173);
JP

##11.国コードからAS番号のリストを検索
###Python版
len(obj.cctoasns('US'))
21927
※上は戻り値の配列の長さ＝AS番号の個数です。
※cctoasns()の戻り値はAS番号のリストです。
###PHP版
echo count($obj->cctoasns('US'));
21927
※上は戻り値の配列の長さ＝AS番号の個数です。
※cctoasns()の戻り値はAS番号の配列です。

##12.IPアドレス、AS番号から、国、RIR、割り当て状態、割り当て日を出力
###Python版
####IPv4アドレス
obj.getririnfo("8.8.8.8")
[(u'US', u'arin', u'allocated', u'19921201')]
####IPv6アドレス
obj.getririnfo("2404:6800:4004:80a::1003")
[(u'AU', u'apnic', u'allocated', u'20080930')]
####AS番号
※AS番号を引数にする際は、str型ではなく、intまたはlong型です。
obj.getririnfo(173)
[(u'JP', u'apnic', u'allocated', u'20020801')]
###PHP版
####IPv4アドレス
var_dump($obj->getririnfo('8.8.8.8'));
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(2) "US"
    [1]=>
    string(4) "arin"
    [2]=>
    string(9) "allocated"
    [3]=>
    string(8) "19921201"
  }
}
####IPv6アドレス
var_dump($obj->getririnfo("2404:6800:4004:80a::1003"));
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(2) "AU"
    [1]=>
    string(5) "apnic"
    [2]=>
    string(9) "allocated"
    [3]=>
    string(8) "20080930"
  }
}
####AS番号
※AS番号を引数にする際は、string型ではなく、integer型です。
var_dump($obj->getririnfo(173));
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(2) "JP"
    [1]=>
    string(5) "apnic"
    [2]=>
    string(9) "allocated"
    [3]=>
    string(8) "20020801"
  }
}

まだありますので、続けて更新します。
ご意見、ご要望ございましたら、コメントいただけると幸いです。