lab 0.1.5 → 0.2.0
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/.gitignore +4 -0
- data/config/test_lab.yml +11 -0
- data/config/test_targets.yml +21 -0
- data/lib/lab/controller/dynagen_controller.rb +6 -6
- data/lib/lab/controller/remote_esx_controller.rb +51 -51
- data/lib/lab/controller/remote_esxi_controller.rb +62 -0
- data/lib/lab/controller/remote_workstation_controller.rb +12 -12
- data/lib/lab/controller/virtualbox_controller.rb +16 -16
- data/lib/lab/controller/workstation_controller.rb +9 -9
- data/lib/lab/controller/workstation_vixr_controller.rb +9 -9
- data/lib/lab/controllers.rb +1 -3
- data/lib/lab/driver/dynagen_driver.rb +32 -32
- data/lib/lab/driver/fog_driver.rb +144 -144
- data/lib/lab/driver/remote_esxi_driver.rb +177 -0
- data/lib/lab/driver/remote_workstation_driver.rb +181 -181
- data/lib/lab/driver/virtualbox_driver.rb +132 -132
- data/lib/lab/driver/vm_driver.rb +177 -177
- data/lib/lab/driver/workstation_driver.rb +218 -218
- data/lib/lab/driver/workstation_vixr_driver.rb +108 -108
- data/lib/lab/drivers.rb +1 -1
- data/lib/lab/modifier/backtrack5_modifier.rb +8 -8
- data/lib/lab/modifier/dos_modifier.rb +3 -3
- data/lib/lab/modifier/test_modifier.rb +6 -6
- data/lib/lab/version.rb +1 -1
- data/lib/lab/vm.rb +242 -242
- data/lib/lab/vm_controller.rb +217 -211
- data/src/Gemfile +4 -0
- data/src/README.md +80 -0
- data/src/Rakefile +1 -0
- data/src/TODO +15 -0
- data/src/config/test_lab.yml +11 -0
- data/src/config/test_targets.yml +21 -0
- data/src/lab.gemspec +35 -0
- data/src/lib/lab.rb +2 -0
- data/src/lib/lab/controller/dynagen_controller.rb +14 -0
- data/src/lib/lab/controller/fog_controller.rb +6 -0
- data/src/lib/lab/controller/remote_esxi_controller.rb +62 -0
- data/src/lib/lab/controller/remote_workstation_controller.rb +22 -0
- data/src/lib/lab/controller/virtualbox_controller.rb +25 -0
- data/src/lib/lab/controller/vsphere_controller.rb +18 -0
- data/src/lib/lab/controller/workstation_controller.rb +17 -0
- data/src/lib/lab/controller/workstation_vixr_controller.rb +19 -0
- data/src/lib/lab/controllers.rb +9 -0
- data/src/lib/lab/driver/dynagen_driver.rb +47 -0
- data/src/lib/lab/driver/fog_driver.rb +104 -0
- data/src/lib/lab/driver/remote_esxi_driver.rb +177 -0
- data/src/lib/lab/driver/remote_workstation_driver.rb +197 -0
- data/src/lib/lab/driver/virtualbox_driver.rb +142 -0
- data/src/lib/lab/driver/vm_driver.rb +195 -0
- data/src/lib/lab/driver/vsphere_driver.rb +120 -0
- data/src/lib/lab/driver/workstation_driver.rb +234 -0
- data/src/lib/lab/driver/workstation_vixr_driver.rb +126 -0
- data/src/lib/lab/drivers.rb +9 -0
- data/src/lib/lab/modifier/backtrack5_modifier.rb +16 -0
- data/src/lib/lab/modifier/dos_modifier.rb +14 -0
- data/src/lib/lab/modifier/test_modifier.rb +16 -0
- data/src/lib/lab/modifiers.rb +3 -0
- data/src/lib/lab/version.rb +3 -0
- data/src/lib/lab/vm.rb +269 -0
- data/src/lib/lab/vm_controller.rb +275 -0
- data/src/test/.gitkeep +0 -0
- metadata +51 -12
- data/lib/lab/driver/remote_esx_driver.rb +0 -177
@@ -0,0 +1,275 @@
|
|
1
|
+
#
|
2
|
+
# $Id$
|
3
|
+
#
|
4
|
+
# This is the main lab controller. Require this controller to get all
|
5
|
+
# lab functionality.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
$:.unshift(File.expand_path(File.dirname(__FILE__)))
|
10
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), 'driver')))
|
11
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), 'controller')))
|
12
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), 'modifier')))
|
13
|
+
|
14
|
+
require 'find'
|
15
|
+
require 'yaml'
|
16
|
+
require 'enumerator'
|
17
|
+
require 'fileutils'
|
18
|
+
|
19
|
+
require 'vm'
|
20
|
+
require 'controllers'
|
21
|
+
require 'drivers'
|
22
|
+
require 'modifiers'
|
23
|
+
|
24
|
+
require 'net/scp'
|
25
|
+
require 'net/ssh'
|
26
|
+
|
27
|
+
module Lab
|
28
|
+
module Controllers
|
29
|
+
class VmController
|
30
|
+
|
31
|
+
include Enumerable
|
32
|
+
include Lab::Controllers::WorkstationController
|
33
|
+
include Lab::Controllers::RemoteWorkstationController
|
34
|
+
include Lab::Controllers::VirtualBoxController
|
35
|
+
include Lab::Controllers::FogController
|
36
|
+
include Lab::Controllers::DynagenController
|
37
|
+
include Lab::Controllers::RemoteEsxiController
|
38
|
+
include Lab::Controllers::VsphereController
|
39
|
+
#include Lab::Controllers::QemuController
|
40
|
+
#include Lab::Controllers::QemudoController
|
41
|
+
def initialize (labdef=nil)
|
42
|
+
|
43
|
+
# Start with an empty array of vm objects
|
44
|
+
@vms = []
|
45
|
+
|
46
|
+
# labdef is a just a big array of hashes
|
47
|
+
load_vms(labdef) if labdef
|
48
|
+
end
|
49
|
+
|
50
|
+
def clear!
|
51
|
+
@vms = []
|
52
|
+
end
|
53
|
+
|
54
|
+
def [](x)
|
55
|
+
# Support indexing by both names and number
|
56
|
+
if x.class == String
|
57
|
+
find_by_vmid(x)
|
58
|
+
else
|
59
|
+
return @vms[x]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def find_by_vmid(search)
|
64
|
+
@vms.each do |vm|
|
65
|
+
return vm if vm.hostname.to_s.downcase == search.to_s.downcase
|
66
|
+
end
|
67
|
+
return nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def find_by_tag(search)
|
71
|
+
@vms.each do |vm|
|
72
|
+
vm.tags.each do |tag|
|
73
|
+
return vm if tag.downcase == search.to_s.downcase
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return nil
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_vm(vmid, location=nil, os=nil, tools=nil, credentials=nil, user=nil, host=nil)
|
80
|
+
@vms << Vm.new( {
|
81
|
+
'vmid' => vmid,
|
82
|
+
'driver' => type,
|
83
|
+
'location' => location,
|
84
|
+
'credentials' => credentials,
|
85
|
+
'user' => user,
|
86
|
+
'host' => host
|
87
|
+
})
|
88
|
+
end
|
89
|
+
|
90
|
+
def remove_by_vmid(vmid)
|
91
|
+
@vms.delete(self.find_by_vmid(vmid))
|
92
|
+
end
|
93
|
+
|
94
|
+
def from_file(file)
|
95
|
+
load_vms(YAML::load_file(file))
|
96
|
+
end
|
97
|
+
|
98
|
+
def load_vms(vms)
|
99
|
+
vms.each do |item|
|
100
|
+
vm = Vm.new(item)
|
101
|
+
@vms << vm unless includes_vmid? vm.vmid
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_file(file)
|
106
|
+
File.open(file, 'w') { |f| @vms.each { |vm| f.puts vm.to_yaml } }
|
107
|
+
end
|
108
|
+
|
109
|
+
def each &block
|
110
|
+
@vms.each { |vm| yield vm }
|
111
|
+
end
|
112
|
+
|
113
|
+
def includes?(specified_vm)
|
114
|
+
@vms.each { |vm| if (vm == specified_vm) then return true end }
|
115
|
+
end
|
116
|
+
|
117
|
+
def includes_vmid?(vmid)
|
118
|
+
@vms.each do |vm|
|
119
|
+
return true if (vm.vmid == vmid)
|
120
|
+
end
|
121
|
+
false
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Build a vm lab from a directory of files. Really only useful for file-based
|
126
|
+
# vm hosts. (vmware workstation)
|
127
|
+
#
|
128
|
+
def build_from_dir(driver_type, dir, clear=false)
|
129
|
+
|
130
|
+
if clear
|
131
|
+
@vms = []
|
132
|
+
end
|
133
|
+
|
134
|
+
if driver_type.downcase == "workstation"
|
135
|
+
vm_list = ::Lab::Controllers::WorkstationController::dir_list(dir)
|
136
|
+
elsif driver_type.downcase == "remote_workstation"
|
137
|
+
vm_list = ::Lab::Controllers::RemoteWorkstationController::dir_list(dir)
|
138
|
+
elsif driver_type.downcase == "virtualbox"
|
139
|
+
vm_list = ::Lab::Controllers::VirtualBoxController::dir_list(dir)
|
140
|
+
elsif driver_type.downcase == "fog"
|
141
|
+
vm_list = ::Lab::Controllers::FogController::dir_list(dir)
|
142
|
+
elsif driver_type.downcase == "Dynagen"
|
143
|
+
vm_list = ::Lab::Controllers::DynagenController::dir_list(dir)
|
144
|
+
elsif driver_type.downcase == "remote_esxi"
|
145
|
+
vm_list =::Lab::Controllers::RemoteEsxiController::dir_list(dir)
|
146
|
+
elsif driver_type.downcase == "vsphere"
|
147
|
+
vm_list =::Lab::Controllers::VsphereController::dir_list(dir)
|
148
|
+
else
|
149
|
+
raise TypeError, "Unsupported VM Type"
|
150
|
+
end
|
151
|
+
|
152
|
+
vm_list.each_index do |index|
|
153
|
+
@vms << Vm.new( {'vmid' => "vm_#{index}", 'driver' => driver_type, 'location' => vm_list[index]} )
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
#
|
159
|
+
# Builds a vm lab from all running vms. Handy for connecting and saving out
|
160
|
+
# a config or just managing the currently running vms
|
161
|
+
#
|
162
|
+
def build_from_running(driver_type=nil, user=nil, host=nil, clear=false, pass=nil)
|
163
|
+
|
164
|
+
if clear
|
165
|
+
@vms = []
|
166
|
+
end
|
167
|
+
|
168
|
+
case driver_type.intern
|
169
|
+
when :workstation
|
170
|
+
vm_list = ::Lab::Controllers::WorkstationController::running_list
|
171
|
+
vm_list.each do |item|
|
172
|
+
# Name the VM
|
173
|
+
index = @vms.count + 1
|
174
|
+
# Add it to the vm list
|
175
|
+
@vms << Vm.new({
|
176
|
+
'vmid' => "vm_#{index}",
|
177
|
+
'driver' => driver_type,
|
178
|
+
'location' => item
|
179
|
+
})
|
180
|
+
end
|
181
|
+
when :remote_workstation
|
182
|
+
vm_list = ::Lab::Controllers::RemoteWorkstationController::running_list(user, host)
|
183
|
+
vm_list.each do |item|
|
184
|
+
# Name the VM
|
185
|
+
index = @vms.count + 1
|
186
|
+
# Add it to the VM list
|
187
|
+
@vms << Vm.new({
|
188
|
+
'vmid' => "vm_#{index}",
|
189
|
+
'driver' => driver_type,
|
190
|
+
'location' => item,
|
191
|
+
'user' => user,
|
192
|
+
'host' => host
|
193
|
+
})
|
194
|
+
end
|
195
|
+
when :virtualbox
|
196
|
+
vm_list = ::Lab::Controllers::VirtualBoxController::running_list
|
197
|
+
vm_list.each do |item|
|
198
|
+
# Add it to the vm list
|
199
|
+
@vms << Vm.new( {
|
200
|
+
'vmid' => "#{item}",
|
201
|
+
'driver' => driver_type,
|
202
|
+
'location' => nil
|
203
|
+
})
|
204
|
+
end
|
205
|
+
when :fog
|
206
|
+
raise "Unsupported"
|
207
|
+
when :dynagen
|
208
|
+
raise "Unsupported"
|
209
|
+
when :remote_esxi
|
210
|
+
vm_list = ::Lab::Controllers::RemoteEsxiController::running_list(user,host)
|
211
|
+
vm_list.each do |item|
|
212
|
+
@vms << Vm.new( {
|
213
|
+
'vmid' => "#{item[:id]}",
|
214
|
+
'name' => "#{item[:name]}",
|
215
|
+
'driver' => driver_type,
|
216
|
+
'user' => user,
|
217
|
+
'host' => host
|
218
|
+
})
|
219
|
+
end
|
220
|
+
when :vsphere
|
221
|
+
vm_list = ::Lab::Controllers::VsphereController::running_list(user,host,pass)
|
222
|
+
vm_list.each do |item|
|
223
|
+
@vms << Vm.new( {
|
224
|
+
'vmid' => "#{item[:id]}",
|
225
|
+
'name' => "#{item[:name]}",
|
226
|
+
'driver' => driver_type,
|
227
|
+
'user' => user,
|
228
|
+
'host' => host,
|
229
|
+
'pass' => pass
|
230
|
+
})
|
231
|
+
end
|
232
|
+
else
|
233
|
+
raise TypeError, "Unsupported VM Type"
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
237
|
+
|
238
|
+
#
|
239
|
+
# Applicable only to virtualbox. Reads the config file & parses / creates
|
240
|
+
# VM objects for each vm.
|
241
|
+
#
|
242
|
+
def build_from_config(driver_type=nil, user=nil, host=nil, clear=false)
|
243
|
+
if clear
|
244
|
+
@vms = []
|
245
|
+
end
|
246
|
+
|
247
|
+
case driver_type.intern
|
248
|
+
when :virtualbox
|
249
|
+
vm_list = ::Lab::Controllers::VirtualBoxController::config_list
|
250
|
+
|
251
|
+
vm_list.each do |item|
|
252
|
+
# Add it to the vm list
|
253
|
+
@vms << Vm.new( {
|
254
|
+
'vmid' => "#{item}",
|
255
|
+
'driver' => driver_type,
|
256
|
+
'location' => nil,
|
257
|
+
'user' => user,
|
258
|
+
'host' => host } )
|
259
|
+
end
|
260
|
+
|
261
|
+
else
|
262
|
+
raise TypeError, "Unsupported VM Type"
|
263
|
+
end
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
def running?(vmid)
|
268
|
+
if includes_vmid?(vmid)
|
269
|
+
return self.find_by_vmid(vmid).running?
|
270
|
+
end
|
271
|
+
return false
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
data/src/test/.gitkeep
ADDED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement: &
|
16
|
+
requirement: &14248700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *14248700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: net-ssh
|
27
|
-
requirement: &
|
27
|
+
requirement: &14247980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *14247980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: net-scp
|
38
|
-
requirement: &
|
38
|
+
requirement: &14229460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *14229460
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rbvmomi
|
49
|
-
requirement: &
|
49
|
+
requirement: &14228480 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *14228480
|
58
58
|
description: ! 'Start/Stop/Revert and do other cool stuff w/ Vmware, Virtualbox, and
|
59
59
|
ESXi vms. This gem wraps common CLI utilities and other gems to create a common
|
60
60
|
inteface for vms. '
|
@@ -64,16 +64,20 @@ executables: []
|
|
64
64
|
extensions: []
|
65
65
|
extra_rdoc_files: []
|
66
66
|
files:
|
67
|
+
- .gitignore
|
67
68
|
- Gemfile
|
68
69
|
- Gemfile.lock
|
69
70
|
- README.md
|
70
71
|
- Rakefile
|
71
72
|
- TODO
|
73
|
+
- config/test_lab.yml
|
74
|
+
- config/test_targets.yml
|
72
75
|
- lab.gemspec
|
73
76
|
- lib/lab.rb
|
74
77
|
- lib/lab/controller/dynagen_controller.rb
|
75
78
|
- lib/lab/controller/fog_controller.rb
|
76
79
|
- lib/lab/controller/remote_esx_controller.rb
|
80
|
+
- lib/lab/controller/remote_esxi_controller.rb
|
77
81
|
- lib/lab/controller/remote_workstation_controller.rb
|
78
82
|
- lib/lab/controller/virtualbox_controller.rb
|
79
83
|
- lib/lab/controller/workstation_controller.rb
|
@@ -81,7 +85,7 @@ files:
|
|
81
85
|
- lib/lab/controllers.rb
|
82
86
|
- lib/lab/driver/dynagen_driver.rb
|
83
87
|
- lib/lab/driver/fog_driver.rb
|
84
|
-
- lib/lab/driver/
|
88
|
+
- lib/lab/driver/remote_esxi_driver.rb
|
85
89
|
- lib/lab/driver/remote_workstation_driver.rb
|
86
90
|
- lib/lab/driver/virtualbox_driver.rb
|
87
91
|
- lib/lab/driver/vm_driver.rb
|
@@ -95,6 +99,41 @@ files:
|
|
95
99
|
- lib/lab/version.rb
|
96
100
|
- lib/lab/vm.rb
|
97
101
|
- lib/lab/vm_controller.rb
|
102
|
+
- src/Gemfile
|
103
|
+
- src/README.md
|
104
|
+
- src/Rakefile
|
105
|
+
- src/TODO
|
106
|
+
- src/config/test_lab.yml
|
107
|
+
- src/config/test_targets.yml
|
108
|
+
- src/lab.gemspec
|
109
|
+
- src/lib/lab.rb
|
110
|
+
- src/lib/lab/controller/dynagen_controller.rb
|
111
|
+
- src/lib/lab/controller/fog_controller.rb
|
112
|
+
- src/lib/lab/controller/remote_esxi_controller.rb
|
113
|
+
- src/lib/lab/controller/remote_workstation_controller.rb
|
114
|
+
- src/lib/lab/controller/virtualbox_controller.rb
|
115
|
+
- src/lib/lab/controller/vsphere_controller.rb
|
116
|
+
- src/lib/lab/controller/workstation_controller.rb
|
117
|
+
- src/lib/lab/controller/workstation_vixr_controller.rb
|
118
|
+
- src/lib/lab/controllers.rb
|
119
|
+
- src/lib/lab/driver/dynagen_driver.rb
|
120
|
+
- src/lib/lab/driver/fog_driver.rb
|
121
|
+
- src/lib/lab/driver/remote_esxi_driver.rb
|
122
|
+
- src/lib/lab/driver/remote_workstation_driver.rb
|
123
|
+
- src/lib/lab/driver/virtualbox_driver.rb
|
124
|
+
- src/lib/lab/driver/vm_driver.rb
|
125
|
+
- src/lib/lab/driver/vsphere_driver.rb
|
126
|
+
- src/lib/lab/driver/workstation_driver.rb
|
127
|
+
- src/lib/lab/driver/workstation_vixr_driver.rb
|
128
|
+
- src/lib/lab/drivers.rb
|
129
|
+
- src/lib/lab/modifier/backtrack5_modifier.rb
|
130
|
+
- src/lib/lab/modifier/dos_modifier.rb
|
131
|
+
- src/lib/lab/modifier/test_modifier.rb
|
132
|
+
- src/lib/lab/modifiers.rb
|
133
|
+
- src/lib/lab/version.rb
|
134
|
+
- src/lib/lab/vm.rb
|
135
|
+
- src/lib/lab/vm_controller.rb
|
136
|
+
- src/test/.gitkeep
|
98
137
|
- test/.gitkeep
|
99
138
|
homepage: http://www.github.com/rapid7/lab/wiki
|
100
139
|
licenses: []
|
@@ -116,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
155
|
version: '0'
|
117
156
|
requirements: []
|
118
157
|
rubyforge_project: lab
|
119
|
-
rubygems_version: 1.8.
|
158
|
+
rubygems_version: 1.8.15
|
120
159
|
signing_key:
|
121
160
|
specification_version: 3
|
122
161
|
summary: Manage VMs like a boss
|
@@ -1,177 +0,0 @@
|
|
1
|
-
require 'vm_driver'
|
2
|
-
|
3
|
-
##
|
4
|
-
## $Id$
|
5
|
-
##
|
6
|
-
|
7
|
-
# This driver was built against:
|
8
|
-
# VMware ESX Host Agent 4.1.0 build-348481
|
9
|
-
|
10
|
-
module Lab
|
11
|
-
module Drivers
|
12
|
-
|
13
|
-
class RemoteEsxDriver < VmDriver
|
14
|
-
|
15
|
-
def initialize(config)
|
16
|
-
unless config['user'] then raise ArgumentError, "Must provide a username" end
|
17
|
-
unless config['host'] then raise ArgumentError, "Must provide a hostname" end
|
18
|
-
|
19
|
-
super(config)
|
20
|
-
|
21
|
-
@user = filter_command(config['user'])
|
22
|
-
@host = filter_command(config['host'])
|
23
|
-
@port = config['port']
|
24
|
-
end
|
25
|
-
|
26
|
-
def start
|
27
|
-
remote_system_command("vim-cmd vmsvc/power.on #{@vmid}")
|
28
|
-
end
|
29
|
-
|
30
|
-
def stop
|
31
|
-
remote_system_command("vim-cmd vmsvc/power.off #{@vmid}")
|
32
|
-
end
|
33
|
-
|
34
|
-
def suspend
|
35
|
-
remote_system_command("vim-cmd vmsvc/power.suspend #{@vmid}")
|
36
|
-
end
|
37
|
-
|
38
|
-
def pause
|
39
|
-
remote_system_command("vim-cmd vmsvc/power.suspend #{@vmid}")
|
40
|
-
end
|
41
|
-
|
42
|
-
def resume
|
43
|
-
remote_system_command("vim-cmd vmsvc/power.suspendResume #{@vmid}")
|
44
|
-
end
|
45
|
-
|
46
|
-
def reset
|
47
|
-
remote_system_command("vim-cmd vmsvc/power.reset #{@vmid}")
|
48
|
-
end
|
49
|
-
|
50
|
-
def create_snapshot(snapshot)
|
51
|
-
snapshot = filter_input(snapshot)
|
52
|
-
|
53
|
-
remote_system_command("vim-cmd vmsvc/snapshot.create #{@vmid} #{snapshot} \'lab created snapshot\' 1 true")
|
54
|
-
end
|
55
|
-
|
56
|
-
def revert_snapshot(snapshot)
|
57
|
-
|
58
|
-
snapshots = get_snapshots
|
59
|
-
|
60
|
-
# Look through our snapshot list, choose the right one based on display_name
|
61
|
-
snapshots.each do |snapshot_obj|
|
62
|
-
|
63
|
-
#puts "DEBUG: checking #{snapshot_obj}"
|
64
|
-
|
65
|
-
if snapshot_obj[:display_name].downcase == snapshot.downcase
|
66
|
-
snapshot_identifier = snapshot_obj[:name].join(" ")
|
67
|
-
|
68
|
-
#puts "DEBUG: I would revert to #{snapshot_obj}"
|
69
|
-
remote_system_command("vim-cmd vmsvc/snapshot.revert #{@vmid} 0 #{snapshot_identifier}")
|
70
|
-
return true
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# If we got here, the snapshot didn't exist
|
75
|
-
raise "Invalid Snapshot Name"
|
76
|
-
end
|
77
|
-
|
78
|
-
def delete_snapshot(snapshot, remove_children=false)
|
79
|
-
snapshots = get_snapshots
|
80
|
-
|
81
|
-
# Look through our snapshot list, choose the right one based on display_name
|
82
|
-
snapshots.each do |snapshot_obj|
|
83
|
-
|
84
|
-
#puts "DEBUG: checking #{snapshot_obj}"
|
85
|
-
|
86
|
-
if snapshot_obj[:display_name].downcase == snapshot.downcase
|
87
|
-
snapshot_identifier = snapshot_obj[:name].join(" ")
|
88
|
-
remote_system_command("vim-cmd vmsvc/snapshot.remove #{@vmid} #{remove_children} #{snapshot_identifier}")
|
89
|
-
return true
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# If we got here, the snapshot didn't exist
|
94
|
-
raise "Invalid Snapshot Name"
|
95
|
-
end
|
96
|
-
|
97
|
-
def delete_all_snapshots
|
98
|
-
remote_system_command("vim-cmd vmsvc/snapshot.removeall #{@vmid}")
|
99
|
-
end
|
100
|
-
|
101
|
-
def run_command(command)
|
102
|
-
raise "Not Implemented"
|
103
|
-
end
|
104
|
-
|
105
|
-
def copy_from(from, to)
|
106
|
-
if @os == "linux"
|
107
|
-
scp_from(from, to)
|
108
|
-
else
|
109
|
-
raise "Unimplemented"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def copy_to(from, to)
|
114
|
-
if @os == "linux"
|
115
|
-
scp_to(from, to)
|
116
|
-
else
|
117
|
-
raise "Unimplemented"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def check_file_exists(file)
|
122
|
-
raise "Not Implemented"
|
123
|
-
end
|
124
|
-
|
125
|
-
def create_directory(directory)
|
126
|
-
raise "Not Implemented"
|
127
|
-
end
|
128
|
-
|
129
|
-
def cleanup
|
130
|
-
|
131
|
-
end
|
132
|
-
|
133
|
-
def running?
|
134
|
-
power_status_string = `ssh #{@user}@#{@host} \"vim-cmd vmsvc/power.getstate #{@vmid}\"`
|
135
|
-
return true if power_status_string =~ /Powered on/
|
136
|
-
false
|
137
|
-
end
|
138
|
-
|
139
|
-
def get_snapshots
|
140
|
-
# Command take the format:
|
141
|
-
# vmware-vim-cmd vmsvc/snapshot.revert [vmid: int] [snapshotlevel: int] [snapshotindex: int]
|
142
|
-
output = `ssh #{@user}@#{@host} \"vim-cmd vmsvc/snapshot.get #{@vmid}\"`
|
143
|
-
|
144
|
-
# this keeps track of the snapshots, takes the form:
|
145
|
-
#[ {:name => [0,0], :display_name => "String containing the snapshotname},
|
146
|
-
# {:name => [0,1], :display_name => "String containing the snapshotname}, ]
|
147
|
-
# ...
|
148
|
-
snapshots = []
|
149
|
-
|
150
|
-
# Use these to keep track of the parsing...
|
151
|
-
current_tree = -1
|
152
|
-
current_num = 0
|
153
|
-
count = 0
|
154
|
-
|
155
|
-
# Do the parsing & stick the snapshots in the snapshots array
|
156
|
-
output_lines = output.split("\n")
|
157
|
-
output_lines.each do |line|
|
158
|
-
if line.include?("|") # this is a new snapshot
|
159
|
-
if line.include?("ROOT") # it's a root
|
160
|
-
current_num = 0
|
161
|
-
current_tree = current_tree + 1 # new tree
|
162
|
-
snapshots << { :name => [current_num, current_tree], :display_name => output_lines[count+1].split(":").last.strip }
|
163
|
-
else
|
164
|
-
current_num = current_num + 1 # new snapshot in current tree
|
165
|
-
snapshots << { :name => [current_num, current_tree], :display_name => output_lines[count+1].split(":").last.strip }
|
166
|
-
end
|
167
|
-
end
|
168
|
-
count = count+1
|
169
|
-
end
|
170
|
-
|
171
|
-
snapshots
|
172
|
-
end
|
173
|
-
|
174
|
-
end
|
175
|
-
|
176
|
-
end
|
177
|
-
end
|