SysDeck/THIRD_PARTY.md

341 lines
17 KiB
Markdown
Executable File

# Third-Party Attributions
SysDeck integrates with external tools and plugins. Each
integration invokes the external tool as a **separate process** —
`cockpit.spawn` in the Cockpit plugin edition, fixed-argv spawns from
the web console's bridge modules — and no external code is bundled
within the suite. The
suite (MIT) and the external tools remain independent programs.
This file satisfies the attribution requirements of the licenses listed
below and documents every external integration point — including the
one vendored project in the master tarball (klanker-gate, below).
---
## Vendored Project (master tarball only)
### klanker-gate — the "Frosty Deno" LLM gateway (the AI Gateway module)
**klanker-gate is not SysDeck's code.** All credit belongs to its
author, **TykoDev**. The master tarball vendors the upstream tree
unmodified, as a sibling of the suite, under its own Apache-2.0
license; the suite's modules talk to it as a separate process over
REST (same no-linking rule as every other entry in this file).
| Field | Value |
|-------|-------|
| **Project** | klanker-gate ("Frosty Deno" LLM Gateway) |
| **Author** | **TykoDev** |
| **Source** | https://github.com/TykoDev/klanker-gate |
| **License** | Apache-2.0 (full text kept at `klanker-gate/LICENSE`; notice kept at `klanker-gate/ATTRIBUTION.md`) |
| **Vendored at** | `klanker-gate/` in the master tarball, own version **0.9.0** (independent from SysDeck's version) |
| **SysDeck additions** | `klanker-gate/arch/` only (PKGBUILD, systemd unit, sysusers/tmpfiles, run wrapper, runbook) — zero upstream source changes |
| **Modules** | `sysdeck-klanker` (cockpit edition: `bridge/klanker.py` + `plugins/sysdeck-klanker/`) and the web edition `klanker` bridge + AI Gateway panel — both are thin REST *clients* containing no upstream code |
| **Integration** | REST against `KLANKER_URL` (default `http://127.0.0.1:8080`), `Authorization: Bearer <KLANKER_ADMIN_TOKEN>` — a separate process invoked over HTTP, never linked or embedded |
| **License compat** | MIT suite + Apache-2.0 vendored tree redistributed in source form with LICENSE and notices retained — compliant; the two programs remain independent works |
---
## Bundled Dependencies (shipped with the suite itself)
None. The suite is self-contained MIT-licensed code with no vendored
third-party libraries. (The master tarball separately vendors the
klanker-gate project — see the section above; it is a sibling tree,
not part of the suite.)
---
## External Tool Integrations (invoked via cockpit.spawn)
These tools are called as separate processes. They must be installed
on the target system for their corresponding module to function. Each
module fails closed with an install hint when its tool is absent.
### Prometheus — Monitoring & Log Pipeline
| Field | Value |
|-------|-------|
| **Module** | `cockpit-prometheus` |
| **Tool** | Prometheus server / pushgateway |
| **License** | Apache-2.0 |
| **Author** | Prometheus Authors |
| **Source** | https://github.com/prometheus/prometheus |
| **Install** | `pacman -S prometheus` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.prometheus", "push-log"])` |
| **License compat** | MIT calling Apache-2.0 via subprocess — independent programs |
### Grafana — Dashboards & Visualization
| Field | Value |
|-------|-------|
| **Module** | `cockpit-grafana` |
| **Tool** | Grafana server |
| **License** | AGPL-3.0 |
| **Author** | Grafana Labs |
| **Source** | https://github.com/grafana/grafana |
| **Install** | `pacman -S grafana` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.grafana", "dashboards"])` |
| **License compat** | MIT calling AGPL-3.0 via subprocess — independent programs |
### DB Engines — Database Control
| Field | Value |
|-------|-------|
| **Module** | `cockpit-db` |
| **Tool** | `psql`, `mysql`, `sqlite3`, and others |
| **License** | PostgreSQL License (psql), GPL-2.0 (mysql), Public Domain (sqlite3) |
| **Author** | PostgreSQL Global Dev Group, Oracle, SQLite Contributors |
| **Source** | https://www.postgresql.org/, https://dev.mysql.com/, https://sqlite.org/ |
| **Install** | `pacman -S postgresql mysql sqlite` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.db", "summary"])` |
| **License compat** | MIT calling permissively-licensed CLIs via subprocess — independent programs |
### hwalert — Hardware Alert Aggregation
| Field | Value |
|-------|-------|
| **Module** | Bridge helper only (panel integration pending) |
| **Tool** | `sensors`, `smartctl`, `mcelog` |
| **License** | MIT / LGPL-2.1+ (lm_sensors), GPL-2.0 (smartmontools), GPL-2.0 (mcelog) |
| **Author** | Various |
| **Source** | https://github.com/lm-sensors/lm-sensors, https://github.com/smartmontools/smartmontools |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.hwalert", "summary"])` |
| **License compat** | MIT calling GPL/LGPL/MIT via subprocess — independent programs |
### Glances — System Monitor
| Field | Value |
|-------|-------|
| **Module** | `cockpit-glances` |
| **Tool** | `glances` CLI |
| **License** | GPL-3.0 |
| **Author** | Nicolargo |
| **Source** | https://github.com/nicolargo/glances |
| **Install** | `pip install glances` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.glances", "snapshot"])` |
| **License compat** | MIT calling GPL-3.0 via subprocess — independent programs |
### lm_sensors — Hardware Sensors
| Field | Value |
|-------|-------|
| **Module** | `cockpit-sensors` |
| **Tool** | `sensors` CLI (from lm_sensors) |
| **License** | MIT / LGPL-2.1+ (varies by component) |
| **Author** | lm_sensors project |
| **Source** | https://github.com/lm-sensors/lm-sensors |
| **Install** | `pacman -S lm_sensors` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.sensors", "summary"])` |
| **License compat** | MIT calling MIT/LGPL — compatible |
### cockpit-sensors — Standalone Cockpit Plugin (reference)
| Field | Value |
|-------|-------|
| **Module** | Referenced by `cockpit-sensors` (not bundled) |
| **License** | MIT |
| **Author** | ocristopfer |
| **Source** | https://github.com/ocristopfer/cockpit-sensors |
| **Note** | The suite provides its own sensor rendering panel. The standalone cockpit-sensors plugin may be installed separately via the in-suite **3rd-Party Modules** panel (v0.0.46+, see `plugins/sysdeck-modules/` and `bridge/modules3p.py`). The legacy `cockpit-module-pull.sh` script remains as a CLI fallback. |
### sysbench — System Benchmark
| Field | Value |
|-------|-------|
| **Module** | `cockpit-benchmark` |
| **Tool** | `sysbench` CLI |
| **License** | GPL-2.0 |
| **Author** | Alexey Kopytov |
| **Source** | https://github.com/akopytov/sysbench |
| **Install** | `pacman -S sysbench` |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.benchmark", "run-cpu"])` |
| **License compat** | MIT calling GPL-2.0 via subprocess — independent programs |
### cockpit-benchmark — Standalone Cockpit Plugin (reference)
| Field | Value |
|-------|-------|
| **Module** | Referenced by `cockpit-benchmark` (not bundled) |
| **License** | MIT |
| **Author** | ealier |
| **Source** | https://github.com/ealier/cockpit-benchmark |
| **Note** | The suite provides its own benchmark panel. The standalone cockpit-benchmark plugin may be installed separately. |
### pacman / dnf / apt — Package Manager
| Field | Value |
|-------|-------|
| **Module** | `cockpit-packages` |
| **Tool** | `pacman` (Arch), `dnf` (Fedora/RHEL), `apt` (Debian/Ubuntu) |
| **License** | GPL-2.0+ (pacman), GPL-2.0+ (dnf), GPL-2.0+ (apt) |
| **Author** | Pacman Development Team, RPM project, Debian project |
| **Source** | https://archlinux.org/pacman/, https://github.com/rpm-software-management/dnf, https://salsa.debian.org/apt-team/apt |
| **Install** | Pre-installed on respective distros |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.packages", "summary"])` |
| **License compat** | MIT calling GPL-2.0+ via subprocess — independent programs |
### cockpit-identities — Standalone Cockpit Plugin (reference)
| Field | Value |
|-------|-------|
| **Module** | Referenced by `cockpit-auth` identities extension (not bundled) |
| **License** | LGPL-2.1 |
| **Author** | cockpit-project |
| **Source** | https://github.com/cockpit-project/cockpit-identities |
| **Note** | The suite's auth identities enumeration invokes the same underlying tools (ssh-add, pkcs11-tool, klist). The standalone cockpit-identities plugin may be installed separately via the in-suite **3rd-Party Modules** panel (v0.0.46+, see `plugins/sysdeck-modules/` and `bridge/modules3p.py`). |
### OpenSSH — SSH Key Enumeration
| Field | Value |
|-------|-------|
| **Module** | `cockpit-auth` (identities) |
| **Tool** | `ssh-add`, `ssh-keygen` |
| **License** | BSD-2-Clause |
| **Author** | OpenBSD project |
| **Source** | https://www.openssh.com/ |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.auth", "ssh-keys"])` |
| **License compat** | MIT calling BSD-2-Clause — compatible |
### MIT Kerberos — Kerberos Principal Enumeration
| Field | Value |
|-------|-------|
| **Module** | `cockpit-auth` (identities) |
| **Tool** | `klist` |
| **License** | MIT (Kerberos) |
| **Author** | MIT Kerberos Consortium |
| **Source** | https://web.mit.edu/kerberos/ |
| **Integration** | `cockpit.spawn(["python3", "-m", "sysdeck.bridge.auth", "kerberos"])` |
| **License compat** | MIT calling MIT — compatible |
---
## External Tools Used by Pre-existing Modules (v0.0.10 and earlier)
Listed for completeness. All invoked as separate processes.
| Tool | Module | License | Author | Source |
|------|--------|---------|--------|--------|
| `podman` | cockpit-containers | Apache-2.0 | containers/podman | https://github.com/containers/podman |
| `nft` | cockpit-firewall | GPL-2.0 | netfilter project | https://git.netfilter.org/nftables |
| `lynis` | cockpit-integrity | GPL-3.0 | CISOfy | https://github.com/CISOfy/lynis |
| `ss` | cockpit-netsec | GPL-2.0 | iproute2 project | https://git.kernel.org/pub/scm/utils/iproute2/iproute2 |
| `kubectl` | cockpit-mesh | Apache-2.0 | Kubernetes | https://github.com/kubernetes/kubernetes |
| `lsblk` | cockpit-vault | GPL-2.0 | util-linux | https://git.kernel.org/pub/scm/utils/util-linux/util-linux |
| `fwupdmgr` | cockpit-firmware | LGPL-2.1+ | fwupd project | https://github.com/fwupd/fwupd |
| `tpm2_pcrread` | cockpit-firmware | BSD-3-Clause | tpm2-software | https://github.com/tpm2-software/tpm2-tools |
| `kata-runtime` | cockpit-kata | Apache-2.0 | kata-containers | https://github.com/kata-containers/kata-containers |
| `mkosi` | cockpit-builder | LGPL-2.1+ | systemd project | https://github.com/systemd/mkosi |
| `mkarchiso` | cockpit-builder | GPL-3.0 | Arch Linux | https://gitlab.archlinux.org/archlinux/archiso |
| `vmdb2` | cockpit-builder | GPL-3.0+ | LVM team (Debian) | https://gitlab.com/lvm-team/vmdb2 |
| `lb` (live-build) | cockpit-builder | GPL-3.0+ | Debian Live team | https://salsa.debian.org/live-team/live-build |
| `pkcs11-tool` | cockpit-auth | MIT (OpenSC) | OpenSC project | https://github.com/OpenSC/OpenSC |
### v0.0.35 — Jellyfin, Photos, Remote FS backends
| Tool | Module | License | Author | Source |
|------|--------|---------|--------|--------|
| `jellyfin` | cockpit-jellyfin | GPL-2.0 | Jellyfin contributors | https://github.com/jellyfin/jellyfin |
| `photoprism` | cockpit-photos | MIT | PhotoPrism contributors | https://github.com/photoprism/photoprism |
| `piwigo` | cockpit-photos | GPL-2.0 | Piwigo contributors | https://github.com/Piwigo/Piwigo |
| `lychee` | cockpit-photos | MIT | LycheeOrg | https://github.com/LycheeOrg/Lychee |
| `occ` (Nextcloud Memories) | cockpit-photos | AGPL-3.0 | pulsejet (memories) + Nextcloud | https://github.com/pulsejet/memories |
| `librephotos` | cockpit-photos | MIT | LibrePhotos contributors | https://github.com/LibrePhotos/librephotos |
| `ceph` | cockpit-remotefs | LGPL-2.1 | Ceph contributors | https://github.com/ceph/ceph |
| `gluster` | cockpit-remotefs | GPL-2.0 | GlusterFS contributors | https://github.com/gluster/glusterfs |
| `moosefs-cli` | cockpit-remotefs | GPL-2.0 | MooseFS contributors | https://github.com/moosefs/moosefs |
| `beegfs-ctl` | cockpit-remotefs | BeeGFS EULA (free) | BeeGFS / NetApp | https://www.beegfs.io/ |
| `pvfs2-server` | cockpit-remotefs | BSD-3 (OrangeFS) | OrangeFS / Omnibond | http://www.orangefs.org/ |
### Intentionally excluded (per v0.0.35 directive)
| Tool | Reason |
|------|--------|
| `nfsd` (NFS) | Kernel-builtin; no cluster; no remote-FS-as-data-store semantics. Use cockpit-nfs. |
| `amanda` (AMANDA) | Backup system (Advanced Maryland Automatic Network Disk Archiver), not a remote/distributed filesystem. Use a dedicated backup solution. |
---
## License Compatibility Summary
The suite is MIT licensed. All external tools are invoked as **separate
programs** via `cockpit.spawn` (subprocess). Under copyright law,
communicating with a separate program via pipes or sockets does not
create a combined work. The licenses of the external tools impose
obligations on the tools themselves, not on the suite.
For GPL-family tools (Glances, nft, lynis, sysbench, ss, lsblk, Grafana):
- The suite does not link against, embed, or distribute their code.
- The suite invokes them as subprocesses, which is permitted without
imposing GPL on the calling program.
- Users who distribute the suite alongside these tools should verify
their own compliance with each tool's license terms.
For MIT/LGPL/BSD/Apache tools: fully compatible with the suite's MIT license.
---
### v0.0.46 — In-Suite 3rd-Party Module Installer
Prior to v0.0.46, the only way to install third-party Cockpit modules
(45Drives Navigator, cockpit-pacman, cockpit-identities, etc.) was the
side-channel `cockpit-module-pull.sh` shell script. That script bundled
a single blanket license prompt at the top and wrote a post-install
text audit log — but it did not surface per-module license / credit /
install-plan disclosures BEFORE the pull, and it had no per-module
opt-out.
v0.0.46 replaces that flow with a first-class **3rd-Party Modules**
panel (`plugins/sysdeck-modules/`) backed by a Python bridge helper
(`bridge/modules3p.py`). Each catalog entry declares its license,
author, source URL, and install hook. The panel renders all four
fields INLINE in every row, right next to a 1-click Install button —
clicking Install is the operator's acceptance of the inline-displayed
license. No modal, no separate confirmation step.
The bridge itself refuses silent installs (no `--accept-license=1`
⇒ `license-not-accepted`) as a guard against malicious callers. The
JS always passes that flag because the license is rendered inline next
to the button — the click IS the acceptance gesture.
Every install / uninstall is appended to
`/etc/cockpit/MODULE_LICENSES.log` as a JSON record. Legacy plain-text
lines from `cockpit-module-pull.sh` are preserved as `{raw: ...}`
records, so a single audit view shows both old and new entries.
### Catalog entries (v0.0.46)
| Module | License | Author | Source | Kind |
|--------|---------|--------|--------|------|
| cockpit-machines | LGPL-2.1 | Cockpit Project | https://github.com/cockpit-project/cockpit-machines | pacman |
| cockpit-podman | LGPL-2.1 | Cockpit Project | https://github.com/cockpit-project/cockpit-podman | pacman |
| cockpit-storaged | LGPL-2.1 | Cockpit Project | https://github.com/cockpit-project/cockpit-storaged | pacman |
| cockpit-identities | LGPL-2.1 | Cockpit Project | https://github.com/cockpit-project/cockpit-identities | git |
| cockpit-navigator | GPL-3.0 | 45Drives | https://github.com/45Drives/cockpit-navigator | deb-tar |
| cockpit-file-sharing | GPL-3.0 | 45Drives | https://github.com/45Drives/cockpit-file-sharing | deb-tar |
| cockpit-zfs-manager | GPL-3.0 | 45Drives | https://github.com/45Drives/cockpit-zfs-manager | git |
| cockpit-pacman | GPL-3.0 | pfeifferj | https://github.com/pfeifferj/cockpit-pacman | git |
| cockpit-sensors | MIT | ocristopfer | https://github.com/ocristopfer/cockpit-sensors | tarball |
| cockpit-benchmark | MIT | ealier | https://github.com/ealier/cockpit-benchmark | git |
Adding a new module to the catalog is a single dict append to
`CATALOG` in `bridge/modules3p.py`. No per-module code branches.
### License compatibility
All entries are invoked as **separate processes** via
`cockpit.spawn`. The suite (MIT) does not link against, embed, or
distribute any of these modules. Under copyright law, communicating
with a separate program via pipes or sockets does not create a
combined work. The licenses of the upstream modules impose
obligations on the modules themselves, not on SysDeck.
For GPL-family modules (cockpit-navigator, cockpit-file-sharing,
cockpit-zfs-manager, cockpit-pacman): operators who distribute SysDeck
alongside these modules should verify their own compliance with each
module's license terms.
For MIT/LGPL/BSD/Apache modules: fully compatible with the suite's MIT
license.