lab 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +4 -0
  2. data/config/test_lab.yml +11 -0
  3. data/config/test_targets.yml +21 -0
  4. data/lib/lab/controller/dynagen_controller.rb +6 -6
  5. data/lib/lab/controller/remote_esx_controller.rb +51 -51
  6. data/lib/lab/controller/remote_esxi_controller.rb +62 -0
  7. data/lib/lab/controller/remote_workstation_controller.rb +12 -12
  8. data/lib/lab/controller/virtualbox_controller.rb +16 -16
  9. data/lib/lab/controller/workstation_controller.rb +9 -9
  10. data/lib/lab/controller/workstation_vixr_controller.rb +9 -9
  11. data/lib/lab/controllers.rb +1 -3
  12. data/lib/lab/driver/dynagen_driver.rb +32 -32
  13. data/lib/lab/driver/fog_driver.rb +144 -144
  14. data/lib/lab/driver/remote_esxi_driver.rb +177 -0
  15. data/lib/lab/driver/remote_workstation_driver.rb +181 -181
  16. data/lib/lab/driver/virtualbox_driver.rb +132 -132
  17. data/lib/lab/driver/vm_driver.rb +177 -177
  18. data/lib/lab/driver/workstation_driver.rb +218 -218
  19. data/lib/lab/driver/workstation_vixr_driver.rb +108 -108
  20. data/lib/lab/drivers.rb +1 -1
  21. data/lib/lab/modifier/backtrack5_modifier.rb +8 -8
  22. data/lib/lab/modifier/dos_modifier.rb +3 -3
  23. data/lib/lab/modifier/test_modifier.rb +6 -6
  24. data/lib/lab/version.rb +1 -1
  25. data/lib/lab/vm.rb +242 -242
  26. data/lib/lab/vm_controller.rb +217 -211
  27. data/src/Gemfile +4 -0
  28. data/src/README.md +80 -0
  29. data/src/Rakefile +1 -0
  30. data/src/TODO +15 -0
  31. data/src/config/test_lab.yml +11 -0
  32. data/src/config/test_targets.yml +21 -0
  33. data/src/lab.gemspec +35 -0
  34. data/src/lib/lab.rb +2 -0
  35. data/src/lib/lab/controller/dynagen_controller.rb +14 -0
  36. data/src/lib/lab/controller/fog_controller.rb +6 -0
  37. data/src/lib/lab/controller/remote_esxi_controller.rb +62 -0
  38. data/src/lib/lab/controller/remote_workstation_controller.rb +22 -0
  39. data/src/lib/lab/controller/virtualbox_controller.rb +25 -0
  40. data/src/lib/lab/controller/vsphere_controller.rb +18 -0
  41. data/src/lib/lab/controller/workstation_controller.rb +17 -0
  42. data/src/lib/lab/controller/workstation_vixr_controller.rb +19 -0
  43. data/src/lib/lab/controllers.rb +9 -0
  44. data/src/lib/lab/driver/dynagen_driver.rb +47 -0
  45. data/src/lib/lab/driver/fog_driver.rb +104 -0
  46. data/src/lib/lab/driver/remote_esxi_driver.rb +177 -0
  47. data/src/lib/lab/driver/remote_workstation_driver.rb +197 -0
  48. data/src/lib/lab/driver/virtualbox_driver.rb +142 -0
  49. data/src/lib/lab/driver/vm_driver.rb +195 -0
  50. data/src/lib/lab/driver/vsphere_driver.rb +120 -0
  51. data/src/lib/lab/driver/workstation_driver.rb +234 -0
  52. data/src/lib/lab/driver/workstation_vixr_driver.rb +126 -0
  53. data/src/lib/lab/drivers.rb +9 -0
  54. data/src/lib/lab/modifier/backtrack5_modifier.rb +16 -0
  55. data/src/lib/lab/modifier/dos_modifier.rb +14 -0
  56. data/src/lib/lab/modifier/test_modifier.rb +16 -0
  57. data/src/lib/lab/modifiers.rb +3 -0
  58. data/src/lib/lab/version.rb +3 -0
  59. data/src/lib/lab/vm.rb +269 -0
  60. data/src/lib/lab/vm_controller.rb +275 -0
  61. data/src/test/.gitkeep +0 -0
  62. metadata +51 -12
  63. 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.1.5
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-03-14 00:00:00.000000000 Z
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: &20127300 !ruby/object:Gem::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: *20127300
24
+ version_requirements: *14248700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: net-ssh
27
- requirement: &20126880 !ruby/object:Gem::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: *20126880
35
+ version_requirements: *14247980
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: net-scp
38
- requirement: &20126460 !ruby/object:Gem::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: *20126460
46
+ version_requirements: *14229460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rbvmomi
49
- requirement: &20126040 !ruby/object:Gem::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: *20126040
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/remote_esx_driver.rb
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.10
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