.. 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"
}