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,843 @@
1
+
2
+
3
+
4
+ require 'pathname'
5
+ require 'Yk/__defun__'
6
+ require 'Yk/__hook__'
7
+ require 'Yk/io_aux'
8
+ require 'pty'
9
+ require 'Yk/misc_tz'
10
+
11
+ (class << File; self; end).class_eval do
12
+ alias_method :__org_open_____, :open
13
+ at_exit do
14
+ begin
15
+ # FileUtils.rm_rf "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
16
+ # FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances") rescue ""
17
+ # FileUtils.rmdir("#{ENV['HOME']}/.tmp/#{File.basename($0)}") rescue ""
18
+ rescue Exception
19
+ end
20
+ end
21
+ def open (f, mode = "r", perm = nil, **opts)
22
+ tmp_mode = false
23
+ #if f == ""
24
+ # if !File.exist? "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
25
+ # File.mkpath "#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}"
26
+ # end
27
+ # f.replace("#{ENV['HOME']}/.tmp/#{File.basename($0)}/instances/#{$$}/tmp.#{rand(10000000000).to_s}")
28
+ # tmp_mode = true
29
+ # fmode.delete = true
30
+ #end
31
+ res = nil
32
+ fmode = mode.to_fmode
33
+ pid = nil
34
+ handleIO = Proc.new do |h|
35
+ p
36
+ pid && h.__defun__(:pid, pid)
37
+ p
38
+ if block_given?
39
+ p
40
+ begin
41
+ # p h
42
+ res = yield h
43
+ ensure
44
+ h.closed? || h.close
45
+ if pid
46
+ begin
47
+ Process.waitpid pid
48
+ rescue => e
49
+ end
50
+ end
51
+ end
52
+ if pid
53
+ res = !($? && $?.exitstatus) ? nil : res
54
+ else
55
+ res
56
+ end
57
+ else
58
+ p
59
+ res = h
60
+ end
61
+ end
62
+ fp = nil
63
+ execIt = Proc.new do |cmdLine|
64
+ opts = opts.clone
65
+ uname = opts.delete :user
66
+ euname = opts.delete(:euser) || uname
67
+ runame = opts.delete(:ruser) || uname
68
+ chdir = opts.delete :chdir
69
+ if chdir == :home
70
+ chdir = Etc::User.home uname
71
+ end
72
+ require 'Yk/misc_tz'
73
+ if Etc::EUser.current? euname
74
+ exec *cmdLine, **opts
75
+ elsif Etc::User.root? euname
76
+ require "shellwords"
77
+ if (File.executable?(tmp = "/usr/sbin/cansudo") && system(tmp) && $? == 0 && STDIN.tty?) or "/etc/group".read =~ /\nwheel|sudo:.*\b(#{Regexp.escape Etc.getpwuid(Process.euid).name})\b/
78
+ exec "sudo", *cmdLine, **opts
79
+ else
80
+ exec "su", "-c", Shellwords.join(cmdLine), **opts
81
+ end
82
+ else
83
+ if Process.euid == 0
84
+ Process.euid = Etc::User.id(euname)
85
+ Process.uid = Etc::User.id(runame)
86
+ Dir.chdir chdir if chdir
87
+ exec *cmdLine, **opts
88
+ else
89
+ require "shellwords"
90
+ ["su", Etc::User.name(uname), "-c", Shellwords.join(cmdLine)].__command_tz__2 mode, env, opts
91
+ end
92
+ end
93
+ end
94
+ doProg = Proc.new do |cmdLine|
95
+ if fmode.sys?
96
+ raise ArgumentError.new("cannot use popen with sysopen")
97
+ end
98
+ if !fmode.terminal?
99
+ fp, ff = nil
100
+ if fmode.readable? && fmode.writable?
101
+ raise ArgumentError.new("function not yet implemented")
102
+ # fr, fout = IO.pipe
103
+ # pid = fork do
104
+ # fr.close
105
+ # fw.close
106
+ # STDIN.reopen fin
107
+ # fmode.stdout? && STDOUT.reopen(fout)
108
+ # fmode.stdout? && STDERR.reopen(fout)
109
+ # exec *cmdLine
110
+ # end
111
+ # fin.close
112
+ # fout.close
113
+ # fr.set_write_io fw
114
+ # fp = fr
115
+ else
116
+ p
117
+ if fmode.encode
118
+ fr, fw = IO.pipe fmode.encode
119
+ else
120
+ fr, fw = IO.pipe
121
+ end
122
+ fcs = []
123
+ if fmode.writable?
124
+ fp, ff = fw, fr
125
+ fcs.push STDIN
126
+ else
127
+ fp, ff = fr, fw
128
+ fmode.stdout? && fcs.push(STDOUT)
129
+ fmode.stderr? && fcs.push(STDERR)
130
+ end
131
+ #fr.nonblock = true
132
+ #fw.nonblock = true
133
+ pid = fork do
134
+ fp.close
135
+ fcs.each do |fc|
136
+ fc.reopen ff
137
+ end
138
+ ff.close
139
+ execIt.call cmdLine
140
+ end
141
+
142
+ ff.close
143
+ end
144
+ handleIO.call fp
145
+ else
146
+ fp = nil
147
+ fq, fp = PTY.open
148
+ if !fp
149
+ raise Exception.new("cannot allocate pseudo tty")
150
+ end
151
+ fp.set_raw
152
+ fq.set_raw
153
+ pid = fork do
154
+ Process.setsid
155
+ #Process.setpgrp
156
+ if fmode.encode && !fmode.encode.empty?
157
+ fqx = IO.reopen fq, "r+:#{fmode.encode}"
158
+ fq.close
159
+ fq = fqx
160
+ end
161
+ begin
162
+ STDIN.reopen fq
163
+ STDOUT.reopen fq
164
+ STDERR.reopen fq
165
+ rescue
166
+ end
167
+ fq.close
168
+ fp.close
169
+ execIt.call cmdLine
170
+ end
171
+ fq.close
172
+ trap :WINCH do
173
+ end
174
+ handleIO.call fp
175
+ end
176
+ end
177
+ if f.is_a? Array
178
+ doProg.call f
179
+ elsif f.is_a? String
180
+ f = f.clone
181
+ case f
182
+ when "|-"
183
+ f = "-"
184
+ fmode.pmode = :program
185
+ fmode.writable = true
186
+ when "-|"
187
+ f = "-"
188
+ fmode.pmode = :program
189
+ fmode.readable = true
190
+ when "|-|"
191
+ f = "-"
192
+ fmode.pmode = :program
193
+ fmode.readable = true
194
+ fmode.writable = true
195
+ when "-"
196
+ fmode.pmode = :program
197
+ else
198
+ if f =~ /^\|/
199
+ f.sub!(/^\|/, "")
200
+ fmode.writable = true; fmode.pmode = :program
201
+ end
202
+ if f =~ /^\|/
203
+ f.sub!(/^\|/, "")
204
+ fmode.readable = true; fmode.pmode = :program
205
+ end
206
+ end
207
+ if f == "-"
208
+ raise ArgumentError.new("function for '-' is not yet implemented")
209
+ else
210
+ File.pipe?(f) && fmode.pmode = :pipe
211
+ case fmode.pmode
212
+ when :program, :terminal
213
+ doProg.call [f]
214
+ else
215
+ writeFile = nil
216
+ getFp = Proc.new do |m|
217
+ if fmode.pmode == :pipe && (IO.instance_method(:use_select) rescue nil)
218
+ mi = m.to_i
219
+ mstd = m.std_mode
220
+ if mi & File::WRONLY != 0
221
+ if mstd =~ /w/ && mstd !~ /\+/
222
+ mstd.sub! /w/, "w+"
223
+ end
224
+ end
225
+ ret = __org_open_____(f, mstd, perm)
226
+ if $startDeb
227
+ p.red ret, f, fmode
228
+ end
229
+ ret
230
+ elsif fmode.sys? || fmode.nonblock?
231
+ if $startDeb
232
+ p f, fmode
233
+ p `ls -la #{f}`
234
+ p f._e?
235
+ p IO.sysopen(f, File::WRONLY|File::NONBLOCK)
236
+ end
237
+ ret = IO.for_fd(IO.sysopen(f, m.to_i | File::NONBLOCK, perm), m.std_mode)
238
+ if $startDeb
239
+ p.red f, fmode
240
+ end
241
+ ret
242
+ else
243
+ if $startDeb
244
+ p f, fmode
245
+ end
246
+ fp = __org_open_____ f, m.std_mode, perm
247
+ end
248
+ end
249
+ if fmode.pmode == :pipe
250
+ if !File.exist?(f) && fmode.creatable?
251
+ begin
252
+ File.mkfifo(f)
253
+ rescue Exception => e
254
+ end
255
+ end
256
+ if !File.pipe?(f)
257
+ raise ArgumentError.new("cannot crate pipe #{f}, non-pipe file already exists.")
258
+ end
259
+ #if fmode.writable? && fmode.readable?
260
+ # hasPipeWriter = true
261
+ # writeFile = "#{f}.__write__"
262
+ # File.pipe?(f) && (File.pipe?(writeFile) || File.mkfifo(writeFile))
263
+ # openWithWrite = Proc.new do |a, b|
264
+ # fp = __org_open_____(a, fmode.to_i, perm)
265
+ # fp.set_write_io __org_open_____(b, fmode.to_i, perm)
266
+ # end
267
+ # if fmode.truncate?
268
+ # openWithWrite.call(f, writeFile)
269
+ # else
270
+ # openWithWrite.call(writeFile, f)
271
+ # end
272
+ #else
273
+ if fmode.writable? && !fmode.readable? && fmode.nonblock?
274
+ fmode2 = fmode.clone
275
+ fmode2.readable = true
276
+ fp = getFp.call fmode2
277
+ fp.fmode = fmode
278
+ else
279
+ fp = getFp.call fmode
280
+ end
281
+ #end
282
+ else
283
+ fp = getFp.call fmode
284
+ end
285
+ if fmode.delete?
286
+ fp.__hook__ :close, f, writeFile do |_org_h, _f_h, _f_h2|
287
+ _org_h.call
288
+ File.exist?(_f_h) && File.delete(_f_h)
289
+ _f_h2 and File.exist?(_f_h2) && File.delete(_f_h2)
290
+ end
291
+ end
292
+ fmode.lock? and fp.flock fmode.to_flock
293
+ fmode.truncate? and (fp.truncate(0) rescue nil)
294
+ handleIO.call fp
295
+ end
296
+ if tmp_mode
297
+ fp.__defun__ :to_s, f.clone
298
+ end
299
+ end
300
+ end
301
+ res
302
+ end
303
+ end
304
+
305
+
306
+
307
+ class File
308
+ def self.readable_file? (f)
309
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.readable?(f)
310
+ end
311
+ def self.writable_file? (f)
312
+ if !File.exist? f
313
+ File.directory?(tmp = File.dirname(f)) && File.writable?(tmp)
314
+ else
315
+ !FileTest.blockdev?(f) && !FileTest.directory?(f) && FileTest.writable?(f)
316
+ end
317
+ end
318
+ def self.executable_file? (f)
319
+ FileTest.executable?(f) && File.file?(f)
320
+ end
321
+ # def self.realpath (f)
322
+ # Pathname.new(f).realpath.to_s
323
+ # end
324
+ def self.relative_path (f, d = ".")
325
+ f = Pathname.new(f)
326
+ d = Pathname.new(d)
327
+ f.relative_path_from(d).to_s
328
+ end
329
+ def self.normalize_path (pth, defdir = nil)
330
+ pth = File.expand_path(pth, defdir)
331
+ if pth =~ /^\/+/
332
+ pth = "/" + $'
333
+ end
334
+ if pth =~ /\/+$/
335
+ pth = $`
336
+ end
337
+ pth
338
+ end
339
+ def self.is_in (f, d, cd = nil)
340
+ f = File.normalize_path(f, cd)
341
+ d = File.normalize_path(d, cd)
342
+ if f =~ /^#{Regexp.escape d}(\/|$)/
343
+ $'
344
+ else
345
+ false
346
+ end
347
+ end
348
+ def self.is_in? (f, d, cd = nil)
349
+ f = File.normalize_path(f, cd)
350
+ d = File.normalize_path(d, cd)
351
+ if f =~ /^#{Regexp.escape d}(\/|$)/
352
+ $'
353
+ else
354
+ false
355
+ end
356
+ end
357
+ def self.sibling (f, g)
358
+ if f =~ /\/[^\/]+$/
359
+ $` + "/" + g
360
+ else
361
+ g
362
+ end
363
+ end
364
+ def self.resymlink (src, dst)
365
+ if File.symlink? dst
366
+ if File.readlink(dst) == src
367
+ return
368
+ else
369
+ FileUtils.rm_f dst
370
+ File.symlink src, dst
371
+ end
372
+ else
373
+ File.symlink src, dst
374
+ end
375
+ end
376
+ def self.resolv_link (l)
377
+ if File.symlink? l
378
+ lk = File.readlink(l)
379
+ else
380
+ return l
381
+ end
382
+ if lk =~ /^\//
383
+ lk
384
+ else
385
+ File.dirname(l) + "/" + File.readlink(l)
386
+ end
387
+ end
388
+ def self.fifo? (f)
389
+ File.pipe?(f)
390
+ end
391
+ def self.lexist? (arg)
392
+ File.symlink?(arg) || File.exist?(arg)
393
+ end
394
+ def self.exist? (arg)
395
+ File.symlink?(arg) || File.exist?(arg)
396
+ end
397
+ def self.lmtime (arg)
398
+ File.lstat(arg).mtime
399
+ end
400
+ def self.mknod (name, type = nil, devn = nil, mode = nil)
401
+ if type
402
+ if mode
403
+ mode = "-m #{mode.to_s(8)}"
404
+ else
405
+ mode = ""
406
+ end
407
+ minor = devn & 0xff
408
+ major = devn >> 8
409
+ tp = type.chr
410
+ system "mknod #{name} #{tp} #{mode} #{major} #{minor}"
411
+ else
412
+ if system "mksock #{name}"
413
+ if mode
414
+ File.chmod mode, name
415
+ end
416
+ else
417
+ raise Exception.new("cannot create socket `#{name}'")
418
+ end
419
+ end
420
+ end
421
+ def self.mkfifo (name, mode = nil)
422
+ if mode
423
+ mode = "-m #{mode.to_s(8)}"
424
+ else
425
+ mode = ""
426
+ end
427
+ if !system "mkfifo #{mode} #{name}"
428
+ raise Exception.new("cannot create fifo `#{name}'")
429
+ end
430
+ end
431
+ def self.mksock (name, mode = nil)
432
+ if !system "mksock #{name}"
433
+ raise Exception.new("cannot create socket `#{name}'")
434
+ end
435
+ if mode
436
+ FileUtils.chmod mode, name
437
+ end
438
+ end
439
+ def self.partial_path (name, sub)
440
+ arr = name.split(/\/+/)
441
+ while arr.size != 0 && arr[-1] == ""
442
+ arr.pop
443
+ end
444
+ arr[sub].join("/")
445
+ end
446
+ def self.delext (name, ext = nil)
447
+ if !ext
448
+ if name =~ /\.[^\.]*$/ && $` != ""
449
+ return name.sub(/\.[^\.]*$/, "")
450
+ else
451
+ return name
452
+ end
453
+ end
454
+ if ext[0] != ?.
455
+ raise ArgumentError.new("'#{ext}' is not extension. Please add '.' before it.")
456
+ end
457
+ name = name.clone
458
+ name.sub! /#{Regexp.escape ext}$/, ""
459
+ name
460
+ end
461
+ def self.which (arg)
462
+ `which #{arg}`.chomp
463
+ end
464
+ end
465
+
466
+
467
+ class Dir
468
+ def self.lrecursive (d)
469
+ recursive d, false do |e|
470
+ yield e
471
+ end
472
+ end
473
+ def self.recursive d, fl = true, orgSz = nil, *exList, &bl
474
+ _recursive({}, d, fl, orgSz, *exList, &bl)
475
+ end
476
+ def self._recursive (dL, d, fl = true, orgSz = nil, *exList)
477
+ ret = []
478
+ if d != "/" && d =~ /\/+$/
479
+ d = $`
480
+ end
481
+ if orgSz == nil
482
+ if d == "/"
483
+ orgSz = 1
484
+ else
485
+ orgSz = d.size + 1
486
+ end
487
+ end
488
+ if !File.directory?(d)
489
+ return block_given? ? 0 : ret
490
+ end
491
+ st = File.lstat d
492
+ s = [st.ino, st.dev]
493
+ if dL[s]
494
+ return
495
+ else
496
+ dL[s] = true
497
+ end
498
+ getRealPath = Proc.new do |a|
499
+ File.realpath(a) rescue a
500
+ end
501
+ if exList[-1].is_a? Hash
502
+ h = exList.pop
503
+ else
504
+ h = Hash.new
505
+ end
506
+ exList.each do |e|
507
+ h[getRealPath.call(e)] = true
508
+ end
509
+ pth = getRealPath.call(d)
510
+ if h[pth]
511
+ return block_given? ? 0 : ret
512
+ end
513
+ h[pth] = true
514
+ cnt = 0
515
+ begin
516
+ Dir.foreach d do |f|
517
+ if f != "." && f != ".."
518
+ if d[-1] == ?/
519
+ f = d + f
520
+ else
521
+ f = d + "/" + f
522
+ end
523
+ if (fl || !File.symlink?(f)) && File.directory?(f)
524
+ cnt += Dir._recursive dL, f, fl, orgSz, h do |g|
525
+ def g.dir
526
+ File.dirname(self)
527
+ end
528
+ def g.base
529
+ File.basename(self)
530
+ end
531
+ def g.dir?
532
+ File.directory?(self)
533
+ end
534
+ g.__defun__ :recbase, g do |tmp|
535
+ tmp[orgSz .. -1]
536
+ end
537
+ if block_given?
538
+ yield g
539
+ else
540
+ ret.push g
541
+ end
542
+ end
543
+ elsif File.exist?(f) || !fl
544
+ def f.dir
545
+ File.dirname(self)
546
+ end
547
+ def f.base
548
+ File.basename(self)
549
+ end
550
+ def f.dir?
551
+ File.directory?(self)
552
+ end
553
+ f.__defun__ :recbase, f do |tmp|
554
+ tmp[orgSz .. -1]
555
+ end
556
+ if block_given?
557
+ yield f
558
+ else
559
+ ret.push f
560
+ end
561
+ cnt += 1
562
+ end
563
+ end
564
+ end
565
+ rescue
566
+ return block_given? ? 0 : []
567
+ end
568
+ return block_given? ? cnt : ret
569
+ end
570
+ def self.each (d)
571
+ Dir.foreach d do |f|
572
+ next if f == "." || f == ".."
573
+ if d[-1] != ?/
574
+ g = d + "/" + f
575
+ else
576
+ g = d + f
577
+ end
578
+ def g.dir
579
+ File.dirname(self)
580
+ end
581
+ def g.base
582
+ File.basename(self)
583
+ end
584
+ def g.dir?
585
+ File.directory?(self)
586
+ end
587
+ yield g
588
+ end
589
+ end
590
+ end
591
+
592
+
593
+ require 'fileutils'
594
+
595
+
596
+ module FileUtils
597
+ class Entry_
598
+ begin
599
+ begin
600
+ File.lchmod(0644, "/")
601
+ rescue NotImplementedError
602
+ def File.lchmod (*args)
603
+ end
604
+ end
605
+ rescue
606
+ end
607
+ begin
608
+ begin
609
+ File.lchown(0, 0, "/")
610
+ rescue NotImplementedError
611
+ def File.lchown (*args)
612
+ end
613
+ end
614
+ rescue
615
+ end
616
+ def lcopy_metadata(path)
617
+ st = lstat()
618
+ if !File.symlink? path
619
+ File.utime st.atime, st.mtime, path
620
+ end
621
+ begin
622
+ File.lchown st.uid, st.gid, path
623
+ rescue Errno::EPERM
624
+ # clear setuid/setgid
625
+ File.lchmod st.mode & 01777, path
626
+ else
627
+ File.lchmod st.mode, path
628
+ end
629
+ end
630
+ def mknod (name, type = nil, devn = nil, mode = nil)
631
+ File.mknod(name, type, devn, mode)
632
+ end
633
+ def mkfifo (name, mode = nil)
634
+ File.mkfifo(name, mode)
635
+ end
636
+ end
637
+ def copy_entry(src, dest, preserve = false, dereference_root = false)
638
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
639
+ destent = Entry_.new(dest, ent.rel, false)
640
+ ent.copy destent.path
641
+ ent.lcopy_metadata destent.path if preserve
642
+ end
643
+ end
644
+ def copy_stat(src, dest, preserve = true, dereference_root = false)
645
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
646
+ destent = Entry_.new(dest, ent.rel, false)
647
+ ent.lcopy_metadata destent.path if preserve
648
+ end
649
+ end
650
+ def cp_stat(src, path)
651
+ st = File.lstat(src)
652
+ if !File.symlink? path
653
+ File.utime st.atime, st.mtime, path
654
+ end
655
+ begin
656
+ File.lchown st.uid, st.gid, path
657
+ rescue Errno::EPERM
658
+ # clear setuid/setgid
659
+ File.lchmod st.mode & 01777, path
660
+ else
661
+ File.lchmod st.mode, path
662
+ end
663
+ end
664
+ module_function :copy_entry
665
+ module_function :copy_stat
666
+ module_function :cp_stat
667
+ end
668
+
669
+
670
+ class File
671
+ class CannotGetLock < Exception
672
+ end
673
+ def try_lock_ex
674
+ if !flock File::LOCK_EX | File::LOCK_NB
675
+ false
676
+ else
677
+ true
678
+ end
679
+ end
680
+ def try_lock_sh
681
+ if !flock File::LOCK_SH | File::LOCK_NB
682
+ false
683
+ else
684
+ true
685
+ end
686
+ end
687
+ def lock_ex
688
+ flock File::LOCK_EX
689
+ end
690
+ def lock_sh
691
+ flock File::LOCK_SH
692
+ end
693
+ def unlock
694
+ flock File::LOCK_UN
695
+ end
696
+ def lock (mode = "e")
697
+ case mode
698
+ when "e"
699
+ flock File::LOCK_EX
700
+ when "s"
701
+ flock File::LOCK_SH
702
+ when "l"
703
+ flock(fmode.writable? ? File::LOCK_EX : File::LOCK_SH)
704
+ else
705
+ raise ArgumentError.new("illeagal mode, '#{mode}'")
706
+ end
707
+ end
708
+ def self.__lock_failed (file)
709
+ require 'shellwords'
710
+ pidList = []
711
+ if File.executable?("/usr/sbin/lsof") && File.executable?("/usr/bin/lsp")
712
+ IO.popen "/usr/sbin/lsof #{Shellwords.escape file} 2> /dev/null" do |r|
713
+ r.each_line do |ln|
714
+ pid = ln.strip.split[1]
715
+ if pid =~ /\d+/
716
+ pidList.push pid
717
+ end
718
+ end
719
+ end
720
+ require 'Yk/proclist'
721
+ ProcList.refresh
722
+ curProc = ProcList.current
723
+ pidList = pidList.select do |e|
724
+ if pc = ProcList.pid(e)
725
+ if pc.isFamilyOf?(curProc)
726
+ next false
727
+ end
728
+ next true
729
+ end
730
+ next false
731
+ end
732
+ if pidList.size > 0
733
+ system "/usr/bin/lsp -a -K #{pidList.join(' ')}"
734
+ end
735
+ end
736
+ end
737
+ def self.try_lock_ex (name)
738
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
739
+ if !fr.flock File::LOCK_EX | File::LOCK_NB
740
+ $DEBUG && __lock_failed(name)
741
+ if block_given?
742
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
743
+ end
744
+ return nil
745
+ end
746
+ if block_given?
747
+ begin
748
+ yield fr
749
+ ensure
750
+ fr.close
751
+ end
752
+ else
753
+ fr
754
+ end
755
+ end
756
+ def self.setpid (name)
757
+ fw = File.open name, File::RDWR|File::CREAT|File::NONBLOCK
758
+ same = fw.read.chomp == $$.to_s
759
+ if !fw.flock(File::LOCK_EX | File::LOCK_NB) && !same
760
+ $DEBUG && __lock_failed(name)
761
+ fw.close
762
+ raise File::CannotGetLock.new("failed to get exclusive lock '#{name}'")
763
+ end
764
+ fw.pos = 0
765
+ if !same
766
+ fw.truncate(0)
767
+ fw.write $$.to_i
768
+ fw.flush
769
+ fw.flock File::LOCK_SH
770
+ else
771
+ Dir.foreach "/proc/#{$$}/fd" do |ent|
772
+ next if ent !~ /^\d+$/
773
+ if File.symlink?(s = "/proc/#{$$}/fd/#{ent}")
774
+ if File.readlink(s) == File.normalize_path(name)
775
+ fw.close
776
+ fw = IO.for_fd(ent.to_i)
777
+ break
778
+ end
779
+ end
780
+ end
781
+ end
782
+ if block_given?
783
+ begin
784
+ yield fw
785
+ ensure
786
+ File.delete name
787
+ !fw.closed? && fw.close
788
+ end
789
+ else
790
+ at_exit do
791
+ File.delete(name) if File.exist?(name)
792
+ !fw.closed? && fw.close
793
+ end
794
+ end
795
+ end
796
+ def self.try_lock_sh (name)
797
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
798
+ if !fr.flock File::LOCK_SH | File::LOCK_NB
799
+ $DEBUG && __lock_failed(name)
800
+ if block_given?
801
+ raise File::CannotGetLock.new("failed to get shared lock '#{name}'")
802
+ end
803
+ return nil
804
+ end
805
+ if block_given?
806
+ begin
807
+ yield fr
808
+ ensure
809
+ fr.close
810
+ end
811
+ else
812
+ fr
813
+ end
814
+ end
815
+ def self.lock_ex (name)
816
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
817
+ fr.flock File::LOCK_EX
818
+ if block_given?
819
+ begin
820
+ yield
821
+ ensure
822
+ fr.close
823
+ end
824
+ else
825
+ fr
826
+ end
827
+ end
828
+ def self.lock_sh (name)
829
+ fr = File.open name, File::RDONLY|File::CREAT|File::NONBLOCK
830
+ fr.flock File::LOCK_SH
831
+ if block_given?
832
+ begin
833
+ yield
834
+ ensure
835
+ fr.close
836
+ end
837
+ else
838
+ fr
839
+ end
840
+ end
841
+ end
842
+
843
+