%global forgeurl https://github.com/mineiro/gaffer Name: gaffer Version: 0.2.1 Release: 1%{?dist} Summary: Daemon and CLI for controlling Elgato Key Lights # gaffer's own code is GPL-3.0-or-later. Rust binaries statically link their # whole dependency tree, so this is the *effective* licence of the shipped # artefacts, with every "OR" in the tree already resolved to one choice: # # GPL-3.0-or-later gaffer itself # MIT chosen for every dual/tri-licensed crate # Apache-2.0 unavoidable: sync_wrapper is Apache-2.0 only # Unicode-3.0 unavoidable: the ICU data crates # # Nothing here needs BSD-3-Clause, LLVM-exception or LGPL: each appears only as # one branch of an OR whose MIT branch was taken instead. # # VERIFY after any dependency change against the LICENSE SUMMARY block that # %%{cargo_license_summary} prints into the build log. Fedora treats a wrong # License field as a review blocker. License: GPL-3.0-or-later AND MIT AND Apache-2.0 AND Unicode-3.0 URL: %{forgeurl} Source0: %{forgeurl}/archive/v%{version}/%{name}-%{version}.tar.gz # Produced by .copr/Makefile from Source0; build roots have no network access. Source1: %{name}-%{version}-vendor.tar.xz BuildRequires: cargo-rpm-macros >= 24 BuildRequires: systemd-rpm-macros BuildRequires: make # gaffer is a *session* service: it needs a user D-Bus session bus, and is # activated on demand rather than being a system daemon. Requires: dbus-common Requires: systemd ExclusiveArch: %{rust_arches} %description gaffer discovers Elgato Key Lights on the local network over mDNS and owns their state, exposing them on the D-Bus session bus so that any desktop client — a panel module, a hotkey, a GTK or Qt application — controls the same lights without re-implementing the protocol. The package installs two programs: gafferd, the daemon, which is started on demand through D-Bus activation; and gaffer, a command-line client suitable for binding to compositor hotkeys or driving a status-bar module. %prep %autosetup -n %{name}-%{version} -p1 -a1 %cargo_prep -v vendor %build # Bake the exact NVR into the daemon, readable at runtime as # Manager1.BuildId and `gafferd --version`. The vendored tarball has no git # metadata, so without this a packaged build could only report the crate # version — which is identical across every snapshot between two releases, and # so cannot answer "is the running daemon the one I just installed?". That # matters because RPM scriptlets run as root and cannot restart a *user* # service: an upgrade replaces the binary while the old process keeps running. export GAFFER_BUILD_ID="%{version}-%{release}" %cargo_build # Record what is statically linked in, for the licence audit trail. %{cargo_license_summary} %{cargo_license} > LICENSE.dependencies %{cargo_vendor_manifest} %install # ARTIFACTDIR points at the profile %%cargo_build actually used, which is not # target/release. UNITDIR is a *user* unit directory: gaffer is per-session. %make_install \ PREFIX=%{_prefix} \ BINDIR=%{_bindir} \ UNITDIR=%{_userunitdir} \ DBUSDIR=%{_datadir}/dbus-1/services \ ARTIFACTDIR=target/rpm %check # The whole suite is hermetic: no hardware, no network, no session bus. %cargo_test %post %systemd_user_post %{name}.service %preun %systemd_user_preun %{name}.service %postun %systemd_user_postun %{name}.service %files %license COPYING %license LICENSE.dependencies %doc README.md %{_bindir}/gaffer %{_bindir}/gafferd %{_userunitdir}/%{name}.service %{_datadir}/dbus-1/services/io.mineiro.gaffer.service %changelog * Wed Aug 19 2026 Jose Tiburcio Ribeiro Netto - 0.2.1-1 - Upstream 0.2.1, which changes no source at all: it exists to carry a dependency refresh into the Cargo.lock that this package vendors from. What ships differs from 0.2.0 only in the statically linked tree. - License: re-verified against the LICENSE SUMMARY that %%{cargo_license_summary} prints, because a dependency refresh is exactly what changes it silently. It is unchanged. One crate joins the tree (zcheapstr, MIT); sync_wrapper is still the only Apache-2.0-only crate, and the ICU data crates are still the only thing requiring Unicode-3.0 — so every term already in the field is still earned, and no new one is. - Upstream has deleted the spec and .copr/ it used to carry, so 0.2.1 is the first release for which this repository is the only place gaffer is packaged. * Sat Aug 08 2026 Jose Tiburcio Ribeiro Netto - 0.2.0-2 - Rebuild. The packaging now verifies Source0 against a recorded sha256 on every build, so this is the first artefact whose source was checked rather than assumed. gaffer itself is unchanged. - This release exists because 0.2.0-1 was built twice from different trees. Both builds package the same software, but two artefacts sharing one NVR is exactly what dnf cannot distinguish, so the number moves rather than being quietly reused. * Sat Aug 08 2026 Jose Tiburcio Ribeiro Netto - 0.2.0-1 - Gangs: link lights so they move as one instrument, keeping the brightness difference they had. Offset and mirror modes; the first lamp named leads. - Scenes: save and restore the whole desk, storing gangs and their spacing rather than a flat list of brightnesses. - Manager1 gains Link, Unlink, SetLinkMode, SetLinkLevel, LinkLevel, SaveScene, ApplyScene, DeleteScene, and the Links, Scenes and BuildId properties. All additive; nothing existing changed shape. - BuildId and `gaffer version` report which build is actually running, and the CLI warns when the daemon was upgraded but never restarted. - Require mdns-sd 0.20.3, which fixes a panic in the mDNS packet write path reachable from a hostile advertisement on the local network. * Sat Jul 25 2026 Jose Tiburcio Ribeiro Netto - 0.1.0-1 - Initial package