Το Module:IP είναι μια βιβλιοθήκη για εργασία με διευθύνσεις IP και υποδίκτυα. Μπορεί να χειριστεί και IPv4 και IPv6. Η βιβλιοθήκη εξάγει τέσσερις κλάσεις, IPAddress, Subnet, IPv4Collection, και IPv6Collection.

Φόρτωση της βιβλιοθήκης

Επεξεργασία
local IP = require('Module:IP')
local IPAddress = IP.IPAddress
local Subnet = IP.Subnet

Η κλάση IPAddress χρησιμοποιείται για εργασία με μεμονωμένες διευθύνσεις IP. Για να δημιουργήσετε ένα νέο αντικείμενο διεύθυνσης IP:

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')

Τα αντικείμενα 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.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 έχουν διάφορες μεθόδους, οι οποίες περιγράφονται παρακάτω.

ipAddress:getIP()

Επιστρέφει μια παράσταση συμβολοσειράς της διεύθυνσης IP. Οι διευθύνσεις 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::"
ipAddress:getVersion()

Επιστρέφει την έκδοση του πρωτοκόλλου IP που χρησιμοποιείται. Αυτό είναι «IPv4» για διευθύνσεις IPv4 και «IPv6» για διευθύνσεις IPv6.

Παραδείγματα:

IPAddress.new('1.2.3.4'):getVersion()                -- "IPv4"
IPAddress.new('2001:db8::ff00:12:3456'):getVersion() -- "IPv6"
ipAddress:isIPv4()

Επιστρέφει true εάν η διεύθυνση IP είναι διεύθυνση IPv4, και false διαφορετικά.

Παραδείγματα:

IPAddress.new('1.2.3.4'):isIPv4()                -- true
IPAddress.new('2001:db8::ff00:12:3456'):isIPv4() -- false
ipAddress:isIPv6()

Επιστρέφει true εάν η διεύθυνση IP είναι διεύθυνση IPv6, και false διαφορετικά.

Παραδείγματα:

IPAddress.new('1.2.3.4'):isIPv6()                -- false
IPAddress.new('2001:db8::ff00:12:3456'):isIPv6() -- true
ipAddress:isInSubnet(subnet)

Επιστρέφει true εάν η διεύθυνση IP βρίσκεται στο υποδίκτυο subnet και false διαφορετικά. Το subnet μπορεί να είναι Subnet object ή 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
ipAddress:getSubnet(bitLength)

Επιστρέφει ένα αντικείμενο υποδικτύου για το υποδίκτυο με ένα bit μήκος bitLength που περιέχει την τρέχουσα IP. Η παράμετρος bitLength πρέπει να είναι ακέραιος μεταξύ 0 και 32 για διευθύνσεις IPv4 ή ακέραιος μεταξύ 0 και 128 για διευθύνσεις IPv6.

Παραδείγματα:

IPAddress.new('1.2.3.4'):getSubnet(24) -- Equivalent to Subnet.new('1.2.3.0/24')
ipAddress:getNextIP()

Επιστρέφει ένα νέο αντικείμενο IPAddress ισοδύναμο με την τρέχουσα διεύθυνση IP προσαυξημένη κατά ένα. Η διεύθυνση IPv4 "255.255.255.255" μετατρέπεται σε "0.0.0.0" και η διεύθυνση IPv6 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" μετατρέπεται σε "::".

Παραδείγματα:

IPAddress.new('1.2.3.4'):getNextIP()                -- Equivalent to IPAddress.new('1.2.3.5')
IPAddress.new('2001:db8::ff00:12:3456'):getNextIP() -- Equivalent to IPAddress.new('2001:db8::ff00:12:3457')
IPAddress.new('255.255.255.255'):getNextIP()        -- Equivalent to IPAddress.new('0.0.0.0')
ipAddress:getPreviousIP()

Επιστρέφει ένα νέο αντικείμενο IPAddress ισοδύναμο με την τρέχουσα διεύθυνση IP μειωμένη κατά ένα. Η διεύθυνση IPv4 "0.0.0.0" μετατρέπεται σε "255.255.255.255" και η διεύθυνση IPv6 "::" μετατρέπεται σε "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff".

Παραδείγματα:

IPAddress.new('1.2.3.4'):getPreviousIP()                -- Equivalent to IPAddress.new('1.2.3.3')
IPAddress.new('2001:db8::ff00:12:3456'):getPreviousIP() -- Equivalent to IPAddress.new('2001:db8::ff00:12:3455')
IPAddress.new('0.0.0.0'):getPreviousIP()                -- Equivalent to IPAddress.new('255.255.255.255')

Η κλάση Subnet χρησιμοποιείται για εργασία με υποδίκτυα διευθύνσεων IPv4 ή IPv6. Για να δημιουργήσετε ένα νέο αντικείμενο υποδικτύου:

local subnet = Subnet.new(cidrString)

cidrStringπρέπει να είναι έγκυρη συμβολοσειρά IPv4 ή IPv6 CIDR.

Τα αντικείμενα υποδικτύου μπορούν να συγκριθούν ως προς την ισότητα:

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.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()

Επιστρέφει ένα αντικείμενο IPAddress για τη χαμηλότερη διεύθυνση IP στο υποδίκτυο.

Παραδείγματα:

Subnet.new('1.2.3.0/24'):getPrefix()              -- Equivalent to IPAddress.new('1.2.3.0')
Subnet.new('2001:db8::ff00:12:0/112'):getPrefix() -- Equivalent to IPAddress.new('2001:db8::ff00:12:0')
subnet:getHighestIP()

Επιστρέφει ένα αντικείμενο IPAddress για την υψηλότερη διεύθυνση IP στο υποδίκτυο.

Παραδείγματα:

Subnet.new('1.2.3.0/24'):getHighestIP()              -- Equivalent to IPAddress.new('1.2.3.255')
Subnet.new('2001:db8::ff00:12:0/112'):getHighestIP() -- Equivalent to IPAddress.new('2001:db8::ff00:12:ffff')
subnet:getBitLength()

Επιστρέφει το μήκος bit του υποδικτύου. Αυτός είναι ένας ακέραιος αριθμός μεταξύ 0 και 32 για διευθύνσεις IPv4 ή ακέραιος μεταξύ 0 και 128 για διευθύνσεις IPv6.

Παραδείγματα:

Subnet.new('1.2.3.0/24'):getBitLength()              -- 24
Subnet.new('2001:db8::ff00:12:0/112'):getBitLength() -- 112
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"
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"
subnet:isIPv4()

Επιστρέφει true εάν το υποδίκτυο χρησιμοποιεί IPv4 και false διαφορετικά.

Παραδείγματα:

Subnet.new('1.2.3.0/24'):isIPv4()              -- true
Subnet.new('2001:db8::ff00:12:0/112'):isIPv4() -- false
subnet:isIPv6()

Επιστρέφει true εάν το υποδίκτυο χρησιμοποιεί IPv6 και false διαφορετικά.

Παραδείγματα:

Subnet.new('1.2.3.0/24'):isIPv6()              -- false
Subnet.new('2001:db8::ff00:12:0/112'):isIPv6() -- true
subnet:containsIP(ip)

Επιστρέφει true εάν το υποδίκτυο περιέχει τη διεύθυνση IP ip, και false διαφορετικά. Το ip μπορεί να είναι μια συμβολοσειρά διεύθυνσης IP ή ένα αντικείμενο διεύθυνσης IP.

Παραδείγματα:

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
subnet:overlapsSubnet(subnet)

Επιστρέφει true εάν το τρέχον υποδίκτυο επικαλύπτεται με το subnet, και false διαφορετικά. Το subnet μπορεί να είναι μια συμβολοσειρά CIDR ή ένα αντικείμενο υποδικτύου.

Παραδείγματα:

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
subnet:walk()

Η μέθοδος walk περιδιαβαίνει (iterates) σε όλα τα αντικείμενα διεύθυνσης IP στο υποδίκτυο.

Παραδείγματα:

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 χρησιμοποιείται για εργασία με πολλές διαφορετικές διευθύνσεις IPv4 και υποδίκτυα IPv4. Για να δημιουργήσετε ένα νέο αντικείμενο IPv4Collection:

local collection = IPv4Collection.new()

Τα αντικείμενα IPv4Collection έχουν διάφορες μεθόδους, οι οποίες περιγράφονται παρακάτω.

collection:getVersion()

Επιστρέφει τη συμβολοσειρά "IPv4".

collection:addIP(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')
collection:addSubnet(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')
collection:addFromString(str)

Εξάγει τυχόν διευθύνσεις IPv4 και IPv4 υποδίκτυα CIDR από το str και τα προσθέτει στη συλλογή. Οποιοδήποτε κείμενο δεν είναι διεύθυνση IPv4 ή υποδίκτυο CIDR αγνοείται.

Παραδείγματα:

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')
collection:containsIP(ip)

Επιστρέφει true εάν η συλλογή περιέχει την καθορισμένη IP· διαφορετικά επιστρέφει false. Η παράμετρος ip μπορεί να είναι μια συμβολοσειρά ή ένα αντικείμενο IPAddress.

Παραδείγματα:

collection:containsIP('1.2.3.4')
collection:containsIP(IPAddress.new('1.2.3.4'))
collection:getRanges()

Επιστρέφει έναν ταξινομημένο πίνακα ζευγών IP ισοδύναμου με τη συλλογή. Κάθε ζεύγος IP είναι ένας πίνακας που αντιπροσωπεύει ένα συνεχόμενο εύρος διευθύνσεων IP από pair[1] έως pair[2] συμπεριλαμβανομένου. Το 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())
-- Logs the following:
-- table#1 {
--   table#2 {
--     1.2.0.0,
--     1.2.1.255,
--   },
--   table#3 {
--     1.2.10.0,
--     1.2.10.255,
--   },
-- }
collection:overlapsSubnet(subnet)

Επιστρέφει true, obj εάν το subnet επικαλύπτει αυτήν τη συλλογή, όπου το obj είναι το πρώτο αντικείμενο IPAddress ή Subnet που επικαλύπτει το υποδίκτυο. Διαφορετικά, επιστρέφει false. Το subnet μπορεί να είναι μια συμβολοσειρά CIDR ή ένα αντικείμενο 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 χρησιμοποιείται για εργασία με πολλές διαφορετικές διευθύνσεις IPv6 και υποδίκτυα IPv6. Τα αντικείμενα IPv6Collection είναι άμεσα ανάλογα με τα αντικείμενα IPv4Collection: περιέχουν τις ίδιες μεθόδους και λειτουργούν με τον ίδιο τρόπο, αλλά όλες οι διευθύνσεις IP και τα υποδίκτυα που προστίθενται σε αυτό πρέπει να είναι IPv6, όχι IPv4.

Για να δημιουργήσετε ένα νέο αντικείμενο IPv6Collection:

local collection = IPv6Collection.new()