ievms-ruby 0.1.0 → 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.
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