ip2cidr 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ip2cidr.rb +65 -69
- data/test/test_ip2cidr.rb +44 -46
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7560f2aa3dfe648e86b20a86c315844581516640
|
|
4
|
+
data.tar.gz: c04d1f724bd0dd0cf53eb090376c36994295d3fe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ec43c2211fdb5d43d859eaadb13a274da5e57b9484501bbd33636d81195688cf0280813ea0b35c477d4fe717a5001e90923f8360e435f4e5d9856e2bbd6b1182
|
|
7
|
+
data.tar.gz: 3288dee934e0b30b0722633f2dce36c5bf844444f0cc08a02f28d3f103415e5c7af9c4aed6bc906dabc62285d1200803096759be0647929b82a6587d159c52ac
|
data/lib/ip2cidr.rb
CHANGED
|
@@ -1,70 +1,66 @@
|
|
|
1
|
-
class
|
|
2
|
-
#
|
|
3
|
-
# Convert an ip address in string format to integer.
|
|
4
|
-
def self.
|
|
5
|
-
ipstring = ipstring.split(".")
|
|
6
|
-
longip = Array.new(4)
|
|
7
|
-
for i in 0..3
|
|
8
|
-
longip[i] = ipstring[i].to_i
|
|
9
|
-
end
|
|
10
|
-
#return longip
|
|
11
|
-
return (longip[0] << 24) + (longip[1] << 16) +
|
|
12
|
-
(longip[2] << 8) + longip[3]
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
#
|
|
16
|
-
# Convert an ip address in integer format to string.
|
|
17
|
-
def self.
|
|
18
|
-
ipstring = ""
|
|
19
|
-
ipstring = (longip >> 24).to_s + "." +
|
|
20
|
-
((longip & 0x00FFFFFF)>> 16).to_s + "." +
|
|
21
|
-
((longip & 0x0000FFFF) >> 8).to_s + "." +
|
|
22
|
-
(longip & 0x000000FF).to_s
|
|
23
|
-
return ipstring
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
#
|
|
27
|
-
# Return a list of cidr addresses given a range of ip
|
|
28
|
-
# addresses.
|
|
29
|
-
def self.
|
|
30
|
-
cidr2mask = [0x00000000, 0x80000000, 0xC0000000,
|
|
31
|
-
0xE0000000, 0xF0000000, 0xF8000000,
|
|
32
|
-
0xFC000000, 0xFE000000, 0xFF000000,
|
|
33
|
-
0xFF800000, 0xFFC00000, 0xFFE00000,
|
|
34
|
-
0xFFF00000, 0xFFF80000, 0xFFFC0000,
|
|
35
|
-
0xFFFE0000, 0xFFFF0000, 0xFFFF8000,
|
|
36
|
-
0xFFFFC000, 0xFFFFE000, 0xFFFFF000,
|
|
37
|
-
0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
|
|
38
|
-
0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
|
39
|
-
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8,
|
|
40
|
-
0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF]
|
|
41
|
-
startaddr =
|
|
42
|
-
endaddr =
|
|
43
|
-
cidrlist = Array.new
|
|
44
|
-
|
|
45
|
-
while endaddr >= startaddr
|
|
46
|
-
maxsize = 32
|
|
47
|
-
while maxsize > 0
|
|
48
|
-
mask = cidr2mask[maxsize - 1]
|
|
49
|
-
maskedbase = startaddr & mask
|
|
50
|
-
|
|
51
|
-
if maskedbase != startaddr
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
return cidrlist
|
|
69
|
-
end
|
|
1
|
+
class IPToCIDR
|
|
2
|
+
# ipstring_to_long
|
|
3
|
+
# Convert an ip address in string format to integer.
|
|
4
|
+
def self.ipstring_to_long(ipstring)
|
|
5
|
+
ipstring = ipstring.split(".")
|
|
6
|
+
longip = Array.new(4)
|
|
7
|
+
for i in 0..3
|
|
8
|
+
longip[i] = ipstring[i].to_i
|
|
9
|
+
end
|
|
10
|
+
#return longip
|
|
11
|
+
return (longip[0] << 24) + (longip[1] << 16) +
|
|
12
|
+
(longip[2] << 8) + longip[3]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# long_to_ip_string
|
|
16
|
+
# Convert an ip address in integer format to string.
|
|
17
|
+
def self.long_to_ip_string(longip)
|
|
18
|
+
ipstring = ""
|
|
19
|
+
ipstring = (longip >> 24).to_s + "." +
|
|
20
|
+
((longip & 0x00FFFFFF)>> 16).to_s + "." +
|
|
21
|
+
((longip & 0x0000FFFF) >> 8).to_s + "." +
|
|
22
|
+
(longip & 0x000000FF).to_s
|
|
23
|
+
return ipstring
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# iprange_to_cidr
|
|
27
|
+
# Return a list of cidr addresses given a range of ip
|
|
28
|
+
# addresses.
|
|
29
|
+
def self.iprange_to_cidr(startip, endip)
|
|
30
|
+
cidr2mask = [0x00000000, 0x80000000, 0xC0000000,
|
|
31
|
+
0xE0000000, 0xF0000000, 0xF8000000,
|
|
32
|
+
0xFC000000, 0xFE000000, 0xFF000000,
|
|
33
|
+
0xFF800000, 0xFFC00000, 0xFFE00000,
|
|
34
|
+
0xFFF00000, 0xFFF80000, 0xFFFC0000,
|
|
35
|
+
0xFFFE0000, 0xFFFF0000, 0xFFFF8000,
|
|
36
|
+
0xFFFFC000, 0xFFFFE000, 0xFFFFF000,
|
|
37
|
+
0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
|
|
38
|
+
0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
|
39
|
+
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8,
|
|
40
|
+
0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF]
|
|
41
|
+
startaddr = ipstring_to_long(startip)
|
|
42
|
+
endaddr = ipstring_to_long (endip)
|
|
43
|
+
cidrlist = Array.new
|
|
44
|
+
|
|
45
|
+
while endaddr >= startaddr
|
|
46
|
+
maxsize = 32
|
|
47
|
+
while maxsize > 0
|
|
48
|
+
mask = cidr2mask[maxsize - 1]
|
|
49
|
+
maskedbase = startaddr & mask
|
|
50
|
+
|
|
51
|
+
break if maskedbase != startaddr
|
|
52
|
+
|
|
53
|
+
maxsize -= 1
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
x = Math.log(endaddr - startaddr + 1) / Math.log(2)
|
|
57
|
+
maxdiff = 32 - x.floor
|
|
58
|
+
maxsize = maxdiff if maxsize < maxdiff
|
|
59
|
+
|
|
60
|
+
cidrlist.push(long_to_ip_string(startaddr) + "/" + maxsize.to_s)
|
|
61
|
+
startaddr += 2**(32 - maxsize)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
return cidrlist
|
|
65
|
+
end
|
|
70
66
|
end
|
data/test/test_ip2cidr.rb
CHANGED
|
@@ -1,46 +1,44 @@
|
|
|
1
|
-
require 'test/unit'
|
|
2
|
-
require 'ip2cidr'
|
|
3
|
-
|
|
4
|
-
class
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
assert_equal "255.255.255.255",
|
|
18
|
-
assert_equal "0.0.0.0",
|
|
19
|
-
assert_equal "254.254.254.254",
|
|
20
|
-
assert_equal "24.255.7.1",
|
|
21
|
-
assert_equal "194.63.15.96",
|
|
22
|
-
assert_equal "46.246.83.202",
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def
|
|
26
|
-
test2 = ["192.168.0.0/13", "192.176.0.0/12", "192.192.0.0/10", "193.0.0.0/8", "194.0.0.0/7",
|
|
27
|
-
"196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4", "224.0.0.0/4", "240.0.0.0/5", "248.0.0.0/6",
|
|
28
|
-
"252.0.0.0/7", "254.0.0.0/8", "255.0.0.0/9", "255.128.0.0/11", "255.160.0.0/13", "255.168.0.0/29"]
|
|
29
|
-
|
|
30
|
-
test4 = ["0.168.0.1/32", "0.168.0.2/31", "0.168.0.4/30", "0.168.0.8/29", "0.168.0.16/28",
|
|
31
|
-
"0.168.0.32/27", "0.168.0.64/26", "0.168.0.128/25", "0.168.1.0/24",
|
|
32
|
-
"0.168.2.0/23", "0.168.4.0/22", "0.168.8.0/21", "0.168.16.0/20",
|
|
33
|
-
"0.168.32.0/19", "0.168.64.0/18", "0.168.128.0/17", "0.169.0.0/16",
|
|
34
|
-
"0.170.0.0/15", "0.172.0.0/14", "0.176.0.0/12", "0.192.0.0/10",
|
|
35
|
-
"1.0.0.0/8", "2.0.0.0/7", "4.0.0.0/6", "8.0.0.0/5", "16.0.0.0/4",
|
|
36
|
-
"32.0.0.0/3", "64.0.0.0/2", "128.0.0.0/2", "192.0.0.0/3", "224.0.0.0/4",
|
|
37
|
-
"240.0.0.0/5", "248.0.0.0/6", "252.0.0.0/7", "254.0.0.0/24"]
|
|
38
|
-
|
|
39
|
-
assert_equal "192.168.0.0/29",
|
|
40
|
-
assert_equal test2,
|
|
41
|
-
assert_equal "192.168.0.1/32",
|
|
42
|
-
assert_equal test4,
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'ip2cidr'
|
|
3
|
+
|
|
4
|
+
class IPToCIDRTest < Test::Unit::TestCase
|
|
5
|
+
def test_ipstring_to_long
|
|
6
|
+
assert_equal 0xc0a80001, IPToCIDR.ipstring_to_long("192.168.0.1").to_s(16)
|
|
7
|
+
assert_equal 0xffffffff, IPToCIDR.ipstring_to_long("255.255.255.255").to_s(16)
|
|
8
|
+
assert_equal 0x00000000, IPToCIDR.ipstring_to_long("0.0.0.0").to_s(16)
|
|
9
|
+
assert_equal 0xfefefefe, IPToCIDR.ipstring_to_long("254.254.254.254").to_s(16)
|
|
10
|
+
assert_equal 0x18ff0701, IPToCIDR.ipstring_to_long("24.255.7.1").to_s(16)
|
|
11
|
+
assert_equal 0xc23f0f60, IPToCIDR.ipstring_to_long("194.63.15.96").to_s(16)
|
|
12
|
+
assert_equal 0x2ef653ca, IPToCIDR.ipstring_to_long("46.246.83.202").to_s(16)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_long_to_ip_string
|
|
16
|
+
assert_equal "192.168.0.1", IPToCIDR.long_to_ip_string(0xc0a80001)
|
|
17
|
+
assert_equal "255.255.255.255", IPToCIDR.long_to_ip_string(0xffffffff)
|
|
18
|
+
assert_equal "0.0.0.0", IPToCIDR.long_to_ip_string(0x00000000)
|
|
19
|
+
assert_equal "254.254.254.254", IPToCIDR.long_to_ip_string(0xfefefefe)
|
|
20
|
+
assert_equal "24.255.7.1", IPToCIDR.long_to_ip_string(0x18ff0701)
|
|
21
|
+
assert_equal "194.63.15.96", IPToCIDR.long_to_ip_string(0xc23f0f60)
|
|
22
|
+
assert_equal "46.246.83.202", IPToCIDR.long_to_ip_string(0x2ef653ca)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_iprange_to_cidr
|
|
26
|
+
test2 = ["192.168.0.0/13", "192.176.0.0/12", "192.192.0.0/10", "193.0.0.0/8", "194.0.0.0/7",
|
|
27
|
+
"196.0.0.0/6", "200.0.0.0/5", "208.0.0.0/4", "224.0.0.0/4", "240.0.0.0/5", "248.0.0.0/6",
|
|
28
|
+
"252.0.0.0/7", "254.0.0.0/8", "255.0.0.0/9", "255.128.0.0/11", "255.160.0.0/13", "255.168.0.0/29"]
|
|
29
|
+
|
|
30
|
+
test4 = ["0.168.0.1/32", "0.168.0.2/31", "0.168.0.4/30", "0.168.0.8/29", "0.168.0.16/28",
|
|
31
|
+
"0.168.0.32/27", "0.168.0.64/26", "0.168.0.128/25", "0.168.1.0/24",
|
|
32
|
+
"0.168.2.0/23", "0.168.4.0/22", "0.168.8.0/21", "0.168.16.0/20",
|
|
33
|
+
"0.168.32.0/19", "0.168.64.0/18", "0.168.128.0/17", "0.169.0.0/16",
|
|
34
|
+
"0.170.0.0/15", "0.172.0.0/14", "0.176.0.0/12", "0.192.0.0/10",
|
|
35
|
+
"1.0.0.0/8", "2.0.0.0/7", "4.0.0.0/6", "8.0.0.0/5", "16.0.0.0/4",
|
|
36
|
+
"32.0.0.0/3", "64.0.0.0/2", "128.0.0.0/2", "192.0.0.0/3", "224.0.0.0/4",
|
|
37
|
+
"240.0.0.0/5", "248.0.0.0/6", "252.0.0.0/7", "254.0.0.0/24"]
|
|
38
|
+
|
|
39
|
+
assert_equal "192.168.0.0/29", IPToCIDR.iprange_to_cidr("192.168.0.0", "192.168.0.7")
|
|
40
|
+
assert_equal test2, IPToCIDR.iprange_to_cidr("192.168.0.0", "255.168.0.7")
|
|
41
|
+
assert_equal "192.168.0.1/32", IPToCIDR.iprange_to_cidr("192.168.0.1", "192.168.0.1")
|
|
42
|
+
assert_equal test4, IPToCIDR.iprange_to_cidr("0.168.0.1", "254.0.0.255")
|
|
43
|
+
end
|
|
44
|
+
end
|