Class: Macinbox::VirtualDisk

Inherits:
Object
  • Object
show all
Defined in:
lib/macinbox/virtual_disk.rb

Instance Method Summary collapse

Constructor Details

#initialize(image) ⇒ VirtualDisk

Returns a new instance of VirtualDisk.



9
10
11
12
13
# 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

Instance Method Details

#attachObject



49
50
51
# 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:) ⇒ Object



45
46
47
# 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) ⇒ Object



41
42
43
# 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) ⇒ Object



37
38
39
# 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!Object



83
84
85
86
87
# 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

#deviceObject



15
16
17
# File 'lib/macinbox/virtual_disk.rb', line 15

def device
  @disk_device
end

#ejectObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 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) ⇒ Object



53
54
55
56
57
# 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:) ⇒ Object



59
60
61
# 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

#mountpointObject



32
33
34
35
# 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) ⇒ Object

Raises:



19
20
21
22
23
24
# 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_efiObject



63
64
65
# File 'lib/macinbox/virtual_disk.rb', line 63

def unmount_efi
  Task.run %W[ /usr/sbin/diskutil unmount #{@efi_device} ] + @task_opts
end

#unset_devicesObject



26
27
28
29
30
# File 'lib/macinbox/virtual_disk.rb', line 26

def unset_devices
  @disk_device = nil
  @efi_device = nil
  @volume_device = nil
end