Log Borger ud efter X minutters inaktivitet

Source: Download script

Last Updated: 4. December 2024 by Agnete Moos (agms@sonderborg.dk)

Parameters:

Navn Type Standardværdi Påkrævet
Click to see the source code
#! /usr/bin/env sh

# This script and "inactivity_suspend_after_time.sh" are mutually exclusive, and each of them
# are written to overwrite each other, so whichever was the last of them run takes effect.

# PARAMETERS
# 1. Checkbox. Enables/disables the script.
# 2. Integer. How many minutes to wait before showing the warning dialog
# 3. Integer. How many minutes to wait before logging out
# 4. String. (optional) The text to be shown in the warning dialog. If no input is given, a default is used
# 5. String. (optional) The text to be shown on the dialog button. If no input is given, a default is used

set -x

if get_os2borgerpc_config os2_product | grep --quiet kiosk; then
  echo "Dette script er ikke designet til at blive anvendt på en kiosk-maskine."
  exit 1
fi

ENABLE=$1
DIALOG_TIME_MINS=$2
LOGOUT_TIME_MINS=$3
DIALOG_TEXT=$4
BUTTON_TEXT=$5

# Note: Currently this log is never rotated, so it'll grow and grow
INACTIVITY_SCRIPT="/usr/share/os2borgerpc/bin/inactive_logout.sh"
INACTIVITY_SCRIPT_LOG="/usr/share/os2borgerpc/bin/inactive_logout.log"
LIGHTDM_SCRIPT="/etc/lightdm/greeter-setup-scripts/suspend_after_time.sh"

# Stop Debconf from interrupting when interacting with the package system
export DEBIAN_FRONTEND=noninteractive

error() {
  echo "$1"
  exit 1
}

# If this is run after inactivity_suspend_after_time, ensure the suspend script
# hasn't left files behind
rm --force $LIGHTDM_SCRIPT

# Handle deactivating inactivity logout
if [ "$ENABLE" = "False" ]; then
  rm --force $INACTIVITY_SCRIPT $INACTIVITY_SCRIPT_LOG
  OLDCRON="/tmp/oldcron"
  crontab -l > $OLDCRON
  if [ -f "$OLDCRON" ]; then
    sed --in-place "\@$INACTIVITY_SCRIPT@d" $OLDCRON
    crontab $OLDCRON
    rm --force $OLDCRON
  fi
  exit
fi

[ -z "$DIALOG_TIME_MINS" ] && error 'Please insert the time the user has to be inactive before dialog is shown.'
[ -z "$LOGOUT_TIME_MINS" ] && error 'Please insert the time the user has to be inactive before being logged out.'
[ "$DIALOG_TIME_MINS" -gt "$LOGOUT_TIME_MINS" ] && error 'Dialog time is greater than logout time and dialog will therefore not be shown. Edit dialog time!'
[ -z "$DIALOG_TEXT" ] && DIALOG_TEXT="Du er inaktiv og bliver logget ud om kort tid..."
[ -z "$BUTTON_TEXT" ] && BUTTON_TEXT="OK"

# xprintidle uses milliseconds, so convert the user inputted minutes to that
LOGOUT_TIME_MS=$(( LOGOUT_TIME_MINS * 60 * 1000 ))
DIALOG_TIME_MS=$(( DIALOG_TIME_MINS * 60 * 1000 ))

# Install xprintidle
apt-get update --assume-yes

# Only try installing if it isn't already as otherwise it will exit with nonzero and stop the script
if ! dpkg --get-selections | grep -v deinstall | grep --quiet xprintidle; then
  if ! apt-get install --assume-yes xprintidle; then
    # apt install could fail due to debian frontend lock being unavailable
    # during automatic updates
    error "apt failed to install xprintidle"
  fi
fi

# if line already added to crontab: skip
if ! crontab -l | grep "$INACTIVITY_SCRIPT"; then
	line="* * * * * $INACTIVITY_SCRIPT"
	(crontab -l -u root; echo "$line") | crontab -u root -
fi

# New auto_logout file, running as root
cat <<- EOF > $INACTIVITY_SCRIPT
	#! /usr/bin/env sh

	# If the user is inactive for too long, a dialog will appear, warning the user that the session will end.
	# If the user do not touch the mouse or press any keyboard key the session will end.
	# Only have one dialog at a time, so remove preexisting ones.
	# Create a new message every time, in case someone didn't close it but
	# just put e.g. a browser in front, to ensure they or someone else gets a
	# new warning when/if inactivity is reached again

	USER_DISPLAY=\$(who | grep -w 'user' | sed -rn 's/.*(:[0-9]*).*/\1/p')

	# These are used by xprintidle
	export XAUTHORITY=/home/user/.Xauthority
	export DISPLAY=\$USER_DISPLAY
	su - user -c "DISPLAY=\$USER_DISPLAY xhost +localhost"

	LOG=$INACTIVITY_SCRIPT_LOG

	echo $LOGOUT_TIME_MS \$(xprintidle) >> \$LOG

	if [ \$(xprintidle) -ge $LOGOUT_TIME_MS ]; then
		echo 'Logging user out' >> \$LOG
		pkill -KILL -u user
		exit 0
	fi
	# if idle time is past the dialog time: show the dialog
	if [ \$(xprintidle) -ge $DIALOG_TIME_MS ]; then
	  # Do spare the poor lives of potential other zenity windows.
	  PID_ZENITY="\$(pgrep --full 'Inaktivitet')"
	  if [ -n \$PID_ZENITY ]; then
	  	kill \$PID_ZENITY
	  fi
	  # echo 'Running zenity...' >> \$LOG
	  # We use the --title to match against above
	  zenity --warning --text="$DIALOG_TEXT" --ok-label="$BUTTON_TEXT" --no-wrap --display=\$USER_DISPLAY --title "Inaktivitet"
	fi
EOF

chmod +x $INACTIVITY_SCRIPT

Beskrivelse

Vis en advarsel efter et antal minutters inaktivitet - ved fortsat inaktivitet logges brugeren automatisk ud. Dette script har til formål at sørge for at brugeren automatisk logges ud, hvis de skulle forlade maskinen uden selv at logge ud.

SIKKERHEDSMÆSSIGE OVERVEJELSER: Mens en BorgerPC er logget ind kan der godt gemmes filer på den, nogle programmer vil huske besøgte webadresser på den, og en Borger kunne efterlade en maskine logget ind på deres E-Boks. Automatisk logud er lavet til scenarier hvor Borger ikke husker selv at lukke/slette vigtige filer, eller bare logge ud. Så vil maskinen i så fald efter X antal tid selv sørge for det.

Vi anbefaler at genstarte efter kørsel, for at være sikker på, det har taget effekt.

Dette script er blevet testet og virker på Ubuntu 22.04.

Parametre

Scriptet tager 5 inputparametre:

  1. Hvorvidt scriptet skal aktiveres. Sæt hak i tjekboksen for at aktivere scriptet. Lad tjekboksen stå tom for at deaktivere scriptet.
  2. Antal MINUTTER computeren kan være inaktiv, før en advarsel vises.
  3. Antal MINUTTER computeren kan være inaktiv, før den lukkes ned. Det skal være længere tid end det første inputparameter, da advarslen ellers ikke vil blive set. Vi foreslår minimum 3 minutter længere.
  4. Teksten der vises i inaktivitetsadvarslen. Hvis feltet efterlades tomt, bruges standardteksten “Du er inaktiv og bliver logget ud om kort tid…”
  5. Teksten der vises på knappen i inaktivitetsadvarslen. Hvis feltet efterlades tomt, bruges standardteksten “OK”

Eksempel: Med inputparametrene 5 og 10 vil der vises en advarsel efter 5 minutter, og hvis inaktiviteten så fortsætter 5 minutter derefter, vil brugeren blive logget af.

Hvis du ønsker linieskift i teksten, kan det gøres ved at skrive \n således: Linie1\nLinie2