veewee 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. data/Gemfile +4 -0
  2. data/README.md +1 -1
  3. data/doc/definition.md +18 -0
  4. data/doc/kvm.md +28 -1
  5. data/doc/template.md +53 -2
  6. data/lib/veewee/command/fusion.rb +37 -3
  7. data/lib/veewee/command/vagrant/basebox.rb +2 -0
  8. data/lib/veewee/command/vagrant/winrm.rb +39 -0
  9. data/lib/veewee/command/vbox.rb +18 -0
  10. data/lib/veewee/definition.rb +13 -3
  11. data/lib/veewee/error.rb +3 -0
  12. data/lib/veewee/provider/core/box.rb +7 -0
  13. data/lib/veewee/provider/core/box/build.rb +34 -14
  14. data/lib/veewee/provider/core/box/copy.rb +17 -0
  15. data/lib/veewee/provider/core/box/exec.rb +31 -12
  16. data/lib/veewee/provider/core/box/floppy.rb +1 -0
  17. data/lib/veewee/provider/core/box/halt.rb +7 -3
  18. data/lib/veewee/provider/core/box/validate_tags.rb +8 -2
  19. data/lib/veewee/provider/core/box/wincp.rb +120 -0
  20. data/lib/veewee/provider/core/box/winrm.rb +59 -0
  21. data/lib/veewee/provider/core/helper/comm.rb +47 -0
  22. data/lib/veewee/provider/core/helper/web.rb +20 -9
  23. data/lib/veewee/provider/core/helper/winrm.rb +167 -0
  24. data/lib/veewee/provider/kvm/box/create.rb +59 -3
  25. data/lib/veewee/provider/kvm/provider.rb +6 -6
  26. data/lib/veewee/provider/parallels/box/helper/buildinfo.rb +1 -1
  27. data/lib/veewee/provider/virtualbox/box.rb +1 -0
  28. data/lib/veewee/provider/virtualbox/box/build.rb +4 -2
  29. data/lib/veewee/provider/virtualbox/box/create.rb +32 -12
  30. data/lib/veewee/provider/virtualbox/box/helper/buildinfo.rb +6 -3
  31. data/lib/veewee/provider/virtualbox/box/helper/create.rb +20 -5
  32. data/lib/veewee/provider/virtualbox/box/helper/winrm_options.rb +31 -0
  33. data/lib/veewee/provider/virtualbox/box/up.rb +33 -12
  34. data/lib/veewee/provider/virtualbox/box/winrm.rb +13 -0
  35. data/lib/veewee/provider/vmfusion/box.rb +2 -0
  36. data/lib/veewee/provider/vmfusion/box/add_share.rb +18 -0
  37. data/lib/veewee/provider/vmfusion/box/build.rb +3 -1
  38. data/lib/veewee/provider/vmfusion/box/create.rb +7 -2
  39. data/lib/veewee/provider/vmfusion/box/helper/buildinfo.rb +9 -6
  40. data/lib/veewee/provider/vmfusion/box/helper/ip.rb +1 -1
  41. data/lib/veewee/provider/vmfusion/box/helper/winrm_options.rb +21 -0
  42. data/lib/veewee/provider/vmfusion/box/template.rb +7 -3
  43. data/lib/veewee/provider/vmfusion/box/template.vmx.erb +6 -0
  44. data/lib/veewee/provider/vmfusion/box/winrm.rb +12 -0
  45. data/lib/veewee/provider/vmfusion/provider.rb +7 -1
  46. data/lib/veewee/version.rb +1 -1
  47. data/templates/CentOS-5.6-x86_64-netboot-packages/definition.rb +16 -0
  48. data/templates/CentOS-5.6-x86_64-netboot-packages/ks.cfg +47 -0
  49. data/templates/CentOS-5.6-x86_64-netboot-packages/postinstall.sh +61 -0
  50. data/templates/Debian-7.0-b3-amd64-netboot/base.sh +27 -0
  51. data/templates/Debian-7.0-b3-amd64-netboot/chef.sh +2 -0
  52. data/templates/Debian-7.0-b3-amd64-netboot/cleanup-virtualbox.sh +4 -0
  53. data/templates/Debian-7.0-b3-amd64-netboot/cleanup.sh +17 -0
  54. data/templates/Debian-7.0-b3-amd64-netboot/definition.rb +51 -0
  55. data/templates/Debian-7.0-b3-amd64-netboot/preseed.cfg +313 -0
  56. data/templates/Debian-7.0-b3-amd64-netboot/puppet.sh +2 -0
  57. data/templates/Debian-7.0-b3-amd64-netboot/ruby.sh +10 -0
  58. data/templates/Debian-7.0-b3-amd64-netboot/vagrant.sh +25 -0
  59. data/templates/Debian-7.0-b3-amd64-netboot/virtualbox.sh +13 -0
  60. data/templates/Debian-7.0-b3-amd64-netboot/zerodisk.sh +3 -0
  61. data/templates/Fedora-18-i386/definition.rb +17 -0
  62. data/templates/Fedora-18-i386/ks.cfg +75 -0
  63. data/templates/Fedora-18-i386/postinstall.sh +38 -0
  64. data/templates/Fedora-18-x86_64/definition.rb +17 -0
  65. data/templates/Fedora-18-x86_64/ks.cfg +75 -0
  66. data/templates/Fedora-18-x86_64/postinstall.sh +38 -0
  67. data/templates/OracleLinux-6.3-x86_64-DVD/base.sh +30 -0
  68. data/templates/OracleLinux-6.3-x86_64-DVD/chef.sh +3 -0
  69. data/templates/OracleLinux-6.3-x86_64-DVD/cleanup.sh +5 -0
  70. data/templates/OracleLinux-6.3-x86_64-DVD/definition.rb +40 -0
  71. data/templates/OracleLinux-6.3-x86_64-DVD/ks.cfg +42 -0
  72. data/templates/OracleLinux-6.3-x86_64-DVD/puppet.sh +12 -0
  73. data/templates/OracleLinux-6.3-x86_64-DVD/ruby.sh +3 -0
  74. data/templates/OracleLinux-6.3-x86_64-DVD/vagrant.sh +18 -0
  75. data/templates/OracleLinux-6.3-x86_64-DVD/virtualbox.sh +8 -0
  76. data/templates/OracleLinux-6.3-x86_64-DVD/zerodisk.sh +3 -0
  77. data/templates/funtoo-latest-x86_64/definition.rb +37 -0
  78. data/templates/funtoo-latest-x86_64/postinstall.sh +401 -0
  79. data/templates/openbsd50_amd64/definition.rb +3 -2
  80. data/templates/openbsd50_amd64/postinstall.sh +4 -4
  81. data/templates/openbsd50_i386/definition.rb +4 -4
  82. data/templates/openbsd52_amd64/README +28 -0
  83. data/templates/openbsd52_amd64/definition.rb +85 -0
  84. data/templates/openbsd52_amd64/postinstall.sh +81 -0
  85. data/templates/openbsd52_i386/README +28 -0
  86. data/templates/openbsd52_i386/definition.rb +85 -0
  87. data/templates/openbsd52_i386/postinstall.sh +81 -0
  88. data/templates/windows-2008R1-serverstandard-amd64/Autounattend.xml +6 -6
  89. data/templates/windows-2008R1-serverweb-amd64/install-winrm.bat +1 -1
  90. data/templates/windows-2008R2-serverstandard-amd64-winrm/Autounattend.xml +224 -0
  91. data/templates/windows-2008R2-serverstandard-amd64-winrm/README.md +87 -0
  92. data/templates/windows-2008R2-serverstandard-amd64-winrm/definition.rb +33 -0
  93. data/templates/windows-2008R2-serverstandard-amd64-winrm/install-chef.bat +2 -0
  94. data/templates/windows-2008R2-serverstandard-amd64-winrm/install-vbox.bat +4 -0
  95. data/templates/windows-2008R2-serverstandard-amd64-winrm/oracle-cert.cer +0 -0
  96. data/templates/windows-2008R2-serverstandard-amd64-winrm/postinstall.sh +74 -0
  97. data/templates/windows-7-enterprise-amd64-winrm/Autounattend.xml +227 -0
  98. data/templates/windows-7-enterprise-amd64-winrm/README.md +52 -0
  99. data/templates/windows-7-enterprise-amd64-winrm/definition.rb +27 -0
  100. data/templates/windows-7-enterprise-amd64-winrm/install-chef.bat +2 -0
  101. data/templates/windows-7-enterprise-amd64-winrm/install-fusion.bat +18 -0
  102. data/templates/windows-7-enterprise-amd64-winrm/install-puppet.bat +4 -0
  103. data/templates/windows-7-enterprise-amd64-winrm/install-vbox.bat +4 -0
  104. data/templates/windows-7-enterprise-amd64-winrm/oracle-cert.cer +0 -0
  105. data/templates/windows-7-enterprise-amd64-winrm/postinstall.bat +74 -0
  106. data/validation/veewee-windows.feature +34 -0
  107. data/veewee.gemspec +1 -1
  108. metadata +73 -7
@@ -5,6 +5,10 @@ module Veewee
5
5
 
6
6
  def build(options={})
7
7
 
8
+ if definition.nil?
9
+ raise Veewee::Error,"Could not find the definition. Make sure you are one level above the definitions directory when you execute the build command."
10
+ end
11
+
8
12
  # Requires valid definition
9
13
 
10
14
  ui.info "Building Box #{name} with Definition #{definition.name}:"
@@ -74,6 +78,7 @@ module Veewee
74
78
  sleep 2
75
79
  end
76
80
 
81
+
77
82
  self.transfer_buildinfo(options)
78
83
 
79
84
  # Filtering post install files based upon --postinstall-include and --postinstall--exclude
@@ -81,9 +86,13 @@ module Veewee
81
86
 
82
87
  self.handle_postinstall(options)
83
88
 
84
- ui.success "The box #{name} was built succesfully!"
89
+ ui.success "The box #{name} was build succesfully!"
85
90
  ui.info "You can now login to the box with:"
86
- ui.info ssh_command_string
91
+ if (definition.winrm_user && definition.winrm_password)
92
+ env.ui.info winrm_command_string
93
+ else
94
+ env.ui.info ssh_command_string
95
+ end
87
96
 
88
97
  return self
89
98
  end
@@ -165,11 +174,11 @@ module Veewee
165
174
  kickstartfiles=definition.kickstart_file
166
175
 
167
176
  if kickstartfiles.nil? || kickstartfiles.length == 0
168
- ui.info "Skipping webserver as no kickstartfile was specified"
177
+ env.ui.info "Skipping webserver as no kickstartfile was specified"
178
+ else
179
+ env.ui.info "Starting a webserver #{definition.kickstart_ip}:#{definition.kickstart_port}\n"
169
180
  end
170
181
 
171
- ui.info "Starting a webserver #{definition.kickstart_ip}:#{definition.kickstart_port}\n"
172
-
173
182
  # Check if the kickstart is an array or a single string
174
183
  if kickstartfiles.is_a?(String)
175
184
  # Let's turn it into an array
@@ -197,17 +206,23 @@ module Veewee
197
206
  definition.postinstall_files.each do |postinstall_file|
198
207
  # Filenames of postinstall_files are relative to their definition
199
208
  filename=File.join(definition.path,postinstall_file)
200
- self.scp(filename,File.basename(filename))
201
- self.exec("chmod +x \"#{File.basename(filename)}\"")
209
+ self.copy_to_box(filename,File.basename(filename))
210
+ if not (definition.winrm_user && definition.winrm_password)
211
+ self.exec("chmod +x \"#{File.basename(filename)}\"")
212
+ end
202
213
  end
203
214
 
204
215
  # Prepare a pre_poinstall file if needed (not nil , or not empty)
205
216
  unless definition.pre_postinstall_file.to_s.empty?
206
217
  pre_filename=File.join(definition.path, definition.pre_postinstall_file)
207
- self.scp(pre_filename,File.basename(pre_filename))
208
- self.exec("chmod +x \"#{File.basename(pre_filename)}\"")
209
- # Inject the call to the real script by executing the first argument (it will be the postinstall script file name to be executed)
210
- self.exec("execute=\"\\n# We must execute the script passed as the first argument\\n\\$1\" && printf \"%b\\n\" \"$execute\" >> #{File.basename(pre_filename)}")
218
+ self.copy_to_box(filename,File.basename(pre_filename))
219
+ if (definition.winrm_user && definition.winrm_password)
220
+ # not implemented on windows yet
221
+ else
222
+ self.exec("chmod +x \"#{File.basename(pre_filename)}\"")
223
+ # Inject the call to the real script by executing the first argument (it will be the postinstall script file name to be executed)
224
+ self.exec("execute=\"\\n# We must execute the script passed as the first argument\\n\\$1\" && printf \"%b\\n\" \"$execute\" >> #{File.basename(pre_filename)}")
225
+ end
211
226
  end
212
227
 
213
228
  # Now iterate over the postinstall files
@@ -218,14 +233,19 @@ module Veewee
218
233
  unless File.basename(postinstall_file).start_with?("_")
219
234
 
220
235
  unless definition.pre_postinstall_file.to_s.empty?
236
+ raise 'not implemented on windows yet' if (definition.winrm_user && definition.winrm_password)
221
237
  # Filename of pre_postinstall_file are relative to their definition
222
238
  pre_filename=File.join(definition.path, definition.pre_postinstall_file)
223
239
  # Upload the pre postinstall script if not already transfered
224
240
  command = "./" + File.basename(pre_filename)
225
241
  command = sudo(command) + " ./"+File.basename(filename)
226
242
  else
227
- command = "./"+File.basename(filename)
228
- command = sudo(command)
243
+ if (definition.winrm_user && definition.winrm_password)
244
+ # no sudo on windows, batch files only please?
245
+ self.exec(File.basename(filename))
246
+ else
247
+ self.exec(sudo("./"+File.basename(filename)))
248
+ end
229
249
  end
230
250
 
231
251
  self.exec(command)
@@ -249,7 +269,7 @@ module Veewee
249
269
  infofile.puts "#{info[:content]}"
250
270
  infofile.rewind
251
271
  infofile.close
252
- self.scp(infofile.path,info[:filename])
272
+ self.copy_to_box(infofile.path,info[:filename])
253
273
  infofile.delete
254
274
  rescue RuntimeError => ex
255
275
  ui.error("Error transfering file #{info[:filename]} failed, possible not enough permissions to write? #{ex}",:prefix => false)
@@ -0,0 +1,17 @@
1
+ module Veewee
2
+ module Provider
3
+ module Core
4
+ module BoxCommand
5
+
6
+ def copy_to_box(localfile,remotefile,options={})
7
+ raise Veewee::Error,"Box is not running" unless self.running?
8
+ if definition.winrm_user && definition.winrm_password # prefer winrm
9
+ self.wincp(localfile,remotefile,options)
10
+ else
11
+ self.scp(localfile,remotefile,options)
12
+ end
13
+ end
14
+ end # Module
15
+ end # Module
16
+ end # Module
17
+ end # Module
@@ -8,25 +8,44 @@ module Veewee
8
8
  "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p #{ssh_options[:port]} -l #{definition.ssh_user} #{self.ip_address}"
9
9
  end
10
10
 
11
+ def winrm_command_string
12
+ "knife winrm -m #{self.ip_address} -P #{winrm_options[:port]} -x #{definition.winrm_user}" +
13
+ " -P #{definition.winrm_password} COMMAND"
14
+ end
15
+
11
16
  def exec(command,options={})
12
17
  raise Veewee::Error,"Box is not running" unless self.running?
13
- begin
14
- new_options=ssh_options.merge(options)
15
- self.when_ssh_login_works(self.ip_address,new_options) do
16
- begin
17
- env.logger.info "About to execute remote command #{command} on box #{name} - #{self.ip_address} - #{new_options}"
18
- result=self.ssh_execute(self.ip_address,command,new_options)
18
+ if definition.winrm_user && definition.winrm_password
19
+ begin
20
+ new_options=winrm_options.merge(options)
21
+ self.when_winrm_login_works(self.ip_address,winrm_options.merge(options)) do
22
+ result = self.winrm_execute(self.ip_address,command,new_options)
19
23
  return result
20
- rescue RuntimeError => ex
21
- error= "Error executing command #{command} : #{ex}"
22
- error+="\n#{ex.backtrace.join("\n")}" unless ex.backtrace.empty?
23
- raise Veewee::SshError, error
24
24
  end
25
+ rescue RuntimeError => ex
26
+ env.ui.error "Error executing command #{command} : #{ex}"
27
+ raise Veewee::WinrmError, ex
28
+ end
29
+ else # definition.ssh_user && definition.ssh_password
30
+ begin
31
+ new_options=ssh_options.merge(options)
32
+ self.when_ssh_login_works(self.ip_address,new_options) do
33
+ begin
34
+ env.logger.info "About to execute remote command #{command} on box #{name} - #{self.ip_address} - #{new_options}"
35
+ result=self.ssh_execute(self.ip_address,command,new_options)
36
+ return result
37
+ rescue RuntimeError => ex
38
+ env.ui.error "Error executing command #{command} : #{ex}"
39
+ raise Veewee::SshError, ex
40
+ end
41
+ end
42
+ rescue Net::SSH::AuthenticationFailed => ex # may want to catch winrm auth fails as well
43
+ env.ui.error "Authentication failure"
44
+ raise Veewee::SshError, "Authentication failure\n"+ex
25
45
  end
26
- rescue Net::SSH::AuthenticationFailed => ex
27
- raise Veewee::SshError, "Authentication failure\n"+ex
28
46
  end
29
47
 
48
+
30
49
  end
31
50
  end # Module
32
51
  end # Module
@@ -5,6 +5,7 @@ module Veewee
5
5
  def create_floppy(floppy_filename)
6
6
  # Todo Check for java
7
7
  # Todo check output of commands
8
+ # Todo allow for .erb templates
8
9
 
9
10
  # Check for floppy
10
11
  unless definition.floppy_files.nil?
@@ -9,9 +9,13 @@ module Veewee
9
9
  if options["force"]==true
10
10
  self.poweroff
11
11
  else
12
- self.exec("echo '#{definition.shutdown_cmd}' > /tmp/shutdown.sh")
13
- self.exec("chmod +x /tmp/shutdown.sh")
14
- self.exec(sudo("/tmp/shutdown.sh"))
12
+ if definition.winrm_user && definition.winrm_password # prefer winrm
13
+ self.exec("#{definition.shutdown_cmd}")
14
+ else
15
+ self.exec("echo '#{definition.shutdown_cmd}' > /tmp/shutdown.sh")
16
+ self.exec("chmod +x /tmp/shutdown.sh")
17
+ self.exec(sudo("/tmp/shutdown.sh"))
18
+ end
15
19
  end
16
20
  else
17
21
  raise Veewee::Error,"Box is not running"
@@ -6,7 +6,7 @@ module Veewee
6
6
  def validate_tags(tags,options)
7
7
 
8
8
  unless self.exists?
9
- ui.error "Error:: You tried to validate box '#{name}' but it does not exit"
9
+ ui.error "Error:: You tried to validate box '#{name}' but it does not exist"
10
10
  exit -1
11
11
  end
12
12
 
@@ -31,7 +31,13 @@ module Veewee
31
31
  ENV['VEEWEE_BOXNAME']=@name
32
32
  ENV['VEEWEE_PROVIDER']=@provider.name
33
33
 
34
- feature_path=File.join(File.dirname(__FILE__),"..","..","..","..","..","validation","veewee.feature")
34
+ if definition.winrm_user && definition.winrm_password # prefer winrm
35
+ featurefile="veewee-windows.feature"
36
+ else
37
+ featurefile="veewee.feature"
38
+ end
39
+
40
+ feature_path=File.join(File.dirname(__FILE__),"..","..","..","..","..","validation",featurefile)
35
41
 
36
42
  features=Array.new
37
43
  features[0]=feature_path
@@ -0,0 +1,120 @@
1
+ require 'veewee/provider/core/helper/winrm'
2
+ module Veewee
3
+ module Provider
4
+ module Core
5
+ module BoxCommand
6
+
7
+ def wincp(localfile,remotefile,options={})
8
+ raise Veewee::Error,"Box is not running" unless self.running?
9
+
10
+ # Calculate an available kickstart port which we will use for wincp
11
+ definition.kickstart_port = "7000" if definition.kickstart_port.nil?
12
+ guessed_port=guess_free_port(definition.kickstart_port.to_i,7199).to_s
13
+ if guessed_port.to_s!=definition.kickstart_port
14
+ env.ui.warn "Changing wincp port from #{definition.kickstart_port} to #{guessed_port}"
15
+ definition.kickstart_port=guessed_port.to_s
16
+ end
17
+
18
+ if self.exec("cmd.exe /C dir #{wget_vbs_file} > %TEMP%\\null",{:exitcode=>"*"}).status != 0
19
+ env.ui.warn "Creating wget.vbs"
20
+ create_wget_vbs_command do |command_chunk, chunk_num|
21
+ self.exec("cmd.exe /C echo \"Rendering '#{wget_vbs_file}' chunk #{chunk_num}\" && #{command_chunk}")
22
+ end
23
+ end
24
+
25
+
26
+ env.ui.warn "Spinning up a wait_for_http_request on http://#{host_ip_as_seen_by_guest}:#{definition.kickstart_port}#{localfile}"
27
+ webthread=allow_for_http_request(localfile,{
28
+ :port => definition.kickstart_port,
29
+ :host => definition.kickstart_ip,
30
+ :timeout => definition.kickstart_timeout,
31
+ :web_dir => '/'
32
+ })
33
+
34
+ begin
35
+ self.when_winrm_login_works(self.ip_address,winrm_options.merge(options)) do
36
+ env.ui.info "Going to try and copy #{localfile} to #{remotefile.inspect}"
37
+ self.exec("cmd.exe /C cscript %TEMP%\\wget.vbs /url:http://#{host_ip_as_seen_by_guest}:#{definition.kickstart_port}#{localfile} /path:#{remotefile}")
38
+ # while true do
39
+ # sleep 0.1 # used to debug
40
+ # end
41
+ end
42
+ end
43
+ end
44
+
45
+
46
+ def wget_vbs_file
47
+ "%TEMP%\\\\wget.vbs"
48
+ end
49
+
50
+ def create_wget_vbs_command(&block)
51
+ bootstrap_bat = []
52
+ chunk_num = 0
53
+ wget_vbs.each_line do |line|
54
+ # escape WIN BATCH special chars
55
+ line.gsub!(/[(<|>)^]/).each{|m| "^#{m}"}
56
+ # windows commands are limited to 2047 characters
57
+ if((bootstrap_bat + [line]).join(" && ").size > 2047 )
58
+ yield bootstrap_bat.join(" && "), chunk_num += 1
59
+ bootstrap_bat = []
60
+ end
61
+ bootstrap_bat << ">> #{wget_vbs_file} (echo.#{line.chomp.strip})"
62
+ end
63
+ yield bootstrap_bat.join(" && "), chunk_num += 1
64
+ bootstrap_bat = []
65
+ end
66
+
67
+ def wget_vbs
68
+ wget_vbs = <<-WGET
69
+ url = WScript.Arguments.Named("url")
70
+ path = WScript.Arguments.Named("path")
71
+ Set objXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
72
+ Set wshShell = CreateObject( "WScript.Shell" )
73
+ Set objUserVariables = wshShell.Environment("USER")
74
+
75
+ 'http proxy is optional
76
+ 'attempt to read from HTTP_PROXY env var first
77
+ On Error Resume Next
78
+
79
+ If NOT (objUserVariables("HTTP_PROXY") = "") Then
80
+ objXMLHTTP.setProxy 2, objUserVariables("HTTP_PROXY")
81
+
82
+ 'fall back to named arg
83
+ ElseIf NOT (WScript.Arguments.Named("proxy") = "") Then
84
+ objXMLHTTP.setProxy 2, WScript.Arguments.Named("proxy")
85
+ End If
86
+
87
+ On Error Goto 0
88
+
89
+ objXMLHTTP.open "GET", url, false
90
+ objXMLHTTP.send()
91
+ If objXMLHTTP.Status = 200 Then
92
+ Set objADOStream = CreateObject("ADODB.Stream")
93
+ objADOStream.Open
94
+ objADOStream.Type = 1
95
+ objADOStream.Write objXMLHTTP.ResponseBody
96
+ objADOStream.Position = 0
97
+ Set objFSO = Createobject("Scripting.FileSystemObject")
98
+ If objFSO.Fileexists(path) Then objFSO.DeleteFile path
99
+ Set objFSO = Nothing
100
+ objADOStream.SaveToFile path
101
+ objADOStream.Close
102
+ Set objADOStream = Nothing
103
+ End if
104
+ Set objXMLHTTP = Nothing
105
+ WGET
106
+ #escape_and_echo(win_wget)
107
+ wget_vbs
108
+ end
109
+
110
+ # escape WIN BATCH special chars
111
+ # and prefixes each line with an
112
+ # echo
113
+ def escape_and_echo(file_contents)
114
+ file_contents.gsub(/^(.*)$/, 'echo.\1').gsub(/([(<|>)^])/, '^\1')
115
+ end
116
+
117
+ end # Module
118
+ end # Module
119
+ end # Module
120
+ end # Module
@@ -0,0 +1,59 @@
1
+ require 'veewee/provider/core/helper/winrm'
2
+ module Veewee
3
+ module Provider
4
+ module Core
5
+ module BoxCommand
6
+
7
+
8
+ def winrm(command=nil,options={})
9
+
10
+ raise Veewee::Error,"Box is not running" unless self.running?
11
+ winrm_options={:user => definition.winrm_user,:password => definition.winrm_password, :port => definition.winrm_host_port, :exitcode => '*'}
12
+
13
+ if (command.nil?)
14
+ env.ui.info "This is a simple interactive shell"
15
+ env.ui.info "To exit interactive mode, use 'quit!'"
16
+
17
+ while 1
18
+ command = ui.ask("veewee>")
19
+ case command.strip
20
+ when 'quit!'
21
+ env.ui.info 'Bye!'
22
+ break
23
+ else
24
+ winrm_execute(self.ip_address,command,winrm_options.merge(options))
25
+ end
26
+ end
27
+ else
28
+ winrm_execute(self.ip_address,command,winrm_options.merge(options))
29
+ end
30
+
31
+
32
+ end
33
+
34
+ private
35
+ def winrm_options(options)
36
+
37
+ command_options = [
38
+ #"-q", #Suppress warning messages
39
+ # "-T", #Pseudo-terminal will not be allocated because stdin is not a terminal.
40
+ "-p #{winrm_options[:port]}",
41
+ "-o UserKnownHostsFile=/dev/null",
42
+ "-t -o StrictHostKeyChecking=no",
43
+ "-o IdentitiesOnly=yes",
44
+ "-o VerifyHostKeyDNS=no"
45
+ ]
46
+ if !(definition.winrm_key.nil? || definition.winrm_key.length!="")
47
+ command_options << "-i #{definition.winrm_key}"
48
+ end
49
+ commandline_options="#{command_options.join(" ")} ".strip
50
+
51
+ user_option=definition.winrm_user.nil? ? "" : "-l #{definition.winrm_user}"
52
+
53
+ return "#{commandline_options} #{user_option}"
54
+ end
55
+ end # Module
56
+ end # Module
57
+ end # Module
58
+ end # Module
59
+
@@ -0,0 +1,47 @@
1
+ module Veewee
2
+ module Provider
3
+ module Core
4
+ module Helper
5
+
6
+ module Comm
7
+
8
+ def comm_method
9
+ if (definition.winrm_user && definition.winrm_password)
10
+ :winrm
11
+ else
12
+ :ssh
13
+ end
14
+ end
15
+
16
+ def when_comm_login_works(ip="127.0.0.1", options = { } , &block)
17
+ case comm_method
18
+ when :winrm
19
+ when_winrm_login_works(ip,options,block)
20
+ when :ssh
21
+ when_ssh_login_works(ip,options,block)
22
+ end
23
+ end
24
+
25
+ def comm_transfer_file(host,filename,destination = '.' , options = {})
26
+ case comm_method
27
+ when :winrm
28
+ winrm_transfer_file(host,filename,destination,options)
29
+ when :ssh
30
+ ssh_transfer_file(host,filename,destination,options)
31
+ end
32
+ end
33
+
34
+ def comm_execute(host,command, options = { :progress => "on"} )
35
+ case comm_method
36
+ when :winrm
37
+ winrm_execute(host,command, options )
38
+ when :ssh
39
+ ssh_execute(host,command, options )
40
+ end
41
+ end
42
+
43
+ end #Class
44
+ end #Module
45
+ end #Module
46
+ end #Module
47
+ end #Module