diff --git a/install.sh b/install.sh index 01dace4..bea443b 100755 --- a/install.sh +++ b/install.sh @@ -21,6 +21,12 @@ fail() { printf 'frame-autopass: %s\n' "$*" >&2; exit 1; } [ "$(uname -m)" = "aarch64" ] || fail "this is for the Steam Frame (aarch64); this machine is $(uname -m)." command -v systemctl >/dev/null || fail "systemd not found." +# Desktop Mode on the Frame runs Konsole in a nested session with its own +# XDG_RUNTIME_DIR and D-Bus, where `systemctl --user` cannot reach the real +# user service manager. Always talk to the login session's one. +export XDG_RUNTIME_DIR="/run/user/$(id -u)" +export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus" + if ! grep -qs arcimx616 /sys/class/video4linux/*/name; then fail "the Arcturus Vision colour module was not found. frame-autopass switches between that module and the built-in IR cameras, so it needs the module attached." diff --git a/tools/autopass.cpp b/tools/autopass.cpp index 7d9bbe5..3b4c827 100644 --- a/tools/autopass.cpp +++ b/tools/autopass.cpp @@ -54,9 +54,12 @@ std::string unit_path() { return base + "/systemd/user/" + kUnit; } -// Runs `systemctl --user ARGS...`, returns its exit code. +// Runs `systemctl --user ARGS...`, returns its exit code. Always against +// the login session's user manager: Desktop Mode on the Frame runs Konsole +// in a nested session whose XDG_RUNTIME_DIR and D-Bus cannot reach it. int systemctl(std::initializer_list args, bool quiet = false) { - std::string cmd = "systemctl --user"; + const std::string run = "/run/user/" + std::to_string(::getuid()); + std::string cmd = "XDG_RUNTIME_DIR=" + run + " DBUS_SESSION_BUS_ADDRESS=unix:path=" + run + "/bus systemctl --user"; for (const char* a : args) cmd += std::string(" ") + a; if (quiet) cmd += " >/dev/null 2>&1"; const int rc = std::system(cmd.c_str()); @@ -204,7 +207,8 @@ int report() { section(&out, "date", "date"); section(&out, "SteamOS", "grep -E '^(VERSION_ID|BUILD_ID)=' /etc/os-release"); section(&out, "SteamVR", "cat /opt/steamvr/bin/version.txt; grep -m1 -E 'cv: version [0-9]' ~/.local/share/Steam/logs/vrserver.txt"); - section(&out, "unit", std::string("systemctl --user status --no-pager ") + kUnit + " | head -5"); + section(&out, "unit", "XDG_RUNTIME_DIR=/run/user/" + std::to_string(::getuid()) + + " systemctl --user status --no-pager " + kUnit + " | head -5"); section(&out, "status", "cat " + autopass::status_path()); section(&out, "config", "cat " + autopass::conf_path() + " 2>/dev/null || echo '(defaults)'"); section(&out, "crash guard", "cat " + autopass::crash_guard_path() + " 2>/dev/null || echo '(empty)'");