モジュール:IP/doc
モジュール:IPはIPアドレスとサブネットを取り扱うライブラリモジュールです。IPv4とIPv6の両方をカバーしており、IPAddress
、 Subnet
、 IPv4Collection
、IPv6Collection
4つのクラスがあります。
ライブラリの読み込み
[編集]local IP = require('Module:IP')
local IPAddress = IP.IPAddress
local Subnet = IP.Subnet
local Util = IP.Util
IPAddress
[編集]IPAddress
クラスは、単一のIPアドレスの取り扱いに使用します。以下の要領で新しいIPAddress
オブジェクトを作成できます。
local ipAddress = IPAddress.new(ipString)
引数となるipString
には、有効なIPv4またはIPv6を渡してください。
例:
local ipv4Address = IPAddress.new('1.2.3.4')
local ipv6Address = IPAddress.new('2001:db8::ff00:12:3456')
なお、IPアドレスではない文字列または無効なIPアドレスが渡された場合、エラーが返ります。ある文字列がIPアドレスかどうかを単純に判別し、呼び出し元モジュール内の処理は継続したい場合pcall
を使用してください。
local isIp, ip = pcall(IPAddress.new, '1.2.3.4') -- isIp: true, ip: IPAddressオブジェクト
local isIp, ip = pcall(IPAddress.new, 'ウィキ助') -- isIp: false, ip: nil
local isIp, ip = pcall(IPAddress.new, '1.2.3.256') -- isIp: false, ip: nil
IPAddress
オブジェクトは関係演算子による比較が可能です。
-- 等価演算子
IPAddress.new('1.2.3.4') == IPAddress.new('1.2.3.4') -- true
IPAddress.new('1.2.3.4') == IPAddress.new('1.2.3.5') -- false
-- 比較演算子
IPAddress.new('1.2.3.4') < IPAddress.new('1.2.3.5') -- true
IPAddress.new('1.2.3.4') > IPAddress.new('1.2.3.5') -- false
IPAddress.new('1.2.3.4') <= IPAddress.new('1.2.3.5') -- true
IPAddress.new('1.2.3.4') <= IPAddress.new('1.2.3.4') -- true
tostring
を用いることでオブジェクトを文字列にすることも可能です。(getIP
の内部関数も同様の働きをします。)
tostring(IPAddress.new('1.2.3.4')) -- "1.2.3.4"
tostring(IPAddress.new('2001:db8::ff00:12:3456')) -- "2001:db8::ff00:12:3456"
-- キャストされたIPv6アドレスは省略形で出力されます:
tostring(IPAddress.new('2001:db8:0:0:0:0:0:0')) -- "2001:db8::"
IPAddress
オブジェクトに対し結合演算子を用いることも可能です。
IPAddress.new('1.2.3.4') .. ' foo' -- "1.2.3.4 foo"
IPAddress.new('1.2.3.4') .. IPAddress.new('5.6.7.8') -- "1.2.3.45.6.7.8"
IPAddress
オブジェクトのメソッドについては以下を参照してください。
getIP
[編集]ipAddress:getIP()
IPアドレスを文字列として返します。tostring
を用いた場合と同様、IPv6アドレスは省略形が出力されます。
例:
IPAddress.new('1.2.3.4'):getIP() -- "1.2.3.4"
IPAddress.new('2001:db8::ff00:12:3456'):getIP() -- "2001:db8::ff00:12:3456"
IPAddress.new('2001:db8:0:0:0:0:0:0'):getIP() -- "2001:db8::"
getVersion
[編集]ipAddress:getVersion()
IPプロトコルのバージョンを返します。IPv4アドレスの場合はIPv4
、IPv6アドレスの場合はIPv6
です。
例:
IPAddress.new('1.2.3.4'):getVersion() -- "IPv4"
IPAddress.new('2001:db8::ff00:12:3456'):getVersion() -- "IPv6"
isIPv4
[編集]ipAddress:isIPv4()
インスタンスに紐づけられたIPアドレスがIPv4の場合はtrue
を、そうでなければfalse
を返します。
例:
IPAddress.new('1.2.3.4'):isIPv4() -- true
IPAddress.new('2001:db8::ff00:12:3456'):isIPv4() -- false
isIPv6
[編集]ipAddress:isIPv6()
インスタンスに紐づけられたIPアドレスがIPv6の場合はtrue
を、そうでなければfalse
を返します。
例:
IPAddress.new('1.2.3.4'):isIPv6() -- false
IPAddress.new('2001:db8::ff00:12:3456'):isIPv6() -- true
isInSubnet
[編集]ipAddress:isInSubnet(subnet)
インスタンスに紐づけられたIPアドレスが、subnet
引数で指定されたサブネットに属する場合はtrue
を、そうでなければfalse
を返します。subnet
引数に対する有効な値はSubnet
オブジェクトまたはCIDRの文字列です。
例:
IPAddress.new('1.2.3.4'):isInSubnet('1.2.3.0/24') -- true
IPAddress.new('1.2.3.4'):isInSubnet('1.2.4.0/24') -- false
IPAddress.new('1.2.3.4'):isInSubnet(Subnet.new('1.2.3.0/24')) -- true
IPAddress.new('2001:db8::ff00:12:3456'):isInSubnet('2001:db8::ff00:12:0/112') -- true
getSubnet
[編集]ipAddress:getSubnet(bitLength)
インスタンスに紐づけられたIPアドレスに対し、bitLength
で指定したビット長のサブネットに対応するSubnet
オブジェクトを返します。bitLength
引数は、IPv4アドレスの場合は0-32の整数、IPv6アドレスの場合は0-128の整数のみ指定できます。
例:
IPAddress.new('1.2.3.4'):getSubnet(24) -- Subnet.new('1.2.3.0/24')と等価
getNextIP
[編集]ipAddress:getNextIP()
インスタンスに紐づけられたIPアドレスに1を加算したIPAddress
オブジェクトを返します。255.255.255.255
のIPv4アドレスは0.0.0.0
となり、ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
のIPv6アドレスは::
となります。
例:
IPAddress.new('1.2.3.4'):getNextIP() -- IPAddress.new('1.2.3.5')と等価
IPAddress.new('2001:db8::ff00:12:3456'):getNextIP() -- IPAddress.new('2001:db8::ff00:12:3457')と等価
IPAddress.new('255.255.255.255'):getNextIP() -- IPAddress.new('0.0.0.0')と等価
getPreviousIP
[編集]ipAddress:getPreviousIP()
インスタンスに紐づけられたIPアドレスから1を減算したIPAddress
オブジェクトを返します。0.0.0.0
のIPv4アドレスは255.255.255.255
となり、::
のIPv6アドレスはffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
となります。
例:
IPAddress.new('1.2.3.4'):getPreviousIP() -- IPAddress.new('1.2.3.3')と等価
IPAddress.new('2001:db8::ff00:12:3456'):getPreviousIP() -- IPAddress.new('2001:db8::ff00:12:3455')と等価
IPAddress.new('0.0.0.0'):getPreviousIP() -- IPAddress.new('255.255.255.255')と等価
Subnet
[編集]Subnet
クラスは、IPv4またはIPv6アドレスのサブネットの取り扱いに使用します。以下の要領で新しいSubnet
オブジェクトを作成できます。
local subnet = Subnet.new(cidrString)
cidrString
引数は、IPv4またはIPv6の有効なCIDRである必要があります。
local cidr = Subnet.new('255.255.255.0/24') -- Subnetオブジェクト
local cidr = Subnet.new('255.255.255.1/24') -- エラー
Subnet
オブジェクトは等価演算子による比較が可能です。
Subnet.new('1.2.3.0/24') == Subnet.new('1.2.3.0/24') -- true
Subnet.new('1.2.3.0/24') == Subnet.new('1.2.3.0/25') -- false
Subnet.new('1.2.3.0/24') == Subnet.new('2001:db8::ff00:12:0/112') -- false
Subnet.new('2001:db8::ff00:12:0/112') == Subnet.new('2001:db8::ff00:12:0/112') -- true
Subnet.new('2001:db8:0:0:0:0:0:0/112') == Subnet.new('2001:db8::/112') -- true
tostring
を用いることでオブジェクトを文字列にすることも可能です。(getCIDR
の内部関数も同様の働きをします。)
tostring(Subnet.new('1.2.3.0/24')) -- "1.2.3.0/24"
tostring(Subnet.new('2001:db8::ff00:12:0/112')) -- "2001:db8::ff00:12:0/112"
tostring(Subnet.new('2001:db8:0:0:0:0:0:0/112')) -- "2001:db8::/112"
Subnet
オブジェクトに対し結合演算子を用いることも可能です。
Subnet.new('1.2.3.0/24') .. ' foo' -- "1.2.3.0/24 foo"
Subnet.new('1.2.3.0/24') .. Subnet.new('4.5.6.0/24') -- "1.2.3.0/244.5.6.0/24"
Subnet
オブジェクトのメソッドについては以下を参照してください。
getPrefix
[編集]subnet:getPrefix()
サブネット内で最初のIPアドレスをIPAddress
オブジェクトとして返します。
例:
Subnet.new('1.2.3.0/24'):getPrefix() -- IPAddress.new('1.2.3.0')と等価
Subnet.new('2001:db8::ff00:12:0/112'):getPrefix() -- IPAddress.new('2001:db8::ff00:12:0')と等価
getHighestIP
[編集]subnet:getHighestIP()
サブネット内で最後のIPアドレスをIPAddress
オブジェクトとして返します。
例:
Subnet.new('1.2.3.0/24'):getHighestIP() -- IPAddress.new('1.2.3.255')と等価
Subnet.new('2001:db8::ff00:12:0/112'):getHighestIP() -- IPAddress.new('2001:db8::ff00:12:ffff')と等価
getBitLength
[編集]subnet:getBitLength()
インスタンスに紐づけられたCIDRのビット長を返します。IPv4アドレスの場合は0-32の整数、IPv6アドレスの場合は0-128の整数です。
例:
Subnet.new('1.2.3.0/24'):getBitLength() -- 24
Subnet.new('2001:db8::ff00:12:0/112'):getBitLength() -- 112
getCIDR
[編集]subnet:getCIDR()
CIDRを文字列として返します。
例:
Subnet.new('1.2.3.0/24'):getCIDR() -- "1.2.3.0/24"
Subnet.new('2001:db8::ff00:12:0/112'):getCIDR() -- "2001:db8::ff00:12:0/112"
Subnet.new('2001:db8:0:0:0:0:0:0/112'):getCIDR() -- "2001:db8::/112"
getVersion
[編集]subnet:getVersion()
IPプロトコルのバージョンを返します。IPv4アドレスの場合はIPv4
、IPv6アドレスの場合はIPv6
です。
例:
Subnet.new('1.2.3.0/24'):getVersion() -- "IPv4"
Subnet.new('2001:db8::ff00:12:0/112'):getVersion() -- "IPv6"
isIPv4
[編集]subnet:isIPv4()
インスタンスに紐づけられたCIDRがIPv4の場合はtrue
を、そうでなければfalse
を返します。
例:
Subnet.new('1.2.3.0/24'):isIPv4() -- true
Subnet.new('2001:db8::ff00:12:0/112'):isIPv4() -- false
isIPv6
[編集]subnet:isIPv6()
インスタンスに紐づけられたCIDRがIPv6の場合はtrue
を、そうでなければfalse
を返します。
例:
Subnet.new('1.2.3.0/24'):isIPv6() -- false
Subnet.new('2001:db8::ff00:12:0/112'):isIPv6() -- true
containsIP
[編集]subnet:containsIP(ip)
インスタンスに紐づけられたCIDRがip
引数のIPアドレスを内包する場合はtrue
を、そうでなければfalse
を返します。ip
引数として有効な値は、IPアドレスを示す文字列またはIPAddress
オブジェクトです。
例:
Subnet.new('1.2.3.0/24'):containsIP('1.2.3.4') -- true
Subnet.new('1.2.3.0/24'):containsIP('1.2.4.4') -- false
Subnet.new('1.2.3.0/24'):containsIP(IPAddress.new('1.2.3.4')) -- true
Subnet.new('2001:db8::ff00:12:0/112'):containsIP('2001:db8::ff00:12:3456') -- true
overlapsSubnet
[編集]subnet:overlapsSubnet(subnet)
インスタンスに紐づけられたCIDRがsubnet
引数のCIDRに含まれる場合true
を、そうでなければfalse
を返します。subnet
引数として有効な値は、CIDRを示す文字列またはSubnet
オブジェクトです。
例:
Subnet.new('1.2.3.0/24'):overlapsSubnet('1.2.0.0/16') -- true
Subnet.new('1.2.3.0/24'):overlapsSubnet('1.2.12.0/22') -- false
Subnet.new('1.2.3.0/24'):overlapsSubnet(Subnet.new('1.2.0.0/16')) -- true
Subnet.new('2001:db8::ff00:12:0/112'):overlapsSubnet('2001:db8::ff00:0:0/96') -- true
walk
[編集]subnet:walk()
walk
メソッドは、サブネットに含まれるすべてのIPAddress
オブジェクトをループ処理します。
例:
for ipAddress in Subnet.new('192.168.0.0/30'):walk() do
mw.log(tostring(ipAddress))
end
-- 192.168.0.0
-- 192.168.0.1
-- 192.168.0.2
-- 192.168.0.3
IPv4Collection
[編集]IPv4Collection
クラスはIPv4アドレスとサブネットの取り扱いに使用します。以下の要領で新しいIPv4Collection
オブジェクトを作成できます。
local collection = IPv4Collection.new()
IPv4Collection
オブジェクトのメソッドについては以下を参照してください。
getVersion
[編集]collection:getVersion()
IPv4
の文字列を返します。
addIP
[編集]collection:addIP(ip)
コレクションにIPアドレスを追加します。ip
引数に対する有効な値はIPアドレスの文字列またはIPAddress
オブジェクトです。
例:
collection:addIP('1.2.3.4')
collection:addIP(IPAddress.new('1.2.3.4'))
このメソッドはチェーンできます。
collection:addIP('1.2.3.4'):addIP('5.6.7.8')
addSubnet
[編集]collection:addSubnet(subnet)
コレクションにサブネットを追加します。subnet
引数に対する有効な値はCIDRの文字列またはSubnet
オブジェクトです。
例:
collection:addSubnet('1.2.3.0/24')
collection:addSubnet(Subnet.new('1.2.3.0/24'))
このメソッドはチェーンできます。
collection:addSubnet('1.2.0.0/24'):addSubnet('1.2.1.0/24')
addFromString
[編集]collection:addFromString(str)
ランダムな文字列からIPv4アドレスとサブネットを抽出し、コレクションに追加します。文字列内で該当しない部分は無視されます。
例:
collection:addFromString('Add some IPs and subnets: 1.2.3.4 1.2.3.5 2001:0::f foo 1.2.4.0/24')
このメソッドはチェーンできます。
collection:addFromString('foo 1.2.3.4'):addFromString('bar 5.6.7.8')
containsIP
[編集]collection:containsIP(ip)
コレクションが特定のIPアドレスを含む場合はtrue
を、そうでない場合はfalse
を返します。ip
引数に対する有効な値はIPアドレスの文字列またはIPAddress
オブジェクトです。
例:
collection:containsIP('1.2.3.4')
collection:containsIP(IPAddress.new('1.2.3.4'))
getRanges
[編集]collection:getRanges()
コレクション内のIPをソートし、ペアを配列として返します。それぞれのIPペアはpair[1]
からpair[2]
までの連続したIPレンジとなります。pair[1]
とpair[2]
はIPAddress
オブジェクトです。
例:
collection:addSubnet('1.2.0.0/24')
collection:addSubnet('1.2.1.0/24')
collection:addSubnet('1.2.10.0/24')
mw.logObject(collection:getRanges())
-- 返り値:
-- table#1 {
-- table#2 {
-- 1.2.0.0,
-- 1.2.1.255,
-- },
-- table#3 {
-- 1.2.10.0,
-- 1.2.10.255,
-- },
-- }
overlapsSubnet
[編集]collection:overlapsSubnet(subnet)
subnet
引数がコレクション内のIPアドレスまたはサブネットに含まれる場合true, obj
を、そうでない場合false
を返します。返り値のobj
は指定のサブネットと包含関係になるIPAddress
またはSubnet
オブジェクトです。
例:
collection:addIP('1.2.3.4')
collection:overlapsSubnet('1.2.3.0/24') -- true, IPAddress.new('1.2.3.4')
collection:overlapsSubnet('1.2.4.0/24') -- false
IPv6Collection
[編集]IPv6Collection
クラスはIPv6アドレスとサブネットの取り扱いに使用します。IPv6Collection
オブジェクトはIPv4Collection
と同じメソッドを有しており、平行的に機能します。ただし、コレクションに追加されるIPアドレスまたはサブネットはIPv6である必要があります。以下の要領で新しいIPv6Collection
オブジェクトを作成できます。
local collection = IPv6Collection.new()