# flake8: noqa
import os
import uuid
import xmltodict
from pytest import skip, fixture
from mock import patch
open_shell_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.xmlsoap.org/ws/2004/09/transfer/Create
FALSE
437
stdin
stdout stderr
"""
open_shell_response = """\
http://schemas.xmlsoap.org/ws/2004/09/transfer/CreateResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
http://windows-host:5985/wsman
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
11111111-1111-1111-1111-111111111113
"""
close_shell_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete
11111111-1111-1111-1111-111111111113
"""
close_shell_response = """\
http://schemas.xmlsoap.org/ws/2004/09/transfer/DeleteResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
"""
run_cmd_with_args_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command
11111111-1111-1111-1111-111111111113
TRUE
FALSE
ipconfig
/all
"""
run_cmd_wo_args_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command
11111111-1111-1111-1111-111111111113
TRUE
FALSE
hostname
"""
run_cmd_ps_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
11111111-1111-1111-1111-1111111111%s4
"""
# PS request is Write-Error "Error"
run_ps_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command
11111111-1111-1111-1111-111111111113
TRUE
FALSE
powershell -encodedcommand VwByAGkAdABlAC0ARQByAHIAbwByACAAIgBFAHIAcgBvAHIAIgA=
"""
cleanup_cmd_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal
11111111-1111-1111-1111-111111111113
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/signal/terminate
"""
cleanup_cmd_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/SignalResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
"""
get_cmd_ps_output_request = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive
11111111-1111-1111-1111-111111111113
stdout stderr
"""
get_cmd_output_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/ReceiveResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
DQpXaW5kb3dzIElQIENvbmZpZ3VyYXRpb24NCg0K
ICAgSG9zdCBOYW1lIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogV0lORE9XUy1IT1NUCiAgIFByaW1hcnkgRG5zIFN1ZmZpeCAgLiAuIC4gLiAuIC4gLiA6IAogICBOb2RlIFR5cGUgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBIeWJyaWQKICAgSVAgUm91dGluZyBFbmFibGVkLiAuIC4gLiAuIC4gLiAuIDogTm8KICAgV0lOUyBQcm94eSBFbmFibGVkLiAuIC4gLiAuIC4gLiAuIDogTm8KCkV0aGVybmV0IGFkYXB0ZXIgTG9jYWwgQXJlYSBDb25uZWN0aW9uOgoKICAgQ29ubmVjdGlvbi1zcGVjaWZpYyBETlMgU3VmZml4ICAuIDogCiAgIERlc2NyaXB0aW9uIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IEludGVsKFIpIDgyNTY3Vi0yIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCiAgIFBoeXNpY2FsIEFkZHJlc3MuIC4gLiAuIC4gLiAuIC4gLiA6IEY4LTBGLTQxLTE2LTg4LUU4CiAgIERIQ1AgRW5hYmxlZC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IE5vCiAgIEF1dG9jb25maWd1cmF0aW9uIEVuYWJsZWQgLiAuIC4gLiA6IFllcwogICBMaW5rLWxvY2FsIElQdjYgQWRkcmVzcyAuIC4gLiAuIC4gOiBmZTgwOjphOTkwOjM1ZTM6YTZhYjpmYzE1JTEwKFByZWZlcnJlZCkgCiAgIElQdjQgQWRkcmVzcy4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IDE3My4xODUuMTUzLjkzKFByZWZlcnJlZCkgCiAgIFN1Ym5ldCBNYXNrIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IDI1NS4yNTUuMjU1LjI0OAogICBEZWZhdWx0IEdhdGV3YXkgLiAuIC4gLiAuIC4gLiAuIC4gOiAxNzMuMTg1LjE1My44OQogICBESENQdjYgSUFJRCAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiAyNTExMzc4NTcKICAgREhDUHY2IENsaWVudCBEVUlELiAuIC4gLiAuIC4gLiAuIDogMDAtMDEtMDAtMDEtMTYtM0ItM0YtQzItRjgtMEYtNDEtMTYtODgtRTgKICAgRE5TIFNlcnZlcnMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogMjA3LjkxLjUuMzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4LjY3LjIyMi4yMjIKICAgTmV0QklPUyBvdmVyIFRjcGlwLiAuIC4gLiAuIC4gLiAuIDogRW5hYmxlZAoKRXRoZXJuZXQgYWRhcHRlciBMb2NhbCBBcmVhIENvbm5lY3Rpb24qIDk6CgogICBNZWRpYSBTdGF0ZSAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBNZWRpYSBkaXNjb25uZWN0ZWQKICAgQ29ubmVjdGlvbi1zcGVjaWZpYyBETlMgU3VmZml4ICAuIDogCiAgIERlc2NyaXB0aW9uIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IEp1bmlwZXIgTmV0d29yayBDb25uZWN0IFZpcnR1YWwgQWRhcHRlcgogICBQaHlzaWNhbCBBZGRyZXNzLiAuIC4gLiAuIC4gLiAuIC4gOiAwMC1GRi1BMC04My00OC0wNAogICBESENQIEVuYWJsZWQuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBZZXMKICAgQXV0b2NvbmZpZ3VyYXRpb24gRW5hYmxlZCAuIC4gLiAuIDogWWVzCgpUdW5uZWwgYWRhcHRlciBpc2F0YXAue0FBNDI2QjM3LTM2OTUtNEVCOC05OTBGLTRDRkFDODQ1RkQxN306CgogICBNZWRpYSBTdGF0ZSAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBNZWRpYSBkaXNjb25uZWN0ZWQKICAgQ29ubmVjdGlvbi1zcGVjaWZpYyBETlMgU3VmZml4ICAuIDogCiAgIERlc2NyaXB0aW9uIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IE1pY3Jvc29mdCBJU0FUQVAgQWRhcHRlcgogICBQaHlzaWNhbCBBZGRyZXNzLiAuIC4gLiAuIC4gLiAuIC4gOiAwMC0wMC0wMC0wMC0wMC0wMC0wMC1FMAogICBESENQIEVuYWJsZWQuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBObwogICBBdXRvY29uZmlndXJhdGlvbiBFbmFibGVkIC4gLiAuIC4gOiBZZXMKClR1bm5lbCBhZGFwdGVyIFRlcmVkbyBUdW5uZWxpbmcgUHNldWRvLUludGVyZmFjZToKCiAgIENvbm5lY3Rpb24tc3BlY2lmaWMgRE5TIFN1ZmZpeCAgLiA6IAogICBEZXNjcmlwdGlvbiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBUZXJlZG8gVHVubmVsaW5nIFBzZXVkby1JbnRlcmZhY2UKICAgUGh5c2ljYWwgQWRkcmVzcy4gLiAuIC4gLiAuIC4gLiAuIDogMDAtMDAtMDAtMDAtMDAtMDAtMDAtRTAKICAgREhDUCBFbmFibGVkLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogTm8KICAgQXV0b2NvbmZpZ3VyYXRpb24gRW5hYmxlZCAuIC4gLiAuIDogWWVzCiAgIElQdjYgQWRkcmVzcy4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IDIwMDE6MDo5ZDM4Ojk1M2M6MmNlZjo3ZmM6NTI0Njo2NmEyKFByZWZlcnJlZCkgCiAgIExpbmstbG9jYWwgSVB2NiBBZGRyZXNzIC4gLiAuIC4gLiA6IGZlODA6OjJjZWY6N2ZjOjUyNDY6NjZhMiUxMyhQcmVmZXJyZWQpIAogICBEZWZhdWx0IEdhdGV3YXkgLiAuIC4gLiAuIC4gLiAuIC4gOiAKICAgTmV0QklPUyBvdmVyIFRjcGlwLiAuIC4gLiAuIC4gLiAuIDogRGlzYWJsZWQKClR1bm5lbCBhZGFwdGVyIDZUTzQgQWRhcHRlcjoKCiAgIENvbm5lY3Rpb24tc3BlY2lmaWMgRE5TIFN1ZmZpeCAgLiA6IAogICBEZXNjcmlwdGlvbiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiBNaWNyb3NvZnQgNnRvNCBBZGFwdGVyICMyCiAgIFBoeXNpY2FsIEFkZHJlc3MuIC4gLiAuIC4gLiAuIC4gLiA6IDAwLTAwLTAwLTAwLTAwLTAwLTAwLUUwCiAgIERIQ1AgRW5hYmxlZC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IE5vCiAgIEF1dG9jb25maWd1cmF0aW9uIEVuYWJsZWQgLiAuIC4gLiA6IFllcwogICBJUHY2IEFkZHJlc3MuIC4gLiAuIC4gLiAuIC4gLiAuIC4gOiAyMDAyOmFkYjk6OTk1ZDo6YWRiOTo5OTVkKFByZWZlcnJlZCkgCiAgIERlZmF1bHQgR2F0ZXdheSAuIC4gLiAuIC4gLiAuIC4gLiA6IDIwMDI6YzA1ODo2MzAxOjpjMDU4OjYzMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMjpjMDU4OjYzMDE6OjEKICAgRE5TIFNlcnZlcnMgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogMjA3LjkxLjUuMzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4LjY3LjIyMi4yMjIKICAgTmV0QklPUyBvdmVyIFRjcGlwLiAuIC4gLiAuIC4gLiAuIDogRGlzYWJsZWQKClR1bm5lbCBhZGFwdGVyIGlzYXRhcC57QkExNjBGQzUtNzAyOC00QjFGLUEwNEItMUFDODAyQjBGRjVBfToKCiAgIE1lZGlhIFN0YXRlIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IE1lZGlhIGRpc2Nvbm5lY3RlZAogICBDb25uZWN0aW9uLXNwZWNpZmljIEROUyBTdWZmaXggIC4gOiAKICAgRGVzY3JpcHRpb24gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIDogTWljcm9zb2Z0IElTQVRBUCBBZGFwdGVyICMyCiAgIFBoeXNpY2FsIEFkZHJlc3MuIC4gLiAuIC4gLiAuIC4gLiA6IDAwLTAwLTAwLTAwLTAwLTAwLTAwLUUwCiAgIERIQ1AgRW5hYmxlZC4gLiAuIC4gLiAuIC4gLiAuIC4gLiA6IE5vCiAgIEF1dG9jb25maWd1cmF0aW9uIEVuYWJsZWQgLiAuIC4gLiA6IFllcwo=
0
"""
get_ps_output_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/ReceiveResponse
uuid:11111111-1111-1111-1111-111111111112
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
IzwgQ0xJWE1MDQo=
PE9ianMgVmVyc2lvbj0iMS4xLjAuMSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vcG93ZXJzaGVsbC8yMDA0LzA0Ij48UyBTPSJFcnJvciI+V3JpdGUtRXJyb3IgIkVycm9yIiA6IEVycm9yX3gwMDBEX194MDAwQV88L1M+PFMgUz0iRXJyb3IiPiAgICArIENhdGVnb3J5SW5mbyAgICAgICAgICA6IE5vdFNwZWNpZmllZDogKDopIFtXcml0ZS1FcnJvcl0sIFdyaXRlRXJyb3JFeGNlcCBfeDAwMERfX3gwMDBBXzwvUz48UyBTPSJFcnJvciI+ICAgdGlvbl94MDAwRF9feDAwMEFfPC9TPjxTIFM9IkVycm9yIj4gICAgKyBGdWxseVF1YWxpZmllZEVycm9ySWQgOiBNaWNyb3NvZnQuUG93ZXJTaGVsbC5Db21tYW5kcy5Xcml0ZUVycm9yRXhjZXB0aW8gX3gwMDBEX194MDAwQV88L1M+PFMgUz0iRXJyb3IiPiAgIG5feDAwMERfX3gwMDBBXzwvUz48UyBTPSJFcnJvciI+IF94MDAwRF9feDAwMEFfPC9TPjwvT2Jqcz4=
1
"""
run_cmd_req_input = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command
11111111-1111-1111-1111-111111111113
TRUE
FALSE
cmd
"""
run_cmd_req_input_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/CommandResponse
uuid:11111111-1111-1111-1111-111111111114
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111112
11111111-1111-1111-1111-111111111111
"""
run_cmd_send_input = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Send
11111111-1111-1111-1111-111111111113
ZWNobyAiaGVsbG8gd29ybGQiICYmIGV4aXQNCg==
"""
run_cmd_send_input_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/SendResponse
uuid:72371E37-E073-474B-B4BA-6559D8D94632
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:9c3de121-c3a4-452b-8f82-36b84e25b7fe
"""
run_cmd_send_input_get_output = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive
11111111-1111-1111-1111-111111111113
stdout stderr
"""
run_cmd_send_input_get_output_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/ReceiveResponse
uuid:6468086A-377E-4BE3-AC71-1155F0F1D4E1
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:02f258b6-186f-4ac0-adc3-51550a131e64
TWljcm9zb2Z0IFdpbmRvd3MgW1ZlcnNpb24gMTAuMC4xNzc2My4xMDdd
DQooYykgMjAxOCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQoNCkM6XFVzZXJzXHJ3ZWJlcj5lY2hvIGhlbGxvIHdvcmxkICYmIGV4aXQNCmhlbGxvIHdvcmxkIA0K
0
"""
stdin_cmd_cleanup = """\
http://windows-host:5985/wsman
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
153600
uuid:11111111-1111-1111-1111-111111111111
PT20S
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Signal
11111111-1111-1111-1111-111111111113
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/signal/terminate
"""
stdin_cmd_cleanup_response = """\
http://schemas.microsoft.com/wbem/wsman/1/windows/shell/SignalResponse
uuid:8A875405-3494-4400-A988-B47A563922E7
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
uuid:11111111-1111-1111-1111-111111111111
"""
def sort_dict(ordered_dict):
items = sorted(ordered_dict.items(), key=lambda x: x[0])
ordered_dict.clear()
for key, value in items:
if isinstance(value, dict):
sort_dict(value)
ordered_dict[key] = value
def xml_str_compare(first, second):
first_dict = xmltodict.parse(first)
second_dict = xmltodict.parse(second)
sort_dict(first_dict)
sort_dict(second_dict)
return first_dict == second_dict
class TransportStub(object):
def send_message(self, message):
if xml_str_compare(message, open_shell_request):
return open_shell_response
elif xml_str_compare(message, close_shell_request):
return close_shell_response
elif xml_str_compare(
message, run_cmd_with_args_request) or xml_str_compare(
message, run_cmd_wo_args_request):
return run_cmd_ps_response % '1'
elif xml_str_compare(message, run_ps_request):
return run_cmd_ps_response % '2'
elif xml_str_compare(
message, cleanup_cmd_request % '1') or xml_str_compare(
message, cleanup_cmd_request % '2'):
return cleanup_cmd_response
elif xml_str_compare(message, get_cmd_ps_output_request % '1'):
return get_cmd_output_response
elif xml_str_compare(message, get_cmd_ps_output_request % '2'):
return get_ps_output_response
elif xml_str_compare(message, run_cmd_req_input):
return run_cmd_req_input_response
elif xml_str_compare(message, run_cmd_send_input):
return run_cmd_send_input_response
elif xml_str_compare(message, run_cmd_send_input_get_output):
return run_cmd_send_input_get_output_response
elif xml_str_compare(message, stdin_cmd_cleanup):
return stdin_cmd_cleanup_response
else:
raise Exception('Message was not expected\n\n%s' % message)
def close_session(self):
pass
@fixture(scope='module')
def protocol_fake(request):
uuid4_patcher = patch('uuid.uuid4')
uuid4_mock = uuid4_patcher.start()
uuid4_mock.return_value = uuid.UUID(
'11111111-1111-1111-1111-111111111111')
from winrm.protocol import Protocol
protocol_fake = Protocol(
endpoint='http://windows-host:5985/wsman',
transport='plaintext',
username='john.smith',
password='secret')
protocol_fake.transport = TransportStub()
def uuid4_patch_stop():
uuid4_patcher.stop()
request.addfinalizer(uuid4_patch_stop)
return protocol_fake
@fixture(scope='module')
def protocol_real():
endpoint = os.environ.get('WINRM_ENDPOINT', None)
transport = os.environ.get('WINRM_TRANSPORT', None)
username = os.environ.get('WINRM_USERNAME', None)
password = os.environ.get('WINRM_PASSWORD', None)
if endpoint:
settings = dict(
endpoint=endpoint,
operation_timeout_sec=5,
read_timeout_sec=7
)
if transport:
settings['transport'] = transport
if username:
settings['username'] = username
if password:
settings['password'] = password
from winrm.protocol import Protocol
protocol = Protocol(**settings)
return protocol
else:
skip('WINRM_ENDPOINT environment variable was not set. Integration tests will be skipped')