# CoreFreq Akmod RPM Spec - Fixed for COPR %global _debugsource_packages 0 %global _debuginfo_packages 0 %global debug_package %{nil} %global corefreq_version 2.0.8 Name: corefreq Version: %{corefreq_version} Release: 24.alpha5%{?dist} Summary: CPU monitoring software with akmod kernel module License: GPL-2.0-only URL: https://github.com/cyring/CoreFreq Source0: %{url}/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: corefreqd.service Source2: Makefile.akmod Source3: corefreq-kmod.spec.in Source4: corefreq-kmod-watcher.path # FIXED: Renamed service file to match the .path file Source5: corefreq-kmod-watcher.service # Akmod BuildRequires BuildRequires: kmodtool BuildRequires: akmods BuildRequires: gcc make rpm-build BuildRequires: systemd-rpm-macros BuildRequires: kernel-devel # Runtime Requirements Requires: systemd Suggests: mokutil Requires: %{name}-kmod >= %{version} Requires: %{name}-kmod-common = %{?epoch:%{epoch}:}%{version}-%{release} # Generate akmod metadata %{expand:%(kmodtool --target %{_target_cpu} --kmodname %{name} --pattern ".*" --akmod 2>/dev/null) } %description CoreFreq is a CPU monitoring software designed for 64-bit Processors. This package provides the user-space tools and the akmod source for the 'corefreqk' kernel module with full automation including Secure Boot support. %package -n akmod-%{name} Summary: Akmod package for %{name} kernel module(s) Requires: kmodtool Requires: akmods Provides: %{name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} Requires: %{name}-kmod-common >= %{?epoch:%{epoch}:}%{version} %description -n akmod-%{name} This package provides the akmod package for the %{name} kernel modules. %package kmod-common Summary: Common files for %{name} kernel module Requires: %{name} = %{?epoch:%{epoch}:}%{version}-%{release} Provides: %{name}-kmod-common = %{?epoch:%{epoch}:}%{version} %description kmod-common This package provides the common files for the %{name} kernel modules. %prep %autosetup -n CoreFreq-%{version} -p1 # Keep a copy of the original Makefile cp Makefile Makefile.orig # Use our akmod-compatible Makefile cp %{SOURCE2} Makefile %build # Build userspace tools only (kernel module is built later by akmod) make %{?_smp_mflags} userspace %install # --- Install userspace components --- install -D -m 0755 build/corefreqd %{buildroot}%{_bindir}/corefreqd install -D -m 0755 build/corefreq-cli %{buildroot}%{_bindir}/corefreq-cli install -D -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}/corefreqd.service # --- Install systemd path-based activator --- install -D -m 0644 %{SOURCE4} %{buildroot}%{_unitdir}/corefreq-kmod-watcher.path # FIXED: Install the correctly named service file install -D -m 0644 %{SOURCE5} %{buildroot}%{_unitdir}/corefreq-kmod-watcher.service # --- Create and install the kmod SRPM for akmods --- install -d %{buildroot}%{_usrsrc}/akmods/ # 1. Create a temporary build environment for the SRPM SRPM_TOPDIR=$(mktemp -d) mkdir -p "$SRPM_TOPDIR"/{SOURCES,SPECS} # 2. Prepare the inner spec file by substituting variables sed -e 's|@COREFREQ_VERSION@|%{corefreq_version}|g' \ -e 's|@RELEASE@|1%{?dist}|g' \ %{SOURCE3} > "$SRPM_TOPDIR"/SPECS/corefreq-kmod.spec # 3. Create the source tarball that the inner spec expects tar -czf "$SRPM_TOPDIR"/SOURCES/corefreq-kmod-%{version}.tar.gz \ --transform "s|^CoreFreq-%{version}|corefreq-kmod-%{version}|" \ -C %{_builddir} \ CoreFreq-%{version} # 4. Build the Source RPM (.src.rpm) rpmbuild -bs \ --define "_topdir $SRPM_TOPDIR" \ "$SRPM_TOPDIR"/SPECS/corefreq-kmod.spec # 5. Install the SRPM where akmods expects to find it install -m 0644 "$SRPM_TOPDIR"/SRPMS/*.src.rpm %{buildroot}%{_usrsrc}/akmods/ # 6. Create the 'latest' symlink pointing to the new SRPM SRPM_NAME=$(basename "$SRPM_TOPDIR"/SRPMS/*.src.rpm) ln -s "$SRPM_NAME" %{buildroot}%{_usrsrc}/akmods/%{name}-kmod.latest # 7. Clean up the temporary directory rm -rf "$SRPM_TOPDIR" %post # === SMART MOK DETECTION AND SETUP === # (smart_mok_check function is unchanged, so omitted for brevity) smart_mok_check() { local akmods_key="/etc/pki/akmods/certs/public_key.der" local pending_keys="/var/lib/mokutil/request" local secure_boot_enabled=false if [ -d /sys/firmware/efi/efivars ]; then if mokutil --sb-state 2>/dev/null | grep -q "SecureBoot enabled"; then secure_boot_enabled=true fi fi if [ "$secure_boot_enabled" = "false" ]; then return 0; fi if [ ! -f "$akmods_key" ]; then echo "Warning: akmods signing key not found. Module signing may fail." return 1 fi if mokutil --list-enrolled 2>/dev/null | grep -q "CN=akmods" || \ mokutil --test-key "$akmods_key" 2>&1 | grep -q "already enrolled\|SKIP.*already enrolled"; then echo "akmods MOK key already enrolled." return 0 fi if [ -d "$pending_keys" ] && [ -n "$(ls -A "$pending_keys" 2>/dev/null)" ]; then cat << 'EOF' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔐 MOK KEY ENROLLMENT PENDING ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ You have pending MOK (Machine Owner Key) enrollments. To complete enrollment: 1. REBOOT your computer 2. At the blue 'MOK Manager' screen during boot: → Select 'Enroll MOK' → Enter the password you provided → Confirm enrollment ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ EOF return 0 fi cat << 'EOF' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔐 SECURE BOOT DETECTED - MOK ENROLLMENT REQUIRED ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ To use CoreFreq with Secure Boot, enroll the akmods signing key: sudo mokutil --import /etc/pki/akmods/certs/public_key.der Then REBOOT and follow the on-screen MOK Manager instructions. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ EOF } smart_mok_check # FIXED: Only enable the path unit. Do not enable corefreqd.service directly. %systemd_post corefreq-kmod-watcher.path echo "" echo "CoreFreq installed successfully!" echo "Kernel module compilation is in progress..." echo "The service will start automatically once the kernel module is built." echo "" echo "To check status: systemctl status corefreqd.service" echo "Once running, use: corefreq-cli" echo "" %preun # FIXED: Only disable the path unit. The corefreqd service doesn't need explicit management here. %systemd_preun corefreq-kmod-watcher.path # This scriptlet runs on final removal ($1 == 0), not on upgrade. if [ $1 -eq 0 ]; then echo "Stopping CoreFreq service for final removal..." systemctl stop corefreqd.service >/dev/null 2>&1 || true # (Rest of the %preun script is unchanged and correct) for i in {1..5}; do if ! systemctl is-active --quiet corefreqd.service; then echo "Service confirmed stopped." break fi sleep 1 done echo "Unloading CoreFreq kernel module..." for i in {1..5}; do if lsmod | grep -q "^corefreqk\s"; then if /sbin/modprobe -r corefreqk >/dev/null 2>&1; then echo "Module corefreqk successfully unloaded." break fi else echo "Module corefreqk is not loaded." break fi sleep 1 done fi %postun # This macro is not needed as we don't want to restart the service on upgrade. # Let the path unit handle it if a new module gets built. # %systemd_postun_with_restart corefreqd.service # (Triggers section is unchanged and correct) # === KERNEL UPDATE TRIGGERS FOR AUTOMATIC REBUILDS === %triggerin -- kernel kernel-core kernel-devel kernel-modules kernel-modules-core echo "Kernel update detected, rebuilding CoreFreq module..." if [ -x /usr/bin/akmods ]; then nohup sh -c 'sleep 5; /usr/bin/akmods --akmod %{name} --force' >/dev/null 2>&1 & fi %triggerpostun -- kernel kernel-core kernel-devel kernel-modules kernel-modules-core echo "Kernel removal detected, cleaning up CoreFreq modules..." if [ -x /usr/bin/akmods ]; then /usr/bin/akmods --remove %{name} >/dev/null 2>&1 || true fi # (%post -n akmod-%{name} and %preun -n akmod-%{name} are unchanged and correct) %post -n akmod-%{name} echo "Initiating CoreFreq kernel module compilation..." echo "This will happen in the background." if command -v at >/dev/null 2>&1 && systemctl is-active --quiet atd; then echo "%{_bindir}/akmods --from-akmod-posttrans --akmod %{name} --kernels \"\$(uname -r)\"" | at now + 1 minute 2>/dev/null || { nohup sh -c 'sleep 10; %{_bindir}/akmods --from-akmod-posttrans --akmod %{name} --kernels "$(uname -r)"' >/dev/null 2>&1 & } else nohup sh -c 'sleep 10; %{_bindir}/akmods --from-akmod-posttrans --akmod %{name} --kernels "$(uname -r)"' >/dev/null 2>&1 & fi echo "Module compilation scheduled. Check 'systemctl status corefreqd.service' in a few minutes." %preun -n akmod-%{name} if [ $1 -eq 0 ]; then for kver in $(find /lib/modules -name "corefreqk.ko" -exec dirname {} \; 2>/dev/null | sed 's|.*/modules/||;s|/.*||' | sort -u); do rm -rf "/lib/modules/$kver/extra/corefreq" "/lib/modules/$kver/updates/corefreqk.ko" 2>/dev/null || true /sbin/depmod -a "$kver" 2>/dev/null || true done fi # FIXED: Merged into a single %files section %files %license LICENSE %doc README.md %{_bindir}/corefreq-cli %{_bindir}/corefreqd %{_unitdir}/corefreqd.service %attr(0644,root,root) %{_unitdir}/corefreq-kmod-watcher.path %attr(0644,root,root) %{_unitdir}/corefreq-kmod-watcher.service %files -n akmod-%{name} # Package the SRPM and the symlink %{_usrsrc}/akmods/corefreq-kmod-%{version}-*.src.rpm %{_usrsrc}/akmods/corefreq-kmod.latest %files kmod-common # This package is empty but serves as a dependency anchor %changelog * Sun Sep 08 2025 Package Maintainer - 2.0.8-24.alpha3 - Switched to systemd path unit for automatic and reliable service start - Renamed service unit to match path unit for correct triggering - Corrected spec file syntax and logic for systemd unit management