network-utility 1.1.4
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 +7 -0
- data/README.md +2 -0
- data/document/acl-M6000-16E.md +27 -0
- data/document/acl-M6000-18S.md +27 -0
- data/document/acl-M6000-8.md +27 -0
- data/document/acl-M6000-8E.md +27 -0
- data/document/acl-MA5200G-8.md +204 -0
- data/document/acl-ME60-16.md +177 -0
- data/document/acl-ME60-X16.md +177 -0
- data/document/acl-NE40E-X16.md +204 -0
- data/document/acl-NE40E-X16A.md +204 -0
- data/document/acl-NE40E-X8.md +204 -0
- data/document/acl-NE40E.md +204 -0
- data/document/acl-NE5000E-20.md +25 -0
- data/document/acl-NE5000E-X16.md +25 -0
- data/document/acl-NE5000E-X16A.md +25 -0
- data/document/acl-NE80E.md +204 -0
- data/document/bgp-CR16010H-F.md +25 -0
- data/document/bgp-CR16018-F.md +25 -0
- data/document/bgp-CR19000-20.md +25 -0
- data/document/bgp-M6000-16E.md +25 -0
- data/document/bgp-M6000-18S.md +25 -0
- data/document/bgp-M6000-8.md +25 -0
- data/document/bgp-M6000-8E.md +25 -0
- data/document/bgp-MA5200G-8.md +25 -0
- data/document/bgp-ME60-16.md +25 -0
- data/document/bgp-ME60-X16.md +25 -0
- data/document/bgp-NE40E-X16.md +25 -0
- data/document/bgp-NE40E-X16A.md +25 -0
- data/document/bgp-NE40E-X8.md +25 -0
- data/document/bgp-NE40E.md +25 -0
- data/document/bgp-NE5000E-20.md +25 -0
- data/document/bgp-NE5000E-X16.md +25 -0
- data/document/bgp-NE5000E-X16A.md +25 -0
- data/document/bgp-NE80E.md +25 -0
- data/document/config.md +1153 -0
- data/document/document.rb +27 -0
- data/document/if-ALCATEL7750.md +48 -0
- data/document/if-C7609.md +47 -0
- data/document/if-CR16010H-F.md +300 -0
- data/document/if-CR16018-F.md +300 -0
- data/document/if-CR19000-20.md +300 -0
- data/document/if-CRS-16.md +47 -0
- data/document/if-CX600-X16A.md +349 -0
- data/document/if-CX600-X8A.md +349 -0
- data/document/if-M6000-16E.md +652 -0
- data/document/if-M6000-18S.md +846 -0
- data/document/if-M6000-8.md +653 -0
- data/document/if-M6000-8E.md +653 -0
- data/document/if-MA5200G-8.md +357 -0
- data/document/if-ME60-16.md +357 -0
- data/document/if-ME60-X16.md +357 -0
- data/document/if-NE40E-X16.md +357 -0
- data/document/if-NE40E-X16A.md +357 -0
- data/document/if-NE40E-X8.md +357 -0
- data/document/if-NE40E.md +357 -0
- data/document/if-NE5000E-20.md +357 -0
- data/document/if-NE5000E-X16.md +357 -0
- data/document/if-NE5000E-X16A.md +357 -0
- data/document/if-NE8000E-X8.md +357 -0
- data/document/if-NE80E.md +357 -0
- data/document/if-NE8100-X8.md +357 -0
- data/document/if-Nokia7750.md +48 -0
- data/document/if-T8000-18.md +653 -0
- data/document/if-V6000.md +663 -0
- data/document/if-VNE9000.md +357 -0
- data/document/if-ZXCTN9000-18EA.md +762 -0
- data/document/if-ZXCTN9000-8EA.md +762 -0
- data/document/lic-M6000-16E.md +28 -0
- data/document/lic-M6000-18S.md +28 -0
- data/document/lic-M6000-8.md +28 -0
- data/document/lic-M6000-8E.md +28 -0
- data/document/lic-MA5200G-8.md +27 -0
- data/document/lic-ME60-16.md +27 -0
- data/document/lic-ME60-X16.md +27 -0
- data/document/lic-NE40E-X16.md +27 -0
- data/document/lic-NE40E-X16A.md +27 -0
- data/document/lic-NE40E-X8.md +27 -0
- data/document/log-M6000-16E.md +36 -0
- data/document/log-M6000-18S.md +36 -0
- data/document/log-M6000-8.md +36 -0
- data/document/log-M6000-8E.md +36 -0
- data/document/log-MA5200G-8.md +61 -0
- data/document/log-ME60-16.md +61 -0
- data/document/log-ME60-X16.md +61 -0
- data/document/log-NE40E-X16.md +61 -0
- data/document/log-NE40E-X16A.md +61 -0
- data/document/log-NE40E-X8.md +61 -0
- data/document/log-NE40E.md +61 -0
- data/document/log-NE5000E-20.md +61 -0
- data/document/log-NE5000E-X16.md +61 -0
- data/document/log-NE5000E-X16A.md +61 -0
- data/document/log-NE80E.md +61 -0
- data/document/nat-CR16010H-F.md +27 -0
- data/document/nat-CR16018-F.md +27 -0
- data/document/nat-M6000-16E.md +27 -0
- data/document/nat-M6000-18S.md +27 -0
- data/document/nat-M6000-8.md +27 -0
- data/document/nat-M6000-8E.md +27 -0
- data/document/nat-ME60-16.md +44 -0
- data/document/nat-ME60-X16.md +44 -0
- data/document/nat-NE40E-X16.md +44 -0
- data/document/nat-NE40E-X16A.md +44 -0
- data/document/policy-M6000-16E.md +13 -0
- data/document/policy-M6000-18S.md +13 -0
- data/document/policy-M6000-8.md +13 -0
- data/document/policy-M6000-8E.md +13 -0
- data/document/policy-MA5200G-8.md +87 -0
- data/document/policy-ME60-16.md +87 -0
- data/document/policy-ME60-X16.md +87 -0
- data/document/policy-NE40E-X16.md +87 -0
- data/document/policy-NE40E-X16A.md +87 -0
- data/document/policy-NE40E-X8.md +87 -0
- data/document/policy-NE40E.md +87 -0
- data/document/policy-NE5000E-20.md +87 -0
- data/document/policy-NE5000E-X16.md +87 -0
- data/document/policy-NE5000E-X16A.md +87 -0
- data/document/policy-NE80E.md +87 -0
- data/document/pool-M6000-16E.md +126 -0
- data/document/pool-M6000-18S.md +126 -0
- data/document/pool-M6000-8.md +126 -0
- data/document/pool-M6000-8E.md +126 -0
- data/document/pool-MA5200G-8.md +138 -0
- data/document/pool-ME60-16.md +138 -0
- data/document/pool-ME60-X16.md +138 -0
- data/document/pool-NE40E-X16.md +138 -0
- data/document/pool-NE40E-X16A.md +138 -0
- data/document/pool-NE40E-X8.md +138 -0
- data/document/pool-NE40E.md +138 -0
- data/document/pool-NE80E.md +138 -0
- data/document/static-CR16010H-F.md +60 -0
- data/document/static-CR16018-F.md +60 -0
- data/document/static-CR19000-20.md +60 -0
- data/document/static-CX600-X16A.md +26 -0
- data/document/static-CX600-X8A.md +26 -0
- data/document/static-M6000-16E.md +104 -0
- data/document/static-M6000-18S.md +104 -0
- data/document/static-M6000-8.md +104 -0
- data/document/static-M6000-8E.md +104 -0
- data/document/static-MA5200G-8.md +82 -0
- data/document/static-ME60-16.md +82 -0
- data/document/static-ME60-X16.md +82 -0
- data/document/static-NE40E-X16.md +82 -0
- data/document/static-NE40E-X16A.md +81 -0
- data/document/static-NE40E-X8.md +82 -0
- data/document/static-NE40E.md +67 -0
- data/document/static-NE5000E-20.md +67 -0
- data/document/static-NE5000E-X16.md +67 -0
- data/document/static-NE5000E-X16A.md +67 -0
- data/document/static-NE8000E-X8.md +26 -0
- data/document/static-NE80E.md +67 -0
- data/document/static-NE8100-X8.md +26 -0
- data/document/static-T8000-18.md +34 -0
- data/document/static-ZXCTN9000-18EA.md +34 -0
- data/document/static-ZXCTN9000-8EA.md +34 -0
- data/document/system-M6000-16E.md +75 -0
- data/document/system-M6000-18S.md +76 -0
- data/document/system-M6000-8.md +75 -0
- data/document/system-M6000-8E.md +75 -0
- data/document/system-MA5200G-8.md +51 -0
- data/document/system-ME60-16.md +51 -0
- data/document/system-ME60-X16.md +51 -0
- data/document/system-NE40E-X16.md +51 -0
- data/document/system-NE40E-X16A.md +51 -0
- data/document/system-NE40E-X8.md +51 -0
- data/document/system-NE40E.md +51 -0
- data/document/system-NE5000E-20.md +51 -0
- data/document/system-NE5000E-X16.md +51 -0
- data/document/system-NE5000E-X16A.md +51 -0
- data/document/system-NE80E.md +51 -0
- data/document/telnet.md +332 -0
- data/network.rb +24 -0
- data/utility/ipv4_address.rb +266 -0
- data/utility/ipv6_address.rb +201 -0
- data/utility/mac_address.rb +77 -0
- data/utility/netmerge.rb +46 -0
- data/utility/route.rb +79 -0
- data/utility/whitelist.rb +21 -0
- metadata +258 -0
@@ -0,0 +1,266 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
=begin # How To Use
|
4
|
+
ip,mask = IP.v4('10.37.214.42/17')
|
5
|
+
net = ip.network_with(mask)
|
6
|
+
p ip.to_b, mask.to_b, net.to_b
|
7
|
+
p ip.is_mask?, mask.is_mask?, net.is_network_with?(mask)
|
8
|
+
si,ei = ip.range_with(mask)
|
9
|
+
p si.to_d, ei.to_d, si.to_b, ei.to_b
|
10
|
+
|
11
|
+
a = IP.v4('10.37.214.21/8')[0]
|
12
|
+
b = IP.v4('145.217.33.14/16')[0]
|
13
|
+
c = IP.v4('221.25.43.72/24')[0]
|
14
|
+
d = IP.v4('238.13.189.51')
|
15
|
+
e = IP.v4('246.211.74.63')
|
16
|
+
p a.is_class_a?, b.is_class_b?, c.is_class_c?, d.is_class_d?, e.is_class_e?
|
17
|
+
p a.is_private?, b.is_private?
|
18
|
+
=end
|
19
|
+
|
20
|
+
class IPv4
|
21
|
+
attr_reader :numbers,:number
|
22
|
+
|
23
|
+
def mode string
|
24
|
+
if ['0b','0x','0d'].include?(string[0..1])
|
25
|
+
return string[2..-1],string[0..1]
|
26
|
+
else
|
27
|
+
return string,'0d'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def formmat string,mode
|
32
|
+
string.split('.').collect{|num|eval("#{mode}#{num}")}
|
33
|
+
end
|
34
|
+
|
35
|
+
def check num
|
36
|
+
return (0<=num && num<=255) ? true : false
|
37
|
+
end
|
38
|
+
|
39
|
+
def checks nums
|
40
|
+
each = eval(nums.collect{|num|check(num).to_s}.join(' && '))
|
41
|
+
all = (nums.size == 4)
|
42
|
+
return each && all
|
43
|
+
end
|
44
|
+
|
45
|
+
def generate string
|
46
|
+
(warn "Abnormal formmat string #{string}!";return nil) unless /[0b|0d|0x]?(\d+)\.(\d+)\.(\d+)\.(\d+)/.match(string)
|
47
|
+
@content,@mode = mode(string)
|
48
|
+
fours = formmat(@content,@mode)
|
49
|
+
if checks(fours)
|
50
|
+
@numbers = fours.clone
|
51
|
+
@number = eval("0b"+to_b.gsub('.',''))
|
52
|
+
else
|
53
|
+
warn "Abnormal decimal string #{string}!";return nil
|
54
|
+
end
|
55
|
+
return self
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize string
|
59
|
+
generate string
|
60
|
+
end
|
61
|
+
|
62
|
+
#### performance ####
|
63
|
+
def to_a
|
64
|
+
@numbers
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_d
|
68
|
+
@numbers.collect{|n|n.to_s(10)}.join"."
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_h
|
72
|
+
@numbers.collect{|n|"%02x"%n}.join"."
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_b
|
76
|
+
@numbers.collect{|n|"%08b"%n}.join"."
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_s # s = short
|
80
|
+
to_d
|
81
|
+
end
|
82
|
+
|
83
|
+
def + num
|
84
|
+
@number += num
|
85
|
+
generate("0b"+("%032b"%@number).unpack("a8a8a8a8").join("."))
|
86
|
+
end
|
87
|
+
|
88
|
+
def - num
|
89
|
+
@number -= num
|
90
|
+
generate("0b"+("%032b"%@number).unpack("a8a8a8a8").join("."))
|
91
|
+
end
|
92
|
+
|
93
|
+
def is_class_a?
|
94
|
+
first =IPv4.new('10.0.0.0').number
|
95
|
+
last = IPv4.new('126.255.255.255').number
|
96
|
+
(first..last).include?(@number)
|
97
|
+
end
|
98
|
+
|
99
|
+
def is_class_b?
|
100
|
+
first =IPv4.new('128.1.0.0').number
|
101
|
+
last = IPv4.new('191.255.255.255').number
|
102
|
+
(first..last).include?(@number)
|
103
|
+
end
|
104
|
+
|
105
|
+
def is_class_c?
|
106
|
+
first =IPv4.new('192.0.1.0').number
|
107
|
+
last = IPv4.new('223.255.255.255').number
|
108
|
+
(first..last).include?(@number)
|
109
|
+
end
|
110
|
+
|
111
|
+
def is_class_d?
|
112
|
+
first =IPv4.new('224.0.0.0').number
|
113
|
+
last = IPv4.new('239.255.255.255').number
|
114
|
+
(first..last).include?(@number)
|
115
|
+
end
|
116
|
+
|
117
|
+
def is_class_e?
|
118
|
+
first =IPv4.new('240.0.0.0').number
|
119
|
+
last = IPv4.new('255.255.255.254').number
|
120
|
+
(first..last).include?(@number)
|
121
|
+
end
|
122
|
+
|
123
|
+
def is_private?
|
124
|
+
fpa =IPv4.new('10.0.0.0').number
|
125
|
+
lpa = IPv4.new('10.255.255.255').number
|
126
|
+
fpb =IPv4.new('172.16.0.0').number
|
127
|
+
lpb = IPv4.new('172.31.255.255').number
|
128
|
+
fpc =IPv4.new('192.168.0.0').number
|
129
|
+
lpc = IPv4.new('192.168.255.255').number
|
130
|
+
(fpa..lpa).include?(@number) || (fpb..lpb).include?(@number) ||
|
131
|
+
(fpc..lpc).include?(@number)
|
132
|
+
end
|
133
|
+
|
134
|
+
def is_another?
|
135
|
+
[IPv4.new('127.0.0.1').number, IPv4.new('255.255.255.255').number,
|
136
|
+
IPv4.new('0.0.0.0').number].include?(@number)
|
137
|
+
end
|
138
|
+
|
139
|
+
#### mask ####
|
140
|
+
def mask_counter
|
141
|
+
if is_mask?
|
142
|
+
counter,msk = 0,to_b.gsub('.','')
|
143
|
+
while msk[-1]=='0'; counter += 1; msk = msk[0..-2]; end
|
144
|
+
return 32-counter
|
145
|
+
else
|
146
|
+
return nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def anti_mask_counter
|
151
|
+
if is_anti_mask?
|
152
|
+
counter,msk = 0,to_b.gsub('.','')
|
153
|
+
while msk[-1]=='1'; counter += 1; msk = msk[0..-2]; end
|
154
|
+
return counter
|
155
|
+
else
|
156
|
+
return nil
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def anti_mask
|
161
|
+
if (counter = mask_counter)
|
162
|
+
IPv4Mask.anti_number(counter)
|
163
|
+
else
|
164
|
+
warn "Not a net mask #{self}!";nil
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def mask
|
169
|
+
if (counter = anti_mask_counter)
|
170
|
+
IPv4Mask.number(counter)
|
171
|
+
else
|
172
|
+
warn "Not an anti-mask #{self}!";nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def is_mask?
|
177
|
+
!to_b.gsub('.','').include?('01')
|
178
|
+
end
|
179
|
+
|
180
|
+
def is_anti_mask?
|
181
|
+
!to_b.gsub('.','').include?('10')
|
182
|
+
end
|
183
|
+
|
184
|
+
#### network ####
|
185
|
+
def network_with mask
|
186
|
+
numbers = []
|
187
|
+
mask.numbers.each_with_index do|num,index|
|
188
|
+
numbers << (num & @numbers[index]).to_s
|
189
|
+
end
|
190
|
+
IPv4.new(numbers.join('.'))
|
191
|
+
end
|
192
|
+
|
193
|
+
def range_with mask
|
194
|
+
return self, self if mask.mask_counter.to_i == 32
|
195
|
+
net = network_with(mask)
|
196
|
+
(start_ip = net.clone) + 1
|
197
|
+
(end_ip = net.clone) + (2**(32-mask.mask_counter.to_i) - 1)
|
198
|
+
return start_ip,end_ip
|
199
|
+
end
|
200
|
+
|
201
|
+
def is_network_with? mask
|
202
|
+
msk_counter,msk = 0,mask.to_b.gsub('.','')
|
203
|
+
while msk[-1]=='0'
|
204
|
+
msk_counter += 1
|
205
|
+
msk = msk[0..-2]
|
206
|
+
end
|
207
|
+
nt_counter,nt = 0,to_b.gsub('.','')
|
208
|
+
while nt[-1]=='0'
|
209
|
+
nt_counter += 1
|
210
|
+
nt = nt[0..-2]
|
211
|
+
end
|
212
|
+
return (nt_counter >= msk_counter) ? true : false
|
213
|
+
end
|
214
|
+
|
215
|
+
def prefix_with another_ip
|
216
|
+
ip1 = self.to_b.gsub('.','')
|
217
|
+
ip2 = another_ip.to_b.gsub('.','')
|
218
|
+
count = 0
|
219
|
+
count += 1 while ip1[count] == ip2[count] && count < 32
|
220
|
+
return count
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
class IPv4Mask
|
225
|
+
def self.number num
|
226
|
+
str = "0b"+("1"*num+"0"*(32-num)).unpack("a8a8a8a8").join(".")
|
227
|
+
IPv4.new(str)
|
228
|
+
end
|
229
|
+
|
230
|
+
def self.string str
|
231
|
+
temp = IPv4.new(str)
|
232
|
+
unless temp.is_mask?
|
233
|
+
raise "Invalid net mask #{str}!"
|
234
|
+
return nil
|
235
|
+
else
|
236
|
+
return temp
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def self.anti_number num
|
241
|
+
str = "0b"+("0"*num+"1"*(32-num)).unpack("a8a8a8a8").join(".")
|
242
|
+
IPv4.new(str)
|
243
|
+
end
|
244
|
+
|
245
|
+
def self.anti_string str
|
246
|
+
temp = IPv4.new(str)
|
247
|
+
unless temp.is_anti_mask?
|
248
|
+
raise "Invalid anti mask #{str}!"
|
249
|
+
return nil
|
250
|
+
else
|
251
|
+
return temp
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
module IP
|
257
|
+
def self.v4 string
|
258
|
+
ip,msk = string.split("/")
|
259
|
+
unless msk
|
260
|
+
return IPv4.new(ip)
|
261
|
+
else
|
262
|
+
mask = msk.include?('.') ? IPv4Mask.string(msk) : IPv4Mask.number(msk.to_i)
|
263
|
+
return IPv4.new(ip),mask
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
@@ -0,0 +1,201 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
class IPv6
|
4
|
+
attr_reader :numbers,:number
|
5
|
+
|
6
|
+
def mode string
|
7
|
+
return IPAddr.new(string).to_string,"0x"
|
8
|
+
end
|
9
|
+
|
10
|
+
def formmat string,mode='0x'
|
11
|
+
string.split(':').collect{|num|eval("#{mode}#{num}")}
|
12
|
+
end
|
13
|
+
|
14
|
+
def check num
|
15
|
+
return (0<= num && num <=0xffff) ? true : false
|
16
|
+
end
|
17
|
+
|
18
|
+
def checks nums
|
19
|
+
each = eval(nums.collect{|num|check(num).to_s}.join(' && '))
|
20
|
+
all = (nums.size == 8)
|
21
|
+
return each && all
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate string
|
25
|
+
(raise "Abnormal formmat string #{string}!";return nil) unless /[0b|0d|0x]?[a-f|A-F|0-9|\:]*/.match(string)
|
26
|
+
@content,@mode = mode(string)
|
27
|
+
eights = formmat(@content,@mode)
|
28
|
+
if checks(eights)
|
29
|
+
@numbers = eights.clone
|
30
|
+
@number = eval("0b"+to_b.gsub(':',''))
|
31
|
+
else
|
32
|
+
raise "Abnormal decimal string #{string}!";return nil
|
33
|
+
end
|
34
|
+
# just modify @content,@mode,@numbers, and @number
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize string
|
38
|
+
generate string
|
39
|
+
end
|
40
|
+
|
41
|
+
#### performance ####
|
42
|
+
def to_a
|
43
|
+
@numbers
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_d
|
47
|
+
@numbers.collect{|n|n.to_s(10)}.join":"
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_h
|
51
|
+
@numbers.collect{|n|"%04x"%n}.join":"
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s # s = short
|
55
|
+
IPAddr.new(@content).to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_b
|
59
|
+
@numbers.collect{|n|"%016b"%n}.join":"
|
60
|
+
end
|
61
|
+
|
62
|
+
def + num
|
63
|
+
@number += num
|
64
|
+
generate(("%032x"%@number).unpack("a4a4a4a4a4a4a4a4").join(":"))
|
65
|
+
end
|
66
|
+
|
67
|
+
def - num
|
68
|
+
@number -= num
|
69
|
+
generate(("%032x"%@number).unpack("a4a4a4a4a4a4a4a4").join(":"))
|
70
|
+
end
|
71
|
+
|
72
|
+
#### mask ####
|
73
|
+
def mask_counter
|
74
|
+
if is_mask?
|
75
|
+
counter,msk = 0,to_b.gsub(':','')
|
76
|
+
while msk[-1]=='0'; counter += 1; msk = msk[0..-2]; end
|
77
|
+
return 128-counter
|
78
|
+
else
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def anti_mask_counter
|
84
|
+
if is_anti_mask?
|
85
|
+
counter,msk = 0,to_b.gsub(':','')
|
86
|
+
while msk[-1]=='1'; counter += 1; msk = msk[0..-2]; end
|
87
|
+
return counter
|
88
|
+
else
|
89
|
+
return nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def anti_mask
|
94
|
+
if (counter = mask_counter)
|
95
|
+
IPv6Mask.anti_number(counter)
|
96
|
+
else
|
97
|
+
warn "Not a net mask #{self}!";nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def mask
|
102
|
+
if (counter = anti_mask_counter)
|
103
|
+
IPv6Mask.number(counter)
|
104
|
+
else
|
105
|
+
warn "Not an anti-mask #{self}!";nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def is_mask?
|
110
|
+
!to_b.gsub(':','').include?('01')
|
111
|
+
end
|
112
|
+
|
113
|
+
def is_anti_mask?
|
114
|
+
!to_b.gsub(':','').include?('10')
|
115
|
+
end
|
116
|
+
|
117
|
+
#### network ####
|
118
|
+
def network_with mask
|
119
|
+
numbers = []
|
120
|
+
mask.numbers.each_with_index do|num,index|
|
121
|
+
numbers << (num & @numbers[index])
|
122
|
+
end
|
123
|
+
IPv6.new(numbers.collect{|n|"%0x"%n}.join(':'))
|
124
|
+
end
|
125
|
+
|
126
|
+
def range_with mask
|
127
|
+
return self, self if mask.mask_counter.to_i == 128
|
128
|
+
net = network_with(mask)
|
129
|
+
(start_ip = net.clone) + 1
|
130
|
+
(end_ip = net.clone) + (2**(128-mask.mask_counter.to_i) - 1)
|
131
|
+
return start_ip,end_ip
|
132
|
+
end
|
133
|
+
|
134
|
+
def is_network_with? mask
|
135
|
+
msk_counter,msk = 0,mask.to_b.gsub(':','')
|
136
|
+
while msk[-1]=='0'
|
137
|
+
msk_counter += 1
|
138
|
+
msk = msk[0..-2]
|
139
|
+
end
|
140
|
+
nt_counter,nt = 0,to_b.gsub(':','')
|
141
|
+
while nt[-1]=='0'
|
142
|
+
nt_counter += 1
|
143
|
+
nt = nt[0..-2]
|
144
|
+
end
|
145
|
+
return (nt_counter >= msk_counter) ? true : false
|
146
|
+
end
|
147
|
+
|
148
|
+
def prefix_with another_ip
|
149
|
+
ip1 = self.to_b.gsub(':','')
|
150
|
+
ip2 = another_ip.to_b.gsub(':','')
|
151
|
+
count = 0
|
152
|
+
count += 1 while ip1[count] == ip2[count] && count < 128
|
153
|
+
return count
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class IPv6Mask
|
158
|
+
def self.number num
|
159
|
+
hex = "%032x"%eval("0b"+"1"*num+"0"*(128-num))
|
160
|
+
str = hex.unpack("a4a4a4a4a4a4a4a4").join(":")
|
161
|
+
IPv6.new(str)
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.string str
|
165
|
+
temp = IPv6.new(str)
|
166
|
+
unless temp.is_mask?
|
167
|
+
raise "Invalid net mask #{str}!"
|
168
|
+
return nil
|
169
|
+
else
|
170
|
+
return temp
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def self.anti_number num
|
175
|
+
hex = "%032x"%eval("0b"+"0"*num+"1"*(128-num))
|
176
|
+
str = hex.unpack("a4a4a4a4a4a4a4a4").join(":")
|
177
|
+
IPv6.new(str)
|
178
|
+
end
|
179
|
+
|
180
|
+
def self.anti_string str
|
181
|
+
temp = IPv6.new(str)
|
182
|
+
unless temp.is_anti_mask?
|
183
|
+
raise "Invalid anti mask #{str}!"
|
184
|
+
return nil
|
185
|
+
else
|
186
|
+
return temp
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
module IP
|
192
|
+
def self.v6 string
|
193
|
+
ip,msk = string.split("/")
|
194
|
+
unless msk
|
195
|
+
return IPv6.new(ip)
|
196
|
+
else
|
197
|
+
mask = msk.include?(':') ? IPv6Mask.string(msk) : IPv6Mask.number(msk.to_i)
|
198
|
+
return IPv6.new(ip),mask
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
class MacAddress
|
4
|
+
attr_reader :numbers,:number
|
5
|
+
|
6
|
+
def full? sequence
|
7
|
+
(sequence.size!=3 && sequence.size!=6) ? false : true
|
8
|
+
end
|
9
|
+
|
10
|
+
def overflow? sequence,unit
|
11
|
+
max = 0
|
12
|
+
max = 65535 if sequence.size==3
|
13
|
+
max = 255 if sequence.size==6
|
14
|
+
return false if unit.to_i>max
|
15
|
+
return true
|
16
|
+
end
|
17
|
+
|
18
|
+
def valid? sequence
|
19
|
+
return "MAC地址长度错误(#{sequence.join('-')})!" unless full?(sequence)
|
20
|
+
sequence.each do|unit|
|
21
|
+
if unit.instance_of?(Numeric)
|
22
|
+
overflow = overflow?(sequence,unit)
|
23
|
+
return "MAC地址超出范围(#{sequence.join('-')})!" unless overflow
|
24
|
+
else
|
25
|
+
unit.to_s.each_char do|char|
|
26
|
+
return "MAC地址含有不合法字符(#{sequence.join('-')})!" unless /[A-F|a-f|0-9]/.match(char)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
return "合法MAC地址"
|
31
|
+
end
|
32
|
+
|
33
|
+
def calculate sequence
|
34
|
+
size = (sequence.size==3) ? (4):(2)
|
35
|
+
optr,result = "%0#{size}x",[]
|
36
|
+
sequence.each do|unit|
|
37
|
+
result << ( optr % eval("0x"+unit) ) if unit.is_a?(String)
|
38
|
+
result << ( optr % unit ) if unit.is_a?(Numeric)
|
39
|
+
end
|
40
|
+
result
|
41
|
+
end
|
42
|
+
|
43
|
+
def == another
|
44
|
+
@number == another.number
|
45
|
+
end
|
46
|
+
|
47
|
+
def initialize sequence
|
48
|
+
@numbers = []
|
49
|
+
valid = valid?(sequence)
|
50
|
+
if valid =="合法MAC地址"
|
51
|
+
@numbers = calculate(sequence)
|
52
|
+
@number = eval("0x"+@numbers.join)
|
53
|
+
else
|
54
|
+
warn valid
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def writing number=3,splitter='-'
|
59
|
+
number = 6 if number>=6
|
60
|
+
@numbers.each_slice(6/number.to_i).collect{|pile|pile.join}.join(splitter)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
module MAC
|
66
|
+
def self.address sequence,def_splt='-'
|
67
|
+
seq = if sequence.is_a?(String)
|
68
|
+
splitter = '-' if sequence.include?('-')
|
69
|
+
splitter = '.' if sequence.include?('.')
|
70
|
+
splitter = def_splt unless def_splt==splitter
|
71
|
+
sequence.split(splitter)
|
72
|
+
else
|
73
|
+
sequence
|
74
|
+
end
|
75
|
+
MacAddress.new(seq)
|
76
|
+
end
|
77
|
+
end
|
data/utility/netmerge.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
module Network
|
4
|
+
# 按网络归并地址段
|
5
|
+
# [ [ network(x.x.x.x), netmask(x.x.x.x) ], ... ] >=> [ [ network(x.x.x.x), netmask(x.x.x.x) ], ... ]
|
6
|
+
def self.merge raw_table
|
7
|
+
min,max = 32,0
|
8
|
+
nets = raw_table.map do|raw|
|
9
|
+
bin = IP.v4(raw[0]).to_b.gsub('.','')
|
10
|
+
num = IP.v4(raw[1]).mask_counter
|
11
|
+
min = num if min >= num
|
12
|
+
max = num if max <= num
|
13
|
+
net = bin[0..(num-1)]
|
14
|
+
end.sort_by{|net|net.size}.uniq # 按最短网络地址排序
|
15
|
+
|
16
|
+
merge = []
|
17
|
+
nets.each do|net|
|
18
|
+
include = false
|
19
|
+
merge << net
|
20
|
+
merge.each do|sub|
|
21
|
+
include = true if /^#{sub}/.match(net) && net!=sub
|
22
|
+
end
|
23
|
+
merge.delete(net) if include
|
24
|
+
end # 网络地址匹配,仅保留最短网络地址
|
25
|
+
|
26
|
+
diet_table = []
|
27
|
+
merge.each do|sub|
|
28
|
+
net = sub + "0"*(32-sub.size)
|
29
|
+
ip = net.unpack("a8a8a8a8").map{|i|eval("0b"+i)}.join(".")
|
30
|
+
network,netmask = IP.v4("#{ip}/#{sub.size}")
|
31
|
+
diet_table << [network.to_d,netmask.to_d]
|
32
|
+
end
|
33
|
+
return diet_table
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
__END__
|
39
|
+
$LOAD_PATH << "."
|
40
|
+
require 'ipv4_address'
|
41
|
+
require 'neatjson'
|
42
|
+
|
43
|
+
path = 'pubnet.json'
|
44
|
+
raw = JSON.parse File.read path
|
45
|
+
table = Network.merge raw
|
46
|
+
File.write path.gsub('.json','_merge.json'),JSON.pretty_generate(table)
|
data/utility/route.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
module Route
|
4
|
+
module_function
|
5
|
+
# [destination, netmask, gateway, interface, owner, priority, metric]
|
6
|
+
|
7
|
+
def match candiroutes, ipv4,backup_size = 2
|
8
|
+
backup_size < 0 and backup_size = 0
|
9
|
+
backup_routing_table = []
|
10
|
+
candiroutes.each do|pile|
|
11
|
+
net, mask = pile[0], pile[1]
|
12
|
+
l = ipv4.number >> (32-mask)
|
13
|
+
r = net.number >> (32-mask)
|
14
|
+
l != r and next
|
15
|
+
backup_routing_table << pile
|
16
|
+
end
|
17
|
+
backup_stack = backup_routing_table.map{|r|r[1]}.uniq.sort.reverse[0..(backup_size-1)]
|
18
|
+
routing_table = backup_routing_table.select{|r|backup_stack.include? r[1]}.sort_by!{|r|r[1]}.reverse
|
19
|
+
end
|
20
|
+
|
21
|
+
def merge candiroutes
|
22
|
+
merge_table = []
|
23
|
+
candiroutes = candiroutes.map do|c|
|
24
|
+
s = c[0].number
|
25
|
+
e = c[0].number + 2**(32-c[1]) - 1
|
26
|
+
c + [s, e, :yet]
|
27
|
+
end
|
28
|
+
candiroutes.each_with_index do|c, i|
|
29
|
+
candiroutes[(i+1)..(-1)].each do |cc|
|
30
|
+
cc[-1] == :bemerged and next
|
31
|
+
merged = c[-3] <= cc[-3] && cc[-2] <= c[-2]
|
32
|
+
bemerged = cc[-3] <= c[-3] && c[-2] <= cc[-2]
|
33
|
+
if merged
|
34
|
+
cc[-1] = :bemerged
|
35
|
+
elsif !merged && bemerged
|
36
|
+
c[-1] = :bemerged
|
37
|
+
break
|
38
|
+
end
|
39
|
+
end
|
40
|
+
merge_table << c[0..2] unless c[-1]==:bemerged
|
41
|
+
end
|
42
|
+
merge_table
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
__END__
|
48
|
+
$:<<"."
|
49
|
+
require 'ipv4_address'
|
50
|
+
|
51
|
+
=begin
|
52
|
+
ip = IP.v4('172.11.0.1')
|
53
|
+
n1,m1 = IP.v4('172.8.0.0/13')
|
54
|
+
n2,m2 = IP.v4('172.10.0.0/255.254.0.0')
|
55
|
+
n2_5,m2_5 = IP.v4('172.10.0.0/255.254.0.0')
|
56
|
+
n3,m3 = IP.v4('192.168.0.0/255.255.255.0')
|
57
|
+
|
58
|
+
candiroutes = [
|
59
|
+
[n1, m1.mask_counter, '1.1.1.1',:intf1, 'static', 1, 0],
|
60
|
+
[n2, m2.mask_counter, '2.2.2.2',:intf2, 'static', 1, 0],
|
61
|
+
[n3,m3.mask_counter, '3.3.3.3', :intf3, 'static', 0, 0],
|
62
|
+
[n2_5,m2_5.mask_counter, '4.4.4.4',:intf4, 'static', 1, 0]
|
63
|
+
]
|
64
|
+
|
65
|
+
pp Route.match candiroutes, ip
|
66
|
+
=end
|
67
|
+
|
68
|
+
=begin
|
69
|
+
n1,m1 = IP.v4('172.8.0.0/13')
|
70
|
+
n2,m2 = IP.v4('172.10.0.0/255.254.0.0')
|
71
|
+
n3,m3 = IP.v4('192.168.0.0/255.255.255.0')
|
72
|
+
|
73
|
+
candiroutes = [
|
74
|
+
[n1, m1.mask_counter, '1.1.1.1', :intf, 'static', 1, 0],
|
75
|
+
[n2, m2.mask_counter, '1.1.1.1', :intf, 'static', 1, 0],
|
76
|
+
[n3, m3.mask_counter, '1.1.1.1', :intf, 'static', 1, 0]
|
77
|
+
]
|
78
|
+
pp Route.merge candiroutes
|
79
|
+
=end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
|
3
|
+
class WhiteList
|
4
|
+
attr_reader :allowed
|
5
|
+
|
6
|
+
def initialize path
|
7
|
+
pubnet = JSON.parse File.read path
|
8
|
+
@allowed = pubnet.inject([]) do|allowed,network|
|
9
|
+
ip,mask = IP.v4(network.join('/'))
|
10
|
+
start_ip,end_ip = ip.range_with(mask)
|
11
|
+
allowed << [start_ip, end_ip]
|
12
|
+
allowed
|
13
|
+
end
|
14
|
+
@allowed
|
15
|
+
end
|
16
|
+
|
17
|
+
def allow? ip
|
18
|
+
@allowed.inject(false){|flag, range| flag || (range[0].number..range[1].number).include?(ip.number)}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|