winrm 1.0.0rc4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.swp
2
+ *.gem
3
+ pkg/*
4
+ .rvmrc
5
+ test/spec/creds*.json
6
+ traces/
data/Rakefile CHANGED
@@ -1,52 +1,20 @@
1
1
  require 'rubygems'
2
2
  require 'rake/clean'
3
- require 'rake/gempackagetask'
4
3
  require 'date'
5
4
 
6
5
  CLEAN.include("pkg")
7
6
  CLEAN.include("doc")
7
+ CLEAN.include("*.gem")
8
8
 
9
- GEMSPEC = Gem::Specification.new do |gem|
10
- gem.name = "winrm"
11
- gem.version = File.open('VERSION').readline.chomp
12
- gem.date = Date.today.to_s
13
- gem.platform = Gem::Platform::RUBY
14
- gem.rubyforge_project = nil
9
+ task :default => [:gem]
15
10
 
16
- gem.author = "Dan Wanek"
17
- gem.email = "dan.wanek@gmail.com"
18
- gem.homepage = "http://github.com/zenchild/WinRM"
19
-
20
- gem.summary = 'Ruby library for Windows Remote Management'
21
- gem.description = <<-EOF
22
- Ruby library for Windows Remote Management
23
- EOF
24
-
25
- gem.files = `git ls-files`.split(/\n/)
26
- gem.require_path = "lib"
27
- gem.rdoc_options = %w(-x test/ -x examples/)
28
- gem.extra_rdoc_files = %w(README COPYING.txt)
29
-
30
- gem.required_ruby_version = '>= 1.8.7'
31
- gem.add_runtime_dependency 'handsoap'
32
- gem.add_runtime_dependency 'nokogiri'
33
- gem.add_runtime_dependency 'httpclient'
34
- gem.add_runtime_dependency 'rubyntlm'
35
- gem.add_runtime_dependency 'uuid'
11
+ desc "Build the gem from the gemspec"
12
+ task :repackage do
13
+ system "gem build winrm.gemspec"
36
14
  end
37
-
38
- Rake::GemPackageTask.new(GEMSPEC) do |pkg|
39
- pkg.need_tar = true
40
- end
41
-
42
- task :default => [:buildgem]
43
15
 
44
16
  desc "Build the gem without a version change"
45
- task :buildgem => [:clean, :repackage]
46
-
47
- desc "Build the gem, but increment the version first"
48
- task :newrelease => [:versionup, :clean, :repackage]
49
-
17
+ task :gem => [:clean, :repackage]
50
18
 
51
19
  desc "Increment the version by 1 minor release"
52
20
  task :versionup do
@@ -54,6 +22,9 @@ task :versionup do
54
22
  puts "New version: #{ver}"
55
23
  end
56
24
 
25
+ desc "Build the gem, but increment the version first"
26
+ task :newrelease => [:versionup, :clean, :repackage]
27
+
57
28
 
58
29
  def up_min_version
59
30
  f = File.open('VERSION', 'r+')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0rc4
1
+ 1.0.0
@@ -29,5 +29,8 @@ module WinRM
29
29
 
30
30
  # A Fault returned in the SOAP response. The XML node is a WSManFault
31
31
  class WinRMWSManFault < StandardError; end
32
+
33
+ # Bad HTTP Transport
34
+ class WinRMHTTPTransportError < StandardError; end
32
35
  end # WinRM
33
36
 
@@ -11,6 +11,7 @@ module WinRM
11
11
  def initialize(endpoint)
12
12
  @endpoint = endpoint.is_a?(String) ? URI.parse(endpoint) : endpoint
13
13
  @httpcli = HTTPClient.new(:agent_name => 'Ruby WinRM Client')
14
+ @httpcli.receive_timeout = 3600 # Set this to an unreasonable amount for now because WinRM has timeouts
14
15
  end
15
16
 
16
17
  def send_request(message)
@@ -19,19 +20,17 @@ module WinRM
19
20
  if(resp.status == 200)
20
21
  # Version 1.1 of WinRM adds the namespaces in the document instead of the envelope so we have to
21
22
  # add them ourselves here. This should have no affect version 2.
22
- doc = Nokogiri::XML(resp.body.content)
23
+ doc = Nokogiri::XML(resp.http_body.content)
23
24
  doc.collect_namespaces.each_pair do |k,v|
24
25
  doc.root.add_namespace((k.split(/:/).last),v) unless doc.namespaces.has_key?(k)
25
26
  end
26
27
  return doc
27
28
  else
28
- puts "RESPONSE was #{resp.status}"
29
- # TODO: raise error
29
+ raise WinRMHTTPTransportError, "Bad HTTP response returned from server (#{resp.status})."
30
30
  end
31
31
  end
32
32
 
33
33
  # We'll need this to force basic authentication if desired
34
- # TODO: implement this for basic auth needs
35
34
  def basic_auth_only!
36
35
  auths = @httpcli.www_auth.instance_variable_get('@authenticator')
37
36
  auths.delete_if {|i| i.scheme !~ /basic/i}
@@ -64,6 +63,9 @@ module WinRM
64
63
  # @param [String<optional>] keytab the path to a keytab file if you are using one
65
64
  def initialize(endpoint, realm, service = nil, keytab = nil, opts)
66
65
  super(endpoint)
66
+ # Remove the GSSAPI auth from HTTPClient because we are doing our own thing
67
+ auths = @httpcli.www_auth.instance_variable_get('@authenticator')
68
+ auths.delete_if {|i| i.is_a?(HTTPClient::SSPINegotiateAuth)}
67
69
  service ||= 'HTTP'
68
70
  @service = "#{service}/#{@endpoint.host}@#{realm}"
69
71
  init_krb
@@ -92,7 +94,7 @@ Content-Type: application/octet-stream\r
92
94
 
93
95
  r = @httpcli.post(@endpoint, body, hdr)
94
96
 
95
- winrm_decrypt(r.body.content)
97
+ winrm_decrypt(r.http_body.content)
96
98
  end
97
99
 
98
100
 
@@ -20,8 +20,7 @@
20
20
 
21
21
  require 'httpclient'
22
22
  require 'savon/soap/xml'
23
- require 'uuid'
24
- require 'gssapi'
23
+ require 'uuidtools'
25
24
  require 'base64'
26
25
  require 'nokogiri'
27
26
 
@@ -36,6 +35,7 @@ module WinRM
36
35
  NS_SCHEMA_INST ='xsi' # http://www.w3.org/2001/XMLSchema-instance
37
36
  NS_WIN_SHELL ='rsp' # http://schemas.microsoft.com/wbem/wsman/1/windows/shell
38
37
  NS_WSMAN_FAULT = 'f' # http://schemas.microsoft.com/wbem/wsman/1/wsmanfault
38
+ NS_WSMAN_CONF = 'cfg'# http://schemas.microsoft.com/wbem/wsman/1/config
39
39
  end
40
40
 
41
41
  require 'winrm/exceptions/exceptions'
@@ -7,7 +7,7 @@ module WinRM
7
7
  DEFAULT_MAX_ENV_SIZE = 153600
8
8
  DEFAULT_LOCALE = 'en-US'
9
9
 
10
- attr_reader :endpoint
10
+ attr_reader :endpoint, :timeout
11
11
 
12
12
  # @param [String,URI] endpoint the WinRM webservice endpoint
13
13
  # @param [Symbol] transport either :kerberos(default)/:ssl/:plaintext
@@ -22,6 +22,7 @@ module WinRM
22
22
  @locale = DEFAULT_LOCALE
23
23
  case transport
24
24
  when :kerberos
25
+ require 'gssapi'
25
26
  # TODO: check fo keys and throw error if missing
26
27
  @xfer = HTTP::HttpGSSAPI.new(endpoint, opts[:realm], opts[:service], opts[:keytab], opts)
27
28
  when :plaintext
@@ -32,34 +33,64 @@ module WinRM
32
33
  end
33
34
 
34
35
  # Operation timeout
35
- def op_timeout(sec)
36
+ # @see http://msdn.microsoft.com/en-us/library/ee916629(v=PROT.13).aspx
37
+ # @param [Fixnum] sec the number of seconds to set the timeout to. It will be converted to an ISO8601 format.
38
+ def set_timeout(sec)
36
39
  @timeout = Iso8601Duration.sec_to_dur(sec)
37
40
  end
41
+ alias :op_timeout :set_timeout
38
42
 
39
43
  # Max envelope size
40
- def max_env_size(sz)
41
- @max_env_sz = sz
44
+ # @see http://msdn.microsoft.com/en-us/library/ee916127(v=PROT.13).aspx
45
+ # @param [Fixnum] byte_sz the max size in bytes to allow for the response
46
+ def max_env_size(byte_sz)
47
+ @max_env_sz = byte_sz
42
48
  end
43
49
 
44
- # Default locale
50
+ # Set the locale
51
+ # @see http://msdn.microsoft.com/en-us/library/gg567404(v=PROT.13).aspx
52
+ # @param [String] locale the locale to set for future messages
45
53
  def locale(locale)
46
54
  @locale = locale
47
55
  end
48
56
 
49
57
  # Create a Shell on the destination host
50
- # @param [String<optional>] i_stream Which input stream to open. Leave this alone unless you know what you're doing
51
- # @param [String<optional>] o_stream Which output stream to open. Leave this alone unless you know what you're doing
58
+ # @param [Hash<optional>] shell_opts additional shell options you can pass
59
+ # @option shell_opts [String] :i_stream Which input stream to open. Leave this alone unless you know what you're doing (default: stdin)
60
+ # @option shell_opts [String] :o_stream Which output stream to open. Leave this alone unless you know what you're doing (default: stdout stderr)
61
+ # @option shell_opts [String] :working_directory the directory to create the shell in
62
+ # @option shell_opts [Hash] :env_vars environment variables to set for the shell. For instance;
63
+ # :env_vars => {:myvar1 => 'val1', :myvar2 => 'var2'}
52
64
  # @return [String] The ShellId from the SOAP response. This is our open shell instance on the remote machine.
53
- def open_shell(i_stream = 'stdin', o_stream = 'stdout stderr')
65
+ def open_shell(shell_opts = {})
66
+ i_stream = shell_opts.has_key?(:i_stream) ? shell_opts[:i_stream] : 'stdin'
67
+ o_stream = shell_opts.has_key?(:o_stream) ? shell_opts[:o_stream] : 'stdout stderr'
68
+ codepage = shell_opts.has_key?(:codepage) ? shell_opts[:codepage] : 437
69
+ noprofile = shell_opts.has_key?(:noprofile) ? shell_opts[:noprofile] : 'FALSE'
54
70
  s = Savon::SOAP::XML.new
55
71
  s.version = 2
56
72
  s.namespaces.merge!(namespaces)
57
- h_opts = { "#{NS_WSMAN_DMTF}:OptionSet" => { "#{NS_WSMAN_DMTF}:Option" => ['FALSE',437],
73
+ h_opts = { "#{NS_WSMAN_DMTF}:OptionSet" => { "#{NS_WSMAN_DMTF}:Option" => [noprofile, codepage],
58
74
  :attributes! => {"#{NS_WSMAN_DMTF}:Option" => {'Name' => ['WINRS_NOPROFILE','WINRS_CODEPAGE']}}}}
59
75
  s.header.merge!(merge_headers(header,resource_uri_cmd,action_create,h_opts))
60
76
  s.input = "#{NS_WIN_SHELL}:Shell"
61
- s.body = { "#{NS_WIN_SHELL}:InputStreams" => i_stream,
62
- "#{NS_WIN_SHELL}:OutputStreams" => o_stream}
77
+ s.body = {
78
+ "#{NS_WIN_SHELL}:InputStreams" => i_stream,
79
+ "#{NS_WIN_SHELL}:OutputStreams" => o_stream
80
+ }
81
+ s.body["#{NS_WIN_SHELL}:WorkingDirectory"] = shell_opts[:working_directory] if shell_opts.has_key?(:working_directory)
82
+ # TODO: research Lifetime a bit more: http://msdn.microsoft.com/en-us/library/cc251546(v=PROT.13).aspx
83
+ #s.body["#{NS_WIN_SHELL}:Lifetime"] = Iso8601Duration.sec_to_dur(shell_opts[:lifetime]) if(shell_opts.has_key?(:lifetime) && shell_opts[:lifetime].is_a?(Fixnum))
84
+ # @todo make it so the input is given in milliseconds and converted to xs:duration
85
+ s.body["#{NS_WIN_SHELL}:IdleTimeOut"] = shell_opts[:idle_timeout] if(shell_opts.has_key?(:idle_timeout) && shell_opts[:idle_timeout].is_a?(String))
86
+ if(shell_opts.has_key?(:env_vars) && shell_opts[:env_vars].is_a?(Hash))
87
+ keys = shell_opts[:env_vars].keys
88
+ vals = shell_opts[:env_vars].values
89
+ s.body["#{NS_WIN_SHELL}:Environment"] = {
90
+ "#{NS_WIN_SHELL}:Variable" => vals,
91
+ :attributes! => {"#{NS_WIN_SHELL}:Variable" => {'Name' => keys}}
92
+ }
93
+ end
63
94
 
64
95
  resp = send_message(s.to_xml)
65
96
  (resp/"//*[@Name='ShellId']").text
@@ -70,12 +101,14 @@ module WinRM
70
101
  # @param [String] command The command to run on the remote machine
71
102
  # @param [Array<String>] arguments An array of arguments for this command
72
103
  # @return [String] The CommandId from the SOAP response. This is the ID we need to query in order to get output.
73
- def run_command(shell_id, command, arguments = [])
104
+ def run_command(shell_id, command, arguments = [], cmd_opts = {})
105
+ consolemode = cmd_opts.has_key?(:console_mode_stdin) ? cmd_opts[:console_mode_stdin] : 'TRUE'
106
+ skipcmd = cmd_opts.has_key?(:skip_cmd_shell) ? cmd_opts[:skip_cmd_shell] : 'FALSE'
74
107
  s = Savon::SOAP::XML.new
75
108
  s.version = 2
76
109
  s.namespaces.merge!(namespaces)
77
110
  h_opts = { "#{NS_WSMAN_DMTF}:OptionSet" => {
78
- "#{NS_WSMAN_DMTF}:Option" => ['TRUE','FALSE'],
111
+ "#{NS_WSMAN_DMTF}:Option" => [consolemode, skipcmd],
79
112
  :attributes! => {"#{NS_WSMAN_DMTF}:Option" => {'Name' => ['WINRS_CONSOLEMODE_STDIN','WINRS_SKIP_CMD_SHELL']}}}
80
113
  }
81
114
  s.header.merge!(merge_headers(header,resource_uri_cmd,action_command,h_opts,selector_shell_id(shell_id)))
@@ -177,9 +210,7 @@ module WinRM
177
210
  end
178
211
 
179
212
  resp = send_message(s.to_xml)
180
-
181
- resp.remove_namespaces!
182
- (resp/"//Fault").empty?
213
+ true
183
214
  end
184
215
 
185
216
  # Run a CMD command
@@ -219,6 +250,7 @@ module WinRM
219
250
  close_shell(shell_id)
220
251
  command_output
221
252
  end
253
+ alias :powershell :run_powershell_script
222
254
 
223
255
 
224
256
  # Run a WQL Query
@@ -250,6 +282,7 @@ module WinRM
250
282
  end
251
283
  items
252
284
  end
285
+ alias :wql :run_wql
253
286
 
254
287
 
255
288
  private
@@ -261,7 +294,9 @@ module WinRM
261
294
  'xmlns:x' => 'http://schemas.xmlsoap.org/ws/2004/09/transfer',
262
295
  'xmlns:w' => 'http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd',
263
296
  'xmlns:p' => 'http://schemas.microsoft.com/wbem/wsman/1/wsman.xsd',
264
- 'xmlns:rsp' => 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell'}
297
+ 'xmlns:rsp' => 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell',
298
+ 'xmlns:cfg' => 'http://schemas.microsoft.com/wbem/wsman/1/config',
299
+ }
265
300
  end
266
301
 
267
302
  def header
@@ -270,9 +305,10 @@ module WinRM
270
305
  "#{NS_ADDRESSING}:Address" => 'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous',
271
306
  :attributes! => {"#{NS_ADDRESSING}:Address" => {'mustUnderstand' => true}}},
272
307
  "#{NS_WSMAN_DMTF}:MaxEnvelopeSize" => @max_env_sz,
273
- "#{NS_ADDRESSING}:MessageID" => "uuid:#{UUID.generate.upcase}",
308
+ "#{NS_ADDRESSING}:MessageID" => "uuid:#{UUIDTools::UUID.random_create.to_s.upcase}",
274
309
  "#{NS_WSMAN_DMTF}:Locale/" => '',
275
310
  "#{NS_WSMAN_MSFT}:DataLocale/" => '',
311
+ #"#{NS_WSMAN_CONF}:MaxTimeoutms" => 600, #TODO: research this a bit http://msdn.microsoft.com/en-us/library/cc251561(v=PROT.13).aspx
276
312
  "#{NS_WSMAN_DMTF}:OperationTimeout" => @timeout,
277
313
  :attributes! => {
278
314
  "#{NS_WSMAN_DMTF}:MaxEnvelopeSize" => {'mustUnderstand' => true},
@@ -296,13 +332,19 @@ module WinRM
296
332
  def send_message(message)
297
333
  resp = @xfer.send_request(message)
298
334
 
299
- errors = resp/"//#{NS_SOAP_ENV}:Body/#{NS_SOAP_ENV}:Fault/*"
300
- if errors.empty?
301
- return resp
302
- else
303
- resp.root.add_namespace(NS_WSMAN_FAULT,'http://schemas.microsoft.com/wbem/wsman/1/wsmanfault')
304
- fault = (errors/"//#{NS_WSMAN_FAULT}:WSManFault").first
305
- raise WinRMWSManFault, "[WSMAN ERROR CODE: #{fault['Code']}]: #{fault.text}"
335
+ begin
336
+ errors = resp/"//#{NS_SOAP_ENV}:Body/#{NS_SOAP_ENV}:Fault/*"
337
+ if errors.empty?
338
+ return resp
339
+ else
340
+ resp.root.add_namespace(NS_WSMAN_FAULT,'http://schemas.microsoft.com/wbem/wsman/1/wsmanfault')
341
+ fault = (errors/"//#{NS_WSMAN_FAULT}:WSManFault").first
342
+ raise WinRMWSManFault, "[WSMAN ERROR CODE: #{fault['Code']}]: #{fault.text}"
343
+ end
344
+ # Sometimes a blank response is returned and it will throw this error when the XPath is evaluated for Fault
345
+ # The returned string will be '<?xml version="1.0"?>\n' in these cases
346
+ rescue Nokogiri::XML::XPath::SyntaxError => e
347
+ raise WinRMWebServiceError, "Bad SOAP Packet returned. Sometimes a retry will solve this error."
306
348
  end
307
349
  end
308
350
 
data/test/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format nested
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Test remote WQL features via WinRM" do
4
+ before(:all) do
5
+ @winrm = winrm_connection
6
+ end
7
+
8
+ it 'should run a CMD command string' do
9
+ output = @winrm.run_cmd('ipconfig /all')
10
+ output[:exitcode].should == 0
11
+ output[:data].should_not be_empty
12
+ end
13
+
14
+ it 'should run a CMD command with proper arguments' do
15
+ output = @winrm.run_cmd('ipconfig', %w{/all})
16
+ output[:exitcode].should == 0
17
+ output[:data].should_not be_empty
18
+ end
19
+
20
+ it 'should run a CMD command with block' do
21
+ outvar = ''
22
+ @winrm.run_cmd('ipconfig', %w{/all}) do |stdout, stderr|
23
+ outvar << stdout
24
+ end
25
+ outvar.should =~ /Windows IP Configuration/
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Test remote Powershell features via WinRM" do
4
+ before(:all) do
5
+ @winrm = winrm_connection
6
+ end
7
+
8
+ it 'should run a test Powershell script' do
9
+ ps_file = File.open('spec/test.ps1', 'r+')
10
+ output = @winrm.run_powershell_script(File.open('spec/test.ps1'))
11
+ ps_file.close
12
+ output[:exitcode].should == 0
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ $: << File.dirname(__FILE__) + '/../../lib/'
2
+ require 'winrm'
3
+ require 'json'
4
+
5
+ module ConnectionHelper
6
+ # To run this test put a file called 'creds.json' in this directory with the following format:
7
+ # {"user":"myuser","pass":"mypass","endpoint":"http://mysys.com/wsman","realm":"MY.REALM"}
8
+ CREDS_FILE='spec/creds.json'
9
+
10
+ def winrm_connection
11
+ creds = JSON.load(File.open(CREDS_FILE,'r'))
12
+ winrm = WinRM::WinRMWebService.new(creds['endpoint'], :kerberos, :realm => creds['realm'])
13
+ #winrm = WinRM::WinRMWebService.new(creds['endpoint'], :plaintext, :user => creds['user'], :pass => creds['pass'])
14
+ #winrm = WinRM::WinRMWebService.new(creds['endpoint'], :plaintext, :user => creds['user'], :pass => creds['pass'], :basic_auth_only => true)
15
+ winrm
16
+ end
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.include(ConnectionHelper)
21
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Test WinRM primitive methods" do
4
+ before(:all) do
5
+ @winrm = winrm_connection
6
+ end
7
+
8
+ it 'should #open_shell and #close_shell' do
9
+ sid = @winrm.open_shell
10
+ # match a UUID
11
+ sid.should =~ /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/
12
+ @winrm.close_shell(sid).should be_true
13
+ end
14
+
15
+ it 'should #run_command and #cleanup_command' do
16
+ sid = @winrm.open_shell
17
+
18
+ cmd_id = @winrm.run_command(sid, 'ipconfig', %w{/all})
19
+ cmd_id.should =~ /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/
20
+
21
+ @winrm.cleanup_command(sid, cmd_id).should be_true
22
+ @winrm.close_shell(sid)
23
+ end
24
+
25
+ it 'should #get_command_output' do
26
+ sid = @winrm.open_shell
27
+ cmd_id = @winrm.run_command(sid, 'ipconfig', %w{/all})
28
+
29
+ output = @winrm.get_command_output(sid, cmd_id)
30
+ output[:exitcode].should == 0
31
+ output[:data].should_not be_empty
32
+
33
+ @winrm.cleanup_command(sid, cmd_id)
34
+ @winrm.close_shell(sid)
35
+ end
36
+
37
+ it 'should #get_command_output with a block' do
38
+ sid = @winrm.open_shell
39
+ cmd_id = @winrm.run_command(sid, 'ipconfig', %w{/all})
40
+
41
+ outvar = ''
42
+ @winrm.get_command_output(sid, cmd_id) do |stdout, stderr|
43
+ outvar << stdout
44
+ end
45
+ outvar.should =~ /Windows IP Configuration/
46
+
47
+ @winrm.cleanup_command(sid, cmd_id)
48
+ @winrm.close_shell(sid)
49
+ end
50
+
51
+ it 'should set #op_timeout' do
52
+ @winrm.op_timeout(120).should == 'PT2M0S'
53
+ @winrm.op_timeout(1202).should == 'PT20M2S'
54
+ @winrm.op_timeout(86400).should == 'PT24H0S'
55
+ end
56
+
57
+ it 'should set #max_env_size' do
58
+ @winrm.max_env_size(153600 * 4)
59
+ @winrm.instance_variable_get('@max_env_sz').should == 614400
60
+ end
61
+
62
+ it 'should set #locale' do
63
+ @winrm.locale('en-ca')
64
+ @winrm.instance_variable_get('@locale').should == 'en-ca'
65
+ end
66
+
67
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Test remote WQL features via WinRM" do
4
+ before(:all) do
5
+ @winrm = winrm_connection
6
+ end
7
+
8
+ it 'should run a WQL query against Win32_Service' do
9
+ output = @winrm.run_wql('select Name,Status from Win32_Service')
10
+ output.should_not be_empty
11
+ end
12
+ end
data/winrm.gemspec CHANGED
@@ -24,10 +24,10 @@ Gem::Specification.new do |s|
24
24
  s.extra_rdoc_files = %w(README COPYING.txt)
25
25
 
26
26
  s.required_ruby_version = '>= 1.9.0'
27
- s.add_runtime_dependency 'gssapi', '>= 0.1.5'
28
- s.add_runtime_dependency 'nokogiri'
29
- s.add_runtime_dependency 'httpclient'
30
- s.add_runtime_dependency 'rubyntlm'
31
- s.add_runtime_dependency 'uuid'
32
- s.add_runtime_dependency 'savon'
27
+ s.add_runtime_dependency 'gssapi', '~> 0.1.5'
28
+ s.add_runtime_dependency 'nokogiri', '~> 1.4.4'
29
+ s.add_runtime_dependency 'httpclient', '~> 2.2.0.2'
30
+ s.add_runtime_dependency 'rubyntlm', '~> 0.1.1'
31
+ s.add_runtime_dependency 'uuidtools', '~> 2.1.2'
32
+ s.add_runtime_dependency 'savon', '~> 0.9.1'
33
33
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winrm
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: 5
5
- version: 1.0.0rc4
4
+ prerelease:
5
+ version: 1.0.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dan Wanek
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-30 00:00:00 -05:00
13
+ date: 2011-04-29 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirement: &id001 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
- - - ">="
22
+ - - ~>
23
23
  - !ruby/object:Gem::Version
24
24
  version: 0.1.5
25
25
  type: :runtime
@@ -30,9 +30,9 @@ dependencies:
30
30
  requirement: &id002 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
- - - ">="
33
+ - - ~>
34
34
  - !ruby/object:Gem::Version
35
- version: "0"
35
+ version: 1.4.4
36
36
  type: :runtime
37
37
  version_requirements: *id002
38
38
  - !ruby/object:Gem::Dependency
@@ -41,9 +41,9 @@ dependencies:
41
41
  requirement: &id003 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
- - - ">="
44
+ - - ~>
45
45
  - !ruby/object:Gem::Version
46
- version: "0"
46
+ version: 2.2.0.2
47
47
  type: :runtime
48
48
  version_requirements: *id003
49
49
  - !ruby/object:Gem::Dependency
@@ -52,20 +52,20 @@ dependencies:
52
52
  requirement: &id004 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
- - - ">="
55
+ - - ~>
56
56
  - !ruby/object:Gem::Version
57
- version: "0"
57
+ version: 0.1.1
58
58
  type: :runtime
59
59
  version_requirements: *id004
60
60
  - !ruby/object:Gem::Dependency
61
- name: uuid
61
+ name: uuidtools
62
62
  prerelease: false
63
63
  requirement: &id005 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
- - - ">="
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: "0"
68
+ version: 2.1.2
69
69
  type: :runtime
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
@@ -74,9 +74,9 @@ dependencies:
74
74
  requirement: &id006 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
- - - ">="
77
+ - - ~>
78
78
  - !ruby/object:Gem::Version
79
- version: "0"
79
+ version: 0.9.1
80
80
  type: :runtime
81
81
  version_requirements: *id006
82
82
  description: " Ruby library for Windows Remote Management\n"
@@ -89,6 +89,7 @@ extra_rdoc_files:
89
89
  - README
90
90
  - COPYING.txt
91
91
  files:
92
+ - .gitignore
92
93
  - COPYING.txt
93
94
  - README
94
95
  - Rakefile
@@ -100,10 +101,13 @@ files:
100
101
  - lib/winrm/soap_provider.rb
101
102
  - lib/winrm/winrm_service.rb
102
103
  - preamble
103
- - test/spec/powershell_tests.spec
104
- - test/spec/spec.opts
104
+ - test/.rspec
105
+ - test/spec/cmd_spec.rb
106
+ - test/spec/powershell_spec.rb
107
+ - test/spec/spec_helper.rb
105
108
  - test/spec/test.ps1
106
- - test/spec/wql_tests.spec
109
+ - test/spec/winrm_primitives_spec.rb
110
+ - test/spec/wql_spec.rb
107
111
  - winrm.gemspec
108
112
  has_rdoc: true
109
113
  homepage: http://github.com/zenchild/WinRM
@@ -126,9 +130,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
130
  required_rubygems_version: !ruby/object:Gem::Requirement
127
131
  none: false
128
132
  requirements:
129
- - - ">"
133
+ - - ">="
130
134
  - !ruby/object:Gem::Version
131
- version: 1.3.1
135
+ version: "0"
132
136
  requirements: []
133
137
 
134
138
  rubyforge_project:
@@ -1,25 +0,0 @@
1
- $: << File.dirname(__FILE__) + '/../../lib/'
2
- require 'kconv'
3
- require 'winrm'
4
- require 'json'
5
-
6
- # To run this test put a file called 'creds.json' in this directory with the following format:
7
- # {"user":"myuser","pass":"mypass","endpoint":"http://mysys.com/wsman"}
8
-
9
-
10
- describe "Test remote Powershell features via WinRM" do
11
- before(:all) do
12
- creds = JSON.load(File.open('spec/creds.json','r'))
13
- WinRM::WinRM.endpoint = creds['endpoint']
14
- WinRM::WinRM.set_auth(creds['user'],creds['pass'])
15
- WinRM::WinRM.set_ca_trust_path('/etc/ssl/certs')
16
- WinRM::WinRM.instance
17
- end
18
-
19
- it 'should run a test Powershell script' do
20
- winrm = WinRM::WinRM.instance
21
- output = winrm.powershell('spec/test.ps1')
22
- output[:exitcode].should eql(0)
23
- end
24
-
25
- end
data/test/spec/spec.opts DELETED
@@ -1,5 +0,0 @@
1
- spec/powershell_tests.spec
2
- spec/wql_tests.spec
3
- --format
4
- nested
5
- --color
@@ -1,24 +0,0 @@
1
- $: << File.dirname(__FILE__) + '/../../lib/'
2
- require 'kconv'
3
- require 'winrm'
4
- require 'json'
5
-
6
- # To run this test put a file called 'creds.json' in this directory with the following format:
7
- # {"user":"myuser","pass":"mypass","endpoint":"http://mysys.com/wsman"}
8
-
9
-
10
- describe "Test remote WQL features via WinRM" do
11
- before(:all) do
12
- creds = JSON.load(File.open('spec/creds.json','r'))
13
- WinRM::WinRM.endpoint = creds['endpoint']
14
- WinRM::WinRM.set_auth(creds['user'],creds['pass'])
15
- WinRM::WinRM.set_ca_trust_path('/etc/ssl/certs')
16
- WinRM::WinRM.instance
17
- end
18
-
19
- it 'should run a WQL query against Win32_Service' do
20
- winrm = WinRM::WinRM.instance
21
- output = winrm.wql('select Name,Status from Win32_Service')
22
- output.should_not be_empty
23
- end
24
- end