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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2 -0
  3. data/document/acl-M6000-16E.md +27 -0
  4. data/document/acl-M6000-18S.md +27 -0
  5. data/document/acl-M6000-8.md +27 -0
  6. data/document/acl-M6000-8E.md +27 -0
  7. data/document/acl-MA5200G-8.md +204 -0
  8. data/document/acl-ME60-16.md +177 -0
  9. data/document/acl-ME60-X16.md +177 -0
  10. data/document/acl-NE40E-X16.md +204 -0
  11. data/document/acl-NE40E-X16A.md +204 -0
  12. data/document/acl-NE40E-X8.md +204 -0
  13. data/document/acl-NE40E.md +204 -0
  14. data/document/acl-NE5000E-20.md +25 -0
  15. data/document/acl-NE5000E-X16.md +25 -0
  16. data/document/acl-NE5000E-X16A.md +25 -0
  17. data/document/acl-NE80E.md +204 -0
  18. data/document/bgp-CR16010H-F.md +25 -0
  19. data/document/bgp-CR16018-F.md +25 -0
  20. data/document/bgp-CR19000-20.md +25 -0
  21. data/document/bgp-M6000-16E.md +25 -0
  22. data/document/bgp-M6000-18S.md +25 -0
  23. data/document/bgp-M6000-8.md +25 -0
  24. data/document/bgp-M6000-8E.md +25 -0
  25. data/document/bgp-MA5200G-8.md +25 -0
  26. data/document/bgp-ME60-16.md +25 -0
  27. data/document/bgp-ME60-X16.md +25 -0
  28. data/document/bgp-NE40E-X16.md +25 -0
  29. data/document/bgp-NE40E-X16A.md +25 -0
  30. data/document/bgp-NE40E-X8.md +25 -0
  31. data/document/bgp-NE40E.md +25 -0
  32. data/document/bgp-NE5000E-20.md +25 -0
  33. data/document/bgp-NE5000E-X16.md +25 -0
  34. data/document/bgp-NE5000E-X16A.md +25 -0
  35. data/document/bgp-NE80E.md +25 -0
  36. data/document/config.md +1153 -0
  37. data/document/document.rb +27 -0
  38. data/document/if-ALCATEL7750.md +48 -0
  39. data/document/if-C7609.md +47 -0
  40. data/document/if-CR16010H-F.md +300 -0
  41. data/document/if-CR16018-F.md +300 -0
  42. data/document/if-CR19000-20.md +300 -0
  43. data/document/if-CRS-16.md +47 -0
  44. data/document/if-CX600-X16A.md +349 -0
  45. data/document/if-CX600-X8A.md +349 -0
  46. data/document/if-M6000-16E.md +652 -0
  47. data/document/if-M6000-18S.md +846 -0
  48. data/document/if-M6000-8.md +653 -0
  49. data/document/if-M6000-8E.md +653 -0
  50. data/document/if-MA5200G-8.md +357 -0
  51. data/document/if-ME60-16.md +357 -0
  52. data/document/if-ME60-X16.md +357 -0
  53. data/document/if-NE40E-X16.md +357 -0
  54. data/document/if-NE40E-X16A.md +357 -0
  55. data/document/if-NE40E-X8.md +357 -0
  56. data/document/if-NE40E.md +357 -0
  57. data/document/if-NE5000E-20.md +357 -0
  58. data/document/if-NE5000E-X16.md +357 -0
  59. data/document/if-NE5000E-X16A.md +357 -0
  60. data/document/if-NE8000E-X8.md +357 -0
  61. data/document/if-NE80E.md +357 -0
  62. data/document/if-NE8100-X8.md +357 -0
  63. data/document/if-Nokia7750.md +48 -0
  64. data/document/if-T8000-18.md +653 -0
  65. data/document/if-V6000.md +663 -0
  66. data/document/if-VNE9000.md +357 -0
  67. data/document/if-ZXCTN9000-18EA.md +762 -0
  68. data/document/if-ZXCTN9000-8EA.md +762 -0
  69. data/document/lic-M6000-16E.md +28 -0
  70. data/document/lic-M6000-18S.md +28 -0
  71. data/document/lic-M6000-8.md +28 -0
  72. data/document/lic-M6000-8E.md +28 -0
  73. data/document/lic-MA5200G-8.md +27 -0
  74. data/document/lic-ME60-16.md +27 -0
  75. data/document/lic-ME60-X16.md +27 -0
  76. data/document/lic-NE40E-X16.md +27 -0
  77. data/document/lic-NE40E-X16A.md +27 -0
  78. data/document/lic-NE40E-X8.md +27 -0
  79. data/document/log-M6000-16E.md +36 -0
  80. data/document/log-M6000-18S.md +36 -0
  81. data/document/log-M6000-8.md +36 -0
  82. data/document/log-M6000-8E.md +36 -0
  83. data/document/log-MA5200G-8.md +61 -0
  84. data/document/log-ME60-16.md +61 -0
  85. data/document/log-ME60-X16.md +61 -0
  86. data/document/log-NE40E-X16.md +61 -0
  87. data/document/log-NE40E-X16A.md +61 -0
  88. data/document/log-NE40E-X8.md +61 -0
  89. data/document/log-NE40E.md +61 -0
  90. data/document/log-NE5000E-20.md +61 -0
  91. data/document/log-NE5000E-X16.md +61 -0
  92. data/document/log-NE5000E-X16A.md +61 -0
  93. data/document/log-NE80E.md +61 -0
  94. data/document/nat-CR16010H-F.md +27 -0
  95. data/document/nat-CR16018-F.md +27 -0
  96. data/document/nat-M6000-16E.md +27 -0
  97. data/document/nat-M6000-18S.md +27 -0
  98. data/document/nat-M6000-8.md +27 -0
  99. data/document/nat-M6000-8E.md +27 -0
  100. data/document/nat-ME60-16.md +44 -0
  101. data/document/nat-ME60-X16.md +44 -0
  102. data/document/nat-NE40E-X16.md +44 -0
  103. data/document/nat-NE40E-X16A.md +44 -0
  104. data/document/policy-M6000-16E.md +13 -0
  105. data/document/policy-M6000-18S.md +13 -0
  106. data/document/policy-M6000-8.md +13 -0
  107. data/document/policy-M6000-8E.md +13 -0
  108. data/document/policy-MA5200G-8.md +87 -0
  109. data/document/policy-ME60-16.md +87 -0
  110. data/document/policy-ME60-X16.md +87 -0
  111. data/document/policy-NE40E-X16.md +87 -0
  112. data/document/policy-NE40E-X16A.md +87 -0
  113. data/document/policy-NE40E-X8.md +87 -0
  114. data/document/policy-NE40E.md +87 -0
  115. data/document/policy-NE5000E-20.md +87 -0
  116. data/document/policy-NE5000E-X16.md +87 -0
  117. data/document/policy-NE5000E-X16A.md +87 -0
  118. data/document/policy-NE80E.md +87 -0
  119. data/document/pool-M6000-16E.md +126 -0
  120. data/document/pool-M6000-18S.md +126 -0
  121. data/document/pool-M6000-8.md +126 -0
  122. data/document/pool-M6000-8E.md +126 -0
  123. data/document/pool-MA5200G-8.md +138 -0
  124. data/document/pool-ME60-16.md +138 -0
  125. data/document/pool-ME60-X16.md +138 -0
  126. data/document/pool-NE40E-X16.md +138 -0
  127. data/document/pool-NE40E-X16A.md +138 -0
  128. data/document/pool-NE40E-X8.md +138 -0
  129. data/document/pool-NE40E.md +138 -0
  130. data/document/pool-NE80E.md +138 -0
  131. data/document/static-CR16010H-F.md +60 -0
  132. data/document/static-CR16018-F.md +60 -0
  133. data/document/static-CR19000-20.md +60 -0
  134. data/document/static-CX600-X16A.md +26 -0
  135. data/document/static-CX600-X8A.md +26 -0
  136. data/document/static-M6000-16E.md +104 -0
  137. data/document/static-M6000-18S.md +104 -0
  138. data/document/static-M6000-8.md +104 -0
  139. data/document/static-M6000-8E.md +104 -0
  140. data/document/static-MA5200G-8.md +82 -0
  141. data/document/static-ME60-16.md +82 -0
  142. data/document/static-ME60-X16.md +82 -0
  143. data/document/static-NE40E-X16.md +82 -0
  144. data/document/static-NE40E-X16A.md +81 -0
  145. data/document/static-NE40E-X8.md +82 -0
  146. data/document/static-NE40E.md +67 -0
  147. data/document/static-NE5000E-20.md +67 -0
  148. data/document/static-NE5000E-X16.md +67 -0
  149. data/document/static-NE5000E-X16A.md +67 -0
  150. data/document/static-NE8000E-X8.md +26 -0
  151. data/document/static-NE80E.md +67 -0
  152. data/document/static-NE8100-X8.md +26 -0
  153. data/document/static-T8000-18.md +34 -0
  154. data/document/static-ZXCTN9000-18EA.md +34 -0
  155. data/document/static-ZXCTN9000-8EA.md +34 -0
  156. data/document/system-M6000-16E.md +75 -0
  157. data/document/system-M6000-18S.md +76 -0
  158. data/document/system-M6000-8.md +75 -0
  159. data/document/system-M6000-8E.md +75 -0
  160. data/document/system-MA5200G-8.md +51 -0
  161. data/document/system-ME60-16.md +51 -0
  162. data/document/system-ME60-X16.md +51 -0
  163. data/document/system-NE40E-X16.md +51 -0
  164. data/document/system-NE40E-X16A.md +51 -0
  165. data/document/system-NE40E-X8.md +51 -0
  166. data/document/system-NE40E.md +51 -0
  167. data/document/system-NE5000E-20.md +51 -0
  168. data/document/system-NE5000E-X16.md +51 -0
  169. data/document/system-NE5000E-X16A.md +51 -0
  170. data/document/system-NE80E.md +51 -0
  171. data/document/telnet.md +332 -0
  172. data/network.rb +24 -0
  173. data/utility/ipv4_address.rb +266 -0
  174. data/utility/ipv6_address.rb +201 -0
  175. data/utility/mac_address.rb +77 -0
  176. data/utility/netmerge.rb +46 -0
  177. data/utility/route.rb +79 -0
  178. data/utility/whitelist.rb +21 -0
  179. 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
@@ -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
+