| Class | MountPoint |
| In: |
mount_point.rb
|
| Parent: | Object |
デバイスとマウント先のディレクトリ、および書き込み情報を格納。
| @smbopts | [R] | |
| mountlist | [R] |
device にマウントするデバイス、もしくは共有フォルダを与える。 device に String クラス以外のものや空白のみのものは無視される。 dir にはマウント先のディレクトリを与える。与えない場合には "/mnt" +「device の basename 部分」を設定する。 writable には読み込み専用ならば nil を、書き込みも可能とするならば true を与える。デフォルトは nil である。
# File mount_point.rb, line 218
218: def initialize(device=nil, dir=nil, writable=nil, fstype=nil)
219: debug(device, dir, writable, fstype)
220:
221: mountitem = MountItem.new(device, dir, writable, fstype)
222:
223: @mountlist = Array.new
224: @mountlist.push(mountitem) if mountitem.device
225:
226: self.samba(nil, nil, "")
227:
228: debug(@mountlist)
229: end
device にマウントするデバイス、もしくは共有フォルダを与える。 device に String クラス以外のものや空白のみのものは無視される。 dir にはマウント先のディレクトリを与える。与えない場合には "/mnt" +「device の basename 部分」を設定する。 writable には読み込み専用ならば nil を、書き込みも可能とするならば true を与える。デフォルトは nil である。
# File mount_point.rb, line 238
238: def add(device=nil, dir=nil, writable=nil, fstype=nil)
239: debug(device, dir, writable, fstype)
240:
241: mountitem = MountItem.new(device, dir, writable, fstype)
242: @mountlist.push(mountitem) if mountitem.device
243:
244: debug(@mountlist)
245: end
設定された全ての device が既にマウント済みかどうかをチェックする。 all に true を与えた場合、一つでもマウントされていないものがあれば、 false を返す。全てがマウントされていれば true を返す。 一方、all に false を与えた場合、一つでもマウントされていれば、 true を返す。一つもマウントされていなければ false を返す。 (これは、「全てアンマウントされているか」を調べるのに有効である)
quiet に false を渡すと、all が true の際はマウントされていないもの に関して、all が false の場合はマウントされているものに関して メッセージを表示する。
# File mount_point.rb, line 404
404: def check_mounted(all=true, quiet=true)
405: allmounted = true
406: partlymounted = false
407:
408: @mountlist.each{ |mountitem|
409: if mountitem.check_mounted(all, quiet) then
410: partlymounted = true
411: else
412: allmounted = false
413: end
414: }
415:
416: debug(allmounted, partlymounted)
417: return allmounted if all
418: return partlymounted unless all
419: end
マウントを実行する、noexec に true を与えると、実際にはコマンドを 実行せず、実行するコマンドを標準出力に出力する。
# File mount_point.rb, line 284
284: def mount(noexec=nil)
285: @mountlist.each{ |mountitem|
286: next if mountitem.check_mounted
287:
288: cmdstr = "/usr/bin/env mount"
289: cmdstr << " #{mountitem.mount_opt_fstype}"
290:
291: debug(mountitem.mount_opt_fstype.chomp.strip)
292: if "-t smbfs" == mountitem.mount_opt_fstype.chomp.strip
293: cmdstr << " #{@smbopts}"
294: cmdstr << ",#{mountitem.mount_opt_readable}"
295: else
296: cmdstr << " -o #{mountitem.mount_opt_readable}"
297: end
298:
299: cmdstr << " #{mountitem.device} #{mountitem.dir}"
300:
301: debug(cmdstr)
302: if /^(.*?)password=.*?,(.*)$/ =~ cmdstr then
303: cmdstr_nopass = $1 + "password=********," + $2
304: else
305: cmdstr_nopass = cmdstr
306: end
307:
308: debug("uid=", Process.uid, " euid=", Process.euid)
309: print "#{cmdstr_nopass}\n"
310: system "#{cmdstr}" unless noexec
311: }
312: end
Samba マウントを行うよう、オプションを設定する。
# File mount_point.rb, line 251
251: def samba(username=nil, uid=nil, password=nil ,
252: codepage=nil, iocharset=nil )
253: smb_opt_username = (username) ? username.chomp.strip : ENV["USER"]
254: smb_opt_uid = (uid) ? uid : Etc.getpwuid(Process.uid).uid
255:
256: smb_opt_codepage = (codepage) ? codepage.chomp.strip : "cp932"
257: smb_opt_iocharset = (iocharset) ? iocharset.chomp.strip : "euc-jp"
258:
259: smb_opt_password = (password) ? password.chomp.strip : get_smbpasswd(smb_opt_username)
260:
261: @smbopts = "-o"
262: @smbopts << " username=#{smb_opt_username}"
263: @smbopts << ",password=#{smb_opt_password}"
264: @smbopts << ",uid=#{smb_opt_uid},gid=#{smb_opt_uid}"
265: @smbopts << ",iocharset=#{smb_opt_iocharset}"
266: @smbopts << ",codepage=#{smb_opt_codepage}"
267: @smbopts << ",fmask=664,dmask=755"
268:
269: debug(@smbopts)
270: end
smbmount を実行する、noexec に true を与えると、実際にはコマンドを 実行せず、実行するコマンドを標準出力に出力する。 結果的には MountPoint.mount メソッドと変わらないが、 このメソッドは一般ユーザでも実行可能である。
# File mount_point.rb, line 339
339: def smbmount(noexec=nil)
340: @mountlist.each{ |mountitem|
341: next if mountitem.check_mounted
342:
343: unless "-t smbfs" == mountitem.mount_opt_fstype.chomp.strip then
344: print "Not Mount MountItem [\"#{mountitem.device}\" ->"
345: print " \"#{mountitem.dir}\"] so it is not \"smbfs\". "
346: return nil
347: end
348:
349: cmdstr = "/usr/bin/env smbmount"
350: cmdstr << " #{mountitem.device} #{mountitem.dir}"
351: cmdstr << " #{@smbopts}"
352: cmdstr << ",#{mountitem.mount_opt_readable}"
353:
354: debug(cmdstr)
355: if /^(.*?)password=.*?,(.*)$/ =~ cmdstr then
356: cmdstr_nopass = $1 + "password=********," + $2
357: else
358: cmdstr_nopass = cmdstr
359: end
360:
361: debug("uid=", Process.uid, " euid=", Process.euid)
362: print "#{cmdstr_nopass}\n"
363: system "#{cmdstr}" unless noexec
364: }
365: end
アンマウントを実行する、noexec に true を与えると、実際にはコマンドを 実行せず、実行するコマンドを標準出力に出力する。
# File mount_point.rb, line 372
372: def smbumount(noexec=nil)
373: @mountlist.each{ |mountitem|
374: next unless mountitem.check_mounted(true)
375:
376: unless "-t smbfs" == mountitem.mount_opt_fstype.chomp.strip then
377: print "Not Uount MountItem [\"#{mountitem.device}\" ->"
378: print " \"#{mountitem.dir}\"] so it is not \"smbfs\". "
379: return nil
380: end
381:
382: cmdstr = "/usr/bin/env smbumount"
383: cmdstr << " #{mountitem.dir}"
384:
385: debug(cmdstr)
386: debug("uid=", Process.uid, " euid=", Process.euid)
387: print "#{cmdstr}\n"
388: system "#{cmdstr}" unless noexec
389: }
390: end
アンマウントを実行する、noexec に true を与えると、実際にはコマンドを 実行せず、実行するコマンドを標準出力に出力する。
# File mount_point.rb, line 319
319: def umount(noexec=nil)
320: @mountlist.each{ |mountitem|
321: next unless mountitem.check_mounted(true)
322:
323: cmdstr = "/usr/bin/env umount"
324: cmdstr << " #{mountitem.device}"
325:
326: debug(cmdstr)
327: debug("uid=", Process.uid, " euid=", Process.euid)
328: print "#{cmdstr}\n"
329: system "#{cmdstr}" unless noexec
330: }
331: end
デバッグ出力用メソッド。組み込み関数 $DEBUG が真の場合 (つまり、 プログラムを $ ruby -d ./xxxxxx.rb として呼び出した場合) に debug メソッドに代入された変数を出力する。
# File mount_point.rb, line 204
204: def debug(*args)
205: p [caller.first, *args] if $DEBUG
206: end