kick/kick-session

48 lines
1.6 KiB
Bash
Executable file

#!/bin/sh
# kick-session -- display-manager session entry for kick.
#
# A display manager (lightdm/gdm/sddm/greetd) keeps only one generation of
# session output (~/.xsession-errors + .old), so crash backtraces and flicker
# evidence are lost after two logins. This wrapper persists every boot to
# its own timestamped log and then execs kick, passing all arguments
# through untouched (screen mode, --panel, tabs, ...). Environment
# (KICK_MODE, KICK_LOG, ...) passes through equally untouched.
#
# Usage (see kick-session.desktop):
# env KICK_MODE=standalone kick-session [kick args...]
set -u
USER_NAME=${USER:-unknown}
HOME_DIR=${HOME:-/tmp}
XDG_HOME=${XDG_DATA_HOME:-$HOME_DIR/.local/share}
LOGDIR="$XDG_HOME/kick/logs"
if ! mkdir -p "$LOGDIR" 2>/dev/null; then
LOGDIR="/tmp/kick-logs-$USER_NAME"
mkdir -p "$LOGDIR" 2>/dev/null || LOGDIR="/tmp"
fi
STAMP=$(date +%Y%m%d-%H%M%S 2>/dev/null || echo "nodate")
LOG="$LOGDIR/session-$STAMP-$$.log"
# Retention: keep the newest 10 session logs, prune the rest. Runs before
# the current log exists, so the current boot is never a candidate.
if [ -d "$LOGDIR" ]; then
# shellcheck disable=SC2012
ls -t "$LOGDIR"/session-*.log 2>/dev/null | tail -n +11 | xargs -r rm -f --
fi
if command -v kick >/dev/null 2>&1; then
KICK_BIN=kick
else
echo "kick-session: 'kick' not found in PATH=$PATH" >&2
exit 127
fi
if exec >"$LOG" 2>&1; then
echo "kick-session: logging to $LOG"
echo "kick-session: date (utc): $(date -u +%FT%TZ 2>/dev/null || date)"
echo "kick-session: args: $*"
else
echo "kick-session: cannot write $LOG, keeping session fds" >&2
fi
exec "$KICK_BIN" "$@"