{ "info": { "author": "Jordan Borean", "author_email": "jborean93@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "pypsrp - Python PowerShell Remoting Protocol Client library\n===========================================================\n\n`Build Status `__ `Build\nstatus `__\n`Coverage Status `__\n\npypsrp is a Python client for the PowerShell Remoting Protocol (PSRP)\nand Windows Remove Management (WinRM) service. It allows your to execute\ncommands on a remote Windows host from any machine that can run Python.\n\nThis library exposes 4 different types of APIs;\n\n- A simple client API that can copy files to and from the remote\n Windows host as well as execute processes and PowerShell scripts\n- A WSMan interface to execute various WSMan calls like ``Send``,\n ``Create``, ``Connect``, ``Disconnect``, etc\n- A Windows Remote Shell (WinRS) layer that executes cmd commands and\n executables using the base WinRM protocol\n- A PowerShell Remoting Protocol (PSRP) layer allows you to create\n remote Runspace Pools and PowerShell pipelines\n\nAt a basic level, you can use this library to;\n\n- Execute a cmd command\n- Run another executable\n- Execute PowerShell scripts\n- Copy a file from the localhost to the remote Windows host\n- Fetch a file from the remote Windows host to the localhost\n- Create a Runspace Pool that contains one or multiple PowerShell\n pipelines and execute them asynchronously\n- Support for a reference host base implementation of PSRP for\n interactive scripts\n\nCurrently this library only supports the WSMan transport method but is\ndesigned to support SSH at some point in the future (PR\u2019s are welcome).\nBy default it supports the following authentication methods with WSMan;\n\n- Basic\n- Certificate\n- NTLM\n\nIt also supports ``Negotiate/Kerberos``, and ``CredSSP`` but require\nextra libraries to be isntalled.\n\nRequirements\n------------\n\nSee ``How to Install`` for more details\n\n- CPython 2.6-2.7, 3.4-3.7\n- `cryptography `__\n- `requests `__\n- `ntlm-auth `__\n- `six `__\n\n*Note: while Python 2.6 is supported it may be dropped in the future if\nit is too much work in the future. You should really be using at least\nPython 2.7 but preferably Python 3.5+*\n\nOptional Requirements\n~~~~~~~~~~~~~~~~~~~~~\n\nThe following Python libraries can be installed to add extra features\nthat do not come with the base package\n\n- `python-gssapi `__ for\n Kerberos authentication on Linux\n- `pywin32 `__ for Kerberos\n authentication on Windows\n- `requests-credssp `__\n for CredSSP authentication\n\nHow to Install\n--------------\n\nTo install pypsrp with all basic features, run\n\n::\n\n pip install pypsrp\n\nKerberos Authentication\n~~~~~~~~~~~~~~~~~~~~~~~\n\nWhile pypsrp supports Kerberos authentication, it isn\u2019t included by\ndefault due to it\u2019s reliance on system packages to be present.\n\nTo install these packages, run the below\n\nFor Debian/Ubuntu\n\n::\n\n # For Python 2\n apt-get install gcc python-dev libkrb5-dev\n\n # For Python 3\n apt-get install gcc python3-dev libkrb5-dev\n\n # To add NTLM to the GSSAPI SPNEGO auth run\n apt-get install gss-ntlmssp\n\nFor RHEL/Centos\n\n::\n\n yum install gcc python-devel krb5-devel\n\n # To add NTLM to the GSSAPI SPNEGO auth run\n yum install gssntlmssp\n\nFor Fedora\n\n::\n\n dnf install gcc python-devel krb5-devel\n\n # To add NTLM to the GSSAPI SPNEGO auth run\n dnf install gssntlmssp\n\nFor Arch Linux\n\n::\n\n pacman -S gcc krb5\n\nOnce installed you can install the Python packages with\n\n::\n\n pip install pypsrp[kerberos]\n\nFor Windows, running the pip install command above is usually enough but\nthere are cases where this will fail. The alternative is to the binary\nbased on the `recent release of\npywin32 `__ instead of\ninstalling through pip.\n\nKerberos also needs to be configured to talk to the domain but that is\noutside the scope of this page.\n\nCredSSP Authentication\n~~~~~~~~~~~~~~~~~~~~~~\n\nLike Kerberos auth, CredSSP is supported but isn\u2019t included by default.\nTo add support for CredSSP auth try to run the following\n\n::\n\n pip install pypsrp[credssp]\n\nIf that fails you may need to update pip and setuptools to a newer\nversion ``pip install -U pip setuptools``, otherwise the following\nsystem package may be required;\n\n::\n\n # For Debian/Ubuntu\n apt-get install gcc python-dev\n\n # For RHEL/Centos\n yum install gcc python-devel\n\n # For Fedora\n dnf install gcc python-devel\n\nHow to Use\n----------\n\nThere are 3 main components that are in use within this library;\n\n- ``Transport``: Handles the raw transport of messages to and from the\n server\n- ``Shell``: Handles the WSMV or PSRP protocol details used to create\n the remote shell that processes are run on, uses ``Connection`` to\n send the details\n- ``Process``: Runs the process or script within a shell\n\nConnection\n~~~~~~~~~~\n\nCurrently only the connection that is supported is the WSMan protocol\nover HTTP through ``pypsrp.wsman.WSMan`` and offers mostly all the same\nfeatures in the WSMV spec including;\n\n- Basic, Certificate, Negotiate, Kerberos, and CredSSP authentication\n- TLS encryption\n- Message encryption with Negotiate, Kerberos, and CredSSP\n authentication\n- Definable proxy\n\nThese are the options that can be used to setup ``WSMan``;\n\n- ``server``: The hostname or IP address of the host to connect to\n- ``max_envelope_size``: The maximum envelope size, in bytes, that can\n be sent to the server, default is ``153600``\n- ``operation_timeout``: The operation timeout, in seconds, of each\n WSMan operation, default is ``20``. This should always be lower than\n ``read_timeout``.\n- ``port``: The port to connect to, default is ``5986`` if ``ssl=True``\n else ``5985``\n- ``username``: The username to connect with, required for all auths\n except ``certificate`` and optionally required for\n ``negotiate/kerberos``\n- ``password``: The password for ``username``. Due to a bug on\n MacOS/Heimdal GSSAPI implementations, this will persist in the user\u2019s\n ccache when using Negotiate or Kerberos authentication, run\n ``kdestroy`` manually to remove this\n- ``ssl``: Whether to connect over ``https`` or ``https``, default is\n ``True``\n- ``path``: The WinRM path to connect to, default is ``wsman``\n- ``auth``: The authentication protocol to use, default is\n ``negotiate``, choices are ``basic``, ``certificate``, ``negotiate``,\n ``ntlm``, ``kerberos``, ``credssp``\n- ``cert_validation``: Whether to validate the server\u2019s SSL\n certificate, default is ``True``. Can be ``False`` to not validate or\n a path to a PEM file of trusted certificates\n- ``connection_timeout``: The timeout for creating a HTTP connection,\n default is ``30``\n- ``read_timeout``: The timeout for receiving a response from the\n server after a request has been made, default is ``30``\n- ``encryption``: Controls the encryption settings, default is\n ``auto``, choices are ``auto``, ``always``, ``never``. Set to\n ``always`` to always run message encryption even over HTTPS,\n ``never`` to never use message encryption even over HTTP\n- ``proxy``: The proxy URL used to connect to the remote host\n- ``no_proxy``: Whether to ignore any environment proxy variable and\n connect directly to the host, default is ``False``\n- ``locale``: The ``wsmv:Locale`` value to set on each WSMan request.\n This specifies the language in which the cleint wants response text\n to be translated, default is ``en-US``\n- ``data_locale``: The ``wsmv:DataLocale`` value to set on each WSMan\n request. This specifies the format in which numerical data is\n presented in the response text, default is the value of ``locale``\n- ``reconnection_retries``: Number of retries on a connection problem,\n default is ``0``\n- ``reconnection_backoff``: Number of seconds to backoff in between\n reconnection attempts (first sleeps X, then sleeps 2\\ *X, 4*\\ X, 8*X,\n \u2026), default is ``2.0``\n- ``certificate_key_pem``: The path to the certificate key used in\n ``certificate`` authentication\n- ``certificate_pem``: The path to the certificate used in\n ``certificate`` authentication\n- ``credssp_auth_mechanism``: The sub-auth mechanism used in CredSSP,\n default is ``auto``, choices are ``auto``, ``ntlm``, or ``kerberos``\n- ``credssp_disable_tlsv1_2``: Whether to used CredSSP auth over the\n insecure TLSv1.0, default is ``False``\n- ``credssp_minimum_version``: The minimum CredSSP server version that\n the client will connect to, default is ``2``\n- ``negotiate_delegate``: Whether to negotiate the credential to the\n host, default is ``False``. This is only valid if ``negotiate`` auth\n negotiated Kerberos or ``kerberos`` was explicitly set\n- ``negotiate_hostname_override``: The hostname used to calculate the\n host SPN when authenticating the host with Kerberos auth. This is\n only valid if ``negotiate`` auth negotiated Kerberos or ``kerberos``\n was explicitly set\n- ``negotiate_send_cbt``: Whether to binding the channel binding token\n (HTTPS only) to the auth or ignore, default is ``True``\n- ``negotiate_service``: Override the service part of the calculated\n SPN used when authenticating the server, default is ``WSMAN``. This\n is only valid if ``negotiate`` auth negotiated Kerberos or\n ``kerberos`` was explicitly set\n\nWhen running over HTTP, this library will enforce encryption by default\nbut if that is not supported (Basic auth) or isn\u2019t available on the host\nthen either use HTTPS or disable encryption with ``encryption=\"never\"``.\n\nThere are plans to add support for SSH as a connection but this still\nneeds to be implemented. SSH will work on hosts that are running\nPowerShell Core but not the standard PowerShell.\n\nShell\n~~~~~\n\nThere are two shells that can be used in this library,\n``pypsrp.shell.WinRS`` and ``pypsrp.powershell.RunspacePool``.\n\n``WinRS`` is a cmd shell that can be used to issue cmd commands,\nincluding but not limited to other executables. Here are the options\nthat can be used to configure a ``WinRS`` shell;\n\n- ``wsman``: WinRS only works over WSMan, so this is the\n ``pypsrp.wsman.WSMan`` object to run the commands over\n- ``resource_uri``: The resource uri of the shell, defaults to\n ``http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd``\n- ``id``: The ID if the shell, this should be kept as ``None`` as it is\n created dynamically by the server\n- ``input_streams``: The input stream(s) of the shell, default is\n ``stdin``\n- ``output_streams``: The output stream(s) of the shell, default is\n ``stdout, stderr``\n- ``codepage``: The codepage of the shell, default is the default of\n the host\n- ``environment``: A dictionary of environment key/values to set for\n the remote shell\n- ``idle_time_out``: THe idle timeout in seconds of the shell\n- ``lifetime``: The total lifetime of the shell\n- ``name``: The name (description only) of the shell\n- ``no_profile``: Whether to create the shell with the user profile\n loaded or not\n- ``working_directory``: The default working directory of the created\n shell\n\n``RunspacePool`` is a shell used by the PSRP protocol, it is designed to\nbe a close implementation of the .NET\n`System.Management.Automation.Runspaces.RunspacePool `__\nclass. The methods and properties are similar and can mostly do the same\nthing. Here are the options that can be used to configure a\n``RunspacePool`` shell;\n\n- ``connection``: The connection object used by the RunspacePool to\n send commands to the remote server, currently only supports ``WSMan``\n- ``apartment_state``: The int value of\n ``pypsrp.complex_objects.ApartmentState`` for the remote thread,\n default is ``UNKNOWN``\n- ``thread_options``: The int value of\n ``pypsrp.complex_objects.ThreadOptions`` that specifies the type of\n thread to create, default is ``DEFAULT``\n- ``host``: The local host info implementation, default is no host\n- ``configuration_name``: The configuration name to connect to, default\n is ``Microsoft.PowerShell`` and can be used to specify the Just\n Enough Administration (JEA) to connect to\n- ``min_runspaces``: The minimuum number of runspaces that a pool can\n hold, default is 1\n- ``max_runspaces``: The maximum number of runspaces that a pool can\n hold. Each PowerShell pipeline is run in a single Runspace, default\n is 1\n- ``session_key_timeout_ms``: The maximum time to wait for a session\n key transfer from the server\n\nProcess\n~~~~~~~\n\nThere are two process objects that can be used, ``pypsrp.shell.Process``\nfor the ``WinRS`` shell and ``pypsrp.powershell.PowerShell`` for the\n``RunspacePool`` shell. These objects are ultimately used to execute\ncommands, processes, or scripts on the remote host.\n\n``Process`` is used with the ``WinRS`` shell to execute a cmd command or\nanother executable. The following options are used to configure the\n``Process`` object;\n\n- ``shell``: The ``WinRS`` shell the process is run over\n- ``executable``: The executable or command to run\n- ``arguments``: A list of arguments to the executable or command,\n default is no arguments\n- ``id``: The ID of the created command, if not specified then this is\n dynamically created\n- ``no_shell``: Whether to create a command in the cmd shell or bypass\n it, default is ``False``. If ``True`` then the executable must be the\n full path to the exe. This only works on older OS\u2019 before 2012 R2\n (not including)\n\nTo execute the process, call ``.invoke()``, the ``stdout``, ``stderr``,\nand ``rc`` properties contain the output of the command once complete.\n\n``PowerShell`` is used by the PSRP protocol, it is designed to be a\nclose implementation of the\n`System.Management.Automation.PowerShell `__\nclass. The methods and properties are similar and can mostly do the same\nthing. Here are the options that can be used to configure a\n``PowerShell`` process;\n\n- ``runspace_pool``: The ``RunspacePool`` object to run the\n ``PowerShell`` process on\n\nTo execute the process, call ``.invoke()``, the ``output``,\n``had_erros``, and ``streams`` contains the execution status and output\ninformation of the process. Before invoke can be called, cmdlets or\nscripts must be added. These can be done with the following methods;\n\n- ``add_script``: Add a raw PowerShell script to the pending commands\n- ``add_cmdlet``: Add a cmdlet to the pending commands\n- ``add_parameters``: Add a dictionary of key/value parameters to the\n last added command\n- ``add_argument``: Add a value argument to the last added command\n- ``add_statement``: Set the last command/script to be the end of that\n pipeline so the next command/script is like a newline\n\nSee the examples below for more details.\n\nExamples\n~~~~~~~~\n\nHow to use the high level client API\n\n.. code:: python\n\n from pypsrp.client import Client\n\n # this takes in the same kwargs as the WSMan object\n client = Client(\"server\", username=\"user\", password=\"password\")\n\n # execute a cmd command\n stdout, stderr, rc = client.execute_cmd(\"dir\")\n\n stdout, stderr, rc = client.execute_cmd(\"powershell.exe gci $pwd\")\n sanitised_stderr = client.sanitise_clixml(stderr)\n\n # execute a PowerShell script\n output, streams, had_errors = client.execute_ps('''$path = \"%s\"\n if (Test-Path -Path $path) {\n Remove-Item -Path $path -Force -Recurse\n }\n New-Item -Path $path -ItemType Directory''' % path)\n output, streams, had_errors = client.execute_ps(\"New-Item -Path C:\\\\temp\\\\folder -ItemType Directory\")\n\n # copy a file from the local host to the remote host\n client.copy(\"~/file.txt\", \"C:\\\\temp\\\\file.txt\")\n\n # fetch a file from the remote host to the local host\n client.fetch(\"C:\\\\temp\\\\file.txt\", \"~/file.txt\")\n\nHow to use WinRS/Process to execute a command\n\n.. code:: python\n\n from pypsrp.shell import Process, SignalCode, WinRS\n from pypsrp.wsman import WSMan\n\n # creates a http connection with no encryption and basic auth\n wsman = WSMan(\"server\", ssl=False, auth=\"basic\", encryption=\"never\",\n username=\"vagrant\", password=\"vagrant\")\n\n with WinRS(wsman) as shell:\n process = Process(shell, \"dir\")\n process.invoke()\n process.signal(SignalCode.CTRL_C)\n\n # execute a process with arguments in the background\n process = Process(shell, \"powershell\", [\"gci\", \"$pwd\"])\n process.begin_invoke() # start the invocation and return immediately\n process.poll_invoke() # update the output stream\n process.end_invoke() # finally wait until the process is finished\n process.signal(SignalCode.CTRL_C)\n\nHow to use RunspacePool/PowerShell to execute a PowerShell\nscript/command\n\n.. code:: python\n\n from pypsrp.powershell import PowerShell, RunspacePool\n from pypsrp.wsman import WSMan\n\n # creates a https connection with explicit kerberos auth and implicit credentials\n wsman = WSMan(\"server\", auth=\"kerberos\", cert_validation=False))\n\n with RunspacePool(wsman) as pool:\n # execute 'Get-Process | Select-Object Name'\n ps = PowerShell(pool)\n ps.add_cmdlet(\"Get-Process\").add_cmdlet(\"Select-Object\").add_argument(\"Name\")\n output = ps.invoke()\n\n # execute 'Get-Process | Select-Object -Property Name'\n ps.add_cmdlet(\"Get-Process\").add_cmdlet(\"Select-Object\")\n ps.add_parameter(\"Property\", \"Name\")\n ps.begin_invoke() # execute process in the background\n ps.poll_invoke() # update the output streams\n ps.end_invoke() # wait until the process is finished\n\n # execute 'Get-Process | Select-Object -Property Name; Get-Service audiosrv'\n ps.add_cmdlet(\"Get-Process\").add_cmdlet(\"Select-Object\").add_parameter(\"Property\", \"Name\")\n ps.add_statement()\n ps.add_cmdlet(\"Get-Service\").add_argument(\"audiosrc\")\n ps.invoke()\n\n # execute a PowerShell script with input being sent\n script = '''begin {\n $DebugPreference = \"Continue\"\n Write-Debug -Message \"begin\"\n } process {\n Write-Output -InputObject $input\n } end {\n Write-Debug -Message \"end\"\n }\n '''\n ps.add_script(script)\n ps.invoke([\"string\", 1])\n print(ps.output)\n print(ps.streams.debug)\n\nLogging\n-------\n\nThis library takes advantage of the Python logging configuration and\nmessages are logged to the ``pypsrp`` named logger as well as\n``pypsrp.*`` where ``*`` is each Python script in the ``pypsrp``\ndirectory.\n\nAn easy way to turn on logging for the entire library is to create the\nfollowing JSON file and run your script with\n``PYPSRP_LOG_CFG=log.json python script.py`` (this does not work with\nPython 2.6).\n\n.. code:: json\n\n {\n \"version\": 1,\n \"disable_existing_loggers\": false,\n \"formatters\": {\n \"simple\": {\n \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n }\n },\n\n \"handlers\": {\n \"console\": {\n \"class\": \"logging.StreamHandler\",\n \"level\": \"DEBUG\",\n \"formatter\": \"simple\",\n \"stream\": \"ext://sys.stdout\"\n }\n },\n\n \"loggers\": {\n \"pypsrp\": {\n \"level\": \"DEBUG\",\n \"handlers\": [\"console\"],\n \"propagate\": \"no\"\n }\n }\n }\n\nYou can adjust the log level by changing the level value in ``logger``\nto ``INFO``.\n\n*Note: ``DEBUG`` contains a lot of information and will output all the\nmessages sent to and from the client. This can have the side effect of\nleaking sensitive information and should only be used for debugging\npurposes.*\n\nTesting\n-------\n\nAny changes are more than welcome in pull request form, you can run the\ncurrent test suite with tox like so;\n\n::\n\n # make sure tox is installed\n pip install tox\n\n # run the tox suite\n tox\n\n # or run the test manually for the current Python environment\n py.test -v --pep8 --cov pypsrp --cov-report term-missing\n\nA lot of the tests either simulate a remote Windows host but you can\nalso run a lot of them against a real Windows host. To do this, set the\nfollowing environment variables before running the tests;\n\n- ``PYPSRP_SERVER``: The hostname or IP of the remote host\n- ``PYPSRP_USERNAME``: The username to connect with\n- ``PYPSRP_PASSWORD``: The password to connect with\n- ``PYPSRR_PORT``: The port to connect with (default: ``5986``)\n- ``PYPSRP_AUTH``: The authentication protocol to auth with (default:\n ``negotiate``)\n\nThere are further integration tests that require a specific host setup\nto run correctly. You can use ``Vagrant`` to set this host up. This is\ndone by running the following commands;\n\n::\n\n # download the Vagrant box and start it up based on the Vagrantfile\n vagrant up\n\n # once the above script is complete run the following\n vagrant ssh # password is vagrant\n\n powershell.exe\n Register-PSSessionConfiguration -Path \"C:\\Users\\vagrant\\Documents\\JEARoleSettings.pssc\" -Name JEARole -Force\n\n $sec_pass = ConvertTo-SecureString -String \"vagrant\" -AsPlainText -Force\n $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList \"vagrant\", $sec_pass\n $thumbprint = (Get-ChildItem -Path Cert:\\LocalMachine\\TrustedPeople)[0].Thumbprint\n\n New-Item -Path WSMan:\\localhost\\ClientCertificate `\n -Subject \"vagrant@localhost\" `\n -URI * `\n -Issuer $thumbprint `\n -Credential $credential `\n -Force\n\n\n # exit the remote PowerShell session\n exit\n\n # exist the SSH session\n exit\n\nOnce complete, set the following environment variables to run the\nintegration tests;\n\n- ``PYPSRP_RUN_INTEGRATION``: To any value\n- ``PYPSRP_SERVER``: Set to ``127.0.0.1``\n- ``PYPSRP_USERNAME``: Set to ``vagrant``\n- ``PYPSRP_PASSWORD``: Set to ``vagrant``\n- ``PYPSRP_HTTP_PORT``: Set to ``55985``\n- ``PYPSRP_HTTPS_PORT``: Set to ``55986``\n- ``PYPSRP_CERT_DIR``: Set to the full path of the project directory\n\nFrom here you can run the normal test suite and it will run all the\nintegration tests.\n\nBacklog\n-------\n\n- Look into adding SSH as a transport option\n- Live interactive console for PSRP\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jborean93/pypsrp", "keywords": "winrm psrp winrs windows", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pypsrp", "package_url": "https://pypi.org/project/pypsrp/", "platform": "", "project_url": "https://pypi.org/project/pypsrp/", "project_urls": { "Homepage": "https://github.com/jborean93/pypsrp" }, "release_url": "https://pypi.org/project/pypsrp/0.4.0/", "requires_dist": [ "cryptography", "ntlm-auth (>=1.2.0)", "requests (>=2.9.1)", "six", "lxml (<4.3.0) ; python_version<\"2.7\"", "ipaddress ; python_version<=\"2.7\"", "requests-credssp (>=1.0.0) ; extra == 'credssp'", "gssapi (>=1.5.0) ; (sys_platform!=\"win32\") and extra == 'kerberos'", "pywin32 ; (sys_platform==\"win32\") and extra == 'kerberos'" ], "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "summary": "PowerShell Remoting Protocol and WinRM for Python", "version": "0.4.0" }, "last_serial": 5853705, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "508d7a441fb57895515a416c6483c89a", "sha256": "a3430f84d88b3bf959ee3315c1306d39dde4968bae11649bc409bbf7bccddb26" }, "downloads": -1, "filename": "pypsrp-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "508d7a441fb57895515a416c6483c89a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 86116, "upload_time": "2018-07-13T03:17:52", "url": "https://files.pythonhosted.org/packages/16/f4/14a2c66a3e108c60ce31ff142b4e2dea12f1ae3938c54a27bd74514805e5/pypsrp-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd7cc73b3a6ffd174a2b41ce60f82492", "sha256": "1fbbfdd26646c26c9306e0d9332828bc7bdc802f2a68b5ca2ff2ffd66d01cc41" }, "downloads": -1, "filename": "pypsrp-0.1.0.tar.gz", "has_sig": false, "md5_digest": "dd7cc73b3a6ffd174a2b41ce60f82492", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89707, "upload_time": "2018-07-13T03:17:53", "url": "https://files.pythonhosted.org/packages/fc/33/9371071b2b18297b0d5f6fd4bd4504afd6515ade898fa865e61745ed84ad/pypsrp-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "92b39bcd02df86c3556309b245c6ca6f", "sha256": "2250e281fb7e8a03bc8f1becad269bd8ecd39e5d84830dd44fb2c1b3b231725c" }, "downloads": -1, "filename": "pypsrp-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "92b39bcd02df86c3556309b245c6ca6f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 87043, "upload_time": "2018-09-11T19:57:34", "url": "https://files.pythonhosted.org/packages/1f/02/dc8ba696dcfdbc584b644386f9607b31547195378bde4da4ca130da947a7/pypsrp-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d028b069ab1d624078272c3c5f6b27b", "sha256": "8cefbe45cc4e130ff8003ca3baed3e40f0b80809dcd510b37d5a134fa320b01d" }, "downloads": -1, "filename": "pypsrp-0.2.0.tar.gz", "has_sig": false, "md5_digest": "2d028b069ab1d624078272c3c5f6b27b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 90882, "upload_time": "2018-09-11T19:57:36", "url": "https://files.pythonhosted.org/packages/1c/13/d7768fd1d540a842ff00ebe23be581cc296402a22335929fa28723b5ba2c/pypsrp-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "103f6f512918622e890311150ba66ec4", "sha256": "34c6a832e46baa016c115165c9af1e132d9b717e5d39a327d57c41cd6233b3d8" }, "downloads": -1, "filename": "pypsrp-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "103f6f512918622e890311150ba66ec4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 87804, "upload_time": "2018-11-14T07:39:51", "url": "https://files.pythonhosted.org/packages/37/fb/4d084dda49301248b21e413a47105f1dbcc9fc57eefd4b78baeb0a54fb3a/pypsrp-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d96bd90d2f266017fb4038c3da39374a", "sha256": "6fc06096d9a4ed0d447041ef31889b01d09b70d244cf8267c07cd6e61ecad1f9" }, "downloads": -1, "filename": "pypsrp-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d96bd90d2f266017fb4038c3da39374a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91733, "upload_time": "2018-11-14T07:39:53", "url": "https://files.pythonhosted.org/packages/27/fa/9d6f185a80ca8a388fe3b4149f5bded0734dfcd118c1a7a51ce1034e8e19/pypsrp-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "7d68d06edcf2b458c8e42d32e34458b5", "sha256": "309853380fe086090a03cc6662a778ee69b1cae355ae4a932859034fd76e9d0b" }, "downloads": -1, "filename": "pypsrp-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7d68d06edcf2b458c8e42d32e34458b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 88379, "upload_time": "2019-02-26T06:36:53", "url": "https://files.pythonhosted.org/packages/3c/c6/71a3edd4cefbf80c3513c97067e554fa5a74180e5eb02371a0ac8f9d56bc/pypsrp-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ea4c2799968e76b675056489870a867", "sha256": "90f946254f547dc3493cea8493c819ab87e152a755797c93aa2668678ba8ae85" }, "downloads": -1, "filename": "pypsrp-0.3.1.tar.gz", "has_sig": false, "md5_digest": "2ea4c2799968e76b675056489870a867", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 92841, "upload_time": "2019-02-26T06:36:55", "url": "https://files.pythonhosted.org/packages/84/c6/7f37b225228ccff49ca7c67a07de721a92d5bab22c8c89560299cf393971/pypsrp-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "678787add7fde5176f8790562d844487", "sha256": "f42919247fb80f7dc24c552560d7c24e754d15326030c9e3b7b94f51cfa4dc69" }, "downloads": -1, "filename": "pypsrp-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "678787add7fde5176f8790562d844487", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 91517, "upload_time": "2019-09-19T03:04:46", "url": "https://files.pythonhosted.org/packages/b2/2b/911279da6d3d98695550c59c45eb341e30dbe896fd66b7e77932c5530f85/pypsrp-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9417ac94dfc126d9785633adfb950436", "sha256": "64b5bdd725a9744c821483b05ecd266f6417f4c6e90ee961a08838480f7d025e" }, "downloads": -1, "filename": "pypsrp-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9417ac94dfc126d9785633adfb950436", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 94952, "upload_time": "2019-09-19T03:04:49", "url": "https://files.pythonhosted.org/packages/f7/73/e116b8f1a5a2580d920bce5b1e3ad846b999ed68001f964d227647261f3d/pypsrp-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "678787add7fde5176f8790562d844487", "sha256": "f42919247fb80f7dc24c552560d7c24e754d15326030c9e3b7b94f51cfa4dc69" }, "downloads": -1, "filename": "pypsrp-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "678787add7fde5176f8790562d844487", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 91517, "upload_time": "2019-09-19T03:04:46", "url": "https://files.pythonhosted.org/packages/b2/2b/911279da6d3d98695550c59c45eb341e30dbe896fd66b7e77932c5530f85/pypsrp-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9417ac94dfc126d9785633adfb950436", "sha256": "64b5bdd725a9744c821483b05ecd266f6417f4c6e90ee961a08838480f7d025e" }, "downloads": -1, "filename": "pypsrp-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9417ac94dfc126d9785633adfb950436", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*", "size": 94952, "upload_time": "2019-09-19T03:04:49", "url": "https://files.pythonhosted.org/packages/f7/73/e116b8f1a5a2580d920bce5b1e3ad846b999ed68001f964d227647261f3d/pypsrp-0.4.0.tar.gz" } ] }