ievms-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 249e1aad51f82e11e427dd5fae50c58761401f70
4
- data.tar.gz: fd970f847bd82ad62e78525fccbf3689affd5db2
3
+ metadata.gz: 85c025ffdb4eb040906b9574aebbc02237da1cf5
4
+ data.tar.gz: b295c401b775fb07805ce59798cf76958332f1e2
5
5
  SHA512:
6
- metadata.gz: 036bd7897575e55f3f2a06a091a6c233c34fab0e111f536bf120dba21ba593b26d650776033c58ea4bc5a9ced55947fd2cb95eb16e53105c145a754b440f817b
7
- data.tar.gz: b5d2a964d5a50c23e90cad5cdd53f14045352bcd22d13edf0a861fe07fe1c84eceed5a17027e9b04d7f4b3a28509fca1357259f5b946b781be1b981a28a84682
6
+ metadata.gz: 0d64a6d900b41a360351e6817550c7b26a0d3d93e7c8a7c2f87483e720400a13826959ece8174f462be778c68eec1f5b20a90650f3405e53f61934e993a49ceb
7
+ data.tar.gz: 9686fb30c99d1949019601d24a64a975ad9dbada42b3f7f4b7945646cc9904aa6e9c7c5b3393bfcf3fc0066d5d44840f82bb3a9566be109a4c4474f49648b8c1
@@ -0,0 +1,9 @@
1
+ next version
2
+ - start using a Changelog
3
+ - add powershell as admin method and command
4
+ - add safe start, stop and reboot def's
5
+ - disply out from admin cmd's
6
+ - default headless
7
+
8
+ 0.1.0
9
+ - initial prototype with a log of functionality
data/README.md CHANGED
@@ -6,10 +6,7 @@
6
6
  [![Dependency Status](https://gemnasium.com/mipmip/ievms-ruby.svg)](https://gemnasium.com/mipmip/ievms-ruby)
7
7
  [![Inline docs](http://inch-ci.org/github/mipmip/ievms-ruby.svg?branch=master)](http://inch-ci.org/github/mipmip/ievms-ruby)
8
8
 
9
- Ruby interface for boxes made by ievms.sh. Use this Library to provision your
10
- IE boxes from https://modern.ie.
11
-
12
- Next to [ievms.sh](https://github.com/xdissent/ievms), `ievms-ruby` also works great in combination with [iectrl](https://github.com/xdissent/iectrl).
9
+ Ruby interface for managing and provisioning IE/Windows Machines from https://modern.ie.
13
10
 
14
11
  ## WinBoxes supported
15
12
 
@@ -23,9 +20,9 @@ Next to [ievms.sh](https://github.com/xdissent/ievms), `ievms-ruby` also works g
23
20
 
24
21
  * Upload and download files from guest machine
25
22
  * Execute cmd.exe and powershell commands on guest machine
26
- * Execute cmd.exe and powershell commands on guest machine as admin
27
- * Shortcut commands for Windows guest like `cat`, `ps`, `reboot` and `shutdown`
28
- * To be used as CLI utility or as library in a ruby script.
23
+ * Execute commands on guest machine as admin
24
+ * CLI with shortcut commands for Windows guests like `cat`, `ps`, `reboot` and `shutdown`
25
+ * Integrated Chocolatey commands to easily install packages
29
26
 
30
27
  ## Requirements
31
28
 
@@ -34,10 +31,6 @@ Next to [ievms.sh](https://github.com/xdissent/ievms), `ievms-ruby` also works g
34
31
  * VirtualBox Extension Pack and Guest Additions >= 5.0.6
35
32
  * Windows Machines created by [ievms](https://github.com/xdissent/ievms)
36
33
 
37
- ### Recommended
38
- * [iectrl](https://github.com/xdissent/iectrl), cli interface for simple
39
- ievms admin commands
40
-
41
34
  ## Usage
42
35
 
43
36
  ### As library
@@ -59,6 +52,8 @@ $ ievmsrb help
59
52
 
60
53
  Commands:
61
54
  ievmsrb cat [vbox name] [file path] # cat file from path in Win vbox
55
+ ievmsrb choco_inst [vbox name] [package] # Install package in win box with Chocolatey
56
+ ievmsrb choco_uninst [vbox name] [package] # Uninstall package in win box with Chocolatey
62
57
  ievmsrb cmd [vbox name] [command to execute] # Run command with cmd.exe in Win vbox
63
58
  ievmsrb cmd_adm [vbox name] [command to execute] # Run command as Administrator with cmd.exe in Win vbox
64
59
  ievmsrb copy_from [vbox name] [path in vbox] [local file] # Copy file from Win vbox to local path
@@ -66,8 +61,17 @@ Commands:
66
61
  ievmsrb copy_to_as_adm [vbox name] [local file] [path in vbox] # Copy local file to Win vbox as Administrator
67
62
  ievmsrb help [COMMAND] # Describe available commands or one specific command
68
63
  ievmsrb ps [vbox name] # Show running tasks in Win vbox
64
+ ievmsrb pwrsh_as_adm [vbox name] [command to execute] # Run command as Administrator with PowerShell in Win vbox
69
65
  ievmsrb reboot [vbox name] # Reboot Win box
66
+ ievmsrb reset_ievms_taskmgr [vbox name] # Reset ievms task manager
67
+ ievmsrb restore_clean [vbox name] # Restore clean snapshot
70
68
  ievmsrb shutdown [vbox name] # Shutdown Win vbox
69
+ ievmsrb start [vbox name] # Start Win box
70
+ ievmsrb version # display version
71
+
72
+ Options:
73
+ -v, [--verbose], [--no-verbose] # Be more verbose
74
+ [--timeout=N] # Timeout in seconds
71
75
  ```
72
76
 
73
77
  Read the docs for more info about [ievms-ruby CLI usage](http://mipmip.github.io/ievms-ruby/cli/).
@@ -83,12 +87,8 @@ To run the tests you need to fullfil the testing requirements first:
83
87
 
84
88
  * "IE9 - Win7" installed by ievms.sh and make sure its running
85
89
 
86
- * [iectrl](https://github.com/xdissent/iectrl), cli interface for simple
87
-
88
90
  ```bash
89
- $ npm install iectrl
90
- $ echo 'PATH="$HOME/node_modules/.bin:$PATH"' >> ~/.profile
91
- $ source ~/.Provider
91
+ curl -s https://raw.githubusercontent.com/xdissent/ievms/master/ievms.sh | env IEVMS_VERSIONS="9" bash
92
92
  ```
93
93
 
94
94
  * Create an new virtual machine called `standbymachine`. Keep the disk size as
@@ -54,3 +54,9 @@ Turn of the Filewall executing a command as Administator
54
54
  $ ievmsrb cmd_adm "IE9 - Win7" 'NetSh Advfirewall set allprofiles state off'
55
55
  ```
56
56
 
57
+
58
+ Show all current account information
59
+ To display the user rights that have been assigned to the account you used to log on to a Windows system, use the whoami command line tool with the /priv switch:
60
+ ```
61
+ ievmsrb cmd "IE9 - Win7" "Whoami /ALL"
62
+ ```
@@ -2,70 +2,106 @@ class IevmsRb < Thor
2
2
  class_option :verbose, :desc => 'Be more verbose', :type => :boolean, :aliases => '-v'
3
3
  class_option :timeout, :desc => 'Timeout in seconds', :type => :numeric
4
4
 
5
+ def initialize(*args)
6
+ super
7
+
8
+ #p args
9
+
10
+ if args[0].count > 0
11
+ @machine = Ievms::WindowsGuest.new args[0][0]
12
+ @machine.verbose = true if options[:verbose]
13
+ @machine.timeout_secs = options[:timeout] if options[:timeout]
14
+ end
15
+ end
16
+
17
+ desc "version", "display version"
18
+ def version
19
+ print Ievms::VERSION
20
+ end
21
+
5
22
  desc "cat [vbox name] [file path]", "cat file from path in Win vbox"
6
23
  def cat(vbox_name,guest_path)
7
- init vbox_name
8
24
  print @machine.download_string_from_file_to_guest guest_path, true
9
25
  end
10
26
 
11
27
  desc "ps [vbox name]", "Show running tasks in Win vbox"
12
28
  def ps(vbox_name)
13
- init vbox_name
14
29
  print @machine.run_command "tasklist"
15
30
  end
16
31
 
17
32
  desc "shutdown [vbox name]", "Shutdown Win vbox"
18
33
  def shutdown(vbox_name)
19
- init vbox_name
20
- print @machine.run_command "shutdown.exe /s /f /t 0"
34
+ @machine.shutdown
21
35
  end
22
36
 
37
+ option :gui, :desc => 'start as gui', :type => :boolean
38
+ desc "start [vbox name]", "Start Win box"
39
+ def start(vbox_name)
40
+ @machine.headless = false if options[:gui]
41
+ @machine.start
42
+ end
43
+
44
+ desc "restore_clean [vbox name]", "Restore clean snapshot"
45
+ def restore_clean(vbox_name)
46
+ @machine.restore_clean_snapshot
47
+ end
23
48
  desc "reboot [vbox name]", "Reboot Win box"
24
49
  def reboot(vbox_name)
25
- init vbox_name
26
- print @machine.run_command "shutdown.exe /r /f /t 0"
50
+ @machine.reboot
27
51
  end
28
52
 
29
53
  desc "copy_to_as_adm [vbox name] [local file] [path in vbox]", "Copy local file to Win vbox as Administrator"
30
54
  def copy_to_as_adm(vbox_name,local_path, guest_path)
31
- init vbox_name
32
55
  @machine.upload_file_to_guest_as_admin(local_path, guest_path, false)
33
56
  end
34
57
 
35
58
  desc "copy_to [vbox name] [local file] [path in vbox]", "Copy local file to Win vbox"
36
59
  def copy_to(vbox_name,local_path, guest_path)
37
- init vbox_name
38
60
  @machine.upload_file_to_guest(local_path, guest_path, false)
39
61
  end
40
62
 
41
63
  desc "copy_from [vbox name] [path in vbox] [local file]", "Copy file from Win vbox to local path"
42
64
  def copy_from(vbox_name, guest_path, local_path)
43
- init vbox_name
44
65
  @machine.download_file_from_guest(guest_path, local_path, false)
45
66
  end
46
67
 
47
68
  desc "cmd [vbox name] [command to execute]", "Run command with cmd.exe in Win vbox"
48
69
  def cmd(vbox_name,command)
49
- init vbox_name
50
-
51
70
  print @machine.run_command command
52
71
  print "\n"
53
72
  end
54
73
 
55
74
  desc "cmd_adm [vbox name] [command to execute]", "Run command as Administrator with cmd.exe in Win vbox"
56
75
  def cmd_as_adm(vbox_name,command)
57
- init vbox_name
58
-
59
76
  print @machine.run_command_as_admin command
60
77
  end
61
78
 
62
- private
79
+ # desc "pwrsh [vbox name] [command to execute]", "Run command with PowerShell in Win vbox"
80
+ # def pwrsh(vbox_name,command)
81
+ # print @machine.run_powershell_cmd command
82
+ # end
83
+
84
+ desc "pwrsh_as_adm [vbox name] [command to execute]", "Run command as Administrator with PowerShell in Win vbox"
85
+ def pwrsh_as_adm(vbox_name,command)
86
+ print @machine.run_powershell_cmd_as_admin command
87
+ end
88
+
89
+ desc "choco_inst [vbox name] [package]", "Install package in win box with Chocolatey"
90
+ def choco_inst(vbox_name,pkg)
91
+ @machine.choco_install pkg
92
+ end
63
93
 
64
- def init vbox_name
65
- @machine = Ievms::WindowsGuest.new vbox_name
66
- #@machine.methods.sort
67
- @machine.verbose = true if options[:verbose]
68
- @machine.timeout_secs = options[:timeout] if options[:timeout]
94
+ desc "choco_uninst [vbox name] [package]", "Uninstall package in win box with Chocolatey"
95
+ def choco_uninst(vbox_name,pkg)
96
+ @machine.choco_uninstall pkg
69
97
  end
98
+
99
+ desc "reset_ievms_taskmgr [vbox name]", "Reset ievms task manager"
100
+ def reset_ievms_taskmgr(vbox_name)
101
+ @machine.end_ievms_task
102
+ end
103
+
104
+ private
105
+
70
106
  end
71
107
 
@@ -1,3 +1,3 @@
1
1
  module Ievms
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -16,18 +16,21 @@ IEVMS_HOME = ENV['HOME']+'/.ievms'
16
16
  module Ievms
17
17
  class WindowsGuest
18
18
  attr_accessor :verbose
19
+ attr_accessor :headless
19
20
  attr_accessor :timeout_secs
20
21
 
21
22
  def initialize(vbox_name)
23
+ @vbox_name = vbox_name
24
+
25
+ check_virtualbox_version
26
+ is_vm?
22
27
 
23
28
  @verbose = false
29
+ @headless = true
24
30
  @timeout_secs = 600 #default timeout for a single task 5 minutes
25
-
26
- @vbox_name = vbox_name
27
-
28
- is_vm vbox_name
29
31
  end
30
32
 
33
+ # copy file from guest (win) machine to host machine
31
34
  def download_file_from_guest(guest_path, local_path, quiet=false)
32
35
 
33
36
  log_stdout "Copying #{guest_path} to #{local_path}", quiet
@@ -55,17 +58,23 @@ module Ievms
55
58
  FileUtils.rm File.join(IEVMS_HOME,File.basename(local_path))
56
59
  end
57
60
 
61
+ # return string from remote file
58
62
  def download_string_from_file_to_guest( guest_path, quiet=false)
59
63
  log_stdout "Copying #{guest_path} to tempfile.txt", quiet
60
64
  guestcontrol_exec "cmd.exe", "cmd.exe /c copy \"#{guest_path}\" \"E:\\tmpfile.txt\""
61
65
 
62
- string = IO.read(File.join(IEVMS_HOME,'tmpfile.txt'))
63
- FileUtils.rm File.join(IEVMS_HOME,'tmpfile.txt')
66
+ tmpfile = File.join(IEVMS_HOME,'tmpfile.txt')
67
+ if File.exists? tmpfile
68
+ string = IO.read(tmpfile)
69
+ FileUtils.rm tmpfile
70
+ else
71
+ string = ''
72
+ end
64
73
  string
65
74
  end
66
75
 
76
+ # make remote file from string
67
77
  def upload_string_as_file_to_guest(string, guest_path, quiet=false)
68
-
69
78
  tmp = Tempfile.new('txtfile')
70
79
  tmp.write "#{string}\n"
71
80
  path = tmp.path
@@ -86,13 +95,20 @@ module Ievms
86
95
  run_command 'del C:\Users\IEUser\.tempadminfile', true
87
96
  end
88
97
 
89
- # execute existibg batch file in Windows guest as Administrator
90
- def run_command_as_admin(command,quiet=false)
98
+ # execute existing batch file in Windows guest as Administrator
99
+ def run_command_as_admin(command,quiet=false, dont_wait=false)
91
100
  log_stdout "Executing command as administrator: #{command}", quiet
92
101
 
93
102
  run_command 'if exist C:\Users\IEUser\ievms.bat del C:\Users\IEUser\ievms.bat && Exit', true
103
+ upload_string_as_file_to_guest('C:\Users\IEUser\ievms_cmd.bat > C:\Users\IEUser\ievms.txt', 'C:\Users\IEUser\ievms.bat', true)
94
104
 
95
- upload_string_as_file_to_guest(command, 'C:\Users\IEUser\ievms.bat', true)
105
+ run_command 'if exist C:\Users\IEUser\ievms.bat del C:\Users\IEUser\ievms_cmd.bat && Exit', true
106
+ upload_string_as_file_to_guest(command, 'C:\Users\IEUser\ievms_cmd.bat', true)
107
+
108
+ if(dont_wait)
109
+ guestcontrol_exec "schtasks.exe", "schtasks.exe /run /tn ievms"
110
+ return
111
+ end
96
112
 
97
113
  _ = Timeout::timeout(@timeout_secs) {
98
114
 
@@ -108,6 +124,9 @@ module Ievms
108
124
  end
109
125
  }
110
126
 
127
+ run_command 'if exist C:\Users\IEUser\ievms.bat del C:\Users\IEUser\ievms_cmd.bat && Exit', true
128
+ print download_string_from_file_to_guest 'c:\Users\IEUser\ievms.txt' unless quiet
129
+ download_string_from_file_to_guest 'c:\Users\IEUser\ievms.txt', true
111
130
  end
112
131
 
113
132
  # execute existing batch file in Windows guest
@@ -117,14 +136,136 @@ module Ievms
117
136
  out
118
137
  end
119
138
 
139
+
140
+ #def run_powershell_cmd(command, quiet=false)
141
+ # run_command '@powershell -NoProfile -Command "' + command +'"', quiet
142
+ #end
143
+
144
+ def run_powershell_cmd_as_admin(command, quiet=false)
145
+ run_command_as_admin '@powershell -NoProfile -ExecutionPolicy unrestricted -Command "' + command + '"', quiet
146
+ end
147
+
148
+ # shutdown windows machine
149
+ def shutdown(quiet=false)
150
+ log_stdout "Trying to shutdown ...", false if @verbose
151
+ if powered_off?
152
+ log_stdout "Already powered off.", false
153
+ else
154
+ log_stdout "shutting down ...", quiet
155
+ # run_command_as_admin "shutdown.exe /s /f /t 0", quiet
156
+ run_command "shutdown.exe /s /f /t 0", quiet
157
+ wait_for_shutdown
158
+ end
159
+ end
160
+
161
+ # start windows, finish as soon as boot is complete
162
+ def start(quiet=false)
163
+ if powered_off?
164
+ log_stdout "starting ...", quiet
165
+
166
+ if(@headless)
167
+ type = 'headless'
168
+ else
169
+ type = 'gui'
170
+ end
171
+ `VBoxManage startvm "#{@vbox_name}" --type #{type}`
172
+ wait_for_guestcontrol
173
+ else
174
+ log_stdout "Already started ...", quiet
175
+ end
176
+ end
177
+
178
+ # reboot windows machine
179
+ def reboot(quiet=false)
180
+ log_stdout "rebooting...", quiet
181
+ shutdown(true)
182
+ start(true)
183
+ end
184
+
185
+ def restore_clean_snapshot(quiet=false)
186
+ log_stdout "Restoring Clean Snapshot ...", quiet
187
+ shutdown
188
+ cmd = "VBoxManage snapshot \"#{@vbox_name}\" restore clean"
189
+ log_stdout cmd, false if @verbose
190
+ stdout,_,_ = Open3.capture3(cmd)
191
+ print stdout
192
+ end
193
+
194
+ # show status of administrative ievms task.
120
195
  def schtasks_query_ievms
121
196
  out, _, _ = guestcontrol_exec "schtasks.exe", "schtasks.exe /query /tn ievms"
122
197
  out
123
198
  end
124
199
 
200
+ # install choco package(s)
201
+ def choco_install(pkg, quiet=false)
202
+ if ! chocolatey?
203
+ log_stdout "First time.. installing Chocolatey first", quiet
204
+ install_chocolatey
205
+ end
206
+
207
+ log_stdout "Installing with choco: #{pkg} \n", quiet
208
+ run_powershell_cmd_as_admin("choco install -y #{pkg}", false)
209
+ end
210
+
211
+ # uninstall package(s)
212
+ def choco_uninstall(pkg,quiet=false)
213
+ if chocolatey?
214
+ log_stdout "Uninstalling with choco: #{pkg} \n", false
215
+ run_powershell_cmd_as_admin("cuninst -y #{pkg}", false)
216
+ else
217
+ log_stdout "Chocolatey is not installed, guess you don't need to uninstall anything.", quiet
218
+ end
219
+ end
220
+
221
+ # is chocolatey installed
222
+ def chocolatey?
223
+ out = run_command_as_admin('@powershell -Command "choco"',false)
224
+ if out.include?("CommandNotFoundException")
225
+ return false
226
+ else
227
+ return true
228
+ end
229
+ end
230
+
231
+ # install the Chocolatey Package Manager for Windows
232
+ def install_chocolatey(quiet=false)
233
+ log_stdout "Installing Chocolatey", quiet
234
+ run_command_as_admin('@powershell -NoProfile -ExecutionPolicy unrestricted -Command "(iex ((new-object net.webclient).DownloadString(\'https://chocolatey.org/install.ps1\'))) >$null 2>&1" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin')
235
+ reboot
236
+ end
237
+
238
+ # end the administrative task
239
+ def end_ievms_task(quiet=true)
240
+ run_command('schtasks.exe /End /TN ievms', quiet)
241
+ end
242
+
243
+ # true when machine powered off
244
+ def powered_off?
245
+ cmd = "VBoxManage showvminfo \"#{@vbox_name}\" | grep \"State:\""
246
+ print cmd if @verbose
247
+ out = `#{cmd}`
248
+ print out if @verbose
249
+ if out.include?('powered off') || out.include?('aborted')
250
+ return true
251
+ end
252
+ end
253
+
254
+ # return true when run level is 3 boot complete
255
+ def boot_complete?
256
+ out = `VBoxManage showvminfo "#{@vbox_name}" | grep 'Additions run level:'`
257
+ print out if @verbose
258
+ if out[-2..-2].to_i == 3
259
+ return true
260
+ end
261
+ end
262
+
263
+ ###############################################################
264
+
125
265
  private
126
266
 
127
267
  def log_stdout(msg, quiet=true)
268
+ quiet = false if @verbose
128
269
  print "[#{@vbox_name}] #{msg}\n" unless quiet
129
270
  end
130
271
 
@@ -133,7 +274,7 @@ module Ievms
133
274
  def guestcontrol_exec(image, cmd)
134
275
 
135
276
  _ = Timeout::timeout(@timeout_secs) {
136
- wait_for_guestcontrol(@vbox_name)
277
+ wait_for_guestcontrol
137
278
  cmd = "VBoxManage guestcontrol \"#{@vbox_name}\" run --username \"#{USERNAME}\" --password '#{PASSWD}' --exe \"#{image}\" -- #{cmd}"
138
279
 
139
280
  log_stdout cmd, false if @verbose
@@ -143,29 +284,38 @@ module Ievms
143
284
 
144
285
  end
145
286
 
146
- # function taken from ievms
147
287
  # Pause execution until guest control is available for a virtual machine
148
- def wait_for_guestcontrol(vboxname)
149
- run_level = 0
150
- while run_level < 3 do
151
- print "Waiting for #{vboxname} to be available for guestcontrol...\n" if @verbose
152
- out = `VBoxManage showvminfo "#{vboxname}" | grep 'Additions run level:'`
153
- run_level = out[-2..-2].to_i
154
- if run_level < 3
155
- sleep 3
156
- end
288
+ def wait_for_guestcontrol
289
+ until boot_complete? do
290
+ print "Waiting for #{@vbox_name} to be available for guestcontrol...\n" if @verbose
291
+ sleep 3
157
292
  end
158
293
  end
159
294
 
160
- # Is it a virtual machine in VirtualBox?
161
- def is_vm(vboxname)
162
- cmd = "VBoxManage showvminfo \"#{vboxname}\""
295
+ # Pause execution until guest machine has shut down
296
+ def wait_for_shutdown
297
+ until powered_off? do
298
+ print "Waiting for #{@vbox_name} to be finished shutdown...\n" if @verbose
299
+ sleep 3
300
+ end
301
+ end
302
+
303
+ # raise when version is not compatible
304
+ def check_virtualbox_version
305
+ if Gem::Version.new(`VBoxManage -v`.strip.split('r')[0]) < Gem::Version.new('5.0.6')
306
+ raise "VirtualBox >= 5.0.6 is not installed"
307
+ end
308
+ end
163
309
 
310
+ # raise when name is not a virtual machine in VirtualBox
311
+ def is_vm?
312
+ cmd = "VBoxManage showvminfo \"#{@vbox_name}\""
164
313
  _, stderr, _ = Open3.capture3(cmd)
165
314
  if stderr.include? 'Could not find a registered machine named'
166
- raise "Virtual Machine #{vboxname} does not exist"
315
+ raise "Virtual Machine #{@vbox_name} does not exist"
167
316
  end
168
317
  end
169
318
 
319
+
170
320
  end
171
321
  end
@@ -1,10 +1,15 @@
1
1
  require 'simplecov'
2
+ require 'thor'
3
+ require 'timeout'
2
4
 
3
5
  SimpleCov.start do
4
6
  add_filter '/test/'
5
7
  add_filter '/vendor/'
6
8
  end
7
9
 
10
+ require 'ievms/ievms_cli'
11
+ require 'ievms/windows_guest'
12
+
8
13
  require 'minitest'
9
14
  require 'minitest/unit'
10
15
  require 'minitest/autorun'
@@ -13,6 +18,12 @@ require 'minitest/pride'
13
18
  require "codeclimate-test-reporter"
14
19
  CodeClimate::TestReporter.start
15
20
 
21
+ machine = Ievms::WindowsGuest.new 'IE9 - Win7'
22
+ machine.headless=true
23
+ machine.verbose=false
24
+ machine.restore_clean_snapshot
25
+ machine = nil
26
+
16
27
  module IevmsRubyTestsShared
17
28
 
18
29
  def initialize(name = nil)
@@ -21,20 +32,4 @@ module IevmsRubyTestsShared
21
32
  super(name) unless name.nil?
22
33
  end
23
34
 
24
- def ensure_machine_running vbox_name
25
-
26
- iectrl = `iectrl status "#{vbox_name}"`
27
- if not iectrl.include?('RUNNING')
28
- iectrl = `iectrl start "#{vbox_name}"`
29
- sleep 5
30
- iectrl = `iectrl status "#{vbox_name}"`
31
- if not iectrl.include?('RUNNING')
32
- iectrl = `VBoxManage startvm --type headless "#{vbox_name}"`
33
- sleep 5
34
- end
35
-
36
- IevmsRb.start(['ps', "IE9 - Win7"])
37
- end
38
-
39
- end
40
35
  end
@@ -1,101 +1,132 @@
1
1
  require 'test_helper'
2
- require 'thor'
3
- require 'ievms/ievms_cli'
4
- require 'ievms/windows_guest'
5
- require 'timeout'
6
2
 
7
3
  class TestWin7 < Minitest::Test
8
4
  include IevmsRubyTestsShared
9
5
 
10
-
11
6
  def setup
12
- ensure_machine_running("IE9 - Win7")
7
+ machine = Ievms::WindowsGuest.new 'IE9 - Win7'
8
+ machine.headless=true
9
+ machine.verbose=false
10
+ machine.start
13
11
  end
14
12
 
15
13
  def test_timeout_option
16
14
  assert_raises {
17
- run_capture(["cmd", "IE9 - Win7", "ping 127.0.0.1 -n 6 > nul", "--verbose", "--timeout", "3" ])
15
+ run_thor_capture(["cmd", "IE9 - Win7", "ping 127.0.0.1 -n 6 > nul", "--verbose", "--timeout", "3" ])
18
16
  }
19
17
  end
20
18
 
21
19
  def test_ps
22
- assert_equal true, run_capture(["ps", "IE9 - Win7"]).include?('winlogon.exe')
20
+ assert_equal true, run_thor_capture(["ps", "IE9 - Win7"]).include?('winlogon.exe')
23
21
  end
24
22
 
25
23
  def test_help
26
- assert_equal true, run_capture([]).include?('[vbox name]')
27
- assert_equal true, run_capture(['help']).include?('[file path]')
24
+ assert_equal true, run_thor_capture([]).include?('[vbox name]')
25
+ assert_equal true, run_thor_capture(['help']).include?('[file path]')
26
+ end
27
+
28
+ def test_version
29
+ assert_equal Ievms::VERSION, run_thor_capture(['version'])
28
30
  end
29
31
 
30
32
  def test_copy_from
31
33
  FileUtils.rm '/tmp/testdlfile2.txt' if File.exists? '/tmp/testdlfile2.txt'
32
- out = run_capture ['copy_from',"IE9 - Win7",'C:\ievms.xml', '/tmp/testdlfile2.txt']
34
+ out = run_thor_capture ['copy_from',"IE9 - Win7",'C:\ievms.xml', '/tmp/testdlfile2.txt']
33
35
 
34
36
  assert_equal out, "[IE9 - Win7] Copying C:\\ievms.xml to /tmp/testdlfile2.txt\n"
35
37
  assert_equal true, File.exists?('/tmp/testdlfile2.txt')
36
38
  end
37
39
 
38
40
  def test_copy_to
39
- IevmsRb.start ['cmd', "IE9 - Win7", 'if exist C:\Users\IEUser\ievms_test_upload3.txt del C:\Users\IEUsers\ievms_test_upload3.txt && Exit']
41
+ run_thor ['cmd', "IE9 - Win7", 'if exist C:\Users\IEUser\ievms_test_upload3.txt del C:\Users\IEUsers\ievms_test_upload3.txt && Exit']
40
42
  FileUtils.rm '/tmp/ievms_test_upload3.txt' if File.exists? '/tmp/ievms_test_upload3.txt'
41
43
  `echo "uploadasadmin_yes" > /tmp/ievms_test_upload3.txt`
42
- out = run_capture ['copy_to',"IE9 - Win7", '/tmp/ievms_test_upload3.txt', 'C:\Users\IEUser\ievms_test_upload3.txt']
43
- out2 = run_capture ['cat',"IE9 - Win7", 'C:\Users\IEUser\ievms_test_upload3.txt']
44
+ out = run_thor_capture ['copy_to',"IE9 - Win7", '/tmp/ievms_test_upload3.txt', 'C:\Users\IEUser\ievms_test_upload3.txt']
45
+ out2 = run_thor_capture ['cat',"IE9 - Win7", 'C:\Users\IEUser\ievms_test_upload3.txt']
44
46
  assert_equal "[IE9 - Win7] Copying /tmp/ievms_test_upload3.txt to C:\\Users\\IEUser\\ievms_test_upload3.txt\n", out
45
47
  assert_match(/uploadasadmin_yes/, out2)
46
48
  end
47
49
 
48
50
  def test_copy_to_as_adm
49
- IevmsRb.start ['cmd_as_adm', "IE9 - Win7", 'if exist C:\ievms_test_upload2.txt del C:\ievms_test_upload2.txt && Exit']
51
+ run_thor ['cmd_as_adm', "IE9 - Win7", 'if exist C:\ievms_test_upload2.txt del C:\ievms_test_upload2.txt && Exit']
50
52
  FileUtils.rm '/tmp/ievms_test_upload2.txt' if File.exists? '/tmp/ievms_test_upload2.txt'
51
53
  `echo "uploadasadmin_yes" > /tmp/ievms_test_upload2.txt`
52
54
 
53
- out = run_capture ['copy_to_as_adm',"IE9 - Win7", '/tmp/ievms_test_upload2.txt', 'C:\ievms_test_upload2.txt']
54
- out2 = run_capture ['cat',"IE9 - Win7", 'C:\ievms_test_upload2.txt']
55
+ out = run_thor_capture ['copy_to_as_adm',"IE9 - Win7", '/tmp/ievms_test_upload2.txt', 'C:\ievms_test_upload2.txt']
56
+ out2 = run_thor_capture ['cat',"IE9 - Win7", 'C:\ievms_test_upload2.txt']
55
57
  assert_equal "[IE9 - Win7] Copying /tmp/ievms_test_upload2.txt to C:\\ievms_test_upload2.txt as Administrator\n", out
56
58
  assert_match(/uploadasadmin_yes/, out2)
57
59
  end
58
60
 
59
61
  def test_reboot
60
- sysinfo = run_capture(['cmd', "IE9 - Win7", 'systeminfo'])
61
- boottime1 = sysinfo.lines.find { |line| line.include?("Boot") }
62
- IevmsRb.start(['reboot', "IE9 - Win7"])
63
- sleep 5
64
- IevmsRb.start(['ps', "IE9 - Win7"])
65
-
66
- sysinfo2 = run_capture(['cmd', "IE9 - Win7", 'systeminfo'])
67
- boottime2 = sysinfo2.lines.find { |line| line.include?("Boot") }
68
- refute_equal boottime1, boottime2
62
+ # sysinfo = run_thor_capture(['cmd', "IE9 - Win7", 'systeminfo'])
63
+ # print sysinfo
64
+ # boottime1 = sysinfo.lines.find { |line| line.include?("Boot") }
65
+ # print boottime1
66
+
67
+ run_thor(['reboot', "IE9 - Win7"])
68
+
69
+ # sysinfo2 = run_thor_capture(['cmd', "IE9 - Win7", 'systeminfo'])
70
+ # boottime2 = sysinfo2.lines.find { |line| line.include?("Boot") }
71
+ # p sysinfo2
72
+ # print boottime2
73
+ #refute_equal boottime1, boottime2
74
+ #FIXME update?
69
75
  end
70
76
 
71
77
  def test_shutdown
72
- iectrl1 = `iectrl status "IE9 - Win7"`
73
- assert_match(/RUNNING/, iectrl1)
74
-
75
- IevmsRb.start(['shutdown', "IE9 - Win7"])
76
- sleep 5
77
-
78
- iectrl2 = `iectrl status "IE9 - Win7"`
79
- refute_match(/RUNNING/, iectrl2)
78
+ machine = Ievms::WindowsGuest.new 'IE9 - Win7'
79
+ assert_equal(true, machine.boot_complete?)
80
+ run_thor(['shutdown', "IE9 - Win7"])
81
+ assert_equal(true, machine.powered_off?)
82
+ assert_match(/Already\ powered\ off/ , run_thor_capture(['shutdown', "IE9 - Win7"]))
80
83
  end
81
84
 
82
85
  def test_cat
83
- out = run_capture(['cat', "IE9 - Win7", 'C:\Windows\System32\Drivers\Etc\hosts'])
86
+ out = run_thor_capture(['cat', "IE9 - Win7", 'C:\Windows\System32\Drivers\Etc\hosts'])
84
87
  assert_match(/rhino\.acme\.com/, out)
85
88
  end
86
89
 
87
90
  def test_cmd
88
- out = run_capture(['cmd', "IE9 - Win7", 'tasklist'])
91
+ out = run_thor_capture(['cmd', "IE9 - Win7", 'tasklist'])
89
92
  assert_match(/winlogon\.exe/, out)
90
93
  end
91
94
 
92
95
  def test_cmd_adm
93
- out = run_capture(['cmd', "IE9 - Win7", 'tasklist'])
96
+ out = run_thor_capture(['cmd', "IE9 - Win7", 'tasklist'])
94
97
  assert_match(/winlogon\.exe/, out)
95
98
  end
96
99
 
100
+ #def test_pwrsh_as_adm
101
+ # p run_thor_capture(['pwrsh_as_adm', "IE9 - Win7", 'curl'])
102
+ #end
103
+
104
+ # takes 5 minutes
105
+ def test_choco
106
+ cmd1 = run_thor_capture(['choco_uninst', "IE9 - Win7", 'curl'])
107
+ assert_match(/Chocolatey\ is\ not\ installed,\ guess\ you/,cmd1)
108
+ run_thor(['choco_inst', "IE9 - Win7", 'curl'])
109
+ p run_thor_capture(['cmd_as_adm', "IE9 - Win7", 'curl'])
110
+ run_thor(['choco_uninst', "IE9 - Win7", 'curl'])
111
+ p run_thor_capture(['cmd_as_adm', "IE9 - Win7", 'curl'])
112
+ end
113
+
114
+ def test_reset_ievms_taskmgr
115
+ machine = Ievms::WindowsGuest.new 'IE9 - Win7'
116
+ machine.run_command_as_admin 'ping 127.0.0.1 -n 30 > nul', true, true
117
+ run_thor(['reset_ievms_taskmgr', "IE9 - Win7"])
118
+ assert_match(/Ready/,run_thor_capture(['cmd', "IE9 - Win7", 'schtasks.exe /Query /TN ievms']))
119
+ end
120
+
97
121
  private
98
- def run_capture(args)
122
+
123
+ def run_thor(args)
124
+ # args << '--verbose'
125
+ IevmsRb.start(args)
126
+ end
127
+
128
+ def run_thor_capture(args)
129
+ # args << '--verbose'
99
130
  out, _ = capture_io do
100
131
  IevmsRb.start(args)
101
132
  end
@@ -1,14 +1,13 @@
1
1
  require 'test_helper'
2
- require 'ievms/windows_guest'
3
- require 'timeout'
4
2
 
5
3
  class TestWin7 < Minitest::Test
6
4
 
7
5
  include IevmsRubyTestsShared
8
6
 
9
7
  def setup
10
- ensure_machine_running("IE9 - Win7")
11
8
  @machine = Ievms::WindowsGuest.new 'IE9 - Win7'
9
+ @machine.headless=true
10
+ @machine.start
12
11
  end
13
12
 
14
13
  def test_non_existing_guest
@@ -40,14 +39,14 @@ include IevmsRubyTestsShared
40
39
  def test_long_cmd_timeout
41
40
  @machine.timeout_secs = 3
42
41
  assert_raises {
43
- @machine.run_command 'ping 127.0.0.1 -n 6 > nul'
42
+ @machine.run_command 'ping 127.0.0.1 -n 10 > nul'
44
43
  }
45
44
  end
46
45
 
47
46
  def test_long_admin_cmd_timeout
48
47
  @machine.timeout_secs = 3
49
48
  assert_raises {
50
- @machine.run_command_as_admin 'ping 127.0.0.1 -n 6 > nul'
49
+ @machine.run_command_as_admin 'ping 127.0.0.1 -n 10 > nul'
51
50
  }
52
51
  end
53
52
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ievms-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pim Snel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-14 00:00:00.000000000 Z
11
+ date: 2015-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -89,6 +89,7 @@ extensions: []
89
89
  extra_rdoc_files: []
90
90
  files:
91
91
  - ".gitignore"
92
+ - CHANGELOG.md
92
93
  - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md