diff --git a/roles/lmn_kde/files/pwroff b/roles/lmn_kde/files/pwroff new file mode 100755 index 0000000..1245335 --- /dev/null +++ b/roles/lmn_kde/files/pwroff @@ -0,0 +1,47 @@ +#!/bin/bash +# +# logout idle users and shutdown machine +# +set -eu + +action="systemctl poweroff" +uptime=$(cat /proc/uptime | cut -f1 -d.) +maxidle=3600 + +u=($(loginctl list-users --no-legend | sort -hr | head -1)) +una=${u[1]} +uid=${u[0]} + +talk2dbus() { + local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)" + sudo -u $una DISPLAY=$display \ + DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus "$@" 2>/dev/null +} + +######## + +## shutdown if nobody is loged in: +if [[ -z "$una" ]] ; then + exec $action +fi + +# FIXME: find idle time independent of running screensaver +if ! t=$(talk2dbus qdbus org.kde.screensaver /ScreenSaver GetActiveTime) ; then + echo "No graphical logins found." +else + idle=$(( t / 1000 )) + if [[ $idle -gt $maxidle ]] ; then + talk2dbus notify-send -i system-shutdown -u critical -a 'Important System Information' \ + 'Please log out, the system will shut down soon!' \ + 'There has been no activity for too long.' + ## shutdown: + #talk2dbus qdbus org.kde.ksmserver /KSMServer logout 1 2 0 + ## logout: + talk2dbus qdbus org.kde.ksmserver /KSMServer logout 1 0 0 + echo "Log-out user $una after being idle for $idle seconds." + else + echo "The user $una has been idle for $idle seconds." + fi +fi + +#w -s | grep tty | sed "s/[[:space:]]\+/ /g" | cut -f4 -d ' ' diff --git a/roles/lmn_kde/files/pwroff.service b/roles/lmn_kde/files/pwroff.service new file mode 100644 index 0000000..1fe36d3 --- /dev/null +++ b/roles/lmn_kde/files/pwroff.service @@ -0,0 +1,6 @@ +[Unit] +Description=Run pwroff script + +[Service] +Type=simple +ExecStart=/usr/local/sbin/pwroff diff --git a/roles/lmn_kde/files/pwroff.timer b/roles/lmn_kde/files/pwroff.timer new file mode 100644 index 0000000..299bc4b --- /dev/null +++ b/roles/lmn_kde/files/pwroff.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Run pwroff script every 10 min after 60 min uptime + +[Timer] +OnBootSec=60min +OnUnitActiveSec=10min + +[Install] +WantedBy=timers.target diff --git a/roles/lmn_kde/handlers/main.yml b/roles/lmn_kde/handlers/main.yml index 2b7f71a..1a21074 100644 --- a/roles/lmn_kde/handlers/main.yml +++ b/roles/lmn_kde/handlers/main.yml @@ -7,3 +7,8 @@ name: tmp.mount enabled: yes listen: enable tmp.mount + +- name: enable pwroff.timer + systemd: + name: pwroff.timer + enabled: true diff --git a/roles/lmn_kde/tasks/main.yml b/roles/lmn_kde/tasks/main.yml index e50b7aa..f8b4fbf 100644 --- a/roles/lmn_kde/tasks/main.yml +++ b/roles/lmn_kde/tasks/main.yml @@ -137,6 +137,23 @@ AllowSuspendThenHibernate=no AllowHybridSleep=no + +- Name: Copy pwroff script + template: + src: pwroff + dest: /usr/local/sbin/ + mode: 0755 + +- name: Provide service and timer for pwroff script + copy: + src: "{{ item }}" + dest: "/etc/systemd/system/{{ item }}" + mode: 0644 + with_items: + - pwroff.service + - pwroff.timer + notify: enable pwroff.timer + ################# general settings ################## - name: Protect grub menu entries blockinfile: