class Macinbox::Actions::CreateBoxFromVDI

Public Class Methods

new(opts) click to toggle source
# File lib/macinbox/actions/create_box_from_vdi.rb, line 14
def initialize(opts)
  @input_vdi         = opts[:vdi_path]        or raise ArgumentError.new(":vdi_path not specified")
  @output_path       = opts[:box_path]        or raise ArgumentError.new(":box_path not specified")

  @box_name          = opts[:box_name]        or raise ArgumentError.new(":box_name not specified")
  @cpu_count         = opts[:cpu_count]       or raise ArgumentError.new(":cpu_count not specified")
  @memory_size       = opts[:memory_size]     or raise ArgumentError.new(":memory_size not specified")

  @gui               = opts[:gui]
  @fullscreen        = opts[:fullscreen]
  @hidpi             = opts[:hidpi]

  @collector         = opts[:collector]       or raise ArgumentError.new(":collector not specified")

  raise Macinbox::Error.new("VDI not found") unless File.exist? @input_vdi
end

Public Instance Methods

run() click to toggle source
# File lib/macinbox/actions/create_box_from_vdi.rb, line 31
      def run
        @temp_dir = Task.backtick %W[ /usr/bin/mktemp -d -t create_box_from_vdi ]
        @collector.add_temp_dir @temp_dir

        Logger.info "Assembling the box contents..." do

          @box_dir = "#{@temp_dir}/#{@box_name}.box"

          FileUtils.mkdir @box_dir

          File.write "#{@box_dir}/metadata.json", <<~EOF
            {"provider": "virtualbox"}
          EOF

          File.write "#{@box_dir}/Vagrantfile", <<~EOF
            Vagrant.configure(2) do |config|
              config.vm.box_check_update = false
              config.vm.synced_folder ".", "/vagrant", disabled: true
              config.vm.provider "virtualbox" do |v|
                v.gui = #{@gui}
              end
            end
          EOF

          task_opts = $verbose ? {} : { :out => File::NULL }

          Task.run %W[ VBoxManage createvm --register --name macinbox --ostype MacOS1013_64 ] + [task_opts]

          @collector.on_cleanup do
            Task.run %W[ VBoxManage unregistervm macinbox --delete ] + [task_opts]
          end

          Task.run %W[ VBoxManage modifyvm macinbox --usbxhci on --memory #{@memory_size} --vram 128 --cpus #{@cpu_count} --firmware efi --chipset ich9 --mouse usbtablet --keyboard usb ] + [task_opts]
          Task.run %W[ VBoxManage setextradata macinbox CustomVideoMode1 1280x800x32 ] + [task_opts]
          Task.run %W[ VBoxManage setextradata macinbox VBoxInternal2/EfiGraphicsResolution 1280x800 ] + [task_opts]
          Task.run %W[ VBoxManage setextradata macinbox GUI/ScaleFactor 2.0 ] + [task_opts] if @hidpi
          Task.run %W[ VBoxManage storagectl macinbox --name #{"SATA Controller"} --add sata --controller IntelAHCI --hostiocache on ] + [task_opts]
          Task.run %W[ VBoxManage storageattach macinbox --storagectl #{"SATA Controller"} --port 0 --device 0 --type hdd --nonrotational on --medium #{@input_vdi} ] + [task_opts]
          Task.run %W[ VBoxManage modifyvm macinbox --boot1 disk ] + [task_opts]
          Task.run %W[ VBoxManage export macinbox -o #{@box_dir}/box.ovf ] + [task_opts]

        end

        Logger.info "Moving the box to the destination..." do
          FileUtils.chown_R ENV["SUDO_USER"], nil, @box_dir
          FileUtils.mv @box_dir, @output_path
        end

      end