virtualbox-guestcontrol 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/rvbox +45 -0
- data/lib/virtualbox-guestcontrol.rb +95 -13
- data/lib/virtualbox-guestcontrol/version.rb +1 -1
- metadata +2 -2
data/bin/rvbox
CHANGED
@@ -53,6 +53,24 @@ class VirtualBoxCommand < Clamp::Command
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
+
|
57
|
+
subcommand "usblist", "list usb devices on host" do
|
58
|
+
def execute
|
59
|
+
VirtualBox::GuestControl::Runner.usb_devices.each do |device|
|
60
|
+
puts device.to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
subcommand "usbdetach", "detach usb devices on host" do
|
66
|
+
parameter "NAME", "name of virtual machine"
|
67
|
+
|
68
|
+
def execute
|
69
|
+
VirtualBox::GuestControl::Runner.usb_devices.each do |device|
|
70
|
+
device.detach(name)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
56
74
|
|
57
75
|
subcommand "status", "says if the vm is booted or not" do
|
58
76
|
parameter "NAME", "name of virtual machine"
|
@@ -65,6 +83,33 @@ class VirtualBoxCommand < Clamp::Command
|
|
65
83
|
end
|
66
84
|
end
|
67
85
|
end
|
86
|
+
|
87
|
+
subcommand "list", "lists the available VMs" do
|
88
|
+
option ["--uuid"], :flag, "show only uuid", :default => false
|
89
|
+
option ["--name"], :flag, "show only name", :default => false
|
90
|
+
|
91
|
+
def execute
|
92
|
+
VirtualBox::GuestControl::Runner.virtual_machines.each do |name, uuid|
|
93
|
+
if uuid?
|
94
|
+
puts uuid
|
95
|
+
elsif name?
|
96
|
+
puts name
|
97
|
+
else
|
98
|
+
puts [name, uuid].join("\t")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
subcommand "execute", "execute a given command" do
|
105
|
+
parameter "NAME", "name of virtual machine"
|
106
|
+
parameter "[COMMAND_PARAMETERS] ...", "command and parameters to pass to the VM", :attribute_name => :command_parameters
|
107
|
+
|
108
|
+
def execute
|
109
|
+
image_name, arguments = command_parameters
|
110
|
+
virtual_box.execute *command_parameters
|
111
|
+
end
|
112
|
+
end
|
68
113
|
end
|
69
114
|
|
70
115
|
VirtualBoxCommand.run(ARGV)
|
@@ -10,7 +10,7 @@ module VirtualBox
|
|
10
10
|
class Runner
|
11
11
|
include ActiveSupport::Configurable
|
12
12
|
|
13
|
-
self.config[:default_timeout] =
|
13
|
+
self.config[:default_timeout] = 240.seconds
|
14
14
|
self.config[:vbox_manage] = Shellter.which("VBoxManage")
|
15
15
|
|
16
16
|
config_accessor :vbox_manage
|
@@ -19,19 +19,23 @@ module VirtualBox
|
|
19
19
|
config_accessor :username
|
20
20
|
config_accessor :password
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
def valid?
|
23
|
+
|
24
|
+
end
|
24
25
|
|
25
26
|
def started?
|
26
|
-
state[:GuestAdditionsRunLevel] == "2"
|
27
|
+
state[:GuestAdditionsRunLevel] == "2" || state[:GuestAdditionsRunLevel] == "3"
|
27
28
|
end
|
28
29
|
|
29
30
|
def shutdown?
|
30
|
-
["poweroff", "aborted"].include?(state[:VMState])
|
31
|
+
["poweroff", "aborted", "saved"].include?(state[:VMState])
|
31
32
|
end
|
32
33
|
|
33
34
|
def shutdown!(force = false)
|
34
35
|
return if shutdown?
|
36
|
+
|
37
|
+
detach_usb_devices
|
38
|
+
|
35
39
|
if force
|
36
40
|
Shellter.run(vbox_manage, "controlvm", ":name", "poweroff", :name => name)
|
37
41
|
wait_until { shutdown? }
|
@@ -83,18 +87,19 @@ module VirtualBox
|
|
83
87
|
options[:password] = password
|
84
88
|
end
|
85
89
|
|
86
|
-
params += ["--
|
87
|
-
params += ["--
|
88
|
-
options[:timeout] = default_timeout.to_s
|
90
|
+
# params += ["--timeout", ":timeout"]
|
91
|
+
params += ["--wait-exit", "--wait-stdout"]
|
92
|
+
# options[:timeout] = default_timeout.to_s
|
89
93
|
|
90
94
|
unless arguments.empty?
|
91
|
-
params += ["--"
|
92
|
-
options[:arguments] = arguments.join(" ")
|
95
|
+
params += ["--"] + arguments
|
93
96
|
end
|
94
97
|
|
95
98
|
params << options
|
99
|
+
|
100
|
+
result = Shellter.run(vbox_manage, *params)
|
101
|
+
puts result.stdout.read
|
96
102
|
|
97
|
-
Shellter.run!(vbox_manage, *params)
|
98
103
|
end
|
99
104
|
end
|
100
105
|
|
@@ -107,6 +112,83 @@ module VirtualBox
|
|
107
112
|
end
|
108
113
|
end
|
109
114
|
end
|
115
|
+
|
116
|
+
class UsbDevice
|
117
|
+
class << self
|
118
|
+
def parse(output, vbox_manage)
|
119
|
+
[].tap do |devices|
|
120
|
+
device = nil
|
121
|
+
output.lines.each do |line|
|
122
|
+
if device
|
123
|
+
if line.strip.blank?
|
124
|
+
devices << device
|
125
|
+
device = nil
|
126
|
+
else
|
127
|
+
key, value = line.split(":")
|
128
|
+
key = key.strip.gsub(" ", "_").underscore
|
129
|
+
value = value.strip
|
130
|
+
device.send(:"#{key}=", value)
|
131
|
+
end
|
132
|
+
else
|
133
|
+
next unless line =~ /UUID:/
|
134
|
+
value = line.split(":").last.strip
|
135
|
+
device = new(value, vbox_manage)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
attr_accessor :uuid, :vendor_id, :product_id, :revision
|
143
|
+
attr_accessor :manufacturer, :product, :address, :current_state
|
144
|
+
attr_accessor :serial_number
|
145
|
+
attr_accessor :vbox_manage
|
146
|
+
|
147
|
+
def initialize(uuid, vbox_manage)
|
148
|
+
self.vbox_manage = vbox_manage
|
149
|
+
self.uuid = uuid
|
150
|
+
end
|
151
|
+
|
152
|
+
def detach(name)
|
153
|
+
result = Shellter.run(vbox_manage, "controlvm", ":name", "usbdetach", ":uuid", :name => name, :uuid => uuid)
|
154
|
+
end
|
155
|
+
|
156
|
+
def attach(name)
|
157
|
+
Shellter.run!(vbox_manage, "controlvm", ":name", "usbattach", ":uuid", :name => name, :uuid => uuid)
|
158
|
+
end
|
159
|
+
|
160
|
+
def to_s
|
161
|
+
"#{product} (#{uuid}): #{current_state}"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def detach_usb_devices
|
166
|
+
self.class.usb_devices.each do |device|
|
167
|
+
device.detach(name)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def attach_usb_devices
|
172
|
+
self.class.usb_devices.each do |device|
|
173
|
+
device.attach(name)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
VM_MATCHER = /^"([^"]*)" \{(.*)\}$/
|
178
|
+
|
179
|
+
class << self
|
180
|
+
def virtual_machines
|
181
|
+
result = Shellter.run!(vbox_manage, "list", "vms")
|
182
|
+
result.stdout.read.lines.map do |line|
|
183
|
+
line.scan(VM_MATCHER).first
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def usb_devices
|
188
|
+
result = Shellter.run!(vbox_manage, "list", "usbhost")
|
189
|
+
UsbDevice.parse(result.stdout, vbox_manage)
|
190
|
+
end
|
191
|
+
end
|
110
192
|
|
111
193
|
private
|
112
194
|
|
@@ -123,12 +205,12 @@ module VirtualBox
|
|
123
205
|
end
|
124
206
|
end
|
125
207
|
|
126
|
-
def with_started_machine
|
208
|
+
def with_started_machine(shutdown_after = false)
|
127
209
|
begin
|
128
210
|
start!
|
129
211
|
yield
|
130
212
|
ensure
|
131
|
-
shutdown!
|
213
|
+
shutdown! if shutdown_after
|
132
214
|
end
|
133
215
|
end
|
134
216
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtualbox-guestcontrol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06
|
12
|
+
date: 2012-08-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: shellter
|