========= Changelog ========= .. note:: Looking for the Fabric 1.x changelog? See :doc:`/changelog-v1`. .. warning:: Keep in mind that Fabric is largely a wrapper around `Paramiko `_ and `Invoke `_ - Fabric's capabilities can often improve simply by upgrading your copies of those libraries! Click their names in this paragraph to visit their changelogs and see what you might get if you upgrade your dependencies. - :release:`3.2.2 <2023-08-30>` - :bug:`2204` The signal handling functionality added in Fabric 2.6 caused unrecoverable tracebacks when invoked from inside a thread (such as the use of `fabric.group.ThreadingGroup`) under certain interpreter versions. This has been fixed by simply refusing to register signal handlers when not in the main thread. Thanks to Francesco Giordano and others for the reports. - :bug:`-` `fabric.runners.Remote` failed to properly deregister its ``SIGWINCH`` signal handler on shutdown; in rare situations this could cause tracebacks when the Python process receives ``SIGWINCH`` while no remote session is active. This has been fixed. - :release:`3.2.1 <2023-08-06>` - :bug:`-` Neglected to actually add ``deprecated`` to our runtime dependency specification (it was still in our development dependencies). This has been fixed. - :release:`3.2.0 <2023-08-06>` - :feature:`-` Enhanced :ref:`fabric.testing ` in ways large and small: - Backwards-compatibly merged the functionality of `~fabric.testing.base.MockSFTP` into `~fabric.testing.base.MockRemote` (may be opted-into by instantiating the latter with ``enable_sftp=True``) so you can mock out both SSH *and* SFTP functionality in the same test, which was previously impossible. It also means you can use this in a Pytest autouse fixture to prevent any tests from accidentally hitting the network! - A new pytest fixture, `~fabric.testing.fixtures.remote_with_sftp`, has been added which leverages the previous bullet point (an all-in-one fixture suitable for, eg, preventing any incidental ssh/sftp attempts during test execution). - A pile of documentation and test enhancements (yes, testing our testing helpers is a thing). - :support:`-` Language update: applied ``s/sanity/safety/g`` to the codebase (with the few actual API members using the term now marked deprecated & new ones added in the meantime, mostly in :ref:`fabric.testing `). - :support:`-` Added a new runtime dependency on the `Deprecated `_ library. - :release:`3.1.0 <2023-05-25>` - :feature:`-` Implement opt-in support for Paramiko 3.2's `~paramiko.auth_strategy.AuthStrategy` machinery, as follows: - Added a new module and class, `fabric.auth.OpenSSHAuthStrategy`, which leverages aforementioned new Paramiko functionality to marry loaded SSH config files with Fabric-level and runtime-level parameters, arriving at what should be OpenSSH-client-compatible authentication behavior. See its API docs for details. - Added new :ref:`configuration settings `: - ``authentication.strategy_class``, which defaults to ``None``, but can be set to ``OpenSSHAuthStrategy`` to opt-in to the new behavior. - ``authentication.identities``, which defaults to the empty list, and can be a list of private key paths for use by the new strategy class. .. warning:: This feature is **EXPERIMENTAL**, **incomplete**, and subject to change! (For example, it lacks passphrase support, and doesn't implement 100% of all auth sources yet, focusing mostly on private keys and interactive-password.) - :feature:`-` Add a new CLI flag to ``fab``, ``fab --list-agent-keys``, which will attempt to connect to your local SSH agent and print a key list, similarly to ``ssh-add -l``. This is mostly useful for expectations-checking Fabric and Paramiko's agent functionality, or for situations where you might not have ``ssh-add`` handy. .. warning:: This feature requires Paramiko 3.2 or above. - :bug:`2263 major` Explicitly add our dependency on ``decorator`` to ``setup.py`` instead of using Invoke's old, now removed, vendored copy of same. This allows Fabric to happily use Invoke 2.1 and above. Thanks to Luke Robison, Nick Humrich, and others, for the reports. - :release:`3.0.1 <2023-04-29>` - :bug:`2241` A typo prevented Fabric's command runner from properly calling its superclass ``stop()`` method, which in tandem with a related Invoke bug meant messy or long shutdowns in many scenarios. Thanks to Orlando Rodríguez for report and initial patch. - :release:`3.0.0 <2023-01-20>` - :bug:`1981 major` (fixed in :issue:`2195`) Automatically close any open SFTP session during `fabric.connection.Connection.close`; this avoids issues encountered upon re-opening a previously-closed connection object. Thanks to Alexander Bodnya for the report and David JM Emmett for the patch. - :feature:`-` Change the default configuration value for ``inline_ssh_env`` from ``False`` to ``True``, to better align with the practicalities of common SSH server configurations. .. warning:: This change is backwards incompatible if you were using environment-variable-setting kwargs or config settings, such as ``Connection.run(command, env={'SOME': 'ENV VARS'})``, and were not already explicitly specifying the value of ``inline_ssh_env``. - :support:`-` Drop support for Python <3.6, including Python 2. .. warning:: This is a backwards incompatible change if you are not yet on Python 3.6 or above; however, pip shouldn't offer you this version of Fabric as long as your pip version understands ``python_requires`` metadata. - :release:`2.7.1 <2022-07-14>` - :bug:`1924` (also :issue:`2007`) Overhaul behavior and testing re: merging together different sources for the ``key_filename`` parameter in ``Connection.connect_kwargs``. This fixes a number of type-related errors (string objects have no ``extend`` attribute, cannot add lists to strings, etc). Thanks to Joey Dumont, Joseph Conti, and Jared Punzel for the reports; and to Kyle Meyer for submitting an early version of the patch. - :release:`2.7.0 <2022-03-25>` - :support:`-` Overhaul administrative metadata and migrate to Circle-CI from Travis-CI. - :feature:`-` Add `~fabric.connection.Connection.shell`, a belated port of the v1 ``open_shell()`` feature. - This wasn't needed initially, as the modern implementation of `~fabric.connection.Connection.run` is as good or better for full interaction than ``open_shell()`` was, provided you're happy supplying a specific shell to execute. - `~fabric.connection.Connection.shell` serves the corner case where you *aren't* happy doing that, eg when you're speaking to network appliances or other targets which are not typical Unix server environments. - Like ``open_shell()``, this new method is primarily for interactive use, and has a slightly less useful return value. See its API docs for more details. - :feature:`-` Forward local terminal resizes to the remote end, when applicable. (For the technical: this means we now turn ``SIGWINCH`` into SSH ``window-change`` messages.) - :bug:`2142 major` Update `~fabric.connection.Connection` temporarily so that it doesn't incidentally apply ``replace_env=True`` to local shell commands, only remote ones. On Windows under Python 3.7+, this was causing local commands to fail due to lack of some environment variables. Future updates will cleanly separate the config tree for remote vs local methods. Thanks to Bartosz Lachowicz for the report and David JM Emmett for the patch. - :release:`2.6.0 <2021-01-18>` - :bug:`- major` Fix a handful of issues in the handling and mocking of SFTP local paths and ``os.path`` members within :ref:`fabric.testing `; this should remove some occasional "useless Mocks" as well as hewing closer to the real behavior of things like ``os.path.abspath`` re: path normalization. - :feature:`-` When the ``local`` path argument to `Transfer.get ` contains nonexistent directories, they are now created instead of raising an error. .. warning:: This change introduces a new runtime dependency: ``pathlib2``. - :feature:`1868` Ported a feature from v1: interpolating the local path argument in `Transfer.get ` with connection and remote filepath attributes. For example, ``cxn.get(remote="/var/log/foo.log", local="{host}/")`` is now feasible for storing a file in per-host-named directories or files, and in fact `Group.get ` does this by default. - :feature:`1810` Add `put `/`get ` support to `~fabric.group.Group`. - :feature:`1999` Add `sudo ` support to `~fabric.group.Group`. Thanks to Bonnie Hardin for the report and to Winston Nolan for an early patchset. - :release:`2.5.0 <2019-08-06>` - :support:`-` Update minimum Invoke version requirement to ``>=1.3``. - :feature:`1985` Add support for explicitly closing remote subprocess' stdin when local stdin sees an EOF, by implementing a new command-runner method recently added to Invoke; this prevents remote programs that 'follow' stdin from blocking forever. - :bug:`- major` Anonymous/'remainder' subprocess execution (eg ``fab -H host -- command``, as opposed to the use of `Connection.run ` inside tasks) was explicitly specifying ``in_stream=False`` (i.e. "disconnect from stdin") under the hood; this was leftover from early development and prevented use of interactive (or other stdin-reading) programs via this avenue. It has been removed; ``cat 'text' | fab -H somehost -- reads-from-stdin`` (or similar use cases) should work again. - :support:`-` Removed unnecessary Cryptography version pin from packaging metadata; this was an artifact from early development. At this point in time, only Paramiko's own direct dependency specification should matter. This is unlikely to affect anybody's install, since Paramiko has required newer Cryptography versions for a number of years now. - :feature:`-` Allow specifying connection timeouts (already available via `~fabric.connection.Connection` constructor argument and configuration option) on the command-line, via :option:`-t/--connect-timeout <-t>`. - :feature:`1989` Reinstate command timeouts, by supporting the implementation of that feature in Invoke (`pyinvoke/invoke#539 `_). Thanks to Israel Fruchter for report and early patchset. - :release:`2.4.0 <2018-09-13>` - :release:`2.3.2 <2018-09-13>` - :release:`2.2.3 <2018-09-13>` - :release:`2.1.6 <2018-09-13>` - :release:`2.0.5 <2018-09-13>` - :feature:`1849` Add `Connection.from_v1 ` (and `Config.from_v1 `) for easy creation of modern ``Connection``/``Config`` objects from the currently configured Fabric 1.x environment. Should make upgrading piecemeal much easier for many use cases. - :feature:`1780` Add context manager behavior to `~fabric.group.Group`, to match the same feature in `~fabric.connection.Connection`. Feature request by István Sárándi. - :feature:`1709` Add `Group.close ` to allow closing an entire group's worth of connections at once. Patch via Johannes Löthberg. - :bug:`-` Fix a bug preventing tab completion (using the Invoke-level ``--complete`` flag) from completing task names correctly (behavior was to act as if there were never any tasks present, even if there was a valid fabfile nearby). - :bug:`1850` Skip over ``ProxyJump`` configuration directives in SSH config data when they would cause self-referential ``RecursionError`` (e.g. due to wildcard-using ``Host`` stanzas which include the jump server itself). Reported by Chris Adams. - :bug:`-` Some debug logging was reusing Invoke's logger object, generating log messages "named" after ``invoke`` instead of ``fabric``. This has been fixed by using Fabric's own logger everywhere instead. - :bug:`1852` Grant internal `~fabric.connection.Connection` objects created during ``ProxyJump`` based gateways/proxies a copy of the outer ``Connection``'s configuration object. This was not previously done, which among other things meant one could not fully disable SSH config file loading (as the internal ``Connection`` objects would revert to the default behavior). Thanks to Chris Adams for the report. - :release:`2.3.1 <2018-08-08>` - :bug:`- (2.3+)` Update the new functionality added for :issue:`1826` so it uses ``export``; without this, nontrivial shell invocations like ``command1 && command2`` end up only applying the env vars to the first command. - :release:`2.3.0 <2018-08-08>` - :feature:`1826` Add a new Boolean configuration and `~fabric.connection.Connection` parameter, ``inline_ssh_env``, which (when set to ``True``) changes how Fabric submits shell environment variables to remote servers; this feature helps work around commonly restrictive ``AcceptEnv`` settings on SSH servers. Thanks to Massimiliano Torromeo and Max Arnold for the reports. - :release:`2.2.2 <2018-07-31>` - :release:`2.1.5 <2018-07-31>` - :release:`2.0.4 <2018-07-31>` - :bug:`-` Implement ``__lt__`` on `~fabric.connection.Connection` so it can be sorted; this was overlooked when implementing things like ``__eq__`` and ``__hash__``. (No, sorting doesn't usually matter much for this object type, but when you gotta, you gotta...) - :support:`1819 backported` Moved example code from the README into the Sphinx landing page so that we could apply doctests; includes a bunch of corrections to invalid example code! Thanks to Antonio Feitosa for the initial catch & patch. - :bug:`1749` Improve `~fabric.transfer.Transfer.put` behavior when uploading to directory (vs file) paths, which was documented as working but had not been fully implemented. The local path's basename (or file-like objects' ``.name`` attribute) is now appended to the remote path in this case. Thanks to Peter Uhnak for the report. - :feature:`1831` Grant `~fabric.group.Group` (and subclasses) the ability to take arbitrary keyword arguments and pass them onto the internal `~fabric.connection.Connection` constructors. This allows code such as:: mygroup = Group('host1', 'host2', 'host3', user='admin') which was previously impossible without manually stuffing premade ``Connection`` objects into `Group.from_connections `. - :bug:`1762` Fix problem where lower configuration levels' setting of ``connect_kwargs.key_filename`` were being overwritten by the CLI ``--identity`` flag's value...even when that value was the empty list. CLI-given values are supposed to win, but not quite that hard. Reported by ``@garu57``. - :support:`1653 backported` Clarify `~fabric.transfer.Transfer` API docs surrounding remote file paths, such as the lack of tilde expansion (a buggy and ultimately unnecessary v1 feature). Thanks to ``@pint12`` for bringing it up. - :release:`2.2.1 <2018-07-18>` - :bug:`1824` The changes implementing :issue:`1772` failed to properly account for backwards compatibility with Invoke-level task objects. This has been fixed; thanks to ``@ilovezfs`` and others for the report. - :release:`2.2.0 <2018-07-13>` - :release:`2.1.4 <2018-07-13>` - :release:`2.0.3 <2018-07-13>` - :bug:`-` The `fabric.testing.fixtures.remote` pytest fixture was found to not be properly executing expectation/sanity tests on teardown; this was an oversight and has been fixed. - :support:`-` Updated the minimum required Invoke version to ``1.1``. - :feature:`1772` ``@hosts`` is back -- as a `@task `/`Task ` parameter of the same name. Acts much like a per-task :option:`--hosts`, but can optionally take dicts of `fabric.connection.Connection` kwargs as well as the typical shorthand host strings. .. note:: As of this change, we are now recommending the use of the new-in-this-release Fabric-level `@task `/`Task ` objects instead of their Invoke counterparts, even if you're not using the ``hosts`` kwarg -- it will help future-proof your code for similar feature-adds later, and generally be less confusing than having mixed Invoke/Fabric imports for these object types. - :feature:`1766` Reinstate support for use as ``python -m fabric``, which (as in v1) now behaves identically to invoking ``fab``. Thanks to ``@RupeshPatro`` for the original patchset. - :bug:`1753` Set one of our test modules to skip user/system SSH config file loading by default, as it was too easy to forget to do so for tests aimed at related functionality. Reported by Chris Rose. - :release:`2.1.3 <2018-05-24>` - :bug:`-` Our packaging metadata lacked a proper ``MANIFEST.in`` and thus some distributions were not including ancillary directories like tests and documentation. This has been fixed. - :bug:`-` Our ``packages=`` argument to ``setuptools.setup`` was too specific and did not allow for subpackages...such as the newly added ``fabric.testing``. Fixed now. - :release:`2.1.2 <2018-05-24>` - :bug:`-` Minor fix to ``extras_require`` re: having ``fabric[pytest]`` encompass the contents of ``fabric[testing]``. - :release:`2.1.1 <2018-05-24>` - :bug:`-` Somehow neglected to actually add ``extras_require`` to our ``setup.py`` to enable ``pip install fabric[testing]`` et al. This has been fixed. We hope. - :release:`2.1.0 <2018-05-24>` - :release:`2.0.2 <2018-05-24>` - :feature:`-` Exposed our previously internal test helpers for use by downstream test suites, as the :ref:`fabric.testing ` subpackage. .. note:: As this code requires non-production dependencies, we've also updated our packaging metadata to publish some setuptools "extras", ``fabric[testing]`` (base) and ``fabric[pytest]`` (for pytest users). - :support:`1761 backported` Integration tests were never added to Travis or ported to pytest before 2.0's release; this has been addressed. - :support:`1759 backported` Apply the ``black`` code formatter to the codebase and engage it on Travis-CI. Thanks to Chris Rose. - :support:`1745 backported` Wrap any imports of ``invoke.vendor.*`` with ``try``/``except`` such that downstream packages which have removed ``invoke.vendor`` are still able to function by using stand-alone dependencies. Patch courtesy of Othmane Madjoudj. - :release:`2.0.1 <2018-05-14>` - :bug:`1740` A Python 3 wheel was not uploaded during the previous release as expected; it turned out we were lacking the typical 'build universal wheels' setting in our ``setup.cfg`` (due to copying it from the one other project in our family of projects which explicitly cannot build universal wheels!) This has been fixed and a proper universal wheel is now built. - :release:`2.0.0 <2018-05-08>` - :feature:`-` Rewrite for 2.0! See :ref:`upgrading`.