veewee 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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