#!/usr/bin/env bash # Installa (via pkexec) una copia di ffmpeg con CAP_SYS_ADMIN, necessaria per kmsgrab. # La capability e' confinata a QUELLA copia del binario, non a /usr/bin/ffmpeg. # # ./setup-kmsgrab.sh installa # ./setup-kmsgrab.sh --remove rimuove set -euo pipefail DEST="/usr/local/libexec/ambilight/ffmpeg-kmsgrab" SRC="$(command -v ffmpeg)" say() { printf '\033[1;32m==>\033[0m %s\n' "$*"; } if [ "${1:-}" = "--remove" ]; then say "Rimuovo $DEST" pkexec sh -c "rm -f '$DEST' && rmdir --ignore-fail-on-non-empty /usr/local/libexec/ambilight 2>/dev/null || true" say "Fatto." exit 0 fi [ -x "$SRC" ] || { echo "ffmpeg non trovato" >&2; exit 1; } say "Installo $SRC -> $DEST con cap_sys_admin+ep (pkexec chiedera' la password)" pkexec sh -c "install -D -m 0755 -o root -g root '$SRC' '$DEST' \ && setcap cap_sys_admin+ep '$DEST' \ && echo '--- capability applicata:' && getcap '$DEST'" say "Verifica rapida (1 frame, senza portal e senza indicatore nel vassoio)" "$DEST" -hide_banner -loglevel error -nostdin \ -f kmsgrab -device /dev/dri/card1 -i - \ -vf "hwdownload,format=bgr0,scale=188:72:flags=bilinear,format=rgb24" \ -frames:v 1 -f rawvideo -pix_fmt rgb24 /tmp/kmsgrab_probe.rgb ls -l /tmp/kmsgrab_probe.rgb python3 - <<'PY' import numpy as np a = np.frombuffer(open('/tmp/kmsgrab_probe.rgb','rb').read(), dtype=np.uint8) print("frame:", a.size, "byte ->", a[:9].tolist(), "| media:", a.reshape(-1,3).mean(axis=0).round(1).tolist()) PY cat <