YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,815 @@
1
+
2
+
3
+ require "Yk/misc_tz"
4
+ require "Yk/path_aux"
5
+ require "Yk/generator__"
6
+ require "Yk/ranger"
7
+ require "resolv"
8
+ require "Yk/ipv4adr"
9
+ require "timeout"
10
+
11
+
12
+ def ip2int (ip)
13
+ ret = 0
14
+ ip.split(".").each do |e|
15
+ ret = ret * 256 + e.to_i
16
+ end
17
+ ret
18
+ end
19
+
20
+
21
+ def int2ip (int)
22
+ d1 = (0xff000000 & int) >> 24
23
+ d2 = (0x00ff0000 & int) >> 16
24
+ d3 = (0x0000ff00 & int) >> 8
25
+ d4 = 0x000000ff & int
26
+ "#{d1}.#{d2}.#{d3}.#{d4}"
27
+ end
28
+
29
+
30
+ def net2djb (expr)
31
+ ret = []
32
+ if expr !~ /\//
33
+ return expr
34
+ end
35
+ net = $`
36
+ mask = $'.to_i
37
+ case mask
38
+ when 25..32
39
+ base = (ip2int(net) >> (32 - mask)) << (32 - mask)
40
+ (0 ... 1 << (32 -mask)).each do |i|
41
+ ret.push int2ip(base + i)
42
+ end
43
+ when 24
44
+ net =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3})\./
45
+ ret.push $1
46
+ when 17..23
47
+ base = (ip2int(net) >> (32 - mask)) << (24 - mask)
48
+ (0 ... 1 << (24 -mask)).each do |i|
49
+ ret.push int2ip((base + i) << 8)[/^(\d{1,3}\.\d{1,3}.\d{1,3})\./, 1]
50
+ end
51
+ when 16
52
+ net =~ /^(\d{1,3}\.\d{1,3})\./
53
+ ret.push $1
54
+ when 9..15
55
+ base = (ip2int(net) >> (32 - mask)) << (16 - mask)
56
+ (0 ... 1 << (16 -mask)).each do |i|
57
+ ret.push int2ip((base + i) << 16)[/^(\d{1,3}\.\d{1,3})\./, 1]
58
+ end
59
+ when 8
60
+ net =~ /^(\d{1,3})\./
61
+ ret.push $1
62
+ when 0..7
63
+ base = (ip2int(net) >> (32 - mask)) << (8 - mask)
64
+ (0 ... 1 << (8 -mask)).each do |i|
65
+ ret.push((base + i).to_s)
66
+ end
67
+ end
68
+ ret
69
+ end
70
+
71
+
72
+ def iprange2nets (ipexpr)
73
+ if ipexpr !~ /\-/
74
+ [ipexpr]
75
+ else
76
+ possibleMask = Proc.new do |i|
77
+ j2 = nil
78
+ 32.times do |j|
79
+ if i & (1 << j) != 0
80
+ j2 = j
81
+ break
82
+ end
83
+ end
84
+ j2
85
+ end
86
+ ret = []
87
+ arr = ipexpr.split /\-/
88
+ bg = ip2int(arr[0].strip)
89
+ ed = ip2int(arr[1].strip)
90
+ while bg <= ed
91
+ bgNext = nil
92
+ possibleMask.call(bg).downto 0 do |m|
93
+ if (bgNext = bg + (1 << m) - 1) <= ed
94
+ bgNext += 1
95
+ if m != 0
96
+ ret.push "#{int2ip bg}/#{32 - m}"
97
+ else
98
+ ret.push int2ip(bg)
99
+ end
100
+ break
101
+ end
102
+ end
103
+ bg = bgNext
104
+ end
105
+ ret
106
+ end
107
+ end
108
+
109
+
110
+ class Intf
111
+ class RangeIntf < Ranger
112
+ def eachNet (addr, mask, excludeBcast = false)
113
+ base = ip2int(addr) & ip2int(mask)
114
+ limit = ip2int("255.255.255.255") - ip2int(mask)
115
+ if limit <= 1
116
+ rg = 0 .. limit
117
+ else
118
+ rg = excludeBcast ? (1 .. limit - 1) : (0 .. limit)
119
+ end
120
+ (intersect Ranger.new(rg)).eachRange do |r|
121
+ f = int2ip(base + r.first)
122
+ l = int2ip(base + r.last)
123
+ if f != l
124
+ yield "#{f}-#{l}"
125
+ else
126
+ yield f
127
+ end
128
+ end
129
+ end
130
+ end
131
+ class RangeN < RangeIntf
132
+ def initialize (addr, mask = nil)
133
+ if addr.is_a? RangeN
134
+ super addr
135
+ else
136
+ super ip2int(addr) & ~ip2int(mask)
137
+ end
138
+ end
139
+ end
140
+
141
+ class RangeNumSeed < RangeIntf
142
+ def initialize (range = nil)
143
+ if !range
144
+ super :all
145
+ else
146
+ if range.is_a? String
147
+ super()
148
+ arr = range.split(/[\,\s]+/)
149
+ arr.each do |e|
150
+ if e =~ /\-/
151
+ from = $`.strip
152
+ to = $'.strip
153
+ if from != ""
154
+ if to != ""
155
+ add from.to_i .. to.to_i
156
+ else
157
+ addFrom from.to_i
158
+ end
159
+ else
160
+ if to != ""
161
+ addTo to.to_i
162
+ end
163
+ end
164
+ else
165
+ add e.to_i
166
+ end
167
+ end
168
+ else
169
+ super
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ class Bridge
176
+ attr :intfNameList
177
+ attr :intfObjs
178
+ attr :intf, true
179
+ @@intf2Bridge = Hash.new
180
+ @@bridgeList = Hash.new
181
+ @@intfName2Bridge = Hash.new
182
+ def members
183
+ intfObjs
184
+ end
185
+ def initialize (n)
186
+ @name = n
187
+ @intfNameList = []
188
+ @intfObjs = []
189
+ @@bridgeList[n] = self
190
+ end
191
+ def add (intfName)
192
+ @intfNameList.push intfName
193
+ @@intfName2Bridge[intfName] = self
194
+ end
195
+ def Bridge.getParentBridge (intfName)
196
+ @@intfName2Bridge[intfName]
197
+ end
198
+ def Bridge.isBridge (n)
199
+ @@bridgeList[n]
200
+ end
201
+ def addObj (intfObj)
202
+ @intfObjs.push intfObj
203
+ end
204
+ def commitRange
205
+ if !@commitRange
206
+ @commitRange = true
207
+ @intf.gates.each do |g, gt|
208
+ noRange, hasRange = [], []
209
+ @intfObjs.each do |intfObj|
210
+ gate = intfObj.newgate gt
211
+ if gate.rangeNumSeed == nil
212
+ noRange.push gate
213
+ else
214
+ hasRange.push gate
215
+ end
216
+ end
217
+ rg = RangeNumSeed.new
218
+ hasRange.each do |e|
219
+ rg.except! e.rangeNumSeed
220
+ end
221
+ noRange.each do |e|
222
+ e.rangeNumSeed = rg
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ class Gate
230
+ attr :name
231
+ attr :intf
232
+ attr :mask, true
233
+ attr :p2p, true
234
+ attr :addr, true
235
+ attr :bcast, true
236
+ attr :fullName
237
+ attr :rangeNumSeed, true
238
+ def isBridge?
239
+ @intf.isBridge?
240
+ end
241
+ def isBridged?
242
+ @intf.isMemberOfBridge?
243
+ end
244
+ def initialize (n, intf, fromFile = false)
245
+ if !fromFile
246
+ if !n.is_a? Gate
247
+ if n == nil
248
+ n = ""
249
+ end
250
+ @intf = intf
251
+ @name = n
252
+ ntmp = n == "" ? "" : ":#{n}"
253
+ @fullName = @intf.name + ntmp
254
+ if (tmp = "/etc/proxy_arp_subnet" / @fullName).readable_file?
255
+ @rangeNumSeed = RangeNumSeed.new(tmp.read.strip_comment)
256
+ @proxy_arp = true
257
+ else
258
+ @rangeNumSeed = nil
259
+ end
260
+ @bridgeMember = false
261
+ else
262
+ @intf = intf
263
+ @name = n.name
264
+ if @name == nil
265
+ @name = ""
266
+ end
267
+ ntmp = @name == "" ? "" : ":#{@name}"
268
+ @fullName = @intf.name + ntmp
269
+ @mask = n.mask
270
+ @bcast = n.bcast
271
+ @p2p = n.p2p
272
+ @addr = n.addr
273
+ @bridgeMember = true
274
+ if (tmp = "/etc/bridge_subnet" / @fullName).readable_file?
275
+ @rangeNumSeed = RangeNumSeed.new(tmp.read.strip_comment)
276
+ else
277
+ @rangeNumSeed = nil
278
+ end
279
+ end
280
+ else
281
+ ifcfgFile, subnetFile = n, intf
282
+ ifcfgFile.read_each_line do |ln|
283
+ ln.strip_comment!
284
+ case ln
285
+ when /^IPADDR\=/
286
+ @addr = $'
287
+ when /^NETMASK\=/
288
+ @mask = $'
289
+ when /^BROARDCAST\=/
290
+ @bcast = $'
291
+ end
292
+ end
293
+ if !@addr
294
+ raise Exception.new("IPADDR is missing in file:#{ifcfgFile}")
295
+ end
296
+ if !@mask
297
+ ai = ip2int(@addr)
298
+ if ai <= ip2int("127.255.255.255")
299
+ @mask = "255.0.0.0"
300
+ elsif ip2int("128.0.0.0") <= ai && ai <= ip2int("191.255.255.255")
301
+ @mask = "255.255.0.0"
302
+ else
303
+ @mask = "255.255.255.0"
304
+ end
305
+ end
306
+ if !@bcast
307
+ @bcast = int2ip((ip2int(@addr) & ip2int(@mask)) + ((1 << 32) - 1) - ip2int(@mask))
308
+ end
309
+ if subnetFile && subnetFile.readable_file?
310
+ @rangeNumSeed = RangeNumSeed.new(subnetFile.read)
311
+ @proxy_arp = true
312
+ end
313
+ end
314
+ end
315
+ def nets
316
+ if !@nets
317
+ @nets = []
318
+ if !@p2p
319
+ if @rangeNumSeed
320
+ (@rangeNumSeed.except RangeN.new(@addr, @mask)).eachNet(@addr, @mask, true) do |n|
321
+ @nets.push n
322
+ end
323
+ else
324
+ RangeN.new(@addr, @mask).reverse!.eachNet(@addr, @mask, true) do |n|
325
+ @nets.push n
326
+ end
327
+ end
328
+ else
329
+ @nets.push @p2p
330
+ end
331
+ end
332
+ @nets
333
+ end
334
+ def take *args
335
+ if !@p2p
336
+ if @rangeNumSeed
337
+ r = @rangeNumSeed.except RangeN.new(@addr, @mask)
338
+ else
339
+ r = RangeN.new(0..~ip2int(@mask)).except RangeN.new(@addr, @mask)
340
+ end
341
+ r = r.take(*args)
342
+ r.eachNet(@addr, @mask, true) do |n|
343
+ yield n
344
+ end
345
+ else
346
+ r = Ranger.new(ip2int(@p2p)).take(*args)
347
+ r.eachRange do |e|
348
+ if e.first == e.last
349
+ yield int2ip(e.first)
350
+ else
351
+ yield "#{int2ip e.first}-#{int2ip e.last}"
352
+ end
353
+ end
354
+ end
355
+ end
356
+ MaskList = []
357
+ def simpleMask
358
+ if MaskList.size == 0
359
+ MaskList.unshift "0.0.0.0"
360
+ 32.times do |i|
361
+ MaskList.unshift int2ip((1 << 32) - (1 << i))
362
+ end
363
+ end
364
+ if !@simpleMask
365
+ @simpleMask = 1 + MaskList.index(@mask)
366
+ end
367
+ end
368
+ def bcast_available?
369
+ if @bcast
370
+ if @proxy_arp
371
+ @rangeNumSeed.include? RangeN.new(@bcast, @mask)
372
+ else
373
+ true
374
+ end
375
+ else
376
+ false
377
+ end
378
+ end
379
+ def net
380
+ if !@net
381
+ @net = int2ip(ip2int(@addr) & ip2int(@mask)) + "/" + simpleMask.to_s
382
+ end
383
+ @net
384
+ end
385
+ def network
386
+ if !@network
387
+ @network = int2ip(ip2int(@addr) & ip2int(@mask))
388
+ end
389
+ @network
390
+ end
391
+ def nets_with_mask
392
+ if !@nets_with_mask
393
+ @nets_with_mask = []
394
+ nets.each do |n|
395
+ iprange2nets(n).each do |e|
396
+ @nets_with_mask.push e
397
+ end
398
+ end
399
+ end
400
+ @nets_with_mask
401
+ end
402
+ def nets_each_ip
403
+ if !@nets_ips
404
+ @nets_ips = []
405
+ nets.each do |n|
406
+ if n =~ /\-/
407
+ (ip2int($`)..ip2int($')).each do |e|
408
+ @nets_ips.push int2ip(e)
409
+ end
410
+ end
411
+ end
412
+ end
413
+ @nets_ips.each do |e|
414
+ yield e
415
+ end
416
+ end
417
+ def gateway
418
+ if !@gateway
419
+ if @intf
420
+ `/sbin/route -n`.each_line do |ln|
421
+ n, @gateway, mask, x, x, x, x, dev = ln.split
422
+ if n =~ /^(default|0\.0\.0\.0)$/ && mask = "0.0.0.0" && dev == @intf.name
423
+ break
424
+ end
425
+ end
426
+ end
427
+ end
428
+ @gateway
429
+ end
430
+ def startI
431
+ if !@startI
432
+ @startI = ip2int(@addr) & ip2int(@mask)
433
+ end
434
+ @startI
435
+ end
436
+ def lastI
437
+ if !@lastI
438
+ @lastI = startI + ((1 << 32) - 1 - ip2int(@mask))
439
+ end
440
+ @lastI
441
+ end
442
+ def in_net? arg
443
+ arg = ip2int(arg)
444
+ startI <= arg && arg <= lastI
445
+ end
446
+ end
447
+ attr :bridge
448
+ attr :rangeNum
449
+ attr :name
450
+ def isBridge?
451
+ @isBridge
452
+ end
453
+ def physicals
454
+ !@isBridge ? [self] : @isBridge.members
455
+ end
456
+ @@firstEthIP = nil
457
+ @@proxies = []
458
+ attr :mac
459
+ def proxies
460
+ if !@proxies
461
+ @proxies = []
462
+ @@proxies.each do |intf|
463
+ if intf != self
464
+ @proxies.push intf
465
+ end
466
+ end
467
+ end
468
+ @proxies
469
+ end
470
+ def initialize (n)
471
+ if (f = "/proc/sys/net/ipv4/conf/#{n}/proxy_arp").exist?
472
+ if `cat #{f}`.chomp.to_i == 1
473
+ @@proxies.push self
474
+ end
475
+ end
476
+ m = `cat /sys/class/net/#{n}/address`.chomp
477
+ if m != ""
478
+ @mac = m
479
+ end
480
+ @name = n
481
+ @isBridge = false
482
+ if @bridge = Bridge.getParentBridge(n)
483
+ @bridge.addObj self
484
+ else
485
+ if tmp = Bridge.isBridge(n)
486
+ @isBridge = tmp
487
+ tmp.intf = self
488
+ end
489
+ @gates = {}
490
+ end
491
+ end
492
+ def logical
493
+ if bridge
494
+ bridge.intf
495
+ else
496
+ self
497
+ end
498
+ end
499
+ def gates
500
+ if !@gates
501
+ @gates = {}
502
+ if @bridge
503
+ @bridge.intf.gates.each_value do |g|
504
+ newgate(g)
505
+ end
506
+ end
507
+ end
508
+ @gates
509
+ end
510
+ def newgate (n)
511
+ if !n.is_a? Gate
512
+ gates[n] ||= Gate.new(n, self)
513
+ else
514
+ gates[n.name] ||= Gate.new(n, self)
515
+ end
516
+ end
517
+ def isEth?
518
+ @name =~ /^eth\d+$/i
519
+ end
520
+ def net
521
+ ret = []
522
+ gates.each do |g|
523
+ ret.push *g.net
524
+ end
525
+ ret
526
+ end
527
+ def isMemberOfBridge?
528
+ @bridge != nil
529
+ end
530
+ def routes
531
+ if !@routes
532
+ @routes = []
533
+ "/sbin/route -n".read_each_line_p do |ln|
534
+ ln.strip_comment!
535
+ arr = ln.split
536
+ if arr[7] == @name
537
+ @routes.push [arr[1], "#{arr[0]}/#{arr[2]}".to_maskbit]
538
+ end
539
+ end
540
+ end
541
+ @routes.each do |e|
542
+ yield e[0], e[1]
543
+ end
544
+ end
545
+ def Intf.getNewIntfs
546
+ @@brList = Hash.new
547
+ if "/usr/sbin/brctl".executable_file?
548
+ IO.popen "/usr/sbin/brctl show" do |fr|
549
+ fr.each__(:each_line) do |g|
550
+ if +g =~ /^bridge\sname\s/
551
+ next
552
+ end
553
+ if +g =~ /^Usage:/
554
+ break
555
+ end
556
+ bridge = nil
557
+ if +g =~ /^[^\s]+/
558
+ bridge = @@brList[$&] = Bridge.new($&)
559
+ if tmp = (+g).split[3]
560
+ bridge.add tmp
561
+ while g.next =~ /^\s+/
562
+ g.inc
563
+ bridge.add((+g).split[-1])
564
+ end
565
+ end
566
+ end
567
+ end
568
+ end
569
+ end
570
+ @@intfs = Hash.new
571
+ @@firstEthIP = nil
572
+ IO.popen "/sbin/ifconfig" do |fr|
573
+ intf = nil
574
+ fr.each__(:each_line) do |g|
575
+ if +g =~ /^[^\s]+/
576
+ intfName = $&
577
+ if intfName =~ /:/
578
+ intfName = $`
579
+ postFix = $'
580
+ else
581
+ postFix = ""
582
+ end
583
+ intf = (@@intfs[intfName] ||= Intf.new(intfName))
584
+ if !intf.isMemberOfBridge?
585
+ addr, mask, bcast, p2p = nil, nil, nil, nil
586
+ while +g !~ /^\s*$/
587
+ if +g =~ /inet addr:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
588
+ intf != nil && addr = $1
589
+ if !@@firstEthIP && intfName =~ /^eth\d+$/
590
+ @@firstEthIP = addr
591
+ end
592
+ end
593
+ if +g =~ /Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
594
+ intf != nil && mask = $1
595
+ end
596
+ if +g =~ /Bcast:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
597
+ intf != nil && bcast = $1
598
+ end
599
+ if +g =~ /P\-t\-P:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
600
+ intf != nil && p2p = $1
601
+ end
602
+ g.inc
603
+ end
604
+ if addr
605
+ gate = intf.newgate(postFix)
606
+ gate.addr, gate.mask, gate.bcast, gate.p2p = addr, mask, bcast, p2p
607
+ end
608
+ else
609
+ while +g !~ /^\s*$/
610
+ g.inc
611
+ end
612
+ end
613
+ end
614
+ end
615
+ end
616
+ @@gateList = {}
617
+ @@intfs.each_value do |intf|
618
+ intf.gates.each_value do |g|
619
+ @@gateList[g.fullName] = g
620
+ end
621
+ end
622
+ @@brList.each do |k, v|
623
+ v.commitRange
624
+ end
625
+ end
626
+ def Intf.gate (name, subnet = nil)
627
+ if !defined? @@gateList
628
+ getNewIntfs
629
+ end
630
+ if !(ret = @@gateList[name])
631
+ if File.file?(name) && File.readable?(name)
632
+ return Gate.new(name, subnet, true)
633
+ end
634
+ end
635
+ ret
636
+ end
637
+ def Intf.gate_to (adr, direct = false)
638
+ if !defined? @@gateList
639
+ getNewIntfs
640
+ end
641
+ bridgeGates = []
642
+ nonBridgeGates = []
643
+ Intf.gates.each do |g|
644
+ if g.isBridge?
645
+ bridgeGates.push g
646
+ else
647
+ nonBridgeGates.push g
648
+ end
649
+ end
650
+ gates = nonBridgeGates + bridgeGates
651
+ if adr !~ /[\-|\/]/
652
+ gates.each do |g|
653
+ g.nets.each do |expr|
654
+ if expr =~ /\-/
655
+ if ip2int($`) <= (a = ip2int(adr)) && a <= ip2int($')
656
+ if block_given?
657
+ yield g, adr
658
+ return
659
+ else
660
+ return g
661
+ end
662
+ end
663
+ elsif expr == adr
664
+ if block_given?
665
+ yield g, adr
666
+ return
667
+ else
668
+ return g
669
+ end
670
+ end
671
+ end
672
+ end
673
+ if !direct
674
+ "/sbin/route -n".read_each_line_p do |ln|
675
+ tmp = ln.split
676
+ if tmp.values_at(0, 2) == ["0.0.0.0", "0.0.0.0"]
677
+ return Intf.gate_to(tmp[1])
678
+ end
679
+ end
680
+ end
681
+ return nil
682
+ else
683
+ rList = Hash.new
684
+ gates.each do |g|
685
+ g.nets.each do |expr|
686
+ rList[g] = IPRanger.new(adr.to_range).intersect IPRanger.new(expr.to_range)
687
+ end
688
+ end
689
+ bridgeGates.each do |g|
690
+ g.intf.bridge.intfObjs.each do |i|
691
+ i.gates.values.each do |g2|
692
+ if g2.name == g.name
693
+ rList[g].del rList[g2]
694
+ end
695
+ end
696
+ end
697
+ end
698
+ rList.each do |g, n|
699
+ n.eachRange do
700
+ yield g, n
701
+ end
702
+ end
703
+ end
704
+ end
705
+ def Intf.gates
706
+ if !defined? @@gateList
707
+ getNewIntfs
708
+ end
709
+ @@gateList.values
710
+ end
711
+ def Intf.firstEthIP
712
+ @@firstEthIP
713
+ end
714
+ def Intf.intfs
715
+ if !defined? @@intfs
716
+ getNewIntfs
717
+ end
718
+ @@intfs.values
719
+ end
720
+ def Intf.intf (n)
721
+ if !defined? @@intfs
722
+ getNewIntfs
723
+ end
724
+ @@intfs[n]
725
+ end
726
+ def Intf.hostIP
727
+ resolver = Resolv::Hosts.new
728
+ ip = resolver.getaddress(`hostname -s`.strip) rescue nil
729
+ if ip != "127.0.0.1"
730
+ return ip
731
+ else
732
+ return firstEthIP
733
+ end
734
+ end
735
+ def Intf.gateway
736
+ gw = "/etc/sysconfig/network".read[/\bGATEWAY\=([^\s]+)/, 1]
737
+ if !gw
738
+ if "/etc/crifcfg".exist?
739
+ "/etc/crifcfg".each_entry do |f|
740
+ if (f / "ifcfg").readable_file?
741
+ gw = (f / "ifcfg").read[/\bGATEWAY\=([^\s]+)/, 1]
742
+ break if gw
743
+ end
744
+ end
745
+ end
746
+ if !gw
747
+ "/etc/sysconfig/network-scripts/ifcfg-*".glob do |f|
748
+ if f.extname != ".bak" || f.extname != ".org"
749
+ gw = f.read[/\bGATEWAY\=([^\s]+)/, 1]
750
+ break if gw
751
+ end
752
+ end
753
+ end
754
+ end
755
+ gw
756
+ end
757
+ end
758
+
759
+ if $0 == __FILE__
760
+ $DEBUG=1
761
+ require "Yk/debugout"
762
+ exit 1
763
+ require 'Yk/auto_pstore'
764
+
765
+ AutoPstore.rander ||= []
766
+ #AutoPstore.rander.clear
767
+ if AutoPstore.rander.size > 100
768
+ AutoPstore.rander.clear
769
+ end
770
+
771
+ $i = 0
772
+
773
+ def rander
774
+ tmp = AutoPstore.rander
775
+ ret = tmp[$i]
776
+ if !ret
777
+ AutoPstore.rander.push(ret = (rand * 10).to_i)
778
+ end
779
+ $i += 1
780
+ ret
781
+ end
782
+
783
+
784
+ rgr = Ranger.new
785
+ r = Proc.new do rander end
786
+ rg = Proc.new do
787
+ a = [nil, nil]
788
+ while a[0] == a[1]
789
+ a = [r.call, r.call].sort
790
+ end
791
+ a[0]..a[1]
792
+ end
793
+ 100.times do
794
+ rgr.reverse!
795
+ rgr.check
796
+ rgr.add(rg.call)
797
+ rgr.check
798
+ rgr.add r.call
799
+ rgr.check
800
+ rgr.del r.call
801
+ rgr.check
802
+ rgr.addFrom r.call
803
+ rgr.check
804
+ rgr.addTo r.call
805
+ rgr.check
806
+ rgr.delFrom r.call
807
+ rgr.check
808
+ rgr.delTo r.call
809
+ rgr.check
810
+ rgr.del(rg.call)
811
+ rgr.check
812
+ end
813
+ end
814
+
815
+