Python 3.9+ modules for Linuxfabrik projects: DB access, SQLite KVS caching, WinRM, SMB, shell execution, 15+ API integrations (Icinga2, Veeam, Nextcloud, ...). Available on PyPI. • made by Linuxfabrik
A mature, production-grade Python library collection providing 40 modules with 300+ functions for system administration, monitoring, and infrastructure automation. These libraries are used across several Linuxfabrik projects -- most prominently the Linuxfabrik Monitoring Plugins (Nagios/Icinga check plugins), but also in ChecklistFabrik and other tools.
If these libraries help you developing your own monitoring plugins, system tools or infrastructure automation, please give it a star.
The library requires Python 3.9+ and runs on every platform.
Full documentation is available at linuxfabrik.github.io/lib. It is automatically built and deployed on every push to main.
Add linuxfabrik-lib as a dependency to your project, or install it manually:
pip install --user linuxfabrik-libThese libraries are built with a clear set of priorities:
- Procedural by design. The libraries deliberately use a procedural/functional style rather than object-oriented programming. Pure functions with explicit inputs and outputs are easier to read, test, and reason about. This is especially true for the most prominent use case -- monitoring plugins -- which are short-lived, linear processes with no complex state to manage over time, where unnecessary abstraction layers would add overhead without tangible benefit.
- Broad compatibility. Python 3.9+ is the minimum, ensuring the libraries work on RHEL 8 and every major distribution without requiring newer runtimes.
- Cross-platform. Core functions behave identically on Linux, Windows, and macOS. Platform-specific code (WinRM, PowerShell, SMB) is cleanly separated.
- Minimal dependencies. We avoid pulling in large dependency trees. External packages are used only when the alternative would be unreliable or significantly more complex.
- Consistent error handling. Most functions return
(success, result)tuples. The caller decides whether to continue or exit -- the library never exits on its own. Thebase.coe()("Continue or Exit") helper makes this pattern concise. - Automatic redaction. Sensitive data (passwords, tokens, API keys) in error messages is automatically sanitized before output.
- Nagios/Icinga conventions. State constants, threshold evaluation, performance data formatting, and range parsing follow the Monitoring Plugins Development Guidelines.
- Defensive defaults. Functions use sensible timeouts, safe SSL settings, and locked-down defaults so that plugins work out of the box without extensive configuration.
| Module | Description | Key Functions |
|---|---|---|
| args.py | Extends argparse with custom input types for monitoring thresholds and a registry of reusable --help texts. |
csv(), float_or_none(), help(), int_or_none(), number_unit_method() |
| base.py | The central library for plugin development. Provides state evaluation, threshold comparison, performance data formatting, ASCII table output, and the coe() error-handling pattern. |
coe(), cu(), get_perfdata(), get_state(), get_table(), get_worst(), oao(), state2str() |
| globals.py | Defines the four Nagios/Icinga plugin states: STATE_OK (0), STATE_WARN (1), STATE_CRIT (2), STATE_UNKNOWN (3). |
-- |
| human.py | Converts raw numbers, byte sizes, bit rates, and durations to human-readable representations and back. Supports binary/SI prefixes and Nagios range syntax with units. | bits2human(), bps2human(), bytes2human(), human2bytes(), human2seconds(), humanrange2bytes(), number2human(), seconds2human() |
| lftest.py | Test harness for data-driven plugin unit tests, spinning up throwaway containers (including MySQL/MariaDB) as fixtures. | attach_each(), attach_tests(), run(), run_container(), run_mysql_compatible_from_containerfile(), test() |
| time.py | Date/time conversions between UNIX epochs, ISO strings, and datetime objects, plus time-macro expansion and time differences. Timezone-aware. | epoch2iso(), now(), timestr2datetime(), timestrdiff() |
| txt.py | Text processing: regex compilation, substring extraction, multi-line parsing, sensitive data redaction, pluralization, and byte/text encoding conversion. | compile_regex(), extract_str(), match_regex(), mltext2array(), pluralize(), to_bytes(), to_text() |
| version.py | Software version parsing, comparison, and End-of-Life checking against endoflife.date. | check_eol(), version(), version2float() |
| Module | Description | Key Functions |
|---|---|---|
| cache.py | A simple SQLite-based key-value store with optional key expiration. Used for persisting state between plugin runs. | get(), set() |
| db_mysql.py | MySQL/MariaDB client with connection management, query execution, privilege checking, and server flavor/status/variable/replication inspection. | check_privileges(), connect(), get_all_variables(), get_engines(), get_replica_status(), lod2dict(), select() |
| db_sqlite.py | Full SQLite interface: table/index creation, CRUD operations, CSV import, regex support, and per-second counter deltas for time-series data. | connect(), create_index(), create_table(), cut(), delete(), insert(), per_second_deltas(), select() |
| Module | Description | Key Functions |
|---|---|---|
| disk.py | File I/O, directory walking, CSV/environment file parsing, block device and partition listing, and temp directory management. | dir_exists(), file_exists(), get_real_disks(), get_tmpdir(), grep_file(), read_file() |
| distro.py | Linux distribution detection. Returns normalized facts including distribution name, version, and Ansible-compatible os_family. |
get_distribution_facts() |
| dmidecode.py | Parses dmidecode output into structured data. Extracts CPU, RAM, firmware, serial number, manufacturer, and model information. |
cpu_speed(), cpu_type(), firmware(), get_data(), manufacturer(), model(), ram(), serno() |
| endoflifedate.py | Bundled End-of-Life data from endoflife.date for offline version checks when internet access is unavailable. | -- |
| psutil.py | Wrapper around psutil for retrieving mounted disk partitions with device, mount point, and filesystem type. |
get_partitions() |
| shell.py | Runs external commands from an argv list without a shell, guards option-style CLI values, and locates executables in PATH. |
safe_cli_value(), shell_exec(), which() |
| Module | Description | Key Functions |
|---|---|---|
| feedparser.py | Parses Atom and RSS feeds from URLs using BeautifulSoup. | parse() |
| net.py | Low-level networking: TCP/UDP/TLS and Unix domain sockets, public IP lookup, subnet enumeration, netmask conversion, and hostname validation. | cidr_to_hosts(), fetch(), fetch_socket(), get_public_ip(), get_subnet_hosts(), ip_to_cidr() |
| ssh.py | Runs commands and copies files over SSH by building shell-free ssh/scp/rsync argument lists. |
build_options(), rsync(), run(), scp(), target() |
| url.py | HTTP/1.x and HTTP/2 client (httpx) for HTML, JSON, or raw data. Supports GET/POST, Basic/Digest authentication, TLS version pinning, proxy control, and connection telemetry. | fetch(), fetch_json(), get_latest_version_from_github(), split_basic_auth(), strip_tags() |
| Module | Description | Key Functions |
|---|---|---|
| powershell.py | Executes PowerShell commands locally (on Windows hosts). | run_ps() |
| smb.py | Native SMB/CIFS file access: list, glob, and open files on remote shares with encryption support. | glob(), open_file() |
| winrm.py | Executes commands and PowerShell scripts on remote Windows hosts via WinRM/PSRP, preferring pypsrp with a pywinrm fallback. | run_cmd(), run_ps() |
| Module | Description | Key Functions |
|---|---|---|
| bexio.py | Bexio business software REST API (contacts, invoices, projects, items, timesheets, and more). | call_api(), fetch_accounts(), fetch_contacts(), fetch_invoices(), fetch_projects(), get_all() |
| grassfish.py | Grassfish digital signage REST API. | fetch_json(), set_player_defaults(), set_screen_defaults() |
| huawei.py | Huawei OceanStor/Dorado storage REST API, decoding its numeric status, model, and hardware codes. | get_data(), get_health_status(), get_running_status(), get_uuid() |
| icinga.py | Icinga2 REST API client for querying services and managing acknowledgements and downtimes. | get_service(), remove_ack(), remove_downtime(), set_ack(), set_downtime() |
| infomaniak.py | Infomaniak Swiss Backup REST API for events, backup products, and slots. | get_events(), get_swiss_backup_products(), get_swiss_backup_slots() |
| jitsi.py | Jitsi Meet server statistics endpoint, with optional HTTP Basic auth. | get_data() |
| keycloak.py | Keycloak identity provider with OIDC discovery, admin-token retrieval, and Admin REST API access. | discover_oidc_endpoints(), get_data(), obtain_admin_token() |
| librenms.py | LibreNMS monitoring API, mapping its alert states to Nagios states. | get_data(), get_prop(), get_state() |
| nextcloud.py | Nextcloud occ command execution as the config.php owner, parsing JSON or text output. |
run_occ() |
| nodebb.py | NodeBB forum API, using a Bearer user token. | get_data() |
| qts.py | QNAP QTS NAS API with session authentication. | get_auth_sid() |
| redfish.py | Redfish BMC API for chassis, systems, storage, managers, and sensors, deriving Nagios states and perfdata. | get_auth_header(), get_perfdata(), get_state(), get_systems() |
| rocket.py | Rocket.Chat REST API for login, room/group history, statistics, and incoming webhooks. | get_groups_history(), get_rooms_get(), get_rooms_info(), get_stats(), get_token(), send2webhook() |
| uptimerobot.py | UptimeRobot API for monitors, alert contacts, maintenance windows, and status pages. | delete_monitor(), edit_monitor(), get_account_details(), get_alert_contacts(), get_monitors(), get_mwindows(), get_psps(), new_monitor() |
| veeam.py | Veeam Backup & Replication Enterprise Manager REST API. | get_token() |
| wildfly.py | WildFly/JBoss management API with digest auth (standalone and domain mode). | get_data() |
A typical monitoring plugin using these libraries:
import lib.args
import lib.base
import lib.url
from lib.globals import (STATE_CRIT, STATE_OK, STATE_UNKNOWN, STATE_WARN)
def main():
# Parse arguments with custom threshold types
parser = lib.args.ArgumentParser()
parser.add_argument('--url', required=True)
parser.add_argument('--warning', type=lib.args.float_or_none, default=80)
parser.add_argument('--critical', type=lib.args.float_or_none, default=90)
args = parser.parse_args()
# Fetch data (coe = "Continue or Exit")
result = lib.base.coe(lib.url.fetch_json(args.url))
# Evaluate thresholds
state = lib.base.get_state(result['usage'], args.warning, args.critical)
perfdata = lib.base.get_perfdata('usage', result['usage'], '%', args.warning, args.critical, 0, 100)
# Output and exit
lib.base.oao('Usage is {}%'.format(result['usage']), state, perfdata)
if __name__ == '__main__':
main()Count the function calls to any "lib" library in your project and sort by frequency:
grep -rhoP '\Wlib\.[a-zA-Z0-9_\.]+' * | sed 's/^[^a-zA-Z0-9]*//' | sort | uniq -c | sort -nr