#!/bin/bash

source /usr/share/calculate/xdm/functions

progname=$0

SHORTOPTS="h"
LONGOPTS="login,logout,help"


PATH_LOG='/var/log/calculate'
FILE_LOG="${PATH_LOG}/cl_login-error.log"

print_help() {
	cat <<'EOF'
Usage: xdm --login|--logout

Execute scripts in /usr/share/calculate/xdm/login.d or
/usr/share/calculate/xdm/logout.d .

Options:
  --login       Execute all scripts in /usr/share/calculate/xdm/login.d
  --logout      Execute all scripts in /usr/share/calculate/xdm/logout.d
  -h, --help    Print this help message
EOF
}

warning() {
	echo "Warning: "$1 1>&2
}

writelog() {
	local ERROR_MESSAGE="${1}"
	if [[ ! -e $PATH_LOG && -w /var/log ]];
	then
		# Создадим директорию логов
		mkdir $PATH_LOG
	fi
	# если права на файл не 755
	if [[ "`stat ${PATH_LOG} | sed -n -r '/Access: \(/ {s/.*\([0-9]([^/]+).*/\1/;p}'`" != "755" && -w $PATH_LOG ]];
	then
		chmod 755 $PATH_LOG
	fi
	
	if [[ -n $ERROR_MESSAGE && -w $FILE_LOG ]];
	then
		# Запишем ошибку в файл
		echo "$ERROR_MESSAGE" >> $FILE_LOG
	fi
}

die() {
	[[ -n $BG_PID ]] && kill $BG_PID
	echo "Error: "$1 1>&2
	writelog "${1}"
	umount_user_res
	exit 1
}


die_xmes() {
	#xmes "${1}"
	die "${1}"
}

umount_user_res(){
	if [[ -n $USER && -z `who | awk '{ print $1, $2 }' | grep -P ":\d+" | awk '{ print $1}' | grep $USER` ]];
	then
		HOME_DIR=`getent passwd $USER | awk -F: '{ print( $6 ); }'`
		PROFILE_DIR=`dirname $HOME_DIR`/.`basename $HOME_DIR`
		REMOTE_PROFILE_DIR=`dirname $HOME_DIR`/.`basename $HOME_DIR`.remote
		ALL_MOUNT_DIRS=`cat /proc/mounts | grep -e $HOME_DIR -e $PROFILE_DIR -e $REMOTE_PROFILE_DIR  |  awk '{ print $2 }'`
		ALL_MOUNT_DIRS=`echo $ALL_MOUNT_DIRS | awk '{ for (i = NF; i > 0; --i) print $i }'`
		for MOUNT_DIR in $ALL_MOUNT_DIRS;
		do	
			KILL_PIDS=`fuser ${MOUNT_DIR} 2>/dev/null`
			if [[ -n $KILL_PIDS ]];
			then
				kill -9 $KILL_PIDS
			fi
			umount "${MOUNT_DIR}"
		done
	fi
}

gtk_background(){
	if [[ -n $(env | grep RUNNING_UNDER_GDM=true) ]] && ls /var/db/pkg/gnome-base/gdm-2* &>/dev/null;
	then
	/usr/bin/env HOME=/root python2 /usr/share/calculate/xdm/setbg &
	BG_PID=$(ps ax | sed -nr "s/^\s*([0-9]+)\s.*setbg$/\1/p")
	fi
}

OPTS=$(getopt -o $SHORTOPTS --long $LONGOPTS -n "$progname" -- "$@")

if [ $? -ne 0 ]; then
	echo "'$progname --help' for more information" 1>&2
	exit 1
fi
eval set -- "$OPTS"

EXECDIR=/usr/share/calculate/xdm

if [[ -w $FILE_LOG ]]; then
	# Очистим лог ошибок
	echo -n "" > $FILE_LOG
fi

while [ $# -gt 0 ]; do
	case $1 in
	-h|--help)
		print_help
		exit 0
		;;
	--login)
		[[ $EXECDIR == /usr/share/calculate/xdm ]] || 
			die "only one of --login or --logout must be specified"
		EXECDIR=${EXECDIR}/login.d
		shift 1
		;;
	--logout)
		[[ $EXECDIR == /usr/share/calculate/xdm ]] || 
			die "only one of --login or --logout must be specified"
		EXECDIR=${EXECDIR}/logout.d
		shift 1
		;;
	--)
		shift
		;;
	auto)
		shift
		;;
	*)
		die "unrecognized option: $1"
		;;
	esac
done
if [[ $EXECDIR == /usr/share/calculate/xdm ]]; then
	die "must specify option"
fi

[[ -e ${EXECDIR} ]] || die "${EXECDIR} is not exists"

FILELIST=$(find ${EXECDIR} -type f | sort)
[[ $FILELIST ]] || warning "${EXECDIR} hasn't scripts"

gtk_background
DOMAIN_USER="`get_ur_domain_set`"
HOME_DIR=`getent passwd $USER | awk -F: '{ print( $6 ); }'`

for script in $FILELIST
do
	source $script && run_script
	res=$?
	case $res in
		0) continue ;;
		1) die_xmes "failed on execute $script" ;;
		2) break ;;
	esac
done

sleep_kill()
{
	sleep 2
	kill $1
}

[[ -n $BG_PID ]] && sleep_kill $BG_PID &
exit 0
