Skip to content

Releases: mrdaemon/exosphere

2.4.0 - Sudo, FreeBSD vuln.xml improvements

10 Mar 16:10
Immutable release. Only release title and notes can be modified.
caff4fe

Choose a tag to compare

Exosphere: A simple CLI and TUI driven application that offers patch reporting for remote unix systems

A minor update that resolves two annoyances:

  1. The FreeBSD provider's reposync operation now fetches the latest vuln.xml as part of its run, preventing failures on fresh installs where the vulnerability database has not been downloaded yet, and ensuring it is up to date alongside the repositories.
  2. Sudo authentication failures now surface a much clearer error message, instead of confusing, out of context Fabric/invoke messages. The error message will now point users towards the documentation chapter about configuring sudoers.

It gets a minor version bump due to user-facing configuration changes, detailed in the next section.

User Actions Required

The minor change to the FreeBSD provider implies a change to sudoers configuration. The reposync operation, which runs through sudo, now also runs /usr/sbin/pkg audit -qF as part of the process.

If you have FreeBSD hosts with a sudo policy of NOPASSWD within exosphere, you will need to update or regenerate your sudoers configuration.

This can be done very simply via exosphere sudo generate. Failure to do so will result in an error message that will point you to the documentation on how to configure this.

If you use SKIP (the default) as a sudo policy, or do not have FreeBSD hosts in your inventory, no action is required.

As always, the latest version is available on PyPI, and our exhaustive documentation has been updated to cover the changes.

What's Changed

  • FreeBSD Provider: Ensure sync refreshs vuln.xml by @mrdaemon in #208
  • Add sudo failure error handling to requires_sudo by @mrdaemon in #209

Full Changelog: v2.3.0...v2.4.0

2.3.0 - Maintenance Release

19 Feb 01:31
Immutable release. Only release title and notes can be modified.
2fc6633

Choose a tag to compare

Exosphere: A simple CLI and TUI driven application that offers patch reporting for remote unix systems

It is time for a periodic maintenance release, with mostly a fix to the json output, some internal library and dev tools upgrades, as well as a bunch of minor documentation improvements.

New "stale" field in json export

Previously, json format exports in reporting module did not include whether or not Exosphere considers the host stale according to its configuration.

A "stale" boolean field has been added to both the to_dict() method on Host objects as well as the expected json schema. The documentation now covers this as well.

This has been a long standing oversight, since every other reporting format actively includes this information, and consumers of the json data should not have to do date math to figure out that information.

Since it is an addition to the schema, the change is backwards compatible.

Documentation improvements:

  • Project README key features now cover parallelization and SSH pipelining
  • Configuration docs now have better inter document links in regard to config file sections
  • uv is now very clearly linked in Quickstart Guide, instead of being easily missed one word links
  • Quickstart Guide now has better, more targeted links to specific documentation sections, as jump points
  • Quickstart Guide now mentions the existence of the 'help' command (which felt like an oversight)
  • The Next Steps section of the Quickstart Guide have been reorganized to better direct new users to features they might want

As always, the release is available on PyPI and our Lovingly Crafted Documentation should be up to date for stable.

What's Changed

Full Changelog: v2.2.0...v2.3.0

2.2.0 - SSH Pipelining and Spring Cleanup

12 Jan 19:19
Immutable release. Only release title and notes can be modified.
93a988b

Choose a tag to compare

A polish pass and a feature

This release contains a hot new feature and a polish pass on the entire codebase, refactoring a lot of internal code that was either sub-par, or naively designed for simpler times back in 1.0, and had not been revisited since.

It's not spring, but spring cleaning is a state of mind, unbound to such trivial things as calendars.

New Feature: SSH Pipelining

image

A new opt-in configuration setting now allows you to leave SSH connections open between operations in Interactive (REPL) or TUI mode, which will allow Exosphere to reuse them, reducing connection open/close churn, and improving performance on larger inventories, or setups where the ssh negociation part of the connection is particularily slow.

The connection will be closed after a configurable idle time that defaults to 300 seconds.

This comes with a new REPL command, connections which will display the current state of any connection currently held open by Exosphere, as well as let you manually close them if that is something you want to do.

By default, the pipelining feature is disabled and the previous Exosphere behavior of closing connections after each operation remains unchanged.

However, some minor batching and optimizations have been done in the dispatch and provider code to ensure there is significantly less connection churn, batching all queries related to a single operation (sync, refresh, ping etc) within the same connection. Performance should be improved in general, even with pipelining disabled.

The choice of which mechanism is preferable is left entirely to the user.

Internal refactoring and polish pass

A lot of the earlier code within Exosphere was designed around a much smaller, more naive ideal for how Exosphere should function. As the application grew and found its exact scope, a lot of these design decisions were mostly hacked around or left alone.

The primary one is the way the state cache (exosphere.db) is built and loaded. Several improvements have been done around the serialization machinery. The state of a Host object is now contained within a HostState dataclass that is easily serializable, with a proper version schema.

This allows us to ensure seamless migration of data between exosphere versions in a much cleaner way, replacing the series of horrifying serialization hacks we had previously to achieve this.

Migration to this new serialization format will be handled transparently by Exosphere, so there is no user action required. INFO level logs are produced on the initial conversion, but otherwise the cached state of your hosts should carry over.

Other than this, a lot of miscellaneous warts and unpleasant areas of the code that bothered the author for a while have been rewritten to be much, much nicer, with no user facing changes or differences. The UI code in particular had a lot of horrifying hacks removed, and duplicated code with subtle differences unified, resulting in a much cleaner code base.

Dependencies changes

Some runtime libraries had their version constraints changed, for compatibility or security reasons:

  • Typer>=0.20.0
  • Textual>=6.7.0 (for new autosize grid components)
  • pyyaml>=6.0.3
  • rich>=14.1.0

Bugfixes

  • cache_autopurge option now correctly respects cache_autosave being false in configuration. This has been clarified in the documentation.

As always, release builds are available on pypi, and you can follow the upgrade guide with no particular notes.

Our lovely documentation has been updated to cover the new features and changes.
Additionally a new FAQ entry has been added to cover some rare issue with dnf providers on redhat-like systems.

What's Changed

Full Changelog: v2.1.2...v2.2.0

2.1.2 - Optional hotfix

09 Nov 20:48
Immutable release. Only release title and notes can be modified.
196fc8f

Choose a tag to compare

Optional Hotfix Release

Minor hotfix and minimum version bumps to accomodate Python 3.14 environments, specifically the optional web ui component of Exosphere.

Also contains internal changes to the CI jobs and test suite to prevent future regression and better test against minimum versions in pyproject to avoid the 2.1.1 issues.

No Exosphere code changes, purely metadata and dependencies, so this hotfix is entirely optional, but of interest if you:

  • Use python 3.14 already
  • Want the webui support

What's Changed

Full Changelog: v2.1.1...v2.1.2

2.1.1 - Hotfix

01 Nov 02:05
Immutable release. Only release title and notes can be modified.
5b8014d

Choose a tag to compare

Hotfix Release

Minimum version of Textual as a dependency was incorrectly set, in some installations this can result in the Inventory screen crashing on access with Footer.__init__() got an unexpected keyword argument 'compact'

Bumps Textual dependency minimum to v6.2.0 to resolve the issue.

I blame the spooky halloween ghosts.

👻 sorry my release was haunted sorry

2.1.0 - The Big Quality Release

01 Nov 00:08
Immutable release. Only release title and notes can be modified.
406ad83

Choose a tag to compare

Big Quality of Life Update

🎃 A spooky Halloween Release 🎃

This update contains multiple long standing QoL changes that I have been wanting to put in for a while.
It is my hope that this makes the experience of using Exosphere more pleasant.

Let's go over the major ones:

TUI Inventory Screen Features

image

Sync Repos as an action has been reworked into Sync & Refresh. When hitting ctrl+x, Exosphere will now do a repository sync followed by a refresh, as there was essentially no scenario in which you would just want a sync alone. This saves you the need to hit ctrl+r immediately after, as it will do it for you.

Filtering functionality on TUI Inventory Screen

image

You can now hit ctrl+f to filter the inventory view to only display hosts with updates, or hosts with Security Updates exclusively.
The CLI inventory command had this functionality for a while, and I strongly felt like the TUI one needed feature parity.

image

A status bar has been added at the bottom of the inventory screen which will inform you whenever the view is filtered in any way.

Themes Support

themes_demo.mp4

Most of the Textual CSS and Colors within the Exosphere TUI have been reworked to use generalized colors that honor the selected Color Theme. So you can now fully swap to your favorite using the appropriate Palette command, and Exosphere will absolutely respect it.

TUI navigation improvement

The bottom footer with navigation keybinds no longer shows the keybind for the screen you are currently on. This conserves screen real estate significantly, and prevents the menu from being overwhelming.

Additionally, the inventory screen now switches the layout of the footer a more compact one to ensure it is legible on smaller terminal sizes.

Before:
image
After:
image

REPL Improvements

In addition to a new shiny logo banner on startup (which can now be disabled, if you don't share my eclectic tastes in ascii art), the REPL has seen massive improvements to its tab completion features.

Host Completion

Exosphere in interactive mode can now tab complete inventory hosts, either as positional or option arguments.

image

This includes the expected readline-like double tab to show all possible matches features.

Better readline/shell-like completion flow

The Completion code has been refactored significantly to allow closer behavior to that of unix shells and readline in general.
More specifically, trailing spaces are appended after matches, and options that do not take arguments (i.e. --sync will simply tab through, allowing you to tab complete lines at blazing speed, in a context sensitive way.

And more!

The lovingly crafted documentation has seen all of its screenshots refreshed, since they were all from 1.0.1.

As usual, the release is available on PyPI:
https://pypi.org/project/exosphere-cli/2.1.0/

What's Changed

Full Changelog: v2.0.1...v2.1.0

2.0.1 - Hotfix Release

12 Oct 16:38
Immutable release. Only release title and notes can be modified.
b95899b

Choose a tag to compare

Small bugfix release

Fixes the issue described in #111 where exosphere version check would exit with 0 status when options.update_checks is disabled.
Now properly exits with nonzero.

What's Changed

  • Fix version check should return 1 when disabled by @mrdaemon in #110

Full Changelog: v2.0.0...v2.0.1

2.0.0 - CLI exit codes and Python 3.14 Support

11 Oct 17:34
Immutable release. Only release title and notes can be modified.
0d8d144

Choose a tag to compare

Big number, small changes

Exosphere now uses consistent and documented exit codes across all of its CLI components.
Since, strictly speaking, this is a backwards incompatible change (although it is unlikely to affect many people), the version has been incremented to 2.0.0 to communicate this, in accordance with the holy texts of Semantic Versioning.

Return Codes

Exosphere now consistently returns the following exit codes:

  • 0 - Success
  • 1 - Execution error (something went wrong during processing)
  • 2 - Argument error (something wrong with an option or argument you provided)
  • 3 - Special - Used sparingly to communicate specific scenarios

Using 2 for argument errors is a consistent behavior with the Typer library (which we use extensively for CLI commands) and multiple Unix utilities, such as grep.

Status 3 is used very sparingly, and so far only returned by exosphere version check to communicate that a new version is available, as well as by inventory status whenever any of its filtering options (--updates-only etc) do not match any hosts.

This is documented in our Lovely Documentation in its Appropriate Section

Python 3.14 Compatiblity

Python 3.14 is now officially supported with this release.

Internally, the test suite for Exosphere has been put in a Matrix that runs against both 3.13 and 3.14, to prevent regressions across supported versions. The uv lockfile has been updated with versions of main dependencies and dev tools that support both, but the minimum required versions have been left alone.

This should ensure compatibility between 3.13 and 3.14, and lays the groundwork to support upcoming versions without too much hassle.

New detailed version command

In order to make diagnostics and debugging easier, the version command now has a details subcommand that will return information about the current Python environment, venv, and host system.

What's Changed

Full Changelog: v1.5.1...v2.0.0

v1.5.1 - Minor QoL Update

10 Oct 23:47
Immutable release. Only release title and notes can be modified.
4d3e433

Choose a tag to compare

Minor point release introducing a small QoL improvement that is fully backwards compatible, as well as Python 3.14 uv housekeeping.

image

Exosphere now has the ability to filter inventory status output with --updates-only and --security-only, and it feels weird that it didn't from day one.

Documented in CLI section here: https://exosphere.readthedocs.io/en/stable/cli.html#viewing-inventory-status

Additionally, the inventory being empty is now correctly considered an error case, and Exosphere commands will correctly return non zero exit when unable to perform their actions due to that scenario.

The lockfile for uv dependencies has been updated with a handful of dependencies that are either minor, or have explicit Python 3.14 support patches added in. We're preemptively adding them it for consistency and future compatibility tests.

Builds are, as always, available from PyPI: https://pypi.org/project/exosphere-cli/1.5.1/

Full Changelog: v1.5.0...v1.5.1

1.5.0 - The Reporting Update

04 Oct 23:32
Immutable release. Only release title and notes can be modified.
e9a7eb2

Choose a tag to compare

Exosphere can now generate reports

image

If you ever felt it was weird that a patch reporting tool could not actually produce reports you can print, email or otherwise use outside of the application, this update will likely please you.

Exosphere now provides a report command which allows you produce document based reports in HTML, Plain Text and Markdown formats, which should hopefully cover most use cases.

The reports can be filtered to include only a selection of hosts, updates only, or security only, and have a wealth of useful options.
Various in depth examples of the formats as well as copious details on usage can be found in our ever growing documentation.

Exosphere can now emit JSON with the current state

image

As part of the same feature, we now have a nice JSON report format available for programmatic consumption of the data and inventory state. It is simply treated as an extra format the reporting module can handle.

This should be helpful if you ever wanted to integrate Exosphere into something else, or feed the data that it generates into something else, ranging from a Discord bot to your event system for your overly complex Doorbell over zigbee MQTT system.

It's also reasonably helpful for use with jq to perform ad-hoc queries that Exosphere itself doesn't expose.

This feature is discussed in great detail, including a full definition of the JSON Schema, in our ever growing documentation.

Version Check command

There is now a version command with a check subcommand that will query PyPI to tell you whether or not your version of exosphere
is up to date, and provide you with links to release notes and upgrade documentation if relevant.

We do not have automatic checks on startup or anything of that nature, it is strictly on-demand.
This feature can also be forcefully disabled via the relevant configuration option if necessary for your environment.

Minor CLI improvements

image
  • inventory refresh now has a --verbose option that will give you a host by host view of tasks as they complete, much like how discover does by default.
  • Built-in help for commands options has been reworked to offer a more consistent view across subcommands.

As always, builds are available on PyPI: https://pypi.org/project/exosphere-cli/1.5.0/

Changes in this Release

  • Docs: Detail syspatch usage for OpenBSD provider by @mrdaemon in #82
  • Improve CLI help, add verbose switch to "inventory refresh" by @mrdaemon in #84
  • Use UTC timezone-aware datetime objects for host.last_refresh by @mrdaemon in #89
  • Add Reporting Feature by @mrdaemon in #94
  • Misc docs fixes by @mrdaemon in #95
  • Add sphinx-lint, poe task, linting pass by @mrdaemon in #99
  • Update FAQ Entry regarding OPNSense by @mrdaemon in #100
  • Add Version Check feature by @mrdaemon in #102
  • Library updates in uv lockfile, both for development and runtime
  • Misc source tree cleanups

Full Changelog: v1.4.1...v1.5.0