|
|
#!/bin/bash
|
|
|
|
|
|
source /lib/rc/sh/functions.sh
|
|
|
|
|
|
variable_value()
|
|
|
{
|
|
|
local varname=$1
|
|
|
/usr/libexec/calculate/cl-variable --value $varname
|
|
|
}
|
|
|
|
|
|
ONLINE_USERS="`variable_value desktop.cl_desktop_online_user`"
|
|
|
|
|
|
# получить доменных пользователей которые не online, но их ресурсы подключены
|
|
|
domain_users() {
|
|
|
for mp in $(grep -Po "^//.*/homes\s+.*Home" /proc/mounts |
|
|
|
awk '{print $2}');do
|
|
|
local username=$(basename $(dirname $mp))
|
|
|
for user in ${ONLINE_USERS//,/ }
|
|
|
do
|
|
|
if [[ $user == $username ]]
|
|
|
then
|
|
|
username=
|
|
|
fi
|
|
|
done
|
|
|
[[ -n $username ]] && echo $username
|
|
|
done | sort | uniq
|
|
|
}
|
|
|
|
|
|
DOMAIN_USERS=( $(domain_users) )
|
|
|
|
|
|
# если есть пользователи в сеансе или выполняется выход
|
|
|
if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]] || pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
then
|
|
|
if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]]
|
|
|
then
|
|
|
ebegin "Logout users"
|
|
|
fi
|
|
|
# есть пользователи в сеансе
|
|
|
if [[ -n $ONLINE_USERS ]]
|
|
|
then
|
|
|
# переменная online_data возвращает строки пользователь,дисплей
|
|
|
for user_disp in $(variable_value desktop.cl_desktop_online_data | sed -r "s/;/ /g")
|
|
|
do
|
|
|
user=$(echo $user_disp | cut -d: -f1)
|
|
|
disp=$(echo $user_disp | cut -d: -f2)
|
|
|
# завершаем сессию пользователя
|
|
|
/usr/sbin/cl-core --method desktop_logout $user &>/dev/null
|
|
|
sleep 1
|
|
|
# если корректное завершение не удалось
|
|
|
if who | grep -q -P "$user.*:$disp"
|
|
|
then
|
|
|
# удаляем запить о пользователе
|
|
|
/usr/bin/sessreg -d -l :$disp $user &>/dev/null
|
|
|
# выполняем принудительный выход из сеанса
|
|
|
USER="$user" /usr/share/calculate/xdm/xdm --logout &>/dev/null &
|
|
|
fi
|
|
|
done
|
|
|
fi
|
|
|
if [[ -n "${DOMAIN_USERS[@]}" ]]
|
|
|
then
|
|
|
for user in ${DOMAIN_USERS[@]}
|
|
|
do
|
|
|
# выполняем принудительный выход из сеанса
|
|
|
USER="$user" /usr/share/calculate/xdm/xdm --logout &>/dev/null &
|
|
|
done
|
|
|
fi
|
|
|
if [[ -n $ONLINE_USERS ]] || [[ -n $DOMAIN_USERS ]]
|
|
|
then
|
|
|
eend 0
|
|
|
fi
|
|
|
|
|
|
# ожидаение завершения процесса выхода пользователя из сеанса
|
|
|
if pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
then
|
|
|
ebegin "Please wait for complete logout"
|
|
|
for i in {1..500}
|
|
|
do
|
|
|
if pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
then
|
|
|
sleep 1
|
|
|
else
|
|
|
break
|
|
|
fi
|
|
|
done
|
|
|
eend 0
|
|
|
fi
|
|
|
fi
|