File synergylock of Package xss-lock
#!/bin/bash
shopt -q extglob
sshprompt='-qo NumberOfPasswordPrompts=0'
remote ()
{
local lpid=$(ps x -o comm,pid= | sed -rn '/synergys/{ s/.*[[:blank:]]([[:digit:]]*)/\1/p; }')
local tcp recv send src dest info
test -n "$lpid" || return
while read recv send src dest info
do
echo [${dest%:*}]=${dest#*:}
done < <(ss -Htnp state established 2>/dev/null|grep ",pid=$lpid,")
}
if test -d ${XDG_RUNTIME_DIR=/run/user/${UID}}
then
plock=$(readlink ${XDG_RUNTIME_DIR}/lockscreen)
if test -n "$plock"
then
xss=$(readlink /proc/${plock}/exe)
fi
case "$xss" in
(*/xss-lock) ;;
(*) echo No xss-lock process found 1>&2
exit 1
;;
esac
fi
eval declare -A ports=($(remote))
declare -A displays xauths
for ip in "${!ports[@]}"
do
pid=$(ssh $sshprompt -fax $USER@$ip -- exec lsof -ti tcp:${ports[$ip]} 2> /dev/null)
env=($(ssh -fax $USER@$ip -- exec exec ps -p 21727 eh | tr ' ' '\n' | grep -E '^(DISPLAY|XAUTHORITY)'))
for e in ${env[@]}
do
case "$e" in
DISPLAY=*) displays[$ip]=${e#*=} ;;
XAUTHORITY=*) xauths[$ip]=${e#*=} ;;
esac
done
done
xsslock=$(pidof lockscreen)
while read status
do
case "$status" in
(clone*=*)
active=${status#*= }
for ip in "${!ports[@]}"
do
ssh $sshprompt -fax $USER@$ip -- pidof xsecurelock '||' env ${xauths[$ip]:+"XAUTHORITY=${xauths[$ip]}"} ${displays[$ip]:+DISPLAY=${displays[$ip]}} exec xset s activate
done
inotifywait -q -q -e close /proc/${active}/exe
;;
(*SIGCHLD*)
for ip in "${!ports[@]}"
do
ssh $sshprompt -fax $USER@$ip -- env ${xauths[$ip]:+"XAUTHORITY=${xauths[$ip]}"} ${displays[$ip]:+DISPLAY=${displays[$ip]}} xset s reset '&&' exec killall -q -u $USER -TERM xsecurelock
done
;;
esac
done < <(exec -a "watch lockscreen" strace -qq -e clone -p $xsslock 2>&1)