7b77cafa6402fb1d9d01c4ae47caf2a9b0d87724 / aldermon/aldermon-setup.sh · 2552 bytes · raw
#!/bin/sh
# aldermon-setup.sh - one-shot privileged setup for aldermon (run once as
# root; idempotent, re-running overwrites installed files):
#
# 1. RAPL watts: energy_uj is 0400 root-only. Installs a udev rule + RUN
# helper chgrp'ing it 0440 to group `adm` so the TUI reads watts
# unprivileged.
# 2. VID: opening /dev/cpu/N/msr must pass TWO gates: the DAC file-mode
# check (node is 0600 root:root — CAP_SYS_RAWIO does NOT override DAC),
# then msr_open()'s capable(CAP_SYS_RAWIO). So: udev puts the nodes at
# 0440 group `adm` (gate 1), and cap_sys_rawio+ep goes on the minimal
# read-only helper aldermon-msr (gate 2, reads only 0x198). Neither
# alone works; the app itself never holds the capability.
#
# doas ./aldermon-setup.sh (from the source tree)
# doas /usr/share/aldermon/aldermon-setup.sh (after make install)
set -eu
PREFIX=${PREFIX:-/usr/local}
MSRBIN=$PREFIX/bin/aldermon-msr
HELPER=$PREFIX/sbin/aldermon-powercap-chmod
RULE=/etc/udev/rules.d/60-aldermon-powercap.rules
# Helper: relax energy_uj to 0440, group adm, on every powercap dir.
cat > "$HELPER" <<'EOF'
#!/bin/sh
for d in /sys/class/powercap/intel-rapl*; do
[ -e "$d/energy_uj" ] && chgrp adm "$d/energy_uj" && chmod 0440 "$d/energy_uj"
done
exit 0
EOF
chmod 0755 "$HELPER"
# RUN+= (not MODE=/GROUP=) - powercap has no devnode, so udev's standard
# MODE/GROUP assignment doesn't apply; we chmod in-process instead.
cat > "$RULE" <<EOF
SUBSYSTEM=="powercap", ACTION=="add", RUN+="$HELPER"
EOF
# Apply immediately so a reboot isn't required.
"$HELPER"
# VID gate 1: unlike powercap, msr IS a real devnode (SUBSYSTEM=="msr",
# KERNEL=="msr0..N", DEVNAME=/dev/cpu/N/msr), so udev MODE/GROUP works
# directly — put the nodes 0440 group adm.
MSRRULE=/etc/udev/rules.d/60-aldermon-msr.rules
cat > "$MSRRULE" <<'EOF'
KERNEL=="msr[0-9]*", SUBSYSTEM=="msr", MODE="0440", GROUP="adm"
EOF
udevadm control --reload-rules
udevadm trigger --subsystem-match=msr
# VID gate 2: hand the capability to the helper only. Fail loudly if it's
# missing — without the cap the helper is inert and the TUI shows "VID n/a".
if [ -x "$MSRBIN" ]; then
setcap cap_sys_rawio+ep "$MSRBIN"
echo " setcap cap_sys_rawio+ep $MSRBIN"
else
echo "aldermon-setup: $MSRBIN not found - run 'doas make install' first," >&2
echo " or use aldermon --vid under root." >&2
exit 1
fi
echo "Installed:"
echo " $HELPER"
echo " $RULE"
echo " $MSRRULE"
echo "Add yourself to adm if not already: doas usermod -aG adm \$USER"