class Macinbox::VirtualDisk

Public Class Methods

new(image) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 9
def initialize(image)
  @image = image
  @quiet_flag = $verbose ? [] : %W[ -quiet ]
  @task_opts = $verbose ? [] : [{ :out => File::NULL }]
end

Public Instance Methods

attach() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 49
def attach
  set_devices(Task.backtick %W[ /usr/bin/hdiutil attach #{@image} -nomount ])
end
convert(format: 'UDZO', outfile:) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 45
def convert(format: 'UDZO', outfile:)
  Task.run %W[ /usr/bin/hdiutil convert -format #{format} -o #{outfile} #{@image} ] + @quiet_flag
end
create(disk_size, fstype) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 41
def create(disk_size, fstype)
  Task.run %W[ /usr/bin/hdiutil create -size #{disk_size}g -type SPARSE -fs #{fstype} -volname #{"Macintosh HD"} -uid 0 -gid 80 -mode 1775 #{@image} ] + @quiet_flag
end
create_from_folder(srcfolder) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 37
def create_from_folder(srcfolder)
  Task.run %W[ /usr/bin/hdiutil create -srcfolder #{srcfolder} #{@image} ] + @quiet_flag
end
detach!() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 83
def detach!
  return unless @disk_device
  %x( /usr/bin/hdiutil detach -quiet -force #{@disk_device.shellescape} > /dev/null 2>&1 )
  unset_devices
end
device() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 15
def device
  @disk_device
end
eject() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 67
def eject
  max_attempts = 5
  for attempt in 1..max_attempts
    begin
      quiet = $verbose ? [] : %W[ quiet ]
      Task.run %W[ /usr/sbin/diskutil ] + quiet + %W[ eject #{@disk_device} ] + @task_opts
      unset_devices
      break
    rescue Macinbox::Error => error
      raise if attempt == max_attempts
      Logger.info "Eject failed: #{error.message}. Sleeping and retrying..." if $verbose
      sleep 15
    end
  end
end
mount(at: nil, owners: false) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 53
def mount(at: nil, owners: false)
  mount_option = at ? %W[ -mountpoint #{at} ] : []
  owners_option = owners ? %W[ -owners on ] : []
  Task.run %W[ /usr/bin/hdiutil attach #{@volume_device} -nobrowse ] + mount_option + owners_option + @quiet_flag
end
mount_efi(at:) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 59
def mount_efi(at:)
  Task.run %W[ /usr/sbin/diskutil mount -mountPoint #{at} #{@efi_device} ] + @task_opts
end
mountpoint() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 32
def mountpoint
  disk_info = Task.backtick %W[ /usr/sbin/diskutil info #{@volume_device} ]
  disk_info[/Mount Point:\s+(.*)/, 1]
end
set_devices(devices) click to toggle source
# File lib/macinbox/virtual_disk.rb, line 19
def set_devices(devices)
  @disk_device = devices[/([^ \n]*)([ \t])+\w*_partition_scheme/, 1]
  @efi_device = devices[/([^ \n]*)([ \t])+EFI/, 1]
  @volume_device = devices[/([^ \n]*)([ \t])+(Apple_HFS|41504653-0000-11AA-AA11-0030654)/, 1]
  raise Macinbox::Error.new("failed to attach the image") unless File.exist? @disk_device
end
unmount_efi() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 63
def unmount_efi
  Task.run %W[ /usr/sbin/diskutil unmount #{@efi_device} ] + @task_opts
end
unset_devices() click to toggle source
# File lib/macinbox/virtual_disk.rb, line 26
def unset_devices
  @disk_device = nil
  @efi_device = nil
  @volume_device = nil
end