YkLib 0.1.0

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 (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
+