Module: Veewee::Provider::Virtualbox::BoxCommand
- Included in:
- Box
- Defined in:
- lib/veewee/provider/virtualbox/box/up.rb,
lib/veewee/provider/virtualbox/box/ssh.rb,
lib/veewee/provider/virtualbox/box/halt.rb,
lib/veewee/provider/virtualbox/box/build.rb,
lib/veewee/provider/virtualbox/box/winrm.rb,
lib/veewee/provider/virtualbox/box/create.rb,
lib/veewee/provider/virtualbox/box/destroy.rb,
lib/veewee/provider/virtualbox/box/poweroff.rb,
lib/veewee/provider/virtualbox/box/helper/ip.rb,
lib/veewee/provider/virtualbox/box/screenshot.rb,
lib/veewee/provider/virtualbox/box/helper/create.rb,
lib/veewee/provider/virtualbox/box/helper/status.rb,
lib/veewee/provider/virtualbox/box/export_vagrant.rb,
lib/veewee/provider/virtualbox/box/helper/version.rb,
lib/veewee/provider/virtualbox/box/helper/buildinfo.rb,
lib/veewee/provider/virtualbox/box/validate_vagrant.rb,
lib/veewee/provider/virtualbox/box/helper/forwarding.rb,
lib/veewee/provider/virtualbox/box/helper/ssh_options.rb,
lib/veewee/provider/virtualbox/box/helper/console_type.rb,
lib/veewee/provider/virtualbox/box/helper/natinterface.rb,
lib/veewee/provider/virtualbox/box/helper/winrm_options.rb,
lib/veewee/provider/virtualbox/box/helper/guest_additions.rb
Constant Summary collapse
- UNSYNCED_VERSIONS =
{"4.2.1" => "4.2.0", "4.1.23" => "4.1.22"}
Instance Method Summary collapse
- #add_floppy_controller ⇒ Object
- #add_ide_controller ⇒ Object
- #add_sata_controller ⇒ Object
- #add_shared_folder ⇒ Object
- #add_ssh_nat_mapping ⇒ Object
- #add_winrm_nat_mapping ⇒ Object
- #attach_disk_common(storagectl, device_number) ⇒ Object
- #attach_disk_ide(device_number = 0) ⇒ Object
- #attach_disk_sata(device_number = 0) ⇒ Object
- #attach_floppy ⇒ Object
- #attach_guest_additions ⇒ Object
- #attach_isofile(device_number = 0) ⇒ Object
- #attach_serial_console ⇒ Object
- #build(options = {}) ⇒ Object
- #build_info ⇒ Object
- #console_type(sequence) ⇒ Object
- #create(options = {}) ⇒ Object
- #create_disk ⇒ Object
- #create_vm ⇒ Object
- #delete_forwarding(name) ⇒ Object
- #destroy(option = {}) ⇒ Object
- #download_vbox_guest_additions_iso(options) ⇒ Object
- #exists? ⇒ Boolean
-
#export_vagrant(options) ⇒ Object
Shellutil.execute(“vagrant package –base #vmname –include /tmp/Vagrantfile –output /tmp/#vmname.box”, => “on”).
- #forwarding(name) ⇒ Object
- #get_vbox_home ⇒ Object
- #halt(options = {}) ⇒ Object
- #host_ip_as_seen_by_guest ⇒ Object
-
#ip_address ⇒ Object
Get the IP address of the box.
- #natinterface ⇒ Object
- #poweroff(options = {}) ⇒ Object
- #running? ⇒ Boolean
- #screenshot(filename, options = {}) ⇒ Object
- #send_keycode(keycode) ⇒ Object
- #send_virtualbox_sequence(sequence) ⇒ Object
- #ssh(command, options = {}) ⇒ Object
- #ssh_options ⇒ Object
- #suppress_messages ⇒ Object
-
#transfer_buildinfo(options) ⇒ Object
Transfer information provide by the provider to the box.
- #up(options = {}) ⇒ Object
- #validate_vagrant(options = {}) ⇒ Object
- #vbox_os_type_id(veewee_type_id) ⇒ Object
-
#vbox_version ⇒ Object
Return the major/minor/incremental version of VirtualBox.
- #vboxga_version ⇒ Object
- #winrm(command, options = {}) ⇒ Object
- #winrm_options ⇒ Object
Instance Method Details
#add_floppy_controller ⇒ Object
125 126 127 128 129 130 131 132 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 125 def add_floppy_controller # Create floppy controller unless definition.floppy_files.nil? command="#{@vboxcmd} storagectl \"#{name}\" --name \"Floppy Controller\" --add floppy" shell_exec("#{command}") end end |
#add_ide_controller ⇒ Object
6 7 8 9 10 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 6 def add_ide_controller #unless => "${vboxcmd} showvminfo \"${vname}\" | grep \"IDE Controller\" " command ="#{@vboxcmd} storagectl \"#{name}\" --name \"IDE Controller\" --add ide" shell_exec("#{command}") end |
#add_sata_controller ⇒ Object
12 13 14 15 16 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 12 def add_sata_controller #unless => "${vboxcmd} showvminfo \"${vname}\" | grep \"SATA Controller\" "; command ="#{@vboxcmd} storagectl \"#{name}\" --name \"SATA Controller\" --add sata --hostiocache #{definition.hostiocache} --sataportcount #{definition.disk_count}" shell_exec("#{command}") end |
#add_shared_folder ⇒ Object
45 46 47 48 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 45 def add_shared_folder command="#{@vboxcmd} sharedfolder add \"#{name}\" --name \"veewee-validation\" --hostpath \"#{File.(env.validation_dir)}\" --automount" shell_exec("#{command}") end |
#add_ssh_nat_mapping ⇒ Object
25 26 27 28 29 30 31 32 33 34 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 25 def add_ssh_nat_mapping unless definition.nil? unless definition.skip_nat_mapping == true #Map SSH Ports command="#{@vboxcmd} modifyvm \"#{name}\" --natpf#{self.natinterface} \"guestssh,tcp,,#{definition.ssh_host_port},,#{definition.ssh_guest_port}\"" shell_exec("#{command}") end end end |
#add_winrm_nat_mapping ⇒ Object
36 37 38 39 40 41 42 43 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 36 def add_winrm_nat_mapping unless definition.nil? #Map SSH Ports command="#{@vboxcmd} modifyvm \"#{name}\" --natpf1 'guestwinrm,tcp,,#{definition.winrm_host_port},,#{definition.winrm_guest_port}'" shell_exec("#{command}") end end |
#attach_disk_common(storagectl, device_number) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 87 def attach_disk_common(storagectl, device_number) place=get_vbox_home 1.upto(definition.disk_count) do |f| location=name+"#{f}."+definition.disk_format.downcase location="#{File.join(place,name,location)}" ui.info "Attaching disk: #{location}" command ="#{@vboxcmd} storageattach \"#{name}\" --storagectl \"#{storagectl}\" --port #{f-1} --device #{device_number} --type hdd --medium \"#{location}\"" shell_exec("#{command}") end end |
#attach_disk_ide(device_number = 0) ⇒ Object
101 102 103 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 101 def attach_disk_ide(device_number=0) self.attach_disk_common("IDE Controller", device_number) end |
#attach_disk_sata(device_number = 0) ⇒ Object
105 106 107 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 105 def attach_disk_sata(device_number=0) self.attach_disk_common("SATA Controller", device_number) end |
#attach_floppy ⇒ Object
135 136 137 138 139 140 141 142 143 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 135 def attach_floppy unless definition.floppy_files.nil? # Attach floppy to machine (the vfd extension is crucial to detect msdos type floppy) floppy_file=File.join(definition.path,"virtualfloppy.vfd") command="#{@vboxcmd} storageattach \"#{name}\" --storagectl \"Floppy Controller\" --port 0 --device 0 --type fdd --medium \"#{floppy_file}\"" shell_exec("#{command}") end end |
#attach_guest_additions ⇒ Object
117 118 119 120 121 122 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 117 def attach_guest_additions full_iso_file=File.join(env.config.veewee.iso_dir,"VBoxGuestAdditions_#{self.vboxga_version}.iso") ui.info "Mounting guest additions: #{full_iso_file}" command ="#{@vboxcmd} storageattach \"#{name}\" --storagectl \"IDE Controller\" --type dvddrive --port 1 --device 0 --medium \"#{full_iso_file}\"" shell_exec("#{command}") end |
#attach_isofile(device_number = 0) ⇒ Object
110 111 112 113 114 115 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 110 def attach_isofile(device_number=0) full_iso_file=File.join(env.config.veewee.iso_dir,definition.iso_file) ui.info "Mounting cdrom: #{full_iso_file}" command ="#{@vboxcmd} storageattach \"#{name}\" --storagectl \"IDE Controller\" --type dvddrive --port 0 --device #{device_number} --medium \"#{full_iso_file}\"" shell_exec("#{command}") end |
#attach_serial_console ⇒ Object
18 19 20 21 22 23 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 18 def attach_serial_console command ="#{@vboxcmd} modifyvm \"#{name}\" --uart1 0x3F8 4" shell_exec("#{command}") command ="#{@vboxcmd} modifyvm \"#{name}\" --uartmode1 file \"#{File.join(FileUtils.pwd,name+"-serial-console"+".log")}\"" shell_exec("#{command}") end |
#build(options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/veewee/provider/virtualbox/box/build.rb', line 6 def build(={}) download_vbox_guest_additions_iso() super() unless definition.floppy_files.nil? unless self.shell_exec("java -version").status == 0 raise Veewee::Error,"This box contains floppyfiles, to create it you require to have java installed or have it in your path" end end end |
#build_info ⇒ Object
6 7 8 9 10 |
# File 'lib/veewee/provider/virtualbox/box/helper/buildinfo.rb', line 6 def build_info info=super info << { :filename => ".vbox_version", :content => "#{self.vboxga_version}" } end |
#console_type(sequence) ⇒ Object
9 10 11 |
# File 'lib/veewee/provider/virtualbox/box/helper/console_type.rb', line 9 def console_type(sequence) send_virtualbox_sequence(sequence) end |
#create(options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/veewee/provider/virtualbox/box/create.rb', line 6 def create(={}) # First check if the directory where we create the VM is empty # Sometimes there are leftovers from badly terminated vms box_directory=File.join(self.get_vbox_home,name) if File.exists?(box_directory) raise Veewee::Error,"To create the vm '#{name}' the directory '#{box_directory}' needs to be empty. \nThis could be caused by an badly closed vm.\nRemove it manually before you proceed." end # Suppress those annoying virtualbox messages self. self.create_vm # Attach ttyS0 to the VM for console output redirect_console=[:redirectconsole] if redirect_console self.attach_serial_console end # Adds a folder to the vm for testing purposes self.add_shared_folder #Create a disk with the same name as the box_name self.create_disk use_sata = definition.use_sata if use_sata disk_device_number = 0 isofile_ide_device_number = 0 else disk_device_number = 0 isofile_ide_device_number = 1 end self.add_ide_controller if use_sata self.add_sata_controller self.attach_disk_sata(disk_device_number) else self.attach_disk_ide(disk_device_number) end self.attach_isofile(isofile_ide_device_number) self.attach_guest_additions self.create_floppy("virtualfloppy.vfd") self.add_floppy_controller self.attach_floppy if definition.winrm_user && definition.winrm_password # prefer winrm env.ui.warn "Using winrm because winrm_user and winrm_password are both set" guessed_port=guess_free_port(definition.winrm_host_port.to_i,definition.winrm_host_port.to_i+40).to_s if guessed_port.to_s!=definition.winrm_host_port env.ui.warn "Changing winrm port from #{definition.winrm_host_port} to #{guessed_port}" definition.winrm_host_port=guessed_port.to_s end self.add_winrm_nat_mapping else guessed_port=guess_free_port(definition.ssh_host_port.to_i,definition.ssh_host_port.to_i+40).to_s if guessed_port.to_s!=definition.ssh_host_port env.ui.warn "Changing ssh port from #{definition.ssh_host_port} to #{guessed_port}" definition.ssh_host_port=guessed_port.to_s end self.add_ssh_nat_mapping end end |
#create_disk ⇒ Object
78 79 80 81 82 83 84 85 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 78 def create_disk place=get_vbox_home 1.upto(definition.disk_count) do |f| ui.info "Creating new harddrive of size #{definition.disk_size.to_i}, format #{definition.disk_format}, variant #{definition.disk_variant} " command ="#{@vboxcmd} createhd --filename \"#{File.join(place,name,name+"#{f}."+definition.disk_format.downcase)}\" --size \"#{definition.disk_size.to_i}\" --format #{definition.disk_format.downcase} --variant #{definition.disk_variant.downcase}" shell_exec("#{command}") end end |
#create_vm ⇒ Object
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 151 def create_vm command="#{@vboxcmd} createvm --name \"#{name}\" --ostype \"#{vbox_os_type_id(definition.os_type_id)}\" --register" #Exec and system stop the execution here shell_exec("#{command}") ui.info "Creating vm #{name} : #{definition.memory_size}M - #{definition.cpu_count} CPU - #{vbox_os_type_id(definition.os_type_id)}" #setting cpu's command="#{@vboxcmd} modifyvm \"#{name}\" --cpus #{definition.cpu_count}" shell_exec("#{command}") #setting memory size command="#{@vboxcmd} modifyvm \"#{name}\" --memory #{definition.memory_size}" shell_exec("#{command}") #setting video memory size command="#{@vboxcmd} modifyvm \"#{name}\" --vram #{definition.video_memory_size}" shell_exec("#{command}") #setting bootorder command="#{@vboxcmd} modifyvm \"#{name}\" --boot1 disk --boot2 dvd --boot3 none --boot4 none" shell_exec("#{command}") # Modify the vm to enable or disable hw virtualization extensions vm_flags=%w{pagefusion acpi ioapic pae hpet hwvirtex hwvirtexcl nestedpaging largepages vtxvpid synthxcpu rtcuseutc} vm_flags.each do |vm_flag| if definition.instance_variable_defined?("@#{vm_flag}") vm_flag_value=definition.instance_variable_get("@#{vm_flag}") ui.info "Setting VM Flag #{vm_flag} to #{vm_flag_value}" ui.warn "Used of #{vm_flag} is deprecated - specify your options in the definition file as \n :virtualbox => { :vm_options => [\"#{vm_flag}\" => \"#{vm_flag_value}\"]}" command="#{@vboxcmd} modifyvm #{name} --#{vm_flag.to_s} #{vm_flag_value}" shell_exec("#{command}") end end unless definition.virtualbox[:vm_options][0].nil? definition.virtualbox[:vm_options][0].each do |vm_flag,vm_flag_value| ui.info "Setting VM Flag #{vm_flag} to #{vm_flag_value}" command="#{@vboxcmd} modifyvm #{name} --#{vm_flag.to_s} #{vm_flag_value}" shell_exec("#{command}") end end end |
#delete_forwarding(name) ⇒ Object
29 30 31 32 33 |
# File 'lib/veewee/provider/virtualbox/box/helper/forwarding.rb', line 29 def delete_forwarding(name) forward=self.forwarding(name) command="#{@vboxcmd} controlvm \"#{self.name}\" natpf#{self.natinterface} delete #{name}" shell_results=shell_exec("#{command}") end |
#destroy(option = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/veewee/provider/virtualbox/box/destroy.rb', line 6 def destroy(option={}) unless self.exists? raise Veewee::Error, "Error:: You tried to destroy a non-existing box '#{name}'" end # If it has a save state,remove that first if self.running? # Poweroff self.poweroff # Wait for it to happen sleep 2 end command="#{@vboxcmd} unregistervm \"#{name}\" --delete" ui.info command ui.info "Deleting vm #{name}" #Exec and system stop the execution here shell_exec("#{command}",{:mute => true}) sleep 1 #if the disk was not attached when the machine was destroyed we also need to delete the disk pattern= File::SEPARATOR+name+"." #+definition.disk_format.downcase found=false command="#{@vboxcmd} list hdds -l" hdds=shell_exec("#{command}",{:mute => true}).stdout.split(/\n\n/) hdds.each do |hdd_text| location=hdd_text.split(/\n/).grep(/^Location/).first.split(':')[1].strip if location.match(/#{pattern}/) if File.exists?(location) command="#{@vboxcmd} closemedium disk \"#{location}\" --delete" else command="#{@vboxcmd} closemedium disk \"#{location}\"" end ui.info "Deleting disk #{location}" ui.info "#{command}" shell_exec("#{command}",{:mute => true}) if File.exists?(location) ui.info "We tried to delete the disk file via virtualbox '#{location} but failed" ui.info "Removing it manually" FileUtils.rm(location) end break end end end |
#download_vbox_guest_additions_iso(options) ⇒ Object
6 7 8 9 10 11 12 |
# File 'lib/veewee/provider/virtualbox/box/helper/guest_additions.rb', line 6 def download_vbox_guest_additions_iso() version=self.vboxga_version isofile="VBoxGuestAdditions_#{version}.iso" url="http://download.virtualbox.org/virtualbox/#{version}/#{isofile}" ui.info "Downloading vbox guest additions iso v #{version} - #{url}" download_iso(url,isofile) end |
#exists? ⇒ Boolean
6 7 8 |
# File 'lib/veewee/provider/virtualbox/box/helper/status.rb', line 6 def exists? return check?(:exists) end |
#export_vagrant(options) ⇒ Object
Shellutil.execute(“vagrant package –base #vmname –include /tmp/Vagrantfile –output /tmp/#vmname.box”, => “on”)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/veewee/provider/virtualbox/box/export_vagrant.rb', line 9 def export_vagrant() # Check if box already exists unless self.exists? ui.info "#{name} is not found, maybe you need to build it first?" exit end if File.exists?("#{name}.box") if ["force"] env.logger.debug("#{name}.box exists, but --force was provided") env.logger.debug("removing #{name}.box first") FileUtils.rm("#{name}.box") env.logger.debug("#{name}.box removed") else raise Veewee::Error, "export file #{name}.box already exists. Use --force option to overwrite." end end # We need to shutdown first if self.running? ui.info "Vagrant requires the box to be shutdown, before it can export" ui.info "Sudo also needs to work for user #{definition.ssh_user}" ui.info "Performing a clean shutdown now." self.halt #Wait for state poweroff while (self.running?) do ui.info ".",{:new_line => false} sleep 1 end ui.info "" ui.info "Machine #{name} is powered off cleanly" end #Vagrant requires a relative path for output of boxes #4.0.x. not using boxes as a subdir boxdir=Pathname.new(Dir.pwd) full_path=File.join(boxdir,name+".box") path1=Pathname.new(full_path) path2=Pathname.new(Dir.pwd) box_path=path1.relative_path_from(path2).to_s if File.exists?("#{box_path}") raise Veewee::Error, "box #{name}.box already exists" end ui.info "Executing vagrant voodoo:" export_command="vagrant package --base '#{name}' --output '#{box_path}'" export_command += " --include #{["include"].join(',')}" unless ["include"].empty? export_command += " --vagrantfile #{["vagrantfile"].join(' ')}" unless ["vagrantfile"].empty? ui.info "#{export_command}" shell_exec("#{export_command}") #hmm, needs to get the gem_home set? ui.info "" #add_ssh_nat_mapping back!!!! #vagrant removes the mapping #we need to restore it in order to be able to login again self.add_ssh_nat_mapping ui.info "To import it into vagrant type:" ui.info "vagrant box add '#{name}' '#{box_path}'" ui.info "" ui.info "To use it:" ui.info "vagrant init '#{name}'" ui.info "vagrant up" ui.info "vagrant ssh" end |
#forwarding(name) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/veewee/provider/virtualbox/box/helper/forwarding.rb', line 6 def forwarding(name) command="#{@vboxcmd} showvminfo --details --machinereadable \"#{self.name}\"" shell_results=shell_exec("#{command}") rules=shell_results.stdout.split(/\n/).grep(/^Forward/) result=nil rules.each do |rule| #Forwarding(0) nr=rule.split('=')[0].split('(')[1].split(')')[0].to_i + 1 # guestssh,tcp,,2222,,22 details=rule.split('=')[1].split('"')[1].split(',') result = { :nr => nr, :name => details[0], :protocol => details[1], :host_ip => details[2], :host_port => details[3], :guest_ip => details[4], :guest_port => details[5] } end return result end |
#get_vbox_home ⇒ Object
50 51 52 53 54 55 56 57 58 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 50 def get_vbox_home command="#{@vboxcmd} list systemproperties" shell_results=shell_exec("#{command}") # On windows Default machine path would include a drive letter, then ':'. # So here we tell to split no more than 2 elements to keep the full path # This should work for all OS as we just need to separate the parameter name with first ':' from the value location=shell_results.stdout.split(/\n/).grep(/Default machine/)[0].split(":", 2)[1].strip return location end |
#halt(options = {}) ⇒ Object
6 7 8 |
# File 'lib/veewee/provider/virtualbox/box/halt.rb', line 6 def halt(={}) super() end |
#host_ip_as_seen_by_guest ⇒ Object
7 8 9 |
# File 'lib/veewee/provider/virtualbox/box/helper/ip.rb', line 7 def host_ip_as_seen_by_guest "10.0.2.2" end |
#ip_address ⇒ Object
Get the IP address of the box
12 13 14 |
# File 'lib/veewee/provider/virtualbox/box/helper/ip.rb', line 12 def ip_address return "127.0.0.1" end |
#natinterface ⇒ Object
6 7 8 9 10 11 12 |
# File 'lib/veewee/provider/virtualbox/box/helper/natinterface.rb', line 6 def natinterface command="#{@vboxcmd} showvminfo --details --machinereadable \"#{self.name}\"" shell_results=shell_exec("#{command}") nic_id=shell_results.stdout.split(/\n/).grep(/^nic/).grep(/nat/)[0].split('=')[0][-1,1] return nic_id end |
#poweroff(options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 |
# File 'lib/veewee/provider/virtualbox/box/poweroff.rb', line 6 def poweroff(={}) # If the vm is not powered off, perform a shutdown if (self.exists? && self.running?) ui.info "Shutting down vm #{name}" #We force it here, maybe vm.shutdown is cleaner command="#{@vboxcmd} controlvm \"#{name}\" poweroff" shell_exec("#{command}") end end |
#running? ⇒ Boolean
10 11 12 |
# File 'lib/veewee/provider/virtualbox/box/helper/status.rb', line 10 def running? return check?(:running) end |
#screenshot(filename, options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/veewee/provider/virtualbox/box/screenshot.rb', line 6 def screenshot(filename,={}) raise Veewee::Error, "The VM needs to exist before we can take a screenshot" unless self.exists? raise Veewee::Error, "The VM needs to be running before we can test a screenshot" unless self.running? # If the vm is not powered off, take a screenshot if (self.exists? && self.running?) ui.info "Saving screenshot of vm #{name} in #{filename}" command="#{@vboxcmd} controlvm \"#{name}\" screenshotpng \"#{filename}\"" shell_exec("#{command}") unless File.exists?(filename) raise Veewee::Error,"Saving Screenshot #{filename} failed" end end end |
#send_keycode(keycode) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/veewee/provider/virtualbox/box/helper/console_type.rb', line 46 def send_keycode(keycode) command= "#{@vboxcmd} controlvm \"#{name}\" keyboardputscancode #{keycode}" env.logger.info "#{command}" sshresult=shell_exec("#{command}",{:mute => true}) unless sshresult.stdout.index("E_ACCESSDENIED").nil? error= "There was an error typing the commands on the console" error+="Probably the VM did not get started." error+= "" error+= "#{sshresult.stdout}" raise Veewee::Error, error end end |
#send_virtualbox_sequence(sequence) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/veewee/provider/virtualbox/box/helper/console_type.rb', line 13 def send_virtualbox_sequence(sequence) ui.info "" counter=0 sequence.each { |s| counter=counter+1 ui.info "Typing:[#{counter}]: "+s keycodes=Veewee::Provider::Core::Helper::Scancode.string_to_keycode(s) # VBox seems to have issues with sending the scancodes as one big # .join()-ed string. It seems to get them out or order or ignore some. # A workaround is to send the scancodes one-by-one. codes="" for keycode in keycodes.split(' ') do unless keycode=="wait" send_keycode(keycode) sleep 0.01 else sleep 1 end end #sleep after each sequence (needs to be param) sleep 0.5 } ui.info "Done typing." ui.info "" end |
#ssh(command, options = {}) ⇒ Object
6 7 8 |
# File 'lib/veewee/provider/virtualbox/box/ssh.rb', line 6 def ssh(command,={}) super(command,) end |
#ssh_options ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/veewee/provider/virtualbox/box/helper/ssh_options.rb', line 6 def port=definition.ssh_host_port if self.exists? forward=self.forwarding("guestssh") unless forward.nil? port=forward[:host_port] end end ={ :user => definition.ssh_user, :port => port, :password => definition.ssh_password, :timeout => definition.ssh_login_timeout.to_i } return end |
#suppress_messages ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 61 def day=24*60*60 update_date=Time.now+365*day extraData = [ ["GUI/RegistrationData","triesLeft=0"], ["GUI/SuppressMessages","confirmInputCapture,remindAboutAutoCapture,remindAboutMouseIntegrationOff,remindAboutMouseIntegrationOn,remindAboutWrongColorDepth"], ["GUI/UpdateDate", "1 d, #{update_date.year}-#{update_date.month.to_s.rjust(2,'0')}-#{update_date.day.to_s.rjust(2,'0')}, stable"], ["GUI/UpdateCheckCount","60"] ] extraData.each do |data| command="#{@vboxcmd} setextradata global \"#{data[0]}\" \"#{data[1]}\"" shell_results=shell_exec("#{command}") end end |
#transfer_buildinfo(options) ⇒ Object
Transfer information provide by the provider to the box
15 16 17 18 19 20 21 22 23 |
# File 'lib/veewee/provider/virtualbox/box/helper/buildinfo.rb', line 15 def transfer_buildinfo() super() # with windows, we just use the mounted volume if not (definition.winrm_user && definition.winrm_password) iso_image="VBoxGuestAdditions_#{self.vboxga_version}.iso" env.logger.info "About to transfer virtualbox guest additions iso to the box #{name} - #{ip_address} - #{}" self.copy_to_box("#{File.join(env.config.veewee.iso_dir,iso_image)}",File.basename(iso_image)) end end |
#up(options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/veewee/provider/virtualbox/box/up.rb', line 6 def up(={}) unless self.exists? raise Veewee::Error, "Error:: You tried to up a non-existing box '#{name}'" end gui_enabled=['nogui']==true ? false : true raise Veewee::Error,"Box is already running" if self.running? if definition.winrm_user && definition.winrm_password # prefer winrm # Before we start,correct the ssh/winrm port if needed forward=self.forwarding("guestwinrm") guessed_port=guess_free_port(definition.winrm_host_port.to_i,definition.winrm_host_port.to_i+40).to_s definition.winrm_host_port=guessed_port.to_s unless forward.nil? if guessed_port!=forward[:guest_port] # Remove the existing one self.delete_forwarding("guestwinrm") env.ui.warn "Changing winrm port on UP from #{forward[:guest_port]} to #{guessed_port}" self.add_winrm_nat_mapping end else self.add_winrm_nat_mapping end else # Before we start,correct the ssh port if needed forward=self.forwarding("guestssh") guessed_port=guess_free_port(definition.ssh_host_port.to_i,definition.ssh_host_port.to_i+40).to_s definition.ssh_host_port=guessed_port.to_s unless forward.nil? if guessed_port!=forward[:guest_port] # Remove the existing one self.delete_forwarding("guestssh") env.ui.warn "Changing ssh port from #{forward[:guest_port]} to #{guessed_port}" self.add_ssh_nat_mapping end else self.add_ssh_nat_mapping end end self. # Once assembled we start the machine env.logger.info "Started the VM with GUI Enabled? #{gui_enabled}" command="#{@vboxcmd} startvm --type gui \"#{name}\"" unless (gui_enabled) command="#{@vboxcmd} startvm --type headless \"#{name}\"" end shell_results=shell_exec("#{command}",{:mute => true}) end |
#validate_vagrant(options = {}) ⇒ Object
6 7 8 |
# File 'lib/veewee/provider/virtualbox/box/validate_vagrant.rb', line 6 def validate_vagrant( = {}) ( ['tags'],) end |
#vbox_os_type_id(veewee_type_id) ⇒ Object
145 146 147 148 149 |
# File 'lib/veewee/provider/virtualbox/box/helper/create.rb', line 145 def vbox_os_type_id(veewee_type_id) type=env.ostypes[veewee_type_id][:vbox] env.logger.info("Using VBOX os_type_id #{type}") return type end |
#vbox_version ⇒ Object
Return the major/minor/incremental version of VirtualBox. For example: 4.1.8_Debianr75467 -> 4.1.8
9 10 11 12 13 14 15 16 |
# File 'lib/veewee/provider/virtualbox/box/helper/version.rb', line 9 def vbox_version command="#{@vboxcmd} --version" stderr = "/dev/null" stderr = "nul" if definition.os_type_id=~/^Win/ shell_results=shell_exec("#{command}",{:mute => true, :stderr => stderr}) version=shell_results.stdout.strip.split(/[^0-9\.]/)[0] return version end |
#vboxga_version ⇒ Object
18 19 20 |
# File 'lib/veewee/provider/virtualbox/box/helper/version.rb', line 18 def vboxga_version affected_version?(self.vbox_version) ? UNSYNCED_VERSIONS[self.vbox_version] : self.vbox_version end |
#winrm(command, options = {}) ⇒ Object
6 7 8 |
# File 'lib/veewee/provider/virtualbox/box/winrm.rb', line 6 def winrm(command,={}) super(command,) end |
#winrm_options ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/veewee/provider/virtualbox/box/helper/winrm_options.rb', line 6 def port=definition.winrm_host_port if self.exists? forward=self.forwarding("guestwinrm") unless forward.nil? port=forward[:host_port] end end ={ :user => definition.winrm_user, :pass => definition.winrm_password, :port => port, # :port => (port.to_i+1).to_s, # debug, by running charles with a reverse proxy :basic_auth_only => true, :timeout => definition.winrm_login_timeout.to_i, :operation_timeout => 600 # ten minutes } return end |