X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=contrib%2Fpm-utils%2F40autorandr;h=0e029af23e9f079b41ebc04293bc2990aea5d63f;hb=756bf74c1301378f15cbe94b1a3ae2d5cf071a9d;hp=0c107486113bb7552134831877fa9f49a33bbfec;hpb=7d127f5879a929868d0a69ff6cd37a0876f9bac2;p=deb_pkgs%2Fautorandr.git diff --git a/contrib/pm-utils/40autorandr b/contrib/pm-utils/40autorandr index 0c10748..0e029af 100755 --- a/contrib/pm-utils/40autorandr +++ b/contrib/pm-utils/40autorandr @@ -5,28 +5,96 @@ exec > /var/log/autorandr.log 2>&1 AUTORANDR="autorandr -c --default default" +# Work around #44: Long user names in w +export PROCPS_USERLEN=32 + +find_user() { + # Determine user owning the display session from $1 + D="$1" + + # Prefer loginctl over all others, see bug #39 + if [ -x "`which loginctl`" ]; then + # Based on http://unix.stackexchange.com/questions/203844/how-to-find-out-the-current-active-xserver-display-number/204498 + # by SO user intelfx + user="$( + loginctl list-sessions --no-legend | while read id uid user seat; do + loginctl show-session -p Display -p Active "$id" | while IFS='=' read property value; do + case "$property" in + Active) + if [ "$value" != "yes" ]; then + continue + fi + ;; + Display) + if [ -n "$value" -a "$value" = "$D" ]; then + echo $user + fi + ;; + esac + done + done + )" + if [ -n "$user" ]; then + echo $user + return 0 + fi + fi + + # Prefer w to who, see bug #39 + if [ -x "`which w`" ]; then + user="`w -h | awk -vD="$D" '$2 ~ ":"D"(.[0-9])?$" || $3 ~ ":"D"(.[0-9])?$" {print $1}' | head -n1`" + + if [ -z "$user" ]; then + # This fallback checks if there is exactly one user (except + # root) logged in an interactive session and assumes the + # session belongs to him. See bug #39. + user="`w -hu | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" + fi + else + user="`who --all | awk -vD="$D" '$3 ~ ":"D"(.[0-9])?$" {print $1}' | head -1`" + + if [ -z "$user" ]; then + # Same fallback as above; see bug #39. + user="`who -u | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" + fi + fi + + if [ -n "$user" ]; then + echo $user + return 0 + fi + + # If none of the above worked, check if there is only one user owning + # processes in $DISPLAY except root + # + # This code should be optimized somehow, but keep in mind that not all + # systems symlink sh -> bash! + OUTPUT="$( + for p in /proc/*; do + [ -d $p ] || continue + d="$(awk -v RS='\0' -F= '$1=="DISPLAY" {print $2}' $p/environ 2>/dev/null)" + if [ "$d" = "$D" ]; then + stat -c %U $p + fi + done | sort | uniq | grep -v root | nl | head -n1 + )" + count=$(echo $OUTPUT | awk '{print $1}') + user=$(echo $OUTPUT | awk '{print $2}') + + if [ "$count" -eq 1 ]; then + echo $user + return 0 + fi + + return 1 +} + detect_display() { for X in /tmp/.X11-unix/X*; do D="${X##/tmp/.X11-unix/X}" - # Prefer w to who, see bug #39 - if [ -x "`which w`" ]; then - user="`w -h | awk -vD="$D" '$2 ~ ":"D"(.[0-9])?$" || $3 ~ ":"D"(.[0-9])?$" {print $1}' | head -n1`" - - if [ -z "$user" ]; then - # This fallback checks if there is exactly one user (except - # root) logged in an interactive session and assumes the - # session belongs to him. See bug #39. - user="`w -hu | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" - fi - else - user="`who --all | awk -vD="$D" '$3 ~ ":"D"(.[0-9])?$" {print $1}' | head -1`" - if [ -z "$user" ]; then - # Same fallback as above; see bug #39. - user="`who -u | awk '/^\w+/ && $1 !~ "root" { users[$1]=$1; } ENDFILE { if(asort(users) == 1) for(u in users) print users[u]; }'`" - fi - fi + user="$(find_user ":$D")" if [ x"$user" != x"" ]; then logger "autorandr: Changing display configuration for display :$D, user '$user'" @@ -36,7 +104,7 @@ detect_display() done } -if grep -q systemd $(readlink -f $(awk '{print $1}' /proc/1/cmdline)) && [ "$2" = "udev" ]; then +if grep -q systemd /proc/1/comm && [ "$2" = "udev" ]; then exec /bin/systemctl start autorandr-resume.service fi