Stop a psmouse quirk from failing every install (#7236)

* Stop a psmouse quirk from failing every install

install/hardware/fix-synaptic-touchpad.sh calls modprobe against the running
kernel. Under 4.0 the only thing that runs it is the ISO finalizer, inside
arch-chroot, where uname -r still names the live ISO's kernel while /lib/modules
holds the target's. The live ISO always boots linux-t2 and the configurator
gives every machine that is not a T2 Mac stock linux, so those two never match:
modprobe exits 1 with "Module psmouse not found in directory /lib/modules/<live
kernel>". run_logged returns that status and omarchy-apply-hardware runs under
set -euo pipefail, so a fresh install stops on the first machine with a device
named "synaptics" and no psmouse loaded -- reported from a ThinkPad in #6985,
but nothing about it is Lenovo-specific.

Skip the load when the running kernel's modules are not reachable, and warn
instead of failing when modprobe declines for any other reason. An optional
touchpad improvement should never be able to halt an install.

This does not make InterTouch reach the installed system: a module loaded into
the live kernel is gone at reboot, so on 4.0 this script has never applied
anything to an installed machine. Persisting it means writing options psmouse
synaptics_intertouch=1 to /etc/modprobe.d, which forces the SMBus transport past
the kernel's own allowlist on any touchpad merely named "synaptics" in
/proc/bus/input/devices. That is a hardware-behaviour change on a wide class of
machines, so it is left for a maintainer to decide separately.

Fixes #6985

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Ask modprobe whether psmouse resolves rather than guessing at /lib/modules

The reachability check ran through OMARCHY_SYNAPTIC_MODULES_DIR, an override
modprobe itself never saw: it decided whether the load was attempted but could
not change where modprobe looked, so the guard and the load consulted different
places and the seam read as though it configured module lookup. modprobe -qn
answers the same question directly -- it resolves psmouse against the running
kernel without loading it -- so the guard and the load now agree by
construction and the override goes away. The arch-chroot case that broke
installs is still skipped silently, for the same reason it always was: the live
kernel's modules are not the ones on disk.

Inline the remaining /proc/bus/input/devices override at its only use. These
leaves are sourced one after another into a single shell, so a variable left at
the top level outlives the script that set it.

Pin the wiring assertion to the run_logged call instead of any mention of the
path. A commented-out line satisfied the old grep, so the test could pass with
the quirk no longer running at all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013L5zwTiZ2CsgazyxXBiPa8

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Omarchybot
2026-08-24 15:33:03 +02:00
committed by GitHub
co-authored by Claude Opus 5
parent 535d8f3485
commit 20400badda
2 changed files with 105 additions and 4 deletions
+23 -4
View File
@@ -1,6 +1,25 @@
# Enable Synaptics InterTouch for confirmed touchpads if not already loaded # Enable Synaptics InterTouch for confirmed touchpads if not already loaded
#
if grep -qi synaptics /proc/bus/input/devices \ # Only when modprobe can resolve psmouse for the running kernel, and never
&& ! lsmod | grep -q '^psmouse'; then # fatally. Installs run this under arch-chroot, where uname -r still names the
modprobe psmouse synaptics_intertouch=1 # live ISO's kernel while /lib/modules holds the target's -- the two differ on
# every machine that is not a T2 Mac, so modprobe failed with "Module psmouse
# not found in directory /lib/modules/<live kernel>" and took the whole install
# down with it. Asking modprobe itself first (-qn resolves a module without
# loading it) keeps that mismatch quiet, and the warning below covers every
# other reason it declines. An optional touchpad improvement must not be able to
# halt an install.
#
# Loading a module into the live kernel does nothing for the installed system
# either way, so this only takes effect when it runs on the booted machine.
# Persisting the switch instead would mean writing options psmouse
# synaptics_intertouch=1 to /etc/modprobe.d, which forces the SMBus transport
# past the kernel's own allowlist on every touchpad merely named "synaptics" in
# /proc/bus/input/devices -- a wider change than this one, and not one to make
# blind.
if grep -qi synaptics "${OMARCHY_SYNAPTIC_INPUT_DEVICES:-/proc/bus/input/devices}" \
&& ! lsmod | grep -q '^psmouse' \
&& modprobe -qn psmouse; then
modprobe psmouse synaptics_intertouch=1 ||
echo "Warning: could not enable Synaptics InterTouch on psmouse" >&2
fi fi
+82
View File
@@ -0,0 +1,82 @@
#!/bin/bash
set -euo pipefail
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
leaf="$ROOT/install/hardware/fix-synaptic-touchpad.sh"
all="$ROOT/install/hardware/all.sh"
grep -q 'run_logged .*hardware/fix-synaptic-touchpad.sh' "$all" ||
fail "the synaptic touchpad quirk runs during hardware setup"
pass "the synaptic touchpad quirk runs during hardware setup"
test_tmp=$(mktemp -d)
trap 'rm -rf "$test_tmp"' EXIT
mkdir -p "$test_tmp/bin"
modprobe_log="$test_tmp/modprobe.log"
# Only a real load is logged, so a case that expects nothing to happen can say
# so with an empty log even though the leaf always asks modprobe first whether
# psmouse resolves against the running kernel.
cat >"$test_tmp/bin/modprobe" <<'SH'
#!/bin/bash
if [[ $1 == "-qn" ]]; then
exit "${TEST_MODPROBE_RESOLVES:-0}"
fi
printf '%s\n' "$*" >>"$MODPROBE_LOG"
exit "${TEST_MODPROBE_STATUS:-0}"
SH
cat >"$test_tmp/bin/lsmod" <<'SH'
#!/bin/bash
printf '%s\n' 'Module Size Used by'
printf '%s\n' "${TEST_LOADED_MODULES:-}"
SH
chmod +x "$test_tmp/bin"/*
printf '%s\n' 'N: Name="SynPS/2 Synaptics TouchPad"' >"$test_tmp/devices"
# Sourced under errexit the way run_logged runs it, so a failing modprobe would
# fail the run rather than be swallowed here.
run_fix() {
: >"$modprobe_log"
MODPROBE_LOG="$modprobe_log" \
PATH="$test_tmp/bin:$PATH" \
OMARCHY_SYNAPTIC_INPUT_DEVICES="$test_tmp/devices" \
TEST_LOADED_MODULES="${1:-}" \
TEST_MODPROBE_STATUS="${2:-0}" \
TEST_MODPROBE_RESOLVES="${3:-0}" \
bash -eE -c 'source "$1"' bash "$leaf"
}
run_fix
grep -q 'psmouse synaptics_intertouch=1' "$modprobe_log" ||
fail "the synaptic touchpad quirk enables InterTouch on a booted machine"
pass "the synaptic touchpad quirk enables InterTouch on a booted machine"
# The install-breaking case: under arch-chroot the live kernel's modules are not
# the ones on disk, so psmouse does not resolve and there is nothing to load.
run_fix "" 0 1
if [[ -s $modprobe_log ]]; then
fail "the synaptic touchpad quirk skips a kernel that cannot resolve psmouse"
fi
pass "the synaptic touchpad quirk skips a kernel that cannot resolve psmouse"
run_fix psmouse
if [[ -s $modprobe_log ]]; then
fail "the synaptic touchpad quirk leaves an already-loaded psmouse alone"
fi
pass "the synaptic touchpad quirk leaves an already-loaded psmouse alone"
# An optional touchpad improvement never gets to halt an install, whatever the
# reason the module declines to load.
run_fix "" 1 2>/dev/null ||
fail "the synaptic touchpad quirk survives a failing modprobe"
pass "the synaptic touchpad quirk survives a failing modprobe"