ip2cidr 0.0.2 → 0.0.3
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/bin/ip2cidr +3 -3
- data/lib/ip2cidr.rb +29 -24
- data/lib/ip2cidr/iphandling.rb +70 -66
- data/test/test_ip2cidr.rb +25 -25
- 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: 2e127f420ac3bc3e02b2e2615e39fa762ae04c58
|
|
4
|
+
data.tar.gz: 0a3bff0f0e679dc0ec7f1c9d30d2e32bcff9309b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 220f930637eddd6bfca39398523fd1f179ddae2b58350bca4ea85e20dc81b3f64a49b0b2d36d3715ea4ec5a57d8faa11df2178c3bd87c3fd25488b147866229e
|
|
7
|
+
data.tar.gz: e346d1ff49cac35cf3de93aa6c17508eac56285fb4c4edd36f94c2f55891370e0e951a02b1fa529883c6435b583a3b2311f694b338d32e8bd9077838061ea051
|
data/bin/ip2cidr
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require 'ip2cidr'
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'ip2cidr'
|
|
4
4
|
puts IPToCIDR.solveCIDR("#{ARGV[0]}", "#{ARGV[1]}")
|
data/lib/ip2cidr.rb
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
require "ip2cidr/iphandling"
|
|
2
|
-
|
|
3
|
-
# The main IPToCIDR driver
|
|
4
|
-
class IPToCIDR
|
|
5
|
-
# Converts IP Range to IP CIDR blocks
|
|
6
|
-
#
|
|
7
|
-
# Example:
|
|
8
|
-
# >> IPToCIDR.solveCIDR("172.254.6.1","192.168.254.254")
|
|
9
|
-
# => 192.168.254.0/24
|
|
10
|
-
# Arguments:
|
|
11
|
-
# startip: (String)
|
|
12
|
-
# endip: (String)
|
|
13
|
-
|
|
14
|
-
def self.solveCIDR(startip, endip)
|
|
15
|
-
cidr = IPHandling.new
|
|
16
|
-
|
|
17
|
-
# Check if IP Starting Address is valid
|
|
18
|
-
raise ArgumentError, 'IP
|
|
19
|
-
|
|
20
|
-
# Check if Ending IP Address is valid
|
|
21
|
-
raise ArgumentError, 'IP
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
require "ip2cidr/iphandling"
|
|
2
|
+
|
|
3
|
+
# The main IPToCIDR driver
|
|
4
|
+
class IPToCIDR
|
|
5
|
+
# Converts IP Range to IP CIDR blocks
|
|
6
|
+
#
|
|
7
|
+
# Example:
|
|
8
|
+
# >> IPToCIDR.solveCIDR("172.254.6.1","192.168.254.254")
|
|
9
|
+
# => 192.168.254.0/24
|
|
10
|
+
# Arguments:
|
|
11
|
+
# startip: (String)
|
|
12
|
+
# endip: (String)
|
|
13
|
+
|
|
14
|
+
def self.solveCIDR(startip, endip)
|
|
15
|
+
cidr = IPHandling.new
|
|
16
|
+
|
|
17
|
+
# Check if IP Starting Address is valid
|
|
18
|
+
raise ArgumentError, 'IP address is not valid' unless startip.split(".").length == 4
|
|
19
|
+
|
|
20
|
+
# Check if Ending IP Address is valid
|
|
21
|
+
raise ArgumentError, 'IP address is not valid' unless endip.split(".").length == 4
|
|
22
|
+
|
|
23
|
+
raise ArgumentError, 'Special IP address error' if
|
|
24
|
+
(startip == "0.0.0.0") || (endip == "0.0.0.0") ||
|
|
25
|
+
(startip == "255.255.255.255") || (endip == "255.255.255.255")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
cidr.iprange_to_cidr(startip, endip)
|
|
29
|
+
end
|
|
25
30
|
end
|
data/lib/ip2cidr/iphandling.rb
CHANGED
|
@@ -1,67 +1,71 @@
|
|
|
1
|
-
class IPHandling
|
|
2
|
-
# ipstring_to_long
|
|
3
|
-
# Convert an ip address in string format to integer.
|
|
4
|
-
def 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
|
-
|
|
11
|
-
#return longip
|
|
12
|
-
return (longip[0] << 24) + (longip[1] << 16) +
|
|
13
|
-
(longip[2] << 8) + longip[3]
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# long_to_ipstring
|
|
17
|
-
# Convert an ip address in integer format to string.
|
|
18
|
-
def long_to_ipstring(longip)
|
|
19
|
-
ipstring = ""
|
|
20
|
-
ipstring = (longip >> 24).to_s + "." +
|
|
21
|
-
((longip & 0x00FFFFFF)>> 16).to_s + "." +
|
|
22
|
-
((longip & 0x0000FFFF) >> 8).to_s + "." +
|
|
23
|
-
(longip & 0x000000FF).to_s
|
|
24
|
-
return ipstring
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# iprange_to_cidr
|
|
28
|
-
# Return a list of cidr addresses given a range of ip
|
|
29
|
-
# addresses.
|
|
30
|
-
def iprange_to_cidr(startip, endip)
|
|
31
|
-
cidr2mask = [0x00000000, 0x80000000, 0xC0000000,
|
|
32
|
-
0xE0000000, 0xF0000000, 0xF8000000,
|
|
33
|
-
0xFC000000, 0xFE000000, 0xFF000000,
|
|
34
|
-
0xFF800000, 0xFFC00000, 0xFFE00000,
|
|
35
|
-
0xFFF00000, 0xFFF80000, 0xFFFC0000,
|
|
36
|
-
0xFFFE0000, 0xFFFF0000, 0xFFFF8000,
|
|
37
|
-
0xFFFFC000, 0xFFFFE000, 0xFFFFF000,
|
|
38
|
-
0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
|
|
39
|
-
0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
|
40
|
-
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8,
|
|
41
|
-
0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF]
|
|
42
|
-
startaddr = ipstring_to_long(startip)
|
|
43
|
-
endaddr = ipstring_to_long (endip)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
class IPHandling
|
|
2
|
+
# ipstring_to_long
|
|
3
|
+
# Convert an ip address in string format to integer.
|
|
4
|
+
def 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
|
+
|
|
11
|
+
#return longip
|
|
12
|
+
return (longip[0] << 24) + (longip[1] << 16) +
|
|
13
|
+
(longip[2] << 8) + longip[3]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# long_to_ipstring
|
|
17
|
+
# Convert an ip address in integer format to string.
|
|
18
|
+
def long_to_ipstring(longip)
|
|
19
|
+
ipstring = ""
|
|
20
|
+
ipstring = (longip >> 24).to_s + "." +
|
|
21
|
+
((longip & 0x00FFFFFF)>> 16).to_s + "." +
|
|
22
|
+
((longip & 0x0000FFFF) >> 8).to_s + "." +
|
|
23
|
+
(longip & 0x000000FF).to_s
|
|
24
|
+
return ipstring
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# iprange_to_cidr
|
|
28
|
+
# Return a list of cidr addresses given a range of ip
|
|
29
|
+
# addresses.
|
|
30
|
+
def iprange_to_cidr(startip, endip)
|
|
31
|
+
cidr2mask = [0x00000000, 0x80000000, 0xC0000000,
|
|
32
|
+
0xE0000000, 0xF0000000, 0xF8000000,
|
|
33
|
+
0xFC000000, 0xFE000000, 0xFF000000,
|
|
34
|
+
0xFF800000, 0xFFC00000, 0xFFE00000,
|
|
35
|
+
0xFFF00000, 0xFFF80000, 0xFFFC0000,
|
|
36
|
+
0xFFFE0000, 0xFFFF0000, 0xFFFF8000,
|
|
37
|
+
0xFFFFC000, 0xFFFFE000, 0xFFFFF000,
|
|
38
|
+
0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
|
|
39
|
+
0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
|
40
|
+
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8,
|
|
41
|
+
0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF]
|
|
42
|
+
startaddr = ipstring_to_long(startip)
|
|
43
|
+
endaddr = ipstring_to_long (endip)
|
|
44
|
+
|
|
45
|
+
# Check if Ending IP Address is greater than Starting IP Address
|
|
46
|
+
raise ArgumentError, 'Starting IP must be less than the end IP' unless startaddr < endaddr
|
|
47
|
+
|
|
48
|
+
cidrlist = Array.new
|
|
49
|
+
|
|
50
|
+
while endaddr >= startaddr
|
|
51
|
+
maxsize = 32
|
|
52
|
+
while maxsize > 0
|
|
53
|
+
mask = cidr2mask[maxsize - 1]
|
|
54
|
+
maskedbase = startaddr & mask
|
|
55
|
+
|
|
56
|
+
break if maskedbase != startaddr
|
|
57
|
+
|
|
58
|
+
maxsize -= 1
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
x = Math.log(endaddr - startaddr + 1) / Math.log(2)
|
|
62
|
+
maxdiff = 32 - x.floor
|
|
63
|
+
maxsize = maxdiff if maxsize < maxdiff
|
|
64
|
+
|
|
65
|
+
cidrlist.push(long_to_ipstring(startaddr) + "/" + maxsize.to_s)
|
|
66
|
+
startaddr += 2**(32 - maxsize)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
return cidrlist
|
|
70
|
+
end
|
|
67
71
|
end
|
data/test/test_ip2cidr.rb
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
require 'minitest/autorun'
|
|
2
|
-
require 'ip2cidr'
|
|
3
|
-
|
|
4
|
-
class IPToCIDRTest < Minitest::Test
|
|
5
|
-
|
|
6
|
-
def test_solveCIDR
|
|
7
|
-
test1 = ["192.168.0.0/29"]
|
|
8
|
-
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",
|
|
9
|
-
"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",
|
|
10
|
-
"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"]
|
|
11
|
-
test3 = ["192.168.0.1/32"]
|
|
12
|
-
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",
|
|
13
|
-
"0.168.0.32/27", "0.168.0.64/26", "0.168.0.128/25", "0.168.1.0/24",
|
|
14
|
-
"0.168.2.0/23", "0.168.4.0/22", "0.168.8.0/21", "0.168.16.0/20",
|
|
15
|
-
"0.168.32.0/19", "0.168.64.0/18", "0.168.128.0/17", "0.169.0.0/16",
|
|
16
|
-
"0.170.0.0/15", "0.172.0.0/14", "0.176.0.0/12", "0.192.0.0/10",
|
|
17
|
-
"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",
|
|
18
|
-
"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",
|
|
19
|
-
"240.0.0.0/5", "248.0.0.0/6", "252.0.0.0/7", "254.0.0.0/24"]
|
|
20
|
-
|
|
21
|
-
assert_equal test1, IPToCIDR.solveCIDR("192.168.0.0", "192.168.0.7")
|
|
22
|
-
assert_equal test2, IPToCIDR.solveCIDR("192.168.0.0", "255.168.0.7")
|
|
23
|
-
assert_equal test3, IPToCIDR.solveCIDR("192.168.0.1", "192.168.0.1")
|
|
24
|
-
assert_equal test4, IPToCIDR.solveCIDR("0.168.0.1", "254.0.0.255")
|
|
25
|
-
end
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'ip2cidr'
|
|
3
|
+
|
|
4
|
+
class IPToCIDRTest < Minitest::Test
|
|
5
|
+
|
|
6
|
+
def test_solveCIDR
|
|
7
|
+
test1 = ["192.168.0.0/29"]
|
|
8
|
+
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",
|
|
9
|
+
"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",
|
|
10
|
+
"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"]
|
|
11
|
+
test3 = ["192.168.0.1/32"]
|
|
12
|
+
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",
|
|
13
|
+
"0.168.0.32/27", "0.168.0.64/26", "0.168.0.128/25", "0.168.1.0/24",
|
|
14
|
+
"0.168.2.0/23", "0.168.4.0/22", "0.168.8.0/21", "0.168.16.0/20",
|
|
15
|
+
"0.168.32.0/19", "0.168.64.0/18", "0.168.128.0/17", "0.169.0.0/16",
|
|
16
|
+
"0.170.0.0/15", "0.172.0.0/14", "0.176.0.0/12", "0.192.0.0/10",
|
|
17
|
+
"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",
|
|
18
|
+
"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",
|
|
19
|
+
"240.0.0.0/5", "248.0.0.0/6", "252.0.0.0/7", "254.0.0.0/24"]
|
|
20
|
+
|
|
21
|
+
assert_equal test1, IPToCIDR.solveCIDR("192.168.0.0", "192.168.0.7")
|
|
22
|
+
assert_equal test2, IPToCIDR.solveCIDR("192.168.0.0", "255.168.0.7")
|
|
23
|
+
assert_equal test3, IPToCIDR.solveCIDR("192.168.0.1", "192.168.0.1")
|
|
24
|
+
assert_equal test4, IPToCIDR.solveCIDR("0.168.0.1", "254.0.0.255")
|
|
25
|
+
end
|
|
26
26
|
end
|