winrm 2.0.3 → 2.1.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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +10 -10
  3. data/.rubocop.yml +26 -26
  4. data/.travis.yml +11 -11
  5. data/Gemfile +3 -3
  6. data/README.md +260 -233
  7. data/Rakefile +34 -34
  8. data/Vagrantfile +6 -6
  9. data/WinrmAppveyor.psm1 +31 -31
  10. data/appveyor.yml +51 -51
  11. data/changelog.md +104 -101
  12. data/lib/winrm.rb +39 -39
  13. data/lib/winrm/connection.rb +83 -82
  14. data/lib/winrm/connection_opts.rb +91 -91
  15. data/lib/winrm/exceptions.rb +76 -76
  16. data/lib/winrm/http/response_handler.rb +96 -96
  17. data/lib/winrm/http/transport.rb +424 -424
  18. data/lib/winrm/http/transport_factory.rb +68 -68
  19. data/lib/winrm/output.rb +59 -59
  20. data/lib/winrm/psrp/create_pipeline.xml.erb +167 -167
  21. data/lib/winrm/psrp/fragment.rb +70 -70
  22. data/lib/winrm/psrp/init_runspace_pool.xml.erb +224 -224
  23. data/lib/winrm/psrp/message.rb +130 -130
  24. data/lib/winrm/psrp/message_data.rb +42 -42
  25. data/lib/winrm/psrp/message_data/base.rb +49 -49
  26. data/lib/winrm/psrp/message_data/error_record.rb +68 -68
  27. data/lib/winrm/psrp/message_data/pipeline_host_call.rb +32 -32
  28. data/lib/winrm/psrp/message_data/pipeline_output.rb +49 -49
  29. data/lib/winrm/psrp/message_data/pipeline_state.rb +40 -40
  30. data/lib/winrm/psrp/message_data/runspacepool_host_call.rb +32 -32
  31. data/lib/winrm/psrp/message_data/runspacepool_state.rb +39 -39
  32. data/lib/winrm/psrp/message_data/session_capability.rb +36 -36
  33. data/lib/winrm/psrp/message_defragmenter.rb +62 -62
  34. data/lib/winrm/psrp/message_factory.rb +75 -75
  35. data/lib/winrm/psrp/message_fragmenter.rb +60 -60
  36. data/lib/winrm/psrp/powershell_output_decoder.rb +139 -139
  37. data/lib/winrm/psrp/receive_response_reader.rb +97 -97
  38. data/lib/winrm/psrp/session_capability.xml.erb +7 -7
  39. data/lib/winrm/psrp/uuid.rb +40 -40
  40. data/lib/winrm/shells/base.rb +180 -175
  41. data/lib/winrm/shells/cmd.rb +65 -65
  42. data/lib/winrm/shells/power_shell.rb +202 -202
  43. data/lib/winrm/shells/retryable.rb +45 -45
  44. data/lib/winrm/shells/shell_factory.rb +58 -50
  45. data/lib/winrm/version.rb +7 -7
  46. data/lib/winrm/wsmv/base.rb +59 -59
  47. data/lib/winrm/wsmv/cleanup_command.rb +61 -61
  48. data/lib/winrm/wsmv/close_shell.rb +50 -50
  49. data/lib/winrm/wsmv/command.rb +101 -101
  50. data/lib/winrm/wsmv/command_output.rb +76 -76
  51. data/lib/winrm/wsmv/command_output_decoder.rb +55 -55
  52. data/lib/winrm/wsmv/configuration.rb +46 -46
  53. data/lib/winrm/wsmv/create_pipeline.rb +66 -66
  54. data/lib/winrm/wsmv/create_shell.rb +119 -119
  55. data/lib/winrm/wsmv/header.rb +203 -203
  56. data/lib/winrm/wsmv/init_runspace_pool.rb +95 -95
  57. data/lib/winrm/wsmv/iso8601_duration.rb +60 -60
  58. data/lib/winrm/wsmv/keep_alive.rb +68 -68
  59. data/lib/winrm/wsmv/receive_response_reader.rb +126 -126
  60. data/lib/winrm/wsmv/send_data.rb +68 -68
  61. data/lib/winrm/wsmv/soap.rb +51 -51
  62. data/lib/winrm/wsmv/wql_query.rb +79 -79
  63. data/lib/winrm/wsmv/write_stdin.rb +88 -88
  64. data/tests/integration/auth_timeout_spec.rb +18 -18
  65. data/tests/integration/cmd_spec.rb +131 -110
  66. data/tests/integration/config-example.yml +16 -16
  67. data/tests/integration/issue_59_spec.rb +26 -26
  68. data/tests/integration/powershell_spec.rb +165 -165
  69. data/tests/integration/spec_helper.rb +65 -65
  70. data/tests/integration/transport_spec.rb +99 -99
  71. data/tests/integration/wql_spec.rb +16 -16
  72. data/tests/matchers.rb +60 -60
  73. data/tests/spec/configuration_spec.rb +184 -184
  74. data/tests/spec/connection_spec.rb +39 -39
  75. data/tests/spec/exception_spec.rb +50 -50
  76. data/tests/spec/http/transport_factory_spec.rb +68 -68
  77. data/tests/spec/http/transport_spec.rb +44 -44
  78. data/tests/spec/output_spec.rb +127 -127
  79. data/tests/spec/psrp/fragment_spec.rb +62 -62
  80. data/tests/spec/psrp/message_data/base_spec.rb +13 -13
  81. data/tests/spec/psrp/message_data/error_record_spec.rb +41 -41
  82. data/tests/spec/psrp/message_data/pipeline_host_call_spec.rb +25 -25
  83. data/tests/spec/psrp/message_data/pipeline_output_spec.rb +32 -32
  84. data/tests/spec/psrp/message_data/pipeline_state_spec.rb +40 -40
  85. data/tests/spec/psrp/message_data/runspace_pool_host_call_spec.rb +25 -25
  86. data/tests/spec/psrp/message_data/runspacepool_state_spec.rb +16 -16
  87. data/tests/spec/psrp/message_data/session_capability_spec.rb +30 -30
  88. data/tests/spec/psrp/message_data_spec.rb +35 -35
  89. data/tests/spec/psrp/message_defragmenter_spec.rb +47 -47
  90. data/tests/spec/psrp/message_fragmenter_spec.rb +105 -105
  91. data/tests/spec/psrp/powershell_output_decoder_spec.rb +100 -100
  92. data/tests/spec/psrp/psrp_message_spec.rb +70 -70
  93. data/tests/spec/psrp/recieve_response_reader_spec.rb +172 -172
  94. data/tests/spec/psrp/uuid_spec.rb +28 -28
  95. data/tests/spec/response_handler_spec.rb +61 -61
  96. data/tests/spec/shells/base_spec.rb +202 -202
  97. data/tests/spec/shells/cmd_spec.rb +75 -75
  98. data/tests/spec/shells/powershell_spec.rb +175 -175
  99. data/tests/spec/spec_helper.rb +47 -47
  100. data/tests/spec/stubs/clixml/error_record.xml.erb +84 -84
  101. data/tests/spec/stubs/clixml/pipeline_state.xml.erb +88 -88
  102. data/tests/spec/stubs/responses/get_command_output_response.xml.erb +13 -13
  103. data/tests/spec/stubs/responses/get_command_output_response_not_done.xml.erb +10 -10
  104. data/tests/spec/stubs/responses/get_powershell_keepalive_response.xml.erb +10 -10
  105. data/tests/spec/stubs/responses/get_powershell_output_response.xml.erb +12 -12
  106. data/tests/spec/stubs/responses/get_powershell_output_response_not_done.xml.erb +9 -9
  107. data/tests/spec/stubs/responses/open_shell_v1.xml +19 -19
  108. data/tests/spec/stubs/responses/open_shell_v2.xml +20 -20
  109. data/tests/spec/stubs/responses/soap_fault_v1.xml +36 -36
  110. data/tests/spec/stubs/responses/soap_fault_v2.xml +42 -42
  111. data/tests/spec/stubs/responses/wmi_error_v2.xml +41 -41
  112. data/tests/spec/wsmv/cleanup_command_spec.rb +22 -22
  113. data/tests/spec/wsmv/close_shell_spec.rb +17 -17
  114. data/tests/spec/wsmv/command_output_decoder_spec.rb +37 -37
  115. data/tests/spec/wsmv/command_output_spec.rb +45 -45
  116. data/tests/spec/wsmv/command_spec.rb +19 -19
  117. data/tests/spec/wsmv/configuration_spec.rb +17 -17
  118. data/tests/spec/wsmv/create_pipeline_spec.rb +31 -31
  119. data/tests/spec/wsmv/create_shell_spec.rb +38 -38
  120. data/tests/spec/wsmv/init_runspace_pool_spec.rb +36 -36
  121. data/tests/spec/wsmv/keep_alive_spec.rb +21 -21
  122. data/tests/spec/wsmv/receive_response_reader_spec.rb +123 -123
  123. data/tests/spec/wsmv/send_data_spec.rb +30 -30
  124. data/tests/spec/wsmv/wql_query_spec.rb +13 -13
  125. data/tests/spec/wsmv/write_stdin_spec.rb +22 -22
  126. data/winrm.gemspec +42 -42
  127. metadata +2 -2
@@ -1,55 +1,55 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require 'base64'
18
-
19
- module WinRM
20
- module WSMV
21
- # Handles decoding a raw output response
22
- class CommandOutputDecoder
23
- # Decode the raw SOAP output into decoded and human consumable text,
24
- # Decodes and replaces invalid unicode characters.
25
- # @param raw_output [String] The raw encoded output
26
- # @return [String] The decoded output
27
- def decode(raw_output)
28
- decoded_text = decode_raw_output(raw_output)
29
- decoded_text = handle_invalid_encoding(decoded_text)
30
- decoded_text = remove_bom(decoded_text)
31
- decoded_text
32
- end
33
-
34
- private
35
-
36
- def decode_raw_output(raw_output)
37
- Base64.decode64(raw_output).force_encoding('utf-8')
38
- end
39
-
40
- def handle_invalid_encoding(decoded_text)
41
- return decoded_text if decoded_text.valid_encoding?
42
- if decoded_text.respond_to?(:scrub)
43
- decoded_text.scrub
44
- else
45
- decoded_text.encode('utf-16', invalid: :replace, undef: :replace).encode('utf-8')
46
- end
47
- end
48
-
49
- def remove_bom(decoded_text)
50
- # remove BOM which 2008R2 applies
51
- decoded_text.sub("\xEF\xBB\xBF", '')
52
- end
53
- end
54
- end
55
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'base64'
18
+
19
+ module WinRM
20
+ module WSMV
21
+ # Handles decoding a raw output response
22
+ class CommandOutputDecoder
23
+ # Decode the raw SOAP output into decoded and human consumable text,
24
+ # Decodes and replaces invalid unicode characters.
25
+ # @param raw_output [String] The raw encoded output
26
+ # @return [String] The decoded output
27
+ def decode(raw_output)
28
+ decoded_text = decode_raw_output(raw_output)
29
+ decoded_text = handle_invalid_encoding(decoded_text)
30
+ decoded_text = remove_bom(decoded_text)
31
+ decoded_text
32
+ end
33
+
34
+ private
35
+
36
+ def decode_raw_output(raw_output)
37
+ Base64.decode64(raw_output).force_encoding('utf-8')
38
+ end
39
+
40
+ def handle_invalid_encoding(decoded_text)
41
+ return decoded_text if decoded_text.valid_encoding?
42
+ if decoded_text.respond_to?(:scrub)
43
+ decoded_text.scrub
44
+ else
45
+ decoded_text.encode('utf-16', invalid: :replace, undef: :replace).encode('utf-8')
46
+ end
47
+ end
48
+
49
+ def remove_bom(decoded_text)
50
+ # remove BOM which 2008R2 applies
51
+ decoded_text.sub("\xEF\xBB\xBF", '')
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,46 +1,46 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
-
19
- module WinRM
20
- module WSMV
21
- # WSMV keep alive message
22
- class Configuration < Base
23
- def initialize(session_opts)
24
- @session_opts = session_opts
25
- end
26
-
27
- protected
28
-
29
- def create_header(header)
30
- header << Gyoku.xml(configuration_headers)
31
- end
32
-
33
- def create_body(_body)
34
- # no body
35
- end
36
-
37
- private
38
-
39
- def configuration_headers
40
- merge_headers(shared_headers(@session_opts),
41
- resource_uri_shell('http://schemas.microsoft.com/wbem/wsman/1/config'),
42
- action_get)
43
- end
44
- end
45
- end
46
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+
19
+ module WinRM
20
+ module WSMV
21
+ # WSMV keep alive message
22
+ class Configuration < Base
23
+ def initialize(session_opts)
24
+ @session_opts = session_opts
25
+ end
26
+
27
+ protected
28
+
29
+ def create_header(header)
30
+ header << Gyoku.xml(configuration_headers)
31
+ end
32
+
33
+ def create_body(_body)
34
+ # no body
35
+ end
36
+
37
+ private
38
+
39
+ def configuration_headers
40
+ merge_headers(shared_headers(@session_opts),
41
+ resource_uri_shell('http://schemas.microsoft.com/wbem/wsman/1/config'),
42
+ action_get)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,66 +1,66 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
- require_relative '../psrp/message_factory'
19
-
20
- module WinRM
21
- module WSMV
22
- # WSMV message to execute a command via psrp
23
- class CreatePipeline < Base
24
- attr_accessor :shell_id, :command_id, :fragment
25
-
26
- def initialize(session_opts, shell_id, command_id, fragment = nil)
27
- @command_id = command_id
28
- @session_opts = session_opts
29
- @shell_id = shell_id
30
- @fragment = fragment
31
- end
32
-
33
- protected
34
-
35
- def create_header(header)
36
- header << Gyoku.xml(command_headers)
37
- end
38
-
39
- def create_body(body)
40
- body.tag!("#{NS_WIN_SHELL}:CommandLine", 'CommandId' => command_id) do |cl|
41
- cl << Gyoku.xml(command_body)
42
- end
43
- end
44
-
45
- private
46
-
47
- def command_body
48
- {
49
- "#{NS_WIN_SHELL}:Command" => 'Invoke-Expression',
50
- "#{NS_WIN_SHELL}:Arguments" => arguments
51
- }
52
- end
53
-
54
- def command_headers
55
- merge_headers(shared_headers(@session_opts),
56
- resource_uri_shell(RESOURCE_URI_POWERSHELL),
57
- action_command,
58
- selector_shell_id(shell_id))
59
- end
60
-
61
- def arguments
62
- encode_bytes(fragment.bytes) if fragment
63
- end
64
- end
65
- end
66
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Matt Wrock <matt@mattwrock.com>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+ require_relative '../psrp/message_factory'
19
+
20
+ module WinRM
21
+ module WSMV
22
+ # WSMV message to execute a command via psrp
23
+ class CreatePipeline < Base
24
+ attr_accessor :shell_id, :command_id, :fragment
25
+
26
+ def initialize(session_opts, shell_id, command_id, fragment = nil)
27
+ @command_id = command_id
28
+ @session_opts = session_opts
29
+ @shell_id = shell_id
30
+ @fragment = fragment
31
+ end
32
+
33
+ protected
34
+
35
+ def create_header(header)
36
+ header << Gyoku.xml(command_headers)
37
+ end
38
+
39
+ def create_body(body)
40
+ body.tag!("#{NS_WIN_SHELL}:CommandLine", 'CommandId' => command_id) do |cl|
41
+ cl << Gyoku.xml(command_body)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def command_body
48
+ {
49
+ "#{NS_WIN_SHELL}:Command" => 'Invoke-Expression',
50
+ "#{NS_WIN_SHELL}:Arguments" => arguments
51
+ }
52
+ end
53
+
54
+ def command_headers
55
+ merge_headers(shared_headers(@session_opts),
56
+ resource_uri_shell(RESOURCE_URI_POWERSHELL),
57
+ action_command,
58
+ selector_shell_id(shell_id))
59
+ end
60
+
61
+ def arguments
62
+ encode_bytes(fragment.bytes) if fragment
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,119 +1,119 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- require_relative 'base'
18
- require_relative 'iso8601_duration'
19
-
20
- module WinRM
21
- module WSMV
22
- # WSMV message to create a remote shell
23
- class CreateShell < Base
24
- # utf8 as default codepage
25
- # https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx
26
- UTF8_CODE_PAGE = 65001
27
-
28
- attr_accessor :i_stream, :o_stream, :codepage, :noprofile
29
- attr_accessor :working_directory, :idle_timeout, :env_vars
30
-
31
- def initialize(session_opts, shell_opts = {})
32
- @session_opts = session_opts
33
- @shell_uri = opt_or_default(shell_opts, :shell_uri, RESOURCE_URI_CMD)
34
- @i_stream = opt_or_default(shell_opts, :i_stream, 'stdin')
35
- @o_stream = opt_or_default(shell_opts, :o_stream, 'stdout stderr')
36
- @codepage = opt_or_default(shell_opts, :codepage, UTF8_CODE_PAGE)
37
- @noprofile = opt_or_default(shell_opts, :noprofile, 'FALSE')
38
- @working_directory = opt_or_default(shell_opts, :working_directory)
39
- @idle_timeout = opt_or_default(shell_opts, :idle_timeout)
40
- @env_vars = opt_or_default(shell_opts, :env_vars)
41
- end
42
-
43
- protected
44
-
45
- def create_header(header)
46
- header << Gyoku.xml(shell_headers)
47
- end
48
-
49
- def create_body(body)
50
- body.tag!("#{NS_WIN_SHELL}:Shell") { |s| s << Gyoku.xml(shell_body) }
51
- end
52
-
53
- private
54
-
55
- def opt_or_default(shell_opts, key, default_value = nil)
56
- shell_opts.key?(key) ? shell_opts[key] : default_value
57
- end
58
-
59
- def shell_body
60
- body = {
61
- "#{NS_WIN_SHELL}:InputStreams" => @i_stream,
62
- "#{NS_WIN_SHELL}:OutputStreams" => @o_stream
63
- }
64
- body["#{NS_WIN_SHELL}:WorkingDirectory"] = @working_directory if @working_directory
65
- if @idle_timeout
66
- body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout)
67
- end
68
- body["#{NS_WIN_SHELL}:Environment"] = environment_vars_body if @env_vars
69
- body
70
- end
71
-
72
- # backwards compat - idle_timeout as an Iso8601Duration string
73
- def format_idle_timeout(timeout)
74
- timeout.is_a?(String) ? timeout : Iso8601Duration.sec_to_dur(timeout)
75
- end
76
-
77
- def environment_vars_body
78
- {
79
- "#{NS_WIN_SHELL}:Variable" => @env_vars.values,
80
- :attributes! => {
81
- "#{NS_WIN_SHELL}:Variable" => {
82
- 'Name' => @env_vars.keys
83
- }
84
- }
85
- }
86
- end
87
-
88
- def shell_headers
89
- merge_headers(shared_headers(@session_opts),
90
- resource_uri_shell(@shell_uri),
91
- action_create,
92
- header_opts)
93
- end
94
-
95
- def action_create
96
- {
97
- "#{NS_ADDRESSING}:Action" => 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Create',
98
- :attributes! => {
99
- "#{NS_ADDRESSING}:Action" => {
100
- 'mustUnderstand' => true
101
- }
102
- }
103
- }
104
- end
105
-
106
- def header_opts
107
- {
108
- "#{NS_WSMAN_DMTF}:OptionSet" => {
109
- "#{NS_WSMAN_DMTF}:Option" => [@noprofile, @codepage], :attributes! => {
110
- "#{NS_WSMAN_DMTF}:Option" => {
111
- 'Name' => %w(WINRS_NOPROFILE WINRS_CODEPAGE)
112
- }
113
- }
114
- }
115
- }
116
- end
117
- end
118
- end
119
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright 2016 Shawn Neal <sneal@sneal.net>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'base'
18
+ require_relative 'iso8601_duration'
19
+
20
+ module WinRM
21
+ module WSMV
22
+ # WSMV message to create a remote shell
23
+ class CreateShell < Base
24
+ # utf8 as default codepage
25
+ # https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx
26
+ UTF8_CODE_PAGE = 65001
27
+
28
+ attr_accessor :i_stream, :o_stream, :codepage, :noprofile
29
+ attr_accessor :working_directory, :idle_timeout, :env_vars
30
+
31
+ def initialize(session_opts, shell_opts = {})
32
+ @session_opts = session_opts
33
+ @shell_uri = opt_or_default(shell_opts, :shell_uri, RESOURCE_URI_CMD)
34
+ @i_stream = opt_or_default(shell_opts, :i_stream, 'stdin')
35
+ @o_stream = opt_or_default(shell_opts, :o_stream, 'stdout stderr')
36
+ @codepage = opt_or_default(shell_opts, :codepage, UTF8_CODE_PAGE)
37
+ @noprofile = opt_or_default(shell_opts, :noprofile, 'FALSE')
38
+ @working_directory = opt_or_default(shell_opts, :working_directory)
39
+ @idle_timeout = opt_or_default(shell_opts, :idle_timeout)
40
+ @env_vars = opt_or_default(shell_opts, :env_vars)
41
+ end
42
+
43
+ protected
44
+
45
+ def create_header(header)
46
+ header << Gyoku.xml(shell_headers)
47
+ end
48
+
49
+ def create_body(body)
50
+ body.tag!("#{NS_WIN_SHELL}:Shell") { |s| s << Gyoku.xml(shell_body) }
51
+ end
52
+
53
+ private
54
+
55
+ def opt_or_default(shell_opts, key, default_value = nil)
56
+ shell_opts.key?(key) ? shell_opts[key] : default_value
57
+ end
58
+
59
+ def shell_body
60
+ body = {
61
+ "#{NS_WIN_SHELL}:InputStreams" => @i_stream,
62
+ "#{NS_WIN_SHELL}:OutputStreams" => @o_stream
63
+ }
64
+ body["#{NS_WIN_SHELL}:WorkingDirectory"] = @working_directory if @working_directory
65
+ if @idle_timeout
66
+ body["#{NS_WIN_SHELL}:IdleTimeOut"] = format_idle_timeout(@idle_timeout)
67
+ end
68
+ body["#{NS_WIN_SHELL}:Environment"] = environment_vars_body if @env_vars
69
+ body
70
+ end
71
+
72
+ # backwards compat - idle_timeout as an Iso8601Duration string
73
+ def format_idle_timeout(timeout)
74
+ timeout.is_a?(String) ? timeout : Iso8601Duration.sec_to_dur(timeout)
75
+ end
76
+
77
+ def environment_vars_body
78
+ {
79
+ "#{NS_WIN_SHELL}:Variable" => @env_vars.values,
80
+ :attributes! => {
81
+ "#{NS_WIN_SHELL}:Variable" => {
82
+ 'Name' => @env_vars.keys
83
+ }
84
+ }
85
+ }
86
+ end
87
+
88
+ def shell_headers
89
+ merge_headers(shared_headers(@session_opts),
90
+ resource_uri_shell(@shell_uri),
91
+ action_create,
92
+ header_opts)
93
+ end
94
+
95
+ def action_create
96
+ {
97
+ "#{NS_ADDRESSING}:Action" => 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Create',
98
+ :attributes! => {
99
+ "#{NS_ADDRESSING}:Action" => {
100
+ 'mustUnderstand' => true
101
+ }
102
+ }
103
+ }
104
+ end
105
+
106
+ def header_opts
107
+ {
108
+ "#{NS_WSMAN_DMTF}:OptionSet" => {
109
+ "#{NS_WSMAN_DMTF}:Option" => [@noprofile, @codepage], :attributes! => {
110
+ "#{NS_WSMAN_DMTF}:Option" => {
111
+ 'Name' => %w(WINRS_NOPROFILE WINRS_CODEPAGE)
112
+ }
113
+ }
114
+ }
115
+ }
116
+ end
117
+ end
118
+ end
119
+ end