ansible-pylibssh


Nameansible-pylibssh JSON
Version 1.3.0 PyPI version JSON
download
home_pagehttps://github.com/ansible/pylibssh
SummaryPython bindings for libssh client specific to Ansible use case
upload_time2025-10-12 01:09:16
maintainerNone
docs_urlNone
authorAnsible, Inc.
requires_python>=3.9
licenseLGPLv2+
keywords cython cext libssh
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            .. image:: https://img.shields.io/pypi/v/ansible-pylibssh.svg?logo=Python&logoColor=white
   :target: https://pypi.org/project/ansible-pylibssh

.. image:: https://img.shields.io/badge/license-LGPL+-blue.svg?maxAge=3600
   :target: https://pypi.org/project/ansible-pylibssh

.. image:: https://img.shields.io/pypi/pyversions/ansible-pylibssh.svg?logo=Python&logoColor=white
   :target: https://pypi.org/project/ansible-pylibssh

.. image:: https://github.com/ansible/pylibssh/actions/workflows/ci-cd.yml/badge.svg?event=push
   :alt: ๐Ÿงช CI/CD @ devel
   :target: https://github.com/ansible/pylibssh/actions/workflows/ci-cd.yml

.. image:: https://img.shields.io/codecov/c/gh/ansible/pylibssh/devel?logo=codecov&logoColor=white
   :target: https://codecov.io/gh/ansible/pylibssh
   :alt: devel branch coverage via Codecov

.. image:: https://img.shields.io/badge/style-wemake-000000.svg
   :target: https://github.com/wemake-services/wemake-python-styleguide

.. image:: https://img.shields.io/badge/Code%20of%20Conduct-Ansible-silver.svg
   :target: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html
   :alt: Ansible Code of Conduct

.. DO-NOT-REMOVE-docs-badges-END

pylibssh: Python bindings to client functionality of libssh specific to Ansible use case
========================================================================================

.. DO-NOT-REMOVE-docs-intro-START

Nightlies @ Dumb PyPI @ GitHub Pages
------------------------------------

.. DO-NOT-REMOVE-nightlies-START

We publish nightlies on tags and pushes to devel.
They are hosted on a GitHub Pages based index generated
by `dumb-pypi <https://pypi.org/project/dumb-pypi/>`_.

The web view is @ https://ansible.github.io/pylibssh/.

.. code-block:: shell-session

    $ pip install \
        --extra-index-url=https://ansible.github.io/pylibssh/simple/ \
        --pre \
        ansible-pylibssh

.. DO-NOT-REMOVE-nightlies-END


Requirements
------------

You need Python 3.9+

pylibssh requires libssh to be installed in particular:

- libssh version 0.9.0 and later.

  To install libssh refer to its `Downloads page
  <https://www.libssh.org/get-it/>`__.


Building the module
-------------------

In the local env, assumes there's a libssh shared library
on the system, build toolchain is present and env vars
are set properly:

.. code-block:: shell-session

    $ git clone https://github.com/ansible/pylibssh.git
    $ cd pylibssh
    $ pip install tox
    $ tox -e build-dists

``manylinux``-compatible wheels:

.. code-block:: shell-session

    $ git clone https://github.com/ansible/pylibssh.git
    $ cd pylibssh
    $ pip install tox
    $ tox -e build-dists-manylinux1-x86_64  # with Docker

    # or with Podman
    $ DOCKER_EXECUTABLE=podman tox -e build-dists-manylinux1-x86_64

    # to enable shell script debug mode use
    $ tox -e build-dists-manylinux1-x86_64 -- -e DEBUG=1

Communication
-------------

Join the Ansible forum:

* `Get Help <https://forum.ansible.com/c/help/6>`_: get help or help others. Please add the appropriate tags if you start new discussions, for example the ``pylibssh`` tag.
* `Posts tagged with 'pylibssh' <https://forum.ansible.com/tag/pylibssh>`_: subscribe to participate in project-related conversations.
* `News & Announcements <https://forum.ansible.com/c/news/5>`_: track project-wide announcements including social events and the `Bullhorn newsletter <https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn>`_.
* `Social Spaces <https://forum.ansible.com/c/chat/4>`_: gather and interact with fellow enthusiasts.

For more information about getting in touch with us, see the `Ansible communication guide <https://docs.ansible.com/ansible/devel/community/communication.html>`_.

License
-------

This library is distributed under the terms of LGPL 2 or higher,
see file ``LICENSE.rst`` in this repository.

*********
Changelog
*********

..
    You should *NOT* be adding new change log entries to this file, this
    file is managed by towncrier. You *may* edit previous change logs to
    fix problems like typo corrections or such.
    To add a new change log entry, please see
    https://pip.pypa.io/en/latest/development/contributing/#news-entries
    we named the news folder "docs/changelog-fragments/".

    WARNING: Don't drop the next directive!

.. towncrier release notes start

v1.3.0
======

*(2025-10-12)*


Bug fixes
---------

- The bundled libssh 0.11.2 no longer fails, when the SFTP server announces
  protocol version 3, but does not provide error message and language tag
  in the ``SSH_FXP_STATUS`` message -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#222 <https://github.com/ansible/pylibssh/issues/222>`__.

- Fixed reading files over SFTP that go over the pre-defined chunk size.

  Prior to this change, the files could end up being corrupted, ending up with the last read chunk written to the file instead of the entire payload.

  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__

  *Related issues and pull requests on GitHub:*
  `#638 <https://github.com/ansible/pylibssh/issues/638>`__.

- Repetitive calls to ``exec_channel()`` no longer crash and return reliable output -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#658 <https://github.com/ansible/pylibssh/issues/658>`__.

- Uploading large files over SCP no longer fails -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#661 <https://github.com/ansible/pylibssh/issues/661>`__.

- Improved performance of SFTP transfers by using larger transfer chunks -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#664 <https://github.com/ansible/pylibssh/issues/664>`__.

- Fixed crash when more operations were called after ``session.close()`` -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#709 <https://github.com/ansible/pylibssh/issues/709>`__.


Features
--------

- The underlying ``SSH_OPTIONS_KEY_EXCHANGE`` option of ``libssh`` is
  now available as ``key_exchange_algorithms`` -- by `@NilashishC <https://github.com/sponsors/NilashishC>`__.

  *Related issues and pull requests on GitHub:*
  `#675 <https://github.com/ansible/pylibssh/issues/675>`__.

- Added a ``pylibsshext.session.connect()`` parameter
  ``open_session_retries`` -- by `@justin-stephenson <https://github.com/sponsors/justin-stephenson>`__.

  The ``open_session_retries`` session ``connect()``
  parameter allows a configurable number of retries if
  libssh ``ssh_channel_open_session()`` returns ``SSH_AGAIN``.
  The default option value is 0, no retries will be
  attempted.

  *Related issues and pull requests on GitHub:*
  `#756 <https://github.com/ansible/pylibssh/issues/756>`__.

- Added a ``pylibsshext.session.connect()`` parameter
  ``timeout_usec`` to set ``SSH_OPTIONS_TIMEOUT_USEC``.

  This allows setting the ``SSH_OPTIONS_TIMEOUT_USEC``
  ssh option, though ``SSH_OPTIONS_TIMEOUT`` is a more
  practical option.

  -- by `@justin-stephenson <https://github.com/sponsors/justin-stephenson>`__

  *Related issues and pull requests on GitHub:*
  `#756 <https://github.com/ansible/pylibssh/issues/756>`__.


Deprecations (removal in next major release)
--------------------------------------------

- The project stopped being tested under Ubuntu 20.04 VM since
  GitHub has sunset their CI images -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#708 <https://github.com/ansible/pylibssh/issues/708>`__.


Removals and backward incompatible breaking changes
---------------------------------------------------

- Dropped support for Python 3.6, 3.7 and 3.8
  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#532 <https://github.com/ansible/pylibssh/issues/532>`__, `#718 <https://github.com/ansible/pylibssh/issues/718>`__.

- PyPI no longer ships year-versioned manylinux wheels. One may
  have to update their version of pip to pick up the new ones.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.


Improved documentation
----------------------

- Added a ``Communication`` section to the main
  documentation page -- by `@Andersson007 <https://github.com/sponsors/Andersson007>`__.

  *Related issues and pull requests on GitHub:*
  `#640 <https://github.com/ansible/pylibssh/issues/640>`__.

- Fixed the argument order in the ``scp.put()`` usage example
  -- by `@kucharskim <https://github.com/sponsors/kucharskim>`__.

  *Related issues and pull requests on GitHub:*
  `#646 <https://github.com/ansible/pylibssh/issues/646>`__.


Packaging updates and notes for downstreams
-------------------------------------------

- PyPI now only ships `PEP 600 <https://peps.python.org/pep-600>`__-compatible manylinux wheels
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.

- The ``pytest-forked`` dependency of build, development and test environments was removed -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#658 <https://github.com/ansible/pylibssh/issues/658>`__, `#760 <https://github.com/ansible/pylibssh/issues/760>`__.

- The wheels are now built in cached container images with a
  correctly set platform identifier.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#692 <https://github.com/ansible/pylibssh/issues/692>`__.

- The ``manylinux`` build scripts now limit ``cmake`` below
  version 4 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#713 <https://github.com/ansible/pylibssh/issues/713>`__.

- Stopped skipping SCP tests in the RPM spec -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#714 <https://github.com/ansible/pylibssh/issues/714>`__.

- Started bundling a copy of libssh 0.11.1 in platform-specific
  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#735 <https://github.com/ansible/pylibssh/issues/735>`__.

- Updated the bundled copy of OpenSSL to the latest version 3.5.0
  in ``manylinux`` wheels -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#738 <https://github.com/ansible/pylibssh/issues/738>`__.

- Updated the bundled version of libssh to 0.11.2 in platform-specific
  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#753 <https://github.com/ansible/pylibssh/issues/753>`__.

- The RPM spec file no longer makes use of unpackaged dists
  from PyPI on RHEL. The configuration is almost identical to
  the one for Fedora. Only the ``setuptools-scm`` spec is
  temporarily patched to allow older versions under RHEL.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#759 <https://github.com/ansible/pylibssh/issues/759>`__.

- A workaround has been applied to the in-tree build backend that prevents
  Cython from hanging when ``libssh`` header files are missing
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  The patch makes ``cythonize()`` single-threaded because ``multiprocessing``
  gets stuck. The upstream will eventually fix this by migrating to
  ``concurrent.futures``.

  *Related issues and pull requests on GitHub:*
  `#762 <https://github.com/ansible/pylibssh/issues/762>`__, `#769 <https://github.com/ansible/pylibssh/issues/769>`__, `#770 <https://github.com/ansible/pylibssh/issues/770>`__.

- Updated the bundled version of libssh to 0.11.3 in platform-specific
  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#766 <https://github.com/ansible/pylibssh/issues/766>`__.


Contributor-facing changes
--------------------------

- The manylinux build scripts have been adjusted to resolve the
  dependency conflict between certain ``packaging`` and ``setuptools``
  versions -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  Previously, this was making some of the CI jobs crash with a traceback
  when building said wheels.

  *Related commits on GitHub:*
  `1dfbf70fdfd99ae75068fdb3630790c96101a96a <https://github.com/ansible/pylibssh/commit/1dfbf70fdfd99ae75068fdb3630790c96101a96a>`__.

- The Git archives are now immutable per the packaging recommendations.
  This allows downstreams safely use GitHub archive URLs when
  re-packaging -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `ea34887831a0c6547b32cd8c6a035bb77b91e771 <https://github.com/ansible/pylibssh/commit/ea34887831a0c6547b32cd8c6a035bb77b91e771>`__.

- Manylinux wheels are no longer built using custom shell scripts.
  Instead, this is delegated to the ``cibuildwheel`` tool.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.

- Updated the version of ``libssh`` to the latest release v0.11.1
  in the cached ``manylinux`` build environment container images
  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#636 <https://github.com/ansible/pylibssh/issues/636>`__.

- All the uses of ``actions/upload-artifact@v3`` and
  ``actions/download-artifact@v3`` have been updated to use
  ``v4``. This also includes bumping
  ``re-actors/checkout-python-sdist`` to ``release/v2`` as it
  uses ``actions/download-artifact`` internally.

  -- by `@NilashishC <https://github.com/sponsors/NilashishC>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#676 <https://github.com/ansible/pylibssh/issues/676>`__.

- The ``dumb-pypi``-produced static package index now renders correct
  URLs to the distribution packages -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#678 <https://github.com/ansible/pylibssh/issues/678>`__, `#679 <https://github.com/ansible/pylibssh/issues/679>`__, `#749 <https://github.com/ansible/pylibssh/issues/749>`__.

- The CI is now configured to use
  :external+tox``tox-run---installpkg`` when testing
  pre-built dists. This replaces the previously existing
  tox-level hacks in ``test-binary-dists`` and
  ``test-source-dists`` environments that have now been
  removed.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#688 <https://github.com/ansible/pylibssh/issues/688>`__.

- The wheel building workflows have been updated to set the
  OCI image platform identifiers to legal values like
  ``linux/arm64``.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#692 <https://github.com/ansible/pylibssh/issues/692>`__.

- The CI is now configured to always set job timeout values.
  This will ensure that the jobs that get stuck don't consume
  all 6 hours just hanging, improving responsiveness and the
  overall CI/CD resource usage.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#706 <https://github.com/ansible/pylibssh/issues/706>`__.

- The linting is now configured to check schemas of the
  Read The Docs configuration file and the GitHub Actions
  CI/CD workflow files in addition to enforcing timeouts.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#707 <https://github.com/ansible/pylibssh/issues/707>`__.

- The ``multiarch/qemu-user-static`` image got replaced with
  ``tonistiigi/binfmt`` because the latter is no longer
  maintained and the former includes the fixed version of QEMU.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#713 <https://github.com/ansible/pylibssh/issues/713>`__.

- Added Fedora 41 and 42 to CI configuration -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#715 <https://github.com/ansible/pylibssh/issues/715>`__.

- Removed needless step from CI adjusting centos8 repositories -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#716 <https://github.com/ansible/pylibssh/issues/716>`__.

- The CI/CD infrastructure no longer pre-builds custom manylinux images
  for building wheel targeting ``manylinux1``, ``manylinux2010`` and
  ``manylinux2014`` tags.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#730 <https://github.com/ansible/pylibssh/issues/730>`__.

- The host OS is now ARM-based when building ``manylinux_*_*_aarch64``
  images for CI/CD -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#731 <https://github.com/ansible/pylibssh/issues/731>`__.

- False negative warnings reported by ``coveragepy`` when are now
  disabled. They are evident when ``pytest-cov`` runs with the
  ``pytest-xdist`` integration. ``pytest`` 8.4 gives them more
  visibility and out ``filterwarnings = error`` setting was turning
  them into errors before this change.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#732 <https://github.com/ansible/pylibssh/issues/732>`__.

- GitHub Actions CI/CD no longer runs jobs that install source
  distributions into the tox environments for testing
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  This is a temporary workaround for an upstream bug in tox and
  said jobs are non-essential.

  *Related issues and pull requests on GitHub:*
  `#733 <https://github.com/ansible/pylibssh/issues/733>`__.

- Updated the pre-built ``libffi`` version to 3.4.8 in the
  cached ``manylinux`` build environment container images
  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#734 <https://github.com/ansible/pylibssh/issues/734>`__.

- Reverted workaround keeping the old CMake version installed
  as the new ``libssh`` works with newer versions -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#737 <https://github.com/ansible/pylibssh/issues/737>`__.

- The CI infrastructure now produces ``manylinux_2_31_armv7l`` base images
  with ``libssh`` and ``openssl`` pre-built -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__ and
  `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#740 <https://github.com/ansible/pylibssh/issues/740>`__.

- Started caching ``manylinux`` build images to be used for producing ``2_34`` tagged wheels
  in ``build-manylinux-container-images`` workflow -- by `@KB-perByte <https://github.com/sponsors/KB-perByte>`__.

  *Related issues and pull requests on GitHub:*
  `#741 <https://github.com/ansible/pylibssh/issues/741>`__.

- The ``reusable-cibuildwheel.yml`` workflow has been refactored to
  be more generic and ``ci-cd.yml`` now holds all the configuration
  toggles -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#750 <https://github.com/ansible/pylibssh/issues/750>`__.

- Updated the version of ``libssh`` to the latest release v0.11.2
  in the cached ``manylinux`` build environment container images
  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#752 <https://github.com/ansible/pylibssh/issues/752>`__.

- When building wheels, the source distribution is now passed directly
  to the ``cibuildwheel`` invocation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#754 <https://github.com/ansible/pylibssh/issues/754>`__.

- Fixed link to python3-pytest for CentOS 9 Stream as it was recently moved from
  CRB to AppStream -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#758 <https://github.com/ansible/pylibssh/issues/758>`__.

- The CI/CD jobs for smoke-testing RPMs have been simplified
  and now, they execute the same steps for all distro types.
  They make use of ``pyproject-rpm-macros`` even under RHEL.
  Installing external RPMs is the only conditional step that
  is skipped on Fedora.

  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#759 <https://github.com/ansible/pylibssh/issues/759>`__.

- The ``requires`` setting has been removed from ``tox.ini``, which
  works around the upstream tool bug. This enabled us to re-introduce
  CI jobs testing against sdist under Python 3.12 and newer
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#764 <https://github.com/ansible/pylibssh/issues/764>`__.

- Updated the version of ``libssh`` to the latest release v0.11.3
  in the cached ``manylinux`` build environment container images
  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#765 <https://github.com/ansible/pylibssh/issues/765>`__.

- Changed tests to use more lightweight ECDSA keys to avoid
  timeouts -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#768 <https://github.com/ansible/pylibssh/issues/768>`__.


----


v1.2.2
======

*(2024-06-27)*


Bug fixes
---------

- Downloading files larger than 64kB over SCP no longer fails -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#621 <https://github.com/ansible/pylibssh/issues/621>`__.


----


v1.2.1
======

*(2024-06-27)*


Bug fixes
---------

- Downloading non-existent remote files via SCP no longer crashes the program -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.

  *Related issues and pull requests on GitHub:*
  `#208 <https://github.com/ansible/pylibssh/issues/208>`__, `#325 <https://github.com/ansible/pylibssh/issues/325>`__, `#620 <https://github.com/ansible/pylibssh/issues/620>`__.


Packaging updates and notes for downstreams
-------------------------------------------

- The RPM specification now opts out of demanding that the
  compiled C-extensions have a Build ID present under EL
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `9053c1008bb169c8e362a92782d46c7c0d3b1c06 <https://github.com/ansible/pylibssh/commit/9053c1008bb169c8e362a92782d46c7c0d3b1c06>`__, `aaa12159b5cdda763a83dcf4ee920510cad83463 <https://github.com/ansible/pylibssh/commit/aaa12159b5cdda763a83dcf4ee920510cad83463>`__.

- The RPM specification has been updated to pre-build the
  vendored copy of ``setuptools-scm`` with the isolation
  disabled, addressing the build problem in EL 9
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `dd85ddefafde8f22ab0239add18a1db9ef789b50 <https://github.com/ansible/pylibssh/commit/dd85ddefafde8f22ab0239add18a1db9ef789b50>`__.

- The RPM definition now runs import self-checks when it is
  built for Fedora Linux -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#615 <https://github.com/ansible/pylibssh/issues/615>`__.


Contributor-facing changes
--------------------------

- RPM builds are now also tested against UBI 9.4 in CI
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `e9ad0a7d456c99cc848b30b48569235366273672 <https://github.com/ansible/pylibssh/commit/e9ad0a7d456c99cc848b30b48569235366273672>`__.


----


v1.2.0.post4
============

*(2024-06-09)*


Packaging updates and notes for downstreams
-------------------------------------------

- Substituting the ``gh`` role in source distribution long
  description has been simplify to stop attempting to make
  URLs to arbitrary GitHub addresses -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `f4ad1b76 <https://github.com/ansible/pylibssh/commit/f4ad1b76>`__.

- The in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend's regular expression
  has been hotfixed to replace the "project" substitution
  correctly -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  Previously, it was generating a lot of noise instead of a
  nice description. But not anymore.

  *Related issues and pull requests on GitHub:*
  `#92752210 <https://github.com/ansible/pylibssh/issues/92752210>`__.


----


v1.2.0.post2
============

*(2024-06-08)*


Packaging updates and notes for downstreams
-------------------------------------------

- The automation now replaces the "project" RST substitution
  in the long description and GitHub Discussions/Releases
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `13374a71 <https://github.com/ansible/pylibssh/commit/13374a71>`__.

- The CI/CD automation has been fixed to include changelog
  updates into source distribution tarballs
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `627f718d <https://github.com/ansible/pylibssh/commit/627f718d>`__.


----


v1.2.0
======

*(2024-06-07)*


Bug fixes
---------

- ansible-pylibssh no longer crashes when received EOF or when channel is not explicitly
  closed -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.

  Previously, ansible-pylibssh crashed if ``channel.recv`` was called and ``libssh``
  returned ``SSH_EOF`` error. It also crashed on some special occasions where
  channel was not explicitly closed and the session object was garbage-collected
  first.

  *Related issues and pull requests on GitHub:*
  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.


Features
--------

- Started exposing the ``SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES``
  and ``SSH_OPTIONS_HOSTKEYS`` options publicly
  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  *Related issues and pull requests on GitHub:*
  `#527 <https://github.com/ansible/pylibssh/issues/527>`__.

- The ``request_exec()`` method was added to the ``Channel`` class. It exposes an
  interface for calling the respective low-level C-API of the underlying
  ``libssh`` library -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.

  Additionally, the following calls to ``libssh`` are now available in the same
  class: ``request_exec()``, ``send_eof()``, ``request_send_signal()`` and
  ``is_eof`` which is exposed as a ``property``.

  *Related issues and pull requests on GitHub:*
  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.


Improved documentation
----------------------

- Fixed spelling of "Connect" in the ``Session.connect()``
  docstring -- by `@donnerhacke <https://github.com/sponsors/donnerhacke>`__.

  *Related issues and pull requests on GitHub:*
  `#474 <https://github.com/ansible/pylibssh/issues/474>`__.

- Added a tip to the ``installation guide``
  on how to set compiler flags when installing from source
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#499 <https://github.com/ansible/pylibssh/issues/499>`__.

- Fixed the example of invoking remote commands by using
  ``Channel.exec_command()`` in snippets -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.

  Its previously showcased version wasn't functional.

  *Related issues and pull requests on GitHub:*
  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.


Packaging updates and notes for downstreams
-------------------------------------------

- A flaw in the logic for copying the project directory into a
  temporary folder that led to infinite recursion when ``TMPDIR``
  was set to a project subdirectory path. This was happening in Fedora
  and its downstream due to the use of `pyproject-rpm-macros
  <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>`__. It was
  only reproducible with ``pip wheel`` and was not affecting the
  ``pyproject-build`` users.

  -- by `@hroncok <https://github.com/sponsors/hroncok>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related commits on GitHub:*
  `89c9b3a <https://github.com/ansible/pylibssh/commit/89c9b3a>`__.

- From now on, the published distribution package artifacts
  for the new releases are signed via `Sigstore
  <https://sigstore.dev>`__ -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  This is happening as a part of the GitHub Actions CI/CD
  workflow automation and the signatures are uploaded to
  the corresponding GitHub Release pages.

  *Related commits on GitHub:*
  `986988a <https://github.com/ansible/pylibssh/commit/986988a>`__.

- The platform-specific macOS wheels are now built using the
  Python interpreter from https://python.org. They are tagged
  with ``macosx_10_9`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#333 <https://github.com/ansible/pylibssh/issues/333>`__.

- The ``toml`` build time dependency has been replaced with
  ``tomli`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  The ``tomli`` distribution is only pulled in under Python
  versions below 3.11. On 3.11 and higher, the standard
  library module ``tomllib`` is now used instead.

  *Related issues and pull requests on GitHub:*
  `#501 <https://github.com/ansible/pylibssh/issues/501>`__.

- Started using the built-in ``setuptools-scm`` Git archive
  support under Python 3.7 and higher -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#502 <https://github.com/ansible/pylibssh/issues/502>`__.

- Added support for Python 3.12 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  It is now both tested in the CI and is advertised through
  the Trove classifiers.

  *Related issues and pull requests on GitHub:*
  `#532 <https://github.com/ansible/pylibssh/issues/532>`__.

- The ``Cython`` build time dependency now has the minimum
  version of 3.0 under Python 3.12 and higher
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  The previous versions of ``Cython`` are still able to build
  the project under older Python versions.

  *Related issues and pull requests on GitHub:*
  `#540 <https://github.com/ansible/pylibssh/issues/540>`__.

- `PEP 660 <https://peps.python.org/pep-660>`__ is now enabled -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  Previously, due to restrictive `PEP 517 <https://peps.python.org/pep-517>`__ hook reimports,
  our in-tree build backend was losing ``non-PEP 517``
  hooks implemented in newer versions of ``setuptools`` but not
  the earlier ones. This is now addressed by reexporting
  everything that ``setuptools`` exposes with a wildcard.

  *Related issues and pull requests on GitHub:*
  `#541 <https://github.com/ansible/pylibssh/issues/541>`__.

- The ``setuptools-scm`` build dependency CI pin was updated to 8.1.0 โ€”
  this version fixes a date parsing incompatibility introduced by Git 2.45.0
  (GitHub: ``pypa/setuptools_scm#1038``,
  GitHub: ``pypa/setuptools_scm#1039``)
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#601 <https://github.com/ansible/pylibssh/issues/601>`__.


Contributor-facing changes
--------------------------

- The ``changelog`` page for the tagged release builds on
  Read The Docs does not attempt showing the draft section
  anymore -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `852d259 <https://github.com/ansible/pylibssh/commit/852d259>`__.

- Adjusted the publishing workflow automation to pre-configure
  Git before attempting to create a tag when building a
  source distribution -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related commits on GitHub:*
  `f07296f <https://github.com/ansible/pylibssh/commit/f07296f>`__.

- The CI configuration for building the macOS platform-specific
  wheels switched to using ``cibuildwheel`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#333 <https://github.com/ansible/pylibssh/issues/333>`__.

- The OS-level tox package was upgraded to v3.28.0 in the UBI9
  CI runtime -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  *Related issues and pull requests on GitHub:*
  `#461 <https://github.com/ansible/pylibssh/issues/461>`__, `#473 <https://github.com/ansible/pylibssh/issues/473>`__.

- Fixed spelling of "Connect" in the ``Session.connect()``
  docstring -- by `@donnerhacke <https://github.com/sponsors/donnerhacke>`__.

  *Related issues and pull requests on GitHub:*
  `#474 <https://github.com/ansible/pylibssh/issues/474>`__.

- The Packit CI access to the internet has been restored
  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  *Related issues and pull requests on GitHub:*
  `#507 <https://github.com/ansible/pylibssh/issues/507>`__.

- Started building ``manylinux_2_28`` base images for testing and
  packaging in the CI/CD infrastructure -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  *Related issues and pull requests on GitHub:*
  `#533 <https://github.com/ansible/pylibssh/issues/533>`__.

- Switched back to using Cython's native plugin for measuring
  code coverage -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#538 <https://github.com/ansible/pylibssh/issues/538>`__.

- Added separate changelog fragment types for contributor-
  and downstream-facing patches -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  Their corresponding identifiers are ``contrib`` and ``packaging``
  respectively. They are meant to be used for more accurate
  classification, where one would resort to using ``misc`` otherwise.

  *Related issues and pull requests on GitHub:*
  `#539 <https://github.com/ansible/pylibssh/issues/539>`__.

- `PEP 660 <https://peps.python.org/pep-660>`__ is now enabled -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  This effectively means that the ecosystem-native editable
  install mode started working properly.

  *Related issues and pull requests on GitHub:*
  `#541 <https://github.com/ansible/pylibssh/issues/541>`__.

- The duplicated jobs matrices for building manylinux wheels
  now reside in a single GitHub Actions CI/CD reusable
  workflow definition.

  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#559 <https://github.com/ansible/pylibssh/issues/559>`__.

- The duplicated jobs matrices of the text jobs now reside in
  a single GitHub Actions CI/CD reusable workflow definition.

  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#560 <https://github.com/ansible/pylibssh/issues/560>`__.

- Fixed the location of release workflow in the
  ``Release Guide`` document -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.

  *Related issues and pull requests on GitHub:*
  `#565 <https://github.com/ansible/pylibssh/issues/565>`__.

- The ``setuptools-scm`` build dependency CI pin was updated to 8.1.0 โ€”
  this version fixes a date parsing incompatibility introduced by Git 2.45.0
  (GitHub: ``pypa/setuptools_scm#1039``,
  GitHub: ``pypa/setuptools_scm#1038``)
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.

  *Related issues and pull requests on GitHub:*
  `#601 <https://github.com/ansible/pylibssh/issues/601>`__.

- The CI/CD configuration was fixed to allow publishing
  to PyPI and other targets disregarding the test stage
  outcome. This used to be a bug in the workflow definition
  that has now been fixed.

  -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__

  *Related issues and pull requests on GitHub:*
  `#602 <https://github.com/ansible/pylibssh/issues/602>`__.


----


v1.1.0 (2022-12-05)
===================

Features
--------

- Started building ``manylinux`` wheels with ``libssh`` v0.9.6
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#441 <https://github.com/ansible/pylibssh/issues/441>`__)


Deprecations (removal in next major release)
--------------------------------------------

- The project stopped being tested under Ubuntu 18.04 VM since
  GitHub is sunsetting their CI images -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#381 <https://github.com/ansible/pylibssh/issues/381>`__)


Documentation
-------------

- Added a ``Release Guide`` for making new releases
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#413 <https://github.com/ansible/pylibssh/issues/413>`__)


Miscellaneous
-------------

- Started testing RPM packaging spec with Packit service
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__ and `@TomasTomecek <https://github.com/sponsors/TomasTomecek>`__
  (`#227 <https://github.com/ansible/pylibssh/issues/227>`__,
  `#246 <https://github.com/ansible/pylibssh/issues/246>`__)
- Removed the remains of Python 2 compatiblity code from the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#377 <https://github.com/ansible/pylibssh/issues/377>`__)
- Fixed removing ``expandvars`` from ``pyproject.toml``
  in an RPM spec -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  Before this patch, the ``sed`` invocation removed entire
  ``build-system.requires`` entry from there, in rare cases
  but this won't be happening anymore.
  (`#378 <https://github.com/ansible/pylibssh/issues/378>`__)
- Declared official support of CPython 3.11 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#396 <https://github.com/ansible/pylibssh/issues/396>`__)
- Started shipping sdists built with Cython v0.29.32 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#399 <https://github.com/ansible/pylibssh/issues/399>`__)
- Started building RPMs with Cython v0.29.32 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#402 <https://github.com/ansible/pylibssh/issues/402>`__)
- Added an SSH connection re-try helper to tests -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#405 <https://github.com/ansible/pylibssh/issues/405>`__)


v1.0.0 (2022-09-14)
===================

Features
--------

- Added ``password_prompt`` argument to ``connect()`` to override the default
  prompt of "password:" when using keyboard-interactive authentication -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#331 <https://github.com/ansible/pylibssh/issues/331>`__)
- Added support for ``:fd:`` socket option -- by `@sabedevops <https://github.com/sponsors/sabedevops>`__
  (`#343 <https://github.com/ansible/pylibssh/issues/343>`__)


Miscellaneous
-------------

- Reworked build scripts to fix manylinux container generation -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#321 <https://github.com/ansible/pylibssh/issues/321>`__)
- Reenable CI building on s390x -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#322 <https://github.com/ansible/pylibssh/issues/322>`__)


v0.4.0 (2022-04-26)
===================

Bugfixes
--------

- Improved ``channel.exec_command`` to always use a newly created ``ssh_channel`` to avoid
  segfaults on repeated calls -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#280 <https://github.com/ansible/pylibssh/issues/280>`__)
- Fixed password prompt match in ``pylibsshext.session.Session.authenticate_interactive()``
  to strip whitespace, check that the prompt only ends with ``password:``, and added
  a little extra logging -- by `@dalrrard <https://github.com/sponsors/dalrrard>`__
  (`#311 <https://github.com/ansible/pylibssh/issues/311>`__)


Backward incompatible changes
-----------------------------

- Dropped support for Python 2.7 and 3.5, and marked support for 3.10 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#314 <https://github.com/ansible/pylibssh/issues/314>`__)


v0.3.0 (2021-11-03)
===================

Bugfixes
--------

- Changed ``sftp.sftp_get`` to write files as bytes rather than assuming files are valid UTF8 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#216 <https://github.com/ansible/pylibssh/issues/216>`__)


Features
--------

- Started building platform-specific ``manylinux2010``, ``manylinux2014``
  and ``manylinux_2_24`` wheels for AARCH64, ppc64le and s390x
  architectures as introduced by `PEP 599 <https://peps.python.org/pep-599>`__ and `PEP 600 <https://peps.python.org/pep-600>`__
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#187 <https://github.com/ansible/pylibssh/issues/187>`__)
- Added gssapi-with-mic support for authentication -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#195 <https://github.com/ansible/pylibssh/issues/195>`__)


Documentation
-------------

- Correct a link to the pip upgrade doc in our installation guide
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#225 <https://github.com/ansible/pylibssh/issues/225>`__)


Miscellaneous
-------------

- Started building AARCH64 base images with Buildah+Podman in GitHub
  Actions CI/CD -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#181 <https://github.com/ansible/pylibssh/issues/181>`__)
- Switched using `pep517 <https://pep517.rtfd.io>`__ lib to
  `build <https://pypa-build.rtfd.io>`__ CLI -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#199 <https://github.com/ansible/pylibssh/issues/199>`__)
- Restructured the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend into multiple
  submodules moving the entry-point to ``pep517_backend.hooks``
  that also facilitates extraction of user-defined
  ``config_settings`` passed by the end-user (packager)
  via the ``build`` CLI command -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#200 <https://github.com/ansible/pylibssh/issues/200>`__)
- Updated manylinux build script to build libssh with GSSAPI
  enabled -- `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#203 <https://github.com/ansible/pylibssh/issues/203>`__)
- Added an initial RPM spec continuously tested in the CI -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#205 <https://github.com/ansible/pylibssh/issues/205>`__)
- Added additional details when SFTP write errors are raised -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#216 <https://github.com/ansible/pylibssh/issues/216>`__)
- Made ``auditwheel`` only keep one platform tag in the produced wheel
  names -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#224 <https://github.com/ansible/pylibssh/issues/224>`__)
- Improved manylinux build scripts to expect dual-aliased manylinux tags
  produced for versions 1/2010/2014 along with their `PEP 600 <https://peps.python.org/pep-600>`__
  counterparts after ``auditwheel repair`` -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#226 <https://github.com/ansible/pylibssh/issues/226>`__)
- Enabled self-test checks in the RPM spec for Fedora
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#228 <https://github.com/ansible/pylibssh/issues/228>`__)
- Enabled self-test checks in the RPM spec for CentOS
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#235 <https://github.com/ansible/pylibssh/issues/235>`__)
- Enabled self-test checks in the RPM spec for RHEL
  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#236 <https://github.com/ansible/pylibssh/issues/236>`__)
- Added ``NAME = "VALUE"`` to flake8-eradicate whitelist to work around test false positive introduced in flake8-eradicate 1.1.0 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#258 <https://github.com/ansible/pylibssh/issues/258>`__)
- Stopped testing ``pylibssh`` binary wheels under Ubuntu 16.04 in GitHub
  Actions CI/CD because it is EOL now -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#260 <https://github.com/ansible/pylibssh/issues/260>`__)
- Fixed failing fast on problems with ``rpmbuild`` in GitHub Actions CI/CD
  under Fedora -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#261 <https://github.com/ansible/pylibssh/issues/261>`__)
- Declare ``python3-pip`` a build dependency under Fedora fixing the RPM
  creation job in GitHub Actions CI/CD under Fedora -- `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#262 <https://github.com/ansible/pylibssh/issues/262>`__)
- Replaced git protocols in pre-commit config with https now that GitHub has turned
  off git protocol access -- `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#266 <https://github.com/ansible/pylibssh/issues/266>`__)


v0.2.0 (2021-03-01)
===================

Bugfixes
--------

- Fixed ``undefined symbol: ssh_disconnect`` and related issues when building on certain distros -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#63 <https://github.com/ansible/pylibssh/issues/63>`__,
  `#153 <https://github.com/ansible/pylibssh/issues/153>`__,
  `#158 <https://github.com/ansible/pylibssh/issues/158>`__)
- Fixed ``"Negative size passed to PyBytes_FromStringAndSize"`` when ``ssh_channel_read_nonblocking`` fails -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#168 <https://github.com/ansible/pylibssh/issues/168>`__)


Features
--------

- Added SCP support -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#151 <https://github.com/ansible/pylibssh/issues/151>`__,
  `#157 <https://github.com/ansible/pylibssh/issues/157>`__)


Documentation
-------------

- Added the initial user guide to docs
  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#141 <https://github.com/ansible/pylibssh/issues/141>`__)
- Added the initial testing guide to docs
  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#142 <https://github.com/ansible/pylibssh/issues/142>`__)
- Added the initial installation guide to docs
  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#145 <https://github.com/ansible/pylibssh/issues/145>`__)


Miscellaneous
-------------

- Migrated the "draft changelog" plugin to the external
  `sphinxcontrib-towncrier implementation
  <https://github.com/sphinx-contrib/sphinxcontrib-towncrier>`__
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#123 <https://github.com/ansible/pylibssh/issues/123>`__)
- Declared official support of CPython 3.9 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#152 <https://github.com/ansible/pylibssh/issues/152>`__)


v0.1.0 (2020-08-12)
===================

Bugfixes
--------

- Enhanced sftp error handling code to match
  with libssh error messages -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#27 <https://github.com/ansible/pylibssh/issues/27>`__)
- Fixed session timeout issue, the data type
  of timeout is expected by ``ssh_options_set``
  is of type ``long int`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#46 <https://github.com/ansible/pylibssh/issues/46>`__)
- Fixed sftp file get issue. On py2
  The file ``write()`` method returns ``None`` on py2
  if bytes are written to file successfully, whereas
  on py3 it returns total number of bytes written
  to file. Added a fix to check for the number of
  bytes written only in the case when ``write()``
  does not return ``None`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#58 <https://github.com/ansible/pylibssh/issues/58>`__)
- Fixed double close issue, added logic to free
  the channel allocated memory within
  ``__dealloc__()`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#113 <https://github.com/ansible/pylibssh/issues/113>`__)


Features
--------

- Added cython extension for libssh client
  API's initial commit -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#1 <https://github.com/ansible/pylibssh/issues/1>`__)
- Added proxycommand support for session and
  update session exeception to ``LibsshSessionException`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#10 <https://github.com/ansible/pylibssh/issues/10>`__)
- Added support for host key checking with
  authentication -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#15 <https://github.com/ansible/pylibssh/issues/15>`__)
- Changed pylibssh dir to pylibsshext to avoid ns collision -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#25 <https://github.com/ansible/pylibssh/issues/25>`__)
- Added sftp get functionality to fetch file
  from remote host -- by `@amolkahat <https://github.com/sponsors/amolkahat>`__
  (`#26 <https://github.com/ansible/pylibssh/issues/26>`__)
- Added support to receive bulk response
  for remote shell -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#40 <https://github.com/ansible/pylibssh/issues/40>`__)
- Added the support for keyboard-authentication method -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__
  (`#105 <https://github.com/ansible/pylibssh/issues/105>`__)


Backward incompatible changes
-----------------------------

- Updated the package name to ``ansible-pylibssh`` to reflect
  that the library only intends to implement a set of APIs that
  are necessary to implement an Ansible connection plugin
  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__
  (`#1 <https://github.com/ansible/pylibssh/issues/1>`__)


Documentation
-------------

- Documented how to compose `Towncrier
  <https://towncrier.readthedocs.io/en/actual-freaking-docs/>`__
  news fragments -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#124 <https://github.com/ansible/pylibssh/issues/124>`__)
- Documented how to contribute to the docs -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#126 <https://github.com/ansible/pylibssh/issues/126>`__)


Miscellaneous
-------------

- Updated requirements file to replace
  ``requirements.txt`` with ``requirements-build.in`` -- by `@akasurde <https://github.com/sponsors/akasurde>`__
  (`#14 <https://github.com/ansible/pylibssh/issues/14>`__)
- Made tox's main env pick up the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build
  backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#72 <https://github.com/ansible/pylibssh/issues/72>`__)
- Refactored sphinx RST parsing in towncrier extension -- by `@ewjoachim <https://github.com/sponsors/ewjoachim>`__
  (`#119 <https://github.com/ansible/pylibssh/issues/119>`__)
- Hotfixed the directive in the in-tree sphinx extension to
  always trigger the changelog document rebuilds so that it'd
  pick up any changelog fragments from disk
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#120 <https://github.com/ansible/pylibssh/issues/120>`__)
- Turned the Townrier fragments README doc title into subtitle
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__

  The effect is that it doesn't show up in the side bar as an
  individual item anymore.
  (`#125 <https://github.com/ansible/pylibssh/issues/125>`__)
- Integrated Markdown support into docs via the `MyST parser
  <https://myst-parser.readthedocs.io/>`__ -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#126 <https://github.com/ansible/pylibssh/issues/126>`__)
- Switched the builder on `Read the Docs
  <https://readthedocs.org/>`__ to `dirhtml
  <https://www.sphinx-doc.org/en/master/usage/builders/index.html#sphinx.builders.dirhtml.DirectoryHTMLBuilder>`__
  so it now generates a dir-based URL layout for the website
  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#127 <https://github.com/ansible/pylibssh/issues/127>`__)
- Enabled `sphinx.ext.autosectionlabel Sphinx extension
  <https://myst-parser.readthedocs.io/>`__ to automatically generate
  reference targets for document sections that can be linked
  against using ``:ref:`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__
  (`#128 <https://github.com/ansible/pylibssh/issues/128>`__)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ansible/pylibssh",
    "name": "ansible-pylibssh",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "cython, cext, libssh",
    "author": "Ansible, Inc.",
    "author_email": "info+github/ansible/pylibssh@ansible.com",
    "download_url": "https://files.pythonhosted.org/packages/68/6d/93b13182acd29632ef3ab58650fc5727936942e2ad642a48f6a5e12aebb4/ansible-pylibssh-1.3.0.tar.gz",
    "platform": null,
    "description": ".. image:: https://img.shields.io/pypi/v/ansible-pylibssh.svg?logo=Python&logoColor=white\n   :target: https://pypi.org/project/ansible-pylibssh\n\n.. image:: https://img.shields.io/badge/license-LGPL+-blue.svg?maxAge=3600\n   :target: https://pypi.org/project/ansible-pylibssh\n\n.. image:: https://img.shields.io/pypi/pyversions/ansible-pylibssh.svg?logo=Python&logoColor=white\n   :target: https://pypi.org/project/ansible-pylibssh\n\n.. image:: https://github.com/ansible/pylibssh/actions/workflows/ci-cd.yml/badge.svg?event=push\n   :alt: \ud83e\uddea CI/CD @ devel\n   :target: https://github.com/ansible/pylibssh/actions/workflows/ci-cd.yml\n\n.. image:: https://img.shields.io/codecov/c/gh/ansible/pylibssh/devel?logo=codecov&logoColor=white\n   :target: https://codecov.io/gh/ansible/pylibssh\n   :alt: devel branch coverage via Codecov\n\n.. image:: https://img.shields.io/badge/style-wemake-000000.svg\n   :target: https://github.com/wemake-services/wemake-python-styleguide\n\n.. image:: https://img.shields.io/badge/Code%20of%20Conduct-Ansible-silver.svg\n   :target: https://docs.ansible.com/ansible/latest/community/code_of_conduct.html\n   :alt: Ansible Code of Conduct\n\n.. DO-NOT-REMOVE-docs-badges-END\n\npylibssh: Python bindings to client functionality of libssh specific to Ansible use case\n========================================================================================\n\n.. DO-NOT-REMOVE-docs-intro-START\n\nNightlies @ Dumb PyPI @ GitHub Pages\n------------------------------------\n\n.. DO-NOT-REMOVE-nightlies-START\n\nWe publish nightlies on tags and pushes to devel.\nThey are hosted on a GitHub Pages based index generated\nby `dumb-pypi <https://pypi.org/project/dumb-pypi/>`_.\n\nThe web view is @ https://ansible.github.io/pylibssh/.\n\n.. code-block:: shell-session\n\n    $ pip install \\\n        --extra-index-url=https://ansible.github.io/pylibssh/simple/ \\\n        --pre \\\n        ansible-pylibssh\n\n.. DO-NOT-REMOVE-nightlies-END\n\n\nRequirements\n------------\n\nYou need Python 3.9+\n\npylibssh requires libssh to be installed in particular:\n\n- libssh version 0.9.0 and later.\n\n  To install libssh refer to its `Downloads page\n  <https://www.libssh.org/get-it/>`__.\n\n\nBuilding the module\n-------------------\n\nIn the local env, assumes there's a libssh shared library\non the system, build toolchain is present and env vars\nare set properly:\n\n.. code-block:: shell-session\n\n    $ git clone https://github.com/ansible/pylibssh.git\n    $ cd pylibssh\n    $ pip install tox\n    $ tox -e build-dists\n\n``manylinux``-compatible wheels:\n\n.. code-block:: shell-session\n\n    $ git clone https://github.com/ansible/pylibssh.git\n    $ cd pylibssh\n    $ pip install tox\n    $ tox -e build-dists-manylinux1-x86_64  # with Docker\n\n    # or with Podman\n    $ DOCKER_EXECUTABLE=podman tox -e build-dists-manylinux1-x86_64\n\n    # to enable shell script debug mode use\n    $ tox -e build-dists-manylinux1-x86_64 -- -e DEBUG=1\n\nCommunication\n-------------\n\nJoin the Ansible forum:\n\n* `Get Help <https://forum.ansible.com/c/help/6>`_: get help or help others. Please add the appropriate tags if you start new discussions, for example the ``pylibssh`` tag.\n* `Posts tagged with 'pylibssh' <https://forum.ansible.com/tag/pylibssh>`_: subscribe to participate in project-related conversations.\n* `News & Announcements <https://forum.ansible.com/c/news/5>`_: track project-wide announcements including social events and the `Bullhorn newsletter <https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn>`_.\n* `Social Spaces <https://forum.ansible.com/c/chat/4>`_: gather and interact with fellow enthusiasts.\n\nFor more information about getting in touch with us, see the `Ansible communication guide <https://docs.ansible.com/ansible/devel/community/communication.html>`_.\n\nLicense\n-------\n\nThis library is distributed under the terms of LGPL 2 or higher,\nsee file ``LICENSE.rst`` in this repository.\n\n*********\nChangelog\n*********\n\n..\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You *may* edit previous change logs to\n    fix problems like typo corrections or such.\n    To add a new change log entry, please see\n    https://pip.pypa.io/en/latest/development/contributing/#news-entries\n    we named the news folder \"docs/changelog-fragments/\".\n\n    WARNING: Don't drop the next directive!\n\n.. towncrier release notes start\n\nv1.3.0\n======\n\n*(2025-10-12)*\n\n\nBug fixes\n---------\n\n- The bundled libssh 0.11.2 no longer fails, when the SFTP server announces\n  protocol version 3, but does not provide error message and language tag\n  in the ``SSH_FXP_STATUS`` message -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#222 <https://github.com/ansible/pylibssh/issues/222>`__.\n\n- Fixed reading files over SFTP that go over the pre-defined chunk size.\n\n  Prior to this change, the files could end up being corrupted, ending up with the last read chunk written to the file instead of the entire payload.\n\n  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#638 <https://github.com/ansible/pylibssh/issues/638>`__.\n\n- Repetitive calls to ``exec_channel()`` no longer crash and return reliable output -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#658 <https://github.com/ansible/pylibssh/issues/658>`__.\n\n- Uploading large files over SCP no longer fails -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#661 <https://github.com/ansible/pylibssh/issues/661>`__.\n\n- Improved performance of SFTP transfers by using larger transfer chunks -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#664 <https://github.com/ansible/pylibssh/issues/664>`__.\n\n- Fixed crash when more operations were called after ``session.close()`` -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#709 <https://github.com/ansible/pylibssh/issues/709>`__.\n\n\nFeatures\n--------\n\n- The underlying ``SSH_OPTIONS_KEY_EXCHANGE`` option of ``libssh`` is\n  now available as ``key_exchange_algorithms`` -- by `@NilashishC <https://github.com/sponsors/NilashishC>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#675 <https://github.com/ansible/pylibssh/issues/675>`__.\n\n- Added a ``pylibsshext.session.connect()`` parameter\n  ``open_session_retries`` -- by `@justin-stephenson <https://github.com/sponsors/justin-stephenson>`__.\n\n  The ``open_session_retries`` session ``connect()``\n  parameter allows a configurable number of retries if\n  libssh ``ssh_channel_open_session()`` returns ``SSH_AGAIN``.\n  The default option value is 0, no retries will be\n  attempted.\n\n  *Related issues and pull requests on GitHub:*\n  `#756 <https://github.com/ansible/pylibssh/issues/756>`__.\n\n- Added a ``pylibsshext.session.connect()`` parameter\n  ``timeout_usec`` to set ``SSH_OPTIONS_TIMEOUT_USEC``.\n\n  This allows setting the ``SSH_OPTIONS_TIMEOUT_USEC``\n  ssh option, though ``SSH_OPTIONS_TIMEOUT`` is a more\n  practical option.\n\n  -- by `@justin-stephenson <https://github.com/sponsors/justin-stephenson>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#756 <https://github.com/ansible/pylibssh/issues/756>`__.\n\n\nDeprecations (removal in next major release)\n--------------------------------------------\n\n- The project stopped being tested under Ubuntu 20.04 VM since\n  GitHub has sunset their CI images -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#708 <https://github.com/ansible/pylibssh/issues/708>`__.\n\n\nRemovals and backward incompatible breaking changes\n---------------------------------------------------\n\n- Dropped support for Python 3.6, 3.7 and 3.8\n  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#532 <https://github.com/ansible/pylibssh/issues/532>`__, `#718 <https://github.com/ansible/pylibssh/issues/718>`__.\n\n- PyPI no longer ships year-versioned manylinux wheels. One may\n  have to update their version of pip to pick up the new ones.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.\n\n\nImproved documentation\n----------------------\n\n- Added a ``Communication`` section to the main\n  documentation page -- by `@Andersson007 <https://github.com/sponsors/Andersson007>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#640 <https://github.com/ansible/pylibssh/issues/640>`__.\n\n- Fixed the argument order in the ``scp.put()`` usage example\n  -- by `@kucharskim <https://github.com/sponsors/kucharskim>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#646 <https://github.com/ansible/pylibssh/issues/646>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- PyPI now only ships `PEP 600 <https://peps.python.org/pep-600>`__-compatible manylinux wheels\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.\n\n- The ``pytest-forked`` dependency of build, development and test environments was removed -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#658 <https://github.com/ansible/pylibssh/issues/658>`__, `#760 <https://github.com/ansible/pylibssh/issues/760>`__.\n\n- The wheels are now built in cached container images with a\n  correctly set platform identifier.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#692 <https://github.com/ansible/pylibssh/issues/692>`__.\n\n- The ``manylinux`` build scripts now limit ``cmake`` below\n  version 4 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#713 <https://github.com/ansible/pylibssh/issues/713>`__.\n\n- Stopped skipping SCP tests in the RPM spec -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#714 <https://github.com/ansible/pylibssh/issues/714>`__.\n\n- Started bundling a copy of libssh 0.11.1 in platform-specific\n  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#735 <https://github.com/ansible/pylibssh/issues/735>`__.\n\n- Updated the bundled copy of OpenSSL to the latest version 3.5.0\n  in ``manylinux`` wheels -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#738 <https://github.com/ansible/pylibssh/issues/738>`__.\n\n- Updated the bundled version of libssh to 0.11.2 in platform-specific\n  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#753 <https://github.com/ansible/pylibssh/issues/753>`__.\n\n- The RPM spec file no longer makes use of unpackaged dists\n  from PyPI on RHEL. The configuration is almost identical to\n  the one for Fedora. Only the ``setuptools-scm`` spec is\n  temporarily patched to allow older versions under RHEL.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#759 <https://github.com/ansible/pylibssh/issues/759>`__.\n\n- A workaround has been applied to the in-tree build backend that prevents\n  Cython from hanging when ``libssh`` header files are missing\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  The patch makes ``cythonize()`` single-threaded because ``multiprocessing``\n  gets stuck. The upstream will eventually fix this by migrating to\n  ``concurrent.futures``.\n\n  *Related issues and pull requests on GitHub:*\n  `#762 <https://github.com/ansible/pylibssh/issues/762>`__, `#769 <https://github.com/ansible/pylibssh/issues/769>`__, `#770 <https://github.com/ansible/pylibssh/issues/770>`__.\n\n- Updated the bundled version of libssh to 0.11.3 in platform-specific\n  wheels published on PyPI -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#766 <https://github.com/ansible/pylibssh/issues/766>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- The manylinux build scripts have been adjusted to resolve the\n  dependency conflict between certain ``packaging`` and ``setuptools``\n  versions -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Previously, this was making some of the CI jobs crash with a traceback\n  when building said wheels.\n\n  *Related commits on GitHub:*\n  `1dfbf70fdfd99ae75068fdb3630790c96101a96a <https://github.com/ansible/pylibssh/commit/1dfbf70fdfd99ae75068fdb3630790c96101a96a>`__.\n\n- The Git archives are now immutable per the packaging recommendations.\n  This allows downstreams safely use GitHub archive URLs when\n  re-packaging -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `ea34887831a0c6547b32cd8c6a035bb77b91e771 <https://github.com/ansible/pylibssh/commit/ea34887831a0c6547b32cd8c6a035bb77b91e771>`__.\n\n- Manylinux wheels are no longer built using custom shell scripts.\n  Instead, this is delegated to the ``cibuildwheel`` tool.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#562 <https://github.com/ansible/pylibssh/issues/562>`__.\n\n- Updated the version of ``libssh`` to the latest release v0.11.1\n  in the cached ``manylinux`` build environment container images\n  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#636 <https://github.com/ansible/pylibssh/issues/636>`__.\n\n- All the uses of ``actions/upload-artifact@v3`` and\n  ``actions/download-artifact@v3`` have been updated to use\n  ``v4``. This also includes bumping\n  ``re-actors/checkout-python-sdist`` to ``release/v2`` as it\n  uses ``actions/download-artifact`` internally.\n\n  -- by `@NilashishC <https://github.com/sponsors/NilashishC>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#676 <https://github.com/ansible/pylibssh/issues/676>`__.\n\n- The ``dumb-pypi``-produced static package index now renders correct\n  URLs to the distribution packages -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#678 <https://github.com/ansible/pylibssh/issues/678>`__, `#679 <https://github.com/ansible/pylibssh/issues/679>`__, `#749 <https://github.com/ansible/pylibssh/issues/749>`__.\n\n- The CI is now configured to use\n  :external+tox``tox-run---installpkg`` when testing\n  pre-built dists. This replaces the previously existing\n  tox-level hacks in ``test-binary-dists`` and\n  ``test-source-dists`` environments that have now been\n  removed.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#688 <https://github.com/ansible/pylibssh/issues/688>`__.\n\n- The wheel building workflows have been updated to set the\n  OCI image platform identifiers to legal values like\n  ``linux/arm64``.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#692 <https://github.com/ansible/pylibssh/issues/692>`__.\n\n- The CI is now configured to always set job timeout values.\n  This will ensure that the jobs that get stuck don't consume\n  all 6 hours just hanging, improving responsiveness and the\n  overall CI/CD resource usage.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#706 <https://github.com/ansible/pylibssh/issues/706>`__.\n\n- The linting is now configured to check schemas of the\n  Read The Docs configuration file and the GitHub Actions\n  CI/CD workflow files in addition to enforcing timeouts.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#707 <https://github.com/ansible/pylibssh/issues/707>`__.\n\n- The ``multiarch/qemu-user-static`` image got replaced with\n  ``tonistiigi/binfmt`` because the latter is no longer\n  maintained and the former includes the fixed version of QEMU.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#713 <https://github.com/ansible/pylibssh/issues/713>`__.\n\n- Added Fedora 41 and 42 to CI configuration -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#715 <https://github.com/ansible/pylibssh/issues/715>`__.\n\n- Removed needless step from CI adjusting centos8 repositories -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#716 <https://github.com/ansible/pylibssh/issues/716>`__.\n\n- The CI/CD infrastructure no longer pre-builds custom manylinux images\n  for building wheel targeting ``manylinux1``, ``manylinux2010`` and\n  ``manylinux2014`` tags.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#730 <https://github.com/ansible/pylibssh/issues/730>`__.\n\n- The host OS is now ARM-based when building ``manylinux_*_*_aarch64``\n  images for CI/CD -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#731 <https://github.com/ansible/pylibssh/issues/731>`__.\n\n- False negative warnings reported by ``coveragepy`` when are now\n  disabled. They are evident when ``pytest-cov`` runs with the\n  ``pytest-xdist`` integration. ``pytest`` 8.4 gives them more\n  visibility and out ``filterwarnings = error`` setting was turning\n  them into errors before this change.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#732 <https://github.com/ansible/pylibssh/issues/732>`__.\n\n- GitHub Actions CI/CD no longer runs jobs that install source\n  distributions into the tox environments for testing\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This is a temporary workaround for an upstream bug in tox and\n  said jobs are non-essential.\n\n  *Related issues and pull requests on GitHub:*\n  `#733 <https://github.com/ansible/pylibssh/issues/733>`__.\n\n- Updated the pre-built ``libffi`` version to 3.4.8 in the\n  cached ``manylinux`` build environment container images\n  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#734 <https://github.com/ansible/pylibssh/issues/734>`__.\n\n- Reverted workaround keeping the old CMake version installed\n  as the new ``libssh`` works with newer versions -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#737 <https://github.com/ansible/pylibssh/issues/737>`__.\n\n- The CI infrastructure now produces ``manylinux_2_31_armv7l`` base images\n  with ``libssh`` and ``openssl`` pre-built -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__ and\n  `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#740 <https://github.com/ansible/pylibssh/issues/740>`__.\n\n- Started caching ``manylinux`` build images to be used for producing ``2_34`` tagged wheels\n  in ``build-manylinux-container-images`` workflow -- by `@KB-perByte <https://github.com/sponsors/KB-perByte>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#741 <https://github.com/ansible/pylibssh/issues/741>`__.\n\n- The ``reusable-cibuildwheel.yml`` workflow has been refactored to\n  be more generic and ``ci-cd.yml`` now holds all the configuration\n  toggles -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#750 <https://github.com/ansible/pylibssh/issues/750>`__.\n\n- Updated the version of ``libssh`` to the latest release v0.11.2\n  in the cached ``manylinux`` build environment container images\n  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#752 <https://github.com/ansible/pylibssh/issues/752>`__.\n\n- When building wheels, the source distribution is now passed directly\n  to the ``cibuildwheel`` invocation -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#754 <https://github.com/ansible/pylibssh/issues/754>`__.\n\n- Fixed link to python3-pytest for CentOS 9 Stream as it was recently moved from\n  CRB to AppStream -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#758 <https://github.com/ansible/pylibssh/issues/758>`__.\n\n- The CI/CD jobs for smoke-testing RPMs have been simplified\n  and now, they execute the same steps for all distro types.\n  They make use of ``pyproject-rpm-macros`` even under RHEL.\n  Installing external RPMs is the only conditional step that\n  is skipped on Fedora.\n\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#759 <https://github.com/ansible/pylibssh/issues/759>`__.\n\n- The ``requires`` setting has been removed from ``tox.ini``, which\n  works around the upstream tool bug. This enabled us to re-introduce\n  CI jobs testing against sdist under Python 3.12 and newer\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#764 <https://github.com/ansible/pylibssh/issues/764>`__.\n\n- Updated the version of ``libssh`` to the latest release v0.11.3\n  in the cached ``manylinux`` build environment container images\n  -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#765 <https://github.com/ansible/pylibssh/issues/765>`__.\n\n- Changed tests to use more lightweight ECDSA keys to avoid\n  timeouts -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#768 <https://github.com/ansible/pylibssh/issues/768>`__.\n\n\n----\n\n\nv1.2.2\n======\n\n*(2024-06-27)*\n\n\nBug fixes\n---------\n\n- Downloading files larger than 64kB over SCP no longer fails -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#621 <https://github.com/ansible/pylibssh/issues/621>`__.\n\n\n----\n\n\nv1.2.1\n======\n\n*(2024-06-27)*\n\n\nBug fixes\n---------\n\n- Downloading non-existent remote files via SCP no longer crashes the program -- by `@Jakuje <https://github.com/sponsors/Jakuje>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#208 <https://github.com/ansible/pylibssh/issues/208>`__, `#325 <https://github.com/ansible/pylibssh/issues/325>`__, `#620 <https://github.com/ansible/pylibssh/issues/620>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- The RPM specification now opts out of demanding that the\n  compiled C-extensions have a Build ID present under EL\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `9053c1008bb169c8e362a92782d46c7c0d3b1c06 <https://github.com/ansible/pylibssh/commit/9053c1008bb169c8e362a92782d46c7c0d3b1c06>`__, `aaa12159b5cdda763a83dcf4ee920510cad83463 <https://github.com/ansible/pylibssh/commit/aaa12159b5cdda763a83dcf4ee920510cad83463>`__.\n\n- The RPM specification has been updated to pre-build the\n  vendored copy of ``setuptools-scm`` with the isolation\n  disabled, addressing the build problem in EL 9\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `dd85ddefafde8f22ab0239add18a1db9ef789b50 <https://github.com/ansible/pylibssh/commit/dd85ddefafde8f22ab0239add18a1db9ef789b50>`__.\n\n- The RPM definition now runs import self-checks when it is\n  built for Fedora Linux -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#615 <https://github.com/ansible/pylibssh/issues/615>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- RPM builds are now also tested against UBI 9.4 in CI\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `e9ad0a7d456c99cc848b30b48569235366273672 <https://github.com/ansible/pylibssh/commit/e9ad0a7d456c99cc848b30b48569235366273672>`__.\n\n\n----\n\n\nv1.2.0.post4\n============\n\n*(2024-06-09)*\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- Substituting the ``gh`` role in source distribution long\n  description has been simplify to stop attempting to make\n  URLs to arbitrary GitHub addresses -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `f4ad1b76 <https://github.com/ansible/pylibssh/commit/f4ad1b76>`__.\n\n- The in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend's regular expression\n  has been hotfixed to replace the \"project\" substitution\n  correctly -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Previously, it was generating a lot of noise instead of a\n  nice description. But not anymore.\n\n  *Related issues and pull requests on GitHub:*\n  `#92752210 <https://github.com/ansible/pylibssh/issues/92752210>`__.\n\n\n----\n\n\nv1.2.0.post2\n============\n\n*(2024-06-08)*\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- The automation now replaces the \"project\" RST substitution\n  in the long description and GitHub Discussions/Releases\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `13374a71 <https://github.com/ansible/pylibssh/commit/13374a71>`__.\n\n- The CI/CD automation has been fixed to include changelog\n  updates into source distribution tarballs\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `627f718d <https://github.com/ansible/pylibssh/commit/627f718d>`__.\n\n\n----\n\n\nv1.2.0\n======\n\n*(2024-06-07)*\n\n\nBug fixes\n---------\n\n- ansible-pylibssh no longer crashes when received EOF or when channel is not explicitly\n  closed -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.\n\n  Previously, ansible-pylibssh crashed if ``channel.recv`` was called and ``libssh``\n  returned ``SSH_EOF`` error. It also crashed on some special occasions where\n  channel was not explicitly closed and the session object was garbage-collected\n  first.\n\n  *Related issues and pull requests on GitHub:*\n  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.\n\n\nFeatures\n--------\n\n- Started exposing the ``SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES``\n  and ``SSH_OPTIONS_HOSTKEYS`` options publicly\n  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#527 <https://github.com/ansible/pylibssh/issues/527>`__.\n\n- The ``request_exec()`` method was added to the ``Channel`` class. It exposes an\n  interface for calling the respective low-level C-API of the underlying\n  ``libssh`` library -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.\n\n  Additionally, the following calls to ``libssh`` are now available in the same\n  class: ``request_exec()``, ``send_eof()``, ``request_send_signal()`` and\n  ``is_eof`` which is exposed as a ``property``.\n\n  *Related issues and pull requests on GitHub:*\n  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.\n\n\nImproved documentation\n----------------------\n\n- Fixed spelling of \"Connect\" in the ``Session.connect()``\n  docstring -- by `@donnerhacke <https://github.com/sponsors/donnerhacke>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#474 <https://github.com/ansible/pylibssh/issues/474>`__.\n\n- Added a tip to the ``installation guide``\n  on how to set compiler flags when installing from source\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#499 <https://github.com/ansible/pylibssh/issues/499>`__.\n\n- Fixed the example of invoking remote commands by using\n  ``Channel.exec_command()`` in snippets -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__.\n\n  Its previously showcased version wasn't functional.\n\n  *Related issues and pull requests on GitHub:*\n  `#576 <https://github.com/ansible/pylibssh/issues/576>`__.\n\n\nPackaging updates and notes for downstreams\n-------------------------------------------\n\n- A flaw in the logic for copying the project directory into a\n  temporary folder that led to infinite recursion when ``TMPDIR``\n  was set to a project subdirectory path. This was happening in Fedora\n  and its downstream due to the use of `pyproject-rpm-macros\n  <https://src.fedoraproject.org/rpms/pyproject-rpm-macros>`__. It was\n  only reproducible with ``pip wheel`` and was not affecting the\n  ``pyproject-build`` users.\n\n  -- by `@hroncok <https://github.com/sponsors/hroncok>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related commits on GitHub:*\n  `89c9b3a <https://github.com/ansible/pylibssh/commit/89c9b3a>`__.\n\n- From now on, the published distribution package artifacts\n  for the new releases are signed via `Sigstore\n  <https://sigstore.dev>`__ -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This is happening as a part of the GitHub Actions CI/CD\n  workflow automation and the signatures are uploaded to\n  the corresponding GitHub Release pages.\n\n  *Related commits on GitHub:*\n  `986988a <https://github.com/ansible/pylibssh/commit/986988a>`__.\n\n- The platform-specific macOS wheels are now built using the\n  Python interpreter from https://python.org. They are tagged\n  with ``macosx_10_9`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#333 <https://github.com/ansible/pylibssh/issues/333>`__.\n\n- The ``toml`` build time dependency has been replaced with\n  ``tomli`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  The ``tomli`` distribution is only pulled in under Python\n  versions below 3.11. On 3.11 and higher, the standard\n  library module ``tomllib`` is now used instead.\n\n  *Related issues and pull requests on GitHub:*\n  `#501 <https://github.com/ansible/pylibssh/issues/501>`__.\n\n- Started using the built-in ``setuptools-scm`` Git archive\n  support under Python 3.7 and higher -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#502 <https://github.com/ansible/pylibssh/issues/502>`__.\n\n- Added support for Python 3.12 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  It is now both tested in the CI and is advertised through\n  the Trove classifiers.\n\n  *Related issues and pull requests on GitHub:*\n  `#532 <https://github.com/ansible/pylibssh/issues/532>`__.\n\n- The ``Cython`` build time dependency now has the minimum\n  version of 3.0 under Python 3.12 and higher\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  The previous versions of ``Cython`` are still able to build\n  the project under older Python versions.\n\n  *Related issues and pull requests on GitHub:*\n  `#540 <https://github.com/ansible/pylibssh/issues/540>`__.\n\n- `PEP 660 <https://peps.python.org/pep-660>`__ is now enabled -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Previously, due to restrictive `PEP 517 <https://peps.python.org/pep-517>`__ hook reimports,\n  our in-tree build backend was losing ``non-PEP 517``\n  hooks implemented in newer versions of ``setuptools`` but not\n  the earlier ones. This is now addressed by reexporting\n  everything that ``setuptools`` exposes with a wildcard.\n\n  *Related issues and pull requests on GitHub:*\n  `#541 <https://github.com/ansible/pylibssh/issues/541>`__.\n\n- The ``setuptools-scm`` build dependency CI pin was updated to 8.1.0 \u2014\n  this version fixes a date parsing incompatibility introduced by Git 2.45.0\n  (GitHub: ``pypa/setuptools_scm#1038``,\n  GitHub: ``pypa/setuptools_scm#1039``)\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#601 <https://github.com/ansible/pylibssh/issues/601>`__.\n\n\nContributor-facing changes\n--------------------------\n\n- The ``changelog`` page for the tagged release builds on\n  Read The Docs does not attempt showing the draft section\n  anymore -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `852d259 <https://github.com/ansible/pylibssh/commit/852d259>`__.\n\n- Adjusted the publishing workflow automation to pre-configure\n  Git before attempting to create a tag when building a\n  source distribution -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related commits on GitHub:*\n  `f07296f <https://github.com/ansible/pylibssh/commit/f07296f>`__.\n\n- The CI configuration for building the macOS platform-specific\n  wheels switched to using ``cibuildwheel`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#333 <https://github.com/ansible/pylibssh/issues/333>`__.\n\n- The OS-level tox package was upgraded to v3.28.0 in the UBI9\n  CI runtime -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#461 <https://github.com/ansible/pylibssh/issues/461>`__, `#473 <https://github.com/ansible/pylibssh/issues/473>`__.\n\n- Fixed spelling of \"Connect\" in the ``Session.connect()``\n  docstring -- by `@donnerhacke <https://github.com/sponsors/donnerhacke>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#474 <https://github.com/ansible/pylibssh/issues/474>`__.\n\n- The Packit CI access to the internet has been restored\n  -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#507 <https://github.com/ansible/pylibssh/issues/507>`__.\n\n- Started building ``manylinux_2_28`` base images for testing and\n  packaging in the CI/CD infrastructure -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#533 <https://github.com/ansible/pylibssh/issues/533>`__.\n\n- Switched back to using Cython's native plugin for measuring\n  code coverage -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#538 <https://github.com/ansible/pylibssh/issues/538>`__.\n\n- Added separate changelog fragment types for contributor-\n  and downstream-facing patches -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  Their corresponding identifiers are ``contrib`` and ``packaging``\n  respectively. They are meant to be used for more accurate\n  classification, where one would resort to using ``misc`` otherwise.\n\n  *Related issues and pull requests on GitHub:*\n  `#539 <https://github.com/ansible/pylibssh/issues/539>`__.\n\n- `PEP 660 <https://peps.python.org/pep-660>`__ is now enabled -- `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  This effectively means that the ecosystem-native editable\n  install mode started working properly.\n\n  *Related issues and pull requests on GitHub:*\n  `#541 <https://github.com/ansible/pylibssh/issues/541>`__.\n\n- The duplicated jobs matrices for building manylinux wheels\n  now reside in a single GitHub Actions CI/CD reusable\n  workflow definition.\n\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#559 <https://github.com/ansible/pylibssh/issues/559>`__.\n\n- The duplicated jobs matrices of the text jobs now reside in\n  a single GitHub Actions CI/CD reusable workflow definition.\n\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#560 <https://github.com/ansible/pylibssh/issues/560>`__.\n\n- Fixed the location of release workflow in the\n  ``Release Guide`` document -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#565 <https://github.com/ansible/pylibssh/issues/565>`__.\n\n- The ``setuptools-scm`` build dependency CI pin was updated to 8.1.0 \u2014\n  this version fixes a date parsing incompatibility introduced by Git 2.45.0\n  (GitHub: ``pypa/setuptools_scm#1039``,\n  GitHub: ``pypa/setuptools_scm#1038``)\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__.\n\n  *Related issues and pull requests on GitHub:*\n  `#601 <https://github.com/ansible/pylibssh/issues/601>`__.\n\n- The CI/CD configuration was fixed to allow publishing\n  to PyPI and other targets disregarding the test stage\n  outcome. This used to be a bug in the workflow definition\n  that has now been fixed.\n\n  -- by `@pbrezina <https://github.com/sponsors/pbrezina>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  *Related issues and pull requests on GitHub:*\n  `#602 <https://github.com/ansible/pylibssh/issues/602>`__.\n\n\n----\n\n\nv1.1.0 (2022-12-05)\n===================\n\nFeatures\n--------\n\n- Started building ``manylinux`` wheels with ``libssh`` v0.9.6\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#441 <https://github.com/ansible/pylibssh/issues/441>`__)\n\n\nDeprecations (removal in next major release)\n--------------------------------------------\n\n- The project stopped being tested under Ubuntu 18.04 VM since\n  GitHub is sunsetting their CI images -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#381 <https://github.com/ansible/pylibssh/issues/381>`__)\n\n\nDocumentation\n-------------\n\n- Added a ``Release Guide`` for making new releases\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#413 <https://github.com/ansible/pylibssh/issues/413>`__)\n\n\nMiscellaneous\n-------------\n\n- Started testing RPM packaging spec with Packit service\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__ and `@TomasTomecek <https://github.com/sponsors/TomasTomecek>`__\n  (`#227 <https://github.com/ansible/pylibssh/issues/227>`__,\n  `#246 <https://github.com/ansible/pylibssh/issues/246>`__)\n- Removed the remains of Python 2 compatiblity code from the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#377 <https://github.com/ansible/pylibssh/issues/377>`__)\n- Fixed removing ``expandvars`` from ``pyproject.toml``\n  in an RPM spec -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  Before this patch, the ``sed`` invocation removed entire\n  ``build-system.requires`` entry from there, in rare cases\n  but this won't be happening anymore.\n  (`#378 <https://github.com/ansible/pylibssh/issues/378>`__)\n- Declared official support of CPython 3.11 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#396 <https://github.com/ansible/pylibssh/issues/396>`__)\n- Started shipping sdists built with Cython v0.29.32 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#399 <https://github.com/ansible/pylibssh/issues/399>`__)\n- Started building RPMs with Cython v0.29.32 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#402 <https://github.com/ansible/pylibssh/issues/402>`__)\n- Added an SSH connection re-try helper to tests -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#405 <https://github.com/ansible/pylibssh/issues/405>`__)\n\n\nv1.0.0 (2022-09-14)\n===================\n\nFeatures\n--------\n\n- Added ``password_prompt`` argument to ``connect()`` to override the default\n  prompt of \"password:\" when using keyboard-interactive authentication -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#331 <https://github.com/ansible/pylibssh/issues/331>`__)\n- Added support for ``:fd:`` socket option -- by `@sabedevops <https://github.com/sponsors/sabedevops>`__\n  (`#343 <https://github.com/ansible/pylibssh/issues/343>`__)\n\n\nMiscellaneous\n-------------\n\n- Reworked build scripts to fix manylinux container generation -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#321 <https://github.com/ansible/pylibssh/issues/321>`__)\n- Reenable CI building on s390x -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#322 <https://github.com/ansible/pylibssh/issues/322>`__)\n\n\nv0.4.0 (2022-04-26)\n===================\n\nBugfixes\n--------\n\n- Improved ``channel.exec_command`` to always use a newly created ``ssh_channel`` to avoid\n  segfaults on repeated calls -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#280 <https://github.com/ansible/pylibssh/issues/280>`__)\n- Fixed password prompt match in ``pylibsshext.session.Session.authenticate_interactive()``\n  to strip whitespace, check that the prompt only ends with ``password:``, and added\n  a little extra logging -- by `@dalrrard <https://github.com/sponsors/dalrrard>`__\n  (`#311 <https://github.com/ansible/pylibssh/issues/311>`__)\n\n\nBackward incompatible changes\n-----------------------------\n\n- Dropped support for Python 2.7 and 3.5, and marked support for 3.10 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#314 <https://github.com/ansible/pylibssh/issues/314>`__)\n\n\nv0.3.0 (2021-11-03)\n===================\n\nBugfixes\n--------\n\n- Changed ``sftp.sftp_get`` to write files as bytes rather than assuming files are valid UTF8 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#216 <https://github.com/ansible/pylibssh/issues/216>`__)\n\n\nFeatures\n--------\n\n- Started building platform-specific ``manylinux2010``, ``manylinux2014``\n  and ``manylinux_2_24`` wheels for AARCH64, ppc64le and s390x\n  architectures as introduced by `PEP 599 <https://peps.python.org/pep-599>`__ and `PEP 600 <https://peps.python.org/pep-600>`__\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#187 <https://github.com/ansible/pylibssh/issues/187>`__)\n- Added gssapi-with-mic support for authentication -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#195 <https://github.com/ansible/pylibssh/issues/195>`__)\n\n\nDocumentation\n-------------\n\n- Correct a link to the pip upgrade doc in our installation guide\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#225 <https://github.com/ansible/pylibssh/issues/225>`__)\n\n\nMiscellaneous\n-------------\n\n- Started building AARCH64 base images with Buildah+Podman in GitHub\n  Actions CI/CD -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#181 <https://github.com/ansible/pylibssh/issues/181>`__)\n- Switched using `pep517 <https://pep517.rtfd.io>`__ lib to\n  `build <https://pypa-build.rtfd.io>`__ CLI -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#199 <https://github.com/ansible/pylibssh/issues/199>`__)\n- Restructured the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build backend into multiple\n  submodules moving the entry-point to ``pep517_backend.hooks``\n  that also facilitates extraction of user-defined\n  ``config_settings`` passed by the end-user (packager)\n  via the ``build`` CLI command -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#200 <https://github.com/ansible/pylibssh/issues/200>`__)\n- Updated manylinux build script to build libssh with GSSAPI\n  enabled -- `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#203 <https://github.com/ansible/pylibssh/issues/203>`__)\n- Added an initial RPM spec continuously tested in the CI -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#205 <https://github.com/ansible/pylibssh/issues/205>`__)\n- Added additional details when SFTP write errors are raised -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#216 <https://github.com/ansible/pylibssh/issues/216>`__)\n- Made ``auditwheel`` only keep one platform tag in the produced wheel\n  names -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#224 <https://github.com/ansible/pylibssh/issues/224>`__)\n- Improved manylinux build scripts to expect dual-aliased manylinux tags\n  produced for versions 1/2010/2014 along with their `PEP 600 <https://peps.python.org/pep-600>`__\n  counterparts after ``auditwheel repair`` -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#226 <https://github.com/ansible/pylibssh/issues/226>`__)\n- Enabled self-test checks in the RPM spec for Fedora\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#228 <https://github.com/ansible/pylibssh/issues/228>`__)\n- Enabled self-test checks in the RPM spec for CentOS\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#235 <https://github.com/ansible/pylibssh/issues/235>`__)\n- Enabled self-test checks in the RPM spec for RHEL\n  -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#236 <https://github.com/ansible/pylibssh/issues/236>`__)\n- Added ``NAME = \"VALUE\"`` to flake8-eradicate whitelist to work around test false positive introduced in flake8-eradicate 1.1.0 -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#258 <https://github.com/ansible/pylibssh/issues/258>`__)\n- Stopped testing ``pylibssh`` binary wheels under Ubuntu 16.04 in GitHub\n  Actions CI/CD because it is EOL now -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#260 <https://github.com/ansible/pylibssh/issues/260>`__)\n- Fixed failing fast on problems with ``rpmbuild`` in GitHub Actions CI/CD\n  under Fedora -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#261 <https://github.com/ansible/pylibssh/issues/261>`__)\n- Declare ``python3-pip`` a build dependency under Fedora fixing the RPM\n  creation job in GitHub Actions CI/CD under Fedora -- `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#262 <https://github.com/ansible/pylibssh/issues/262>`__)\n- Replaced git protocols in pre-commit config with https now that GitHub has turned\n  off git protocol access -- `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#266 <https://github.com/ansible/pylibssh/issues/266>`__)\n\n\nv0.2.0 (2021-03-01)\n===================\n\nBugfixes\n--------\n\n- Fixed ``undefined symbol: ssh_disconnect`` and related issues when building on certain distros -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#63 <https://github.com/ansible/pylibssh/issues/63>`__,\n  `#153 <https://github.com/ansible/pylibssh/issues/153>`__,\n  `#158 <https://github.com/ansible/pylibssh/issues/158>`__)\n- Fixed ``\"Negative size passed to PyBytes_FromStringAndSize\"`` when ``ssh_channel_read_nonblocking`` fails -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#168 <https://github.com/ansible/pylibssh/issues/168>`__)\n\n\nFeatures\n--------\n\n- Added SCP support -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#151 <https://github.com/ansible/pylibssh/issues/151>`__,\n  `#157 <https://github.com/ansible/pylibssh/issues/157>`__)\n\n\nDocumentation\n-------------\n\n- Added the initial user guide to docs\n  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#141 <https://github.com/ansible/pylibssh/issues/141>`__)\n- Added the initial testing guide to docs\n  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#142 <https://github.com/ansible/pylibssh/issues/142>`__)\n- Added the initial installation guide to docs\n  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__ and `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#145 <https://github.com/ansible/pylibssh/issues/145>`__)\n\n\nMiscellaneous\n-------------\n\n- Migrated the \"draft changelog\" plugin to the external\n  `sphinxcontrib-towncrier implementation\n  <https://github.com/sphinx-contrib/sphinxcontrib-towncrier>`__\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#123 <https://github.com/ansible/pylibssh/issues/123>`__)\n- Declared official support of CPython 3.9 -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#152 <https://github.com/ansible/pylibssh/issues/152>`__)\n\n\nv0.1.0 (2020-08-12)\n===================\n\nBugfixes\n--------\n\n- Enhanced sftp error handling code to match\n  with libssh error messages -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#27 <https://github.com/ansible/pylibssh/issues/27>`__)\n- Fixed session timeout issue, the data type\n  of timeout is expected by ``ssh_options_set``\n  is of type ``long int`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#46 <https://github.com/ansible/pylibssh/issues/46>`__)\n- Fixed sftp file get issue. On py2\n  The file ``write()`` method returns ``None`` on py2\n  if bytes are written to file successfully, whereas\n  on py3 it returns total number of bytes written\n  to file. Added a fix to check for the number of\n  bytes written only in the case when ``write()``\n  does not return ``None`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#58 <https://github.com/ansible/pylibssh/issues/58>`__)\n- Fixed double close issue, added logic to free\n  the channel allocated memory within\n  ``__dealloc__()`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#113 <https://github.com/ansible/pylibssh/issues/113>`__)\n\n\nFeatures\n--------\n\n- Added cython extension for libssh client\n  API's initial commit -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#1 <https://github.com/ansible/pylibssh/issues/1>`__)\n- Added proxycommand support for session and\n  update session exeception to ``LibsshSessionException`` -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#10 <https://github.com/ansible/pylibssh/issues/10>`__)\n- Added support for host key checking with\n  authentication -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#15 <https://github.com/ansible/pylibssh/issues/15>`__)\n- Changed pylibssh dir to pylibsshext to avoid ns collision -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#25 <https://github.com/ansible/pylibssh/issues/25>`__)\n- Added sftp get functionality to fetch file\n  from remote host -- by `@amolkahat <https://github.com/sponsors/amolkahat>`__\n  (`#26 <https://github.com/ansible/pylibssh/issues/26>`__)\n- Added support to receive bulk response\n  for remote shell -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#40 <https://github.com/ansible/pylibssh/issues/40>`__)\n- Added the support for keyboard-authentication method -- by `@Qalthos <https://github.com/sponsors/Qalthos>`__\n  (`#105 <https://github.com/ansible/pylibssh/issues/105>`__)\n\n\nBackward incompatible changes\n-----------------------------\n\n- Updated the package name to ``ansible-pylibssh`` to reflect\n  that the library only intends to implement a set of APIs that\n  are necessary to implement an Ansible connection plugin\n  -- by `@ganeshrn <https://github.com/sponsors/ganeshrn>`__\n  (`#1 <https://github.com/ansible/pylibssh/issues/1>`__)\n\n\nDocumentation\n-------------\n\n- Documented how to compose `Towncrier\n  <https://towncrier.readthedocs.io/en/actual-freaking-docs/>`__\n  news fragments -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#124 <https://github.com/ansible/pylibssh/issues/124>`__)\n- Documented how to contribute to the docs -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#126 <https://github.com/ansible/pylibssh/issues/126>`__)\n\n\nMiscellaneous\n-------------\n\n- Updated requirements file to replace\n  ``requirements.txt`` with ``requirements-build.in`` -- by `@akasurde <https://github.com/sponsors/akasurde>`__\n  (`#14 <https://github.com/ansible/pylibssh/issues/14>`__)\n- Made tox's main env pick up the in-tree `PEP 517 <https://peps.python.org/pep-517>`__ build\n  backend -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#72 <https://github.com/ansible/pylibssh/issues/72>`__)\n- Refactored sphinx RST parsing in towncrier extension -- by `@ewjoachim <https://github.com/sponsors/ewjoachim>`__\n  (`#119 <https://github.com/ansible/pylibssh/issues/119>`__)\n- Hotfixed the directive in the in-tree sphinx extension to\n  always trigger the changelog document rebuilds so that it'd\n  pick up any changelog fragments from disk\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#120 <https://github.com/ansible/pylibssh/issues/120>`__)\n- Turned the Townrier fragments README doc title into subtitle\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n\n  The effect is that it doesn't show up in the side bar as an\n  individual item anymore.\n  (`#125 <https://github.com/ansible/pylibssh/issues/125>`__)\n- Integrated Markdown support into docs via the `MyST parser\n  <https://myst-parser.readthedocs.io/>`__ -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#126 <https://github.com/ansible/pylibssh/issues/126>`__)\n- Switched the builder on `Read the Docs\n  <https://readthedocs.org/>`__ to `dirhtml\n  <https://www.sphinx-doc.org/en/master/usage/builders/index.html#sphinx.builders.dirhtml.DirectoryHTMLBuilder>`__\n  so it now generates a dir-based URL layout for the website\n  -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#127 <https://github.com/ansible/pylibssh/issues/127>`__)\n- Enabled `sphinx.ext.autosectionlabel Sphinx extension\n  <https://myst-parser.readthedocs.io/>`__ to automatically generate\n  reference targets for document sections that can be linked\n  against using ``:ref:`` -- by `@webknjaz <https://github.com/sponsors/webknjaz>`__\n  (`#128 <https://github.com/ansible/pylibssh/issues/128>`__)\n",
    "bugtrack_url": null,
    "license": "LGPLv2+",
    "summary": "Python bindings for libssh client specific to Ansible use case",
    "version": "1.3.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/ansible/pylibssh/issues",
        "CI: GitHub Workflows": "https://github.com/ansible/pylibssh/actions?query=branch:devel",
        "Code of Conduct": "https://docs.ansible.com/ansible/latest/community/code_of_conduct.html",
        "Docs: RTD": "https://ansible-pylibssh.rtfd.io/",
        "Homepage": "https://github.com/ansible/pylibssh",
        "Source Code": "https://github.com/ansible/pylibssh"
    },
    "split_keywords": [
        "cython",
        " cext",
        " libssh"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b52e0591e3f88b7cf9a3ad77147c93cd6eaa2fc4a801f07efbb215e748c061db",
                "md5": "6a83c75c73ef68d9798e0ed67cd314d0",
                "sha256": "fe5231259d23eaedf92c50836bcca2033270f8a753e86293cec472d8bc2b78c3"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6a83c75c73ef68d9798e0ed67cd314d0",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2489774,
            "upload_time": "2025-10-12T01:08:39",
            "upload_time_iso_8601": "2025-10-12T01:08:39.331401Z",
            "url": "https://files.pythonhosted.org/packages/b5/2e/0591e3f88b7cf9a3ad77147c93cd6eaa2fc4a801f07efbb215e748c061db/ansible_pylibssh-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "42c0cb997bc56a08c7a688e8c441ba72e856ae685ffc9609057b183808a6df2d",
                "md5": "fa1acde40c09bde922f99da47243f875",
                "sha256": "206adcc43d638fdd2c71de180fcb3a5f4e6523278022b182c2d85624fe368823"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "fa1acde40c09bde922f99da47243f875",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2361425,
            "upload_time": "2025-10-12T01:08:41",
            "upload_time_iso_8601": "2025-10-12T01:08:41.609715Z",
            "url": "https://files.pythonhosted.org/packages/42/c0/cb997bc56a08c7a688e8c441ba72e856ae685ffc9609057b183808a6df2d/ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "36277cd6296958de769bcc9a1597678821098a3a0d063f4afb3531c04665f781",
                "md5": "6044d72f6c55067387cd26fc2cba6be0",
                "sha256": "ddddb5bdafa0f01f6290e75ed8764b62610528e28c7b964f4f9acad8c88c9ac1"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "6044d72f6c55067387cd26fc2cba6be0",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2714233,
            "upload_time": "2025-10-12T01:08:43",
            "upload_time_iso_8601": "2025-10-12T01:08:43.507960Z",
            "url": "https://files.pythonhosted.org/packages/36/27/7cd6296958de769bcc9a1597678821098a3a0d063f4afb3531c04665f781/ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30fd79c2cf8001dc5f27d56855a53e53da2edadeac981e4ab1e1b6cbf9e51a17",
                "md5": "e1bc992fc560235bbbcba76a10c08736",
                "sha256": "ba088dcdb81bbc3c378b3bb1f847df1ab69bf99c8a7e5e0b052e3c5a9183adcc"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "has_sig": false,
            "md5_digest": "e1bc992fc560235bbbcba76a10c08736",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2194959,
            "upload_time": "2025-10-12T01:08:45",
            "upload_time_iso_8601": "2025-10-12T01:08:45.881439Z",
            "url": "https://files.pythonhosted.org/packages/30/fd/79c2cf8001dc5f27d56855a53e53da2edadeac981e4ab1e1b6cbf9e51a17/ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "33b4befaa1f0ddb22dd3849d8466154bd6f3fd5e70fb3eb82cecb9e9ad62f9b0",
                "md5": "c2de48bbc5e4ca608f57f82370b4577b",
                "sha256": "196ff3ed8a6f54e809703209f6a1096b2d85031b7eb2ceb0c6af1ab549a71acd"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c2de48bbc5e4ca608f57f82370b4577b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.9",
            "size": 2589618,
            "upload_time": "2025-10-12T01:08:47",
            "upload_time_iso_8601": "2025-10-12T01:08:47.755831Z",
            "url": "https://files.pythonhosted.org/packages/33/b4/befaa1f0ddb22dd3849d8466154bd6f3fd5e70fb3eb82cecb9e9ad62f9b0/ansible_pylibssh-1.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0c8ba9803748b30b4f2e6594440fd976ad20626ab02de334f2fc874428794977",
                "md5": "9f8de81cadc355a9c36e5fda7c42958c",
                "sha256": "248f9fc4687e07818942d618ba3133aa155402be9c0e31fb4df0d9c5504e1b64"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9f8de81cadc355a9c36e5fda7c42958c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2490652,
            "upload_time": "2025-10-12T01:08:49",
            "upload_time_iso_8601": "2025-10-12T01:08:49.434470Z",
            "url": "https://files.pythonhosted.org/packages/0c/8b/a9803748b30b4f2e6594440fd976ad20626ab02de334f2fc874428794977/ansible_pylibssh-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "de0e19916cd0b7d626910ad6a4dc2ed88d9744a1bd1cda5672eac19d1bda4bab",
                "md5": "65d149e49723570bedb5009127b7f2a5",
                "sha256": "3a6ad801fd94be7782abaa86ae0421b99c55586eb2f583b113a5b75964c823d7"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "65d149e49723570bedb5009127b7f2a5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2357722,
            "upload_time": "2025-10-12T01:08:51",
            "upload_time_iso_8601": "2025-10-12T01:08:51.293784Z",
            "url": "https://files.pythonhosted.org/packages/de/0e/19916cd0b7d626910ad6a4dc2ed88d9744a1bd1cda5672eac19d1bda4bab/ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e6573a79733b74fdb2e28000dcfdcfacda918d2c0e1812a683691bc0dab26878",
                "md5": "514c786036a0f4cbddb0b8d5ab608c78",
                "sha256": "f720e6b1f50d99698e52cb6e41f05dfbb1f033a1d852f1ea5b1005055cf968e8"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "514c786036a0f4cbddb0b8d5ab608c78",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2712675,
            "upload_time": "2025-10-12T01:08:53",
            "upload_time_iso_8601": "2025-10-12T01:08:53.207850Z",
            "url": "https://files.pythonhosted.org/packages/e6/57/3a79733b74fdb2e28000dcfdcfacda918d2c0e1812a683691bc0dab26878/ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7153f5742f1ef3da34e067a29466aac88f179ae3ebadf02bfa4ce92e4b004918",
                "md5": "dccf6dbe50afe2ef357309b70eaf3a7d",
                "sha256": "f613dfd50a1336019cb1a8a28098d3212fb163cc5e47da620c54ab0fe9af9a4e"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "has_sig": false,
            "md5_digest": "dccf6dbe50afe2ef357309b70eaf3a7d",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2188483,
            "upload_time": "2025-10-12T01:08:54",
            "upload_time_iso_8601": "2025-10-12T01:08:54.946226Z",
            "url": "https://files.pythonhosted.org/packages/71/53/f5742f1ef3da34e067a29466aac88f179ae3ebadf02bfa4ce92e4b004918/ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "105b3bec950215581bce7eb547256a3da053ad71fde72b31d11a76a86c64b52b",
                "md5": "f4de6ca737b571ad9df6ce305d84250e",
                "sha256": "daeae1c936fc8145beb5843e365a314819b5ec0905500b795db945b64a3614ac"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f4de6ca737b571ad9df6ce305d84250e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.9",
            "size": 2582419,
            "upload_time": "2025-10-12T01:08:56",
            "upload_time_iso_8601": "2025-10-12T01:08:56.629520Z",
            "url": "https://files.pythonhosted.org/packages/10/5b/3bec950215581bce7eb547256a3da053ad71fde72b31d11a76a86c64b52b/ansible_pylibssh-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f3e978b565e80b9354c4ff2f65a3e21ad7d6ce93d64197c531671d50988b214c",
                "md5": "11bb35ce1e708e4c3c38f653e40532e6",
                "sha256": "0fadea3027fadd23feb5dbf6db3c2617ee69978e8521a6c47877947b4327c349"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "11bb35ce1e708e4c3c38f653e40532e6",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2493133,
            "upload_time": "2025-10-12T01:08:58",
            "upload_time_iso_8601": "2025-10-12T01:08:58.608663Z",
            "url": "https://files.pythonhosted.org/packages/f3/e9/78b565e80b9354c4ff2f65a3e21ad7d6ce93d64197c531671d50988b214c/ansible_pylibssh-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4293095252bdd4961feba9b02591c0cf68036cc5cb7e517fa58cf4829f02a976",
                "md5": "aa1fc8536cedc9166bd39280d1133412",
                "sha256": "e7b38fb5fe94417b4f8348e499a8728a36599ec5c1b7c7ba79e424bf69794071"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "aa1fc8536cedc9166bd39280d1133412",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2386366,
            "upload_time": "2025-10-12T01:09:00",
            "upload_time_iso_8601": "2025-10-12T01:09:00.183491Z",
            "url": "https://files.pythonhosted.org/packages/42/93/095252bdd4961feba9b02591c0cf68036cc5cb7e517fa58cf4829f02a976/ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ab43c6a1e3fb75c79b309ddb1e8ca79e00d5ca0ff10f3d46e66282f9d0085b79",
                "md5": "91453094e189ff3441615e115f8b1e0e",
                "sha256": "1fab4f5e1b49782cd53765fc4bf239d92dc236550a9775de238d306452bf2cba"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "91453094e189ff3441615e115f8b1e0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2738851,
            "upload_time": "2025-10-12T01:09:01",
            "upload_time_iso_8601": "2025-10-12T01:09:01.949534Z",
            "url": "https://files.pythonhosted.org/packages/ab/43/c6a1e3fb75c79b309ddb1e8ca79e00d5ca0ff10f3d46e66282f9d0085b79/ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b34a63d915984ff32d638ea6e2df390074d8f7f4e9efe34e27f96f392f50f087",
                "md5": "902af9fa9915403ee265e9d6e10653f8",
                "sha256": "8d1804c71ad5d7f5d03cc97447ed91ba1bdfde7fe72ba9d03478bb5220ff3d04"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "has_sig": false,
            "md5_digest": "902af9fa9915403ee265e9d6e10653f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2219773,
            "upload_time": "2025-10-12T01:09:03",
            "upload_time_iso_8601": "2025-10-12T01:09:03.795756Z",
            "url": "https://files.pythonhosted.org/packages/b3/4a/63d915984ff32d638ea6e2df390074d8f7f4e9efe34e27f96f392f50f087/ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "05ecde69b732b17e958f3d5b4c71010cec20cf30544d3a22b768dc712027ec46",
                "md5": "a4e41a63ae78a4e5665e06342bef518d",
                "sha256": "63859232d3a6d43a84ad8301c637a05be1ee47f0dee121015fc87bbacdd60532"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a4e41a63ae78a4e5665e06342bef518d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.9",
            "size": 2609480,
            "upload_time": "2025-10-12T01:09:05",
            "upload_time_iso_8601": "2025-10-12T01:09:05.477323Z",
            "url": "https://files.pythonhosted.org/packages/05/ec/de69b732b17e958f3d5b4c71010cec20cf30544d3a22b768dc712027ec46/ansible_pylibssh-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "20cdf820a0e26c85b16980dd947d078f19d47dbe2f4fdc0be8586b3368f475f4",
                "md5": "bc1771cec1102b3e026f3c390ad4fd12",
                "sha256": "0368909bda847e3c78304655f7da7c8c84fad4bdf2dbd608b04697a69d4deda8"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bc1771cec1102b3e026f3c390ad4fd12",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2492845,
            "upload_time": "2025-10-12T01:09:07",
            "upload_time_iso_8601": "2025-10-12T01:09:07.279492Z",
            "url": "https://files.pythonhosted.org/packages/20/cd/f820a0e26c85b16980dd947d078f19d47dbe2f4fdc0be8586b3368f475f4/ansible_pylibssh-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a9b9f1e104263da3d384228a44c7408e329483fc0e3f422346a19f25d770790b",
                "md5": "6931999a7954edf98d79d770bb569996",
                "sha256": "6e9646bad00e5ef84de2d6f1897ceafa2a193e983ed6429a3f958e15bb100531"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "6931999a7954edf98d79d770bb569996",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2361555,
            "upload_time": "2025-10-12T01:09:09",
            "upload_time_iso_8601": "2025-10-12T01:09:09.121235Z",
            "url": "https://files.pythonhosted.org/packages/a9/b9/f1e104263da3d384228a44c7408e329483fc0e3f422346a19f25d770790b/ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f14acc2fd18e7a33ca813a455585a17e25f0f87e1f0f4104147ad0e8b2a9af93",
                "md5": "08179d76a3f9e8b745185d2b6df814b5",
                "sha256": "7a17359bec66eaf84002714b389f996e4b2c6e8cf50e70185a1f2ffd063331cf"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "08179d76a3f9e8b745185d2b6df814b5",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2714433,
            "upload_time": "2025-10-12T01:09:11",
            "upload_time_iso_8601": "2025-10-12T01:09:11.548489Z",
            "url": "https://files.pythonhosted.org/packages/f1/4a/cc2fd18e7a33ca813a455585a17e25f0f87e1f0f4104147ad0e8b2a9af93/ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bba10192b94adb43cd3f0eab1f3c9073a7248925fee5429568a8447f16db1810",
                "md5": "bd702fd55b83b15eeb8ccadb91b73157",
                "sha256": "6b1abe0c4339d535cb5fbd28537bef75476a74edb0e82b7af10c1a4eafeeefba"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "has_sig": false,
            "md5_digest": "bd702fd55b83b15eeb8ccadb91b73157",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2195125,
            "upload_time": "2025-10-12T01:09:13",
            "upload_time_iso_8601": "2025-10-12T01:09:13.133677Z",
            "url": "https://files.pythonhosted.org/packages/bb/a1/0192b94adb43cd3f0eab1f3c9073a7248925fee5429568a8447f16db1810/ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_s390x.manylinux_2_28_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f5c5a6ea3b1d6dbd2c34943224c148b567b9a7ff0146fe7e34582ddf16a12222",
                "md5": "ef1557ec6152c811048df21180c04858",
                "sha256": "f4deb7a05d867e48c4a81a6e1e9371d55460cd596aab3b3c35413a95bfb45d3d"
            },
            "downloads": -1,
            "filename": "ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ef1557ec6152c811048df21180c04858",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.9",
            "size": 2589929,
            "upload_time": "2025-10-12T01:09:14",
            "upload_time_iso_8601": "2025-10-12T01:09:14.955100Z",
            "url": "https://files.pythonhosted.org/packages/f5/c5/a6ea3b1d6dbd2c34943224c148b567b9a7ff0146fe7e34582ddf16a12222/ansible_pylibssh-1.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "686d93b13182acd29632ef3ab58650fc5727936942e2ad642a48f6a5e12aebb4",
                "md5": "e1abd03ab26a611668a4fda3abcf0461",
                "sha256": "243ea1b0962b0b6b1e717ac0e69dac9636e61ec65b37260c317b2360c6e30ca7"
            },
            "downloads": -1,
            "filename": "ansible-pylibssh-1.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "e1abd03ab26a611668a4fda3abcf0461",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 151535,
            "upload_time": "2025-10-12T01:09:16",
            "upload_time_iso_8601": "2025-10-12T01:09:16.699439Z",
            "url": "https://files.pythonhosted.org/packages/68/6d/93b13182acd29632ef3ab58650fc5727936942e2ad642a48f6a5e12aebb4/ansible-pylibssh-1.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-12 01:09:16",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ansible",
    "github_project": "pylibssh",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "tox": true,
    "lcname": "ansible-pylibssh"
}
        
Elapsed time: 2.67586s