#!/bin/sh
BOLD=$(tput bold)
NORMAL=$(tput sgr0)
oneuser_home=/var/lib/one/homes
brestusers=brestusers
brestadmins=brestadmins
tmp_folder=/tmp/brestuser
tmp_passfile=$tmp_folder/p

HOSTNAME=`hostname -s`
DOMAIN=`hostname -d`
FQDN=$HOSTNAME.$DOMAIN

KDC=$( awk '{if ($1 == "server") print $3}' '/etc/ipa/default.conf' )
if [ -z $KDC ]; then
        KDC=$FQDN
fi

SUFFIXS=$(echo $DOMAIN | tr "." "\n")
SUFFIX=""
for N in $SUFFIXS
do
   PART="dc=$N"
   if [ "$SUFFIX" != "" ]; then
      SUFFIX="$SUFFIX,$PART"
   else
      SUFFIX="$PART"
   fi
done

check_merge=$(grep -oP "SUCCESS=merge" /etc/nsswitch.conf)

function clean_tmp(){
	if [ -d "$tmp_folder" ]; then
		rm -rf $tmp_folder
	fi
}

trap ctrl_c INT
function ctrl_c() {
        echo -e "\n\n** Срыв настройки\n"
        clean_tmp
        exit 0
}
function title(){
	echo
	echo "${BOLD}Управление пользователями облачной платформы БРЕСТ${NORMAL}"
}
function help() {
	echo
	echo "Список доступных команд: "
	echo "  ${BOLD}create${NORMAL} USERNAME"
	echo "         добавляет пользователя с именем USERNAME"
	echo "	 Можно использовать дополнительные опции"
	echo " 		-admin_name Имя администратора домена"
	echo " 		-admin_pass Пароль администратора домена"
	echo " 		-pass Пароль создаваемого пользователя"
	echo " 		-is_admin Является ли создаваемый пользователем администратором"
	echo "  ${BOLD}passwd${NORMAL} USERNAME"
	echo "         изменяет пароль пользователя с именем USERNAME"
	echo "  ${BOLD}token${NORMAL}  USERNAME"
	echo "         создает токен для работы с CLI пользователю с именем USERNAME"
	echo "  ${BOLD}del${NORMAL}    USERNAME"
	echo "         удаляет из системы пользователя с именем USERNAME"
	echo "  ${BOLD}list${NORMAL}"
	echo "         выводит список зарегистрированных пользователей системы"
	echo "  ${BOLD}sync${NORMAL}"
	echo "         синхронизирует пользователей с узлами кластера"
	echo
}
function add_user_host() {
	host_name=$2
	is_admin=$3
	
	if [ -z "$check_merge" ]; then
		ssh $host_name "adduser $1 libvirt-qemu"
		ssh $host_name "adduser $1 kvm"
		ssh $host_name "adduser $1 astra-console"
		if [ "$is_admin" == "Да" ]; then
			ssh $host_name "adduser $1 libvirt-admin"
			ssh $host_name "adduser $1 libvirt"
		fi
	fi
}

function admin_auth(){
	if [ $ADMIN_NAME == "0" ]; then
		echo -n "Введите имя администратора сервера IPA (по умолчанию admin): "
		read user_admin
		if [ -z "$user_admin" ]; then
			user_admin="admin"
		fi
	else
		user_admin=$ADMIN_NAME
	fi
	if [ $ADMIN_PASS == "0" ]; then
		echo -n "Введите пароль администратора сервера IPA: "
		read -s admin_pass
		echo
		while [ -z "$admin_pass" ]; do
			echo -n "Введите пароль администратора сервера IPA: "
			read -s admin_pass
			echo
		done
	else
	 	admin_pass=$ADMIN_PASS
	fi

	echo "" > $tmp_passfile
	chmod 0400 $tmp_passfile
	chown root:root $tmp_passfile
	echo "$user_admin:$admin_pass" > $tmp_passfile
	echo $admin_pass | kinit $user_admin || {
		echo -e "\033[91m Вы неправильно ввели имя или пароль, попробуйте ещё раз \033[0m"
		admin_auth
}
	#current_host=$FQDN
}

function create_user(){
	user_name=$1
	if ! echo "$user_name" | grep -Eq  '^[a-z]+[0-9a-z]*$';then
		echo -ne "\nОШИБКА:  логин не может начинаться с цифры, содержать заглавные, кириллические или специальные символы\n"
		exit 1
	fi
	if [ $PASS == "0" ] ; then
		echo -n "Укажите пароль пользователя: "
		read -s user_pass
		echo
		while [ -z "$user_pass" ]; do
			echo -n "Укажите пароль пользователя: "
			read -s user_pass
			echo
		done
	else
		user_pass=$PASS
	fi

	if [ $IS_ADMIN == "0" ]; then
		echo -e "Пользователь будет администратором (по умолчанию Нет)?"
		echo -n "Нет|Да: "
		read is_admin
		if [ -z "$is_admin" ]; then
			is_admin="Нет"
		fi
		while [ "$is_admin" != "Да" ] && [ "$is_admin" != "Нет" ]; do
			echo -n "Укажите \"Нет\" или \"Да\": "
			read is_admin
		done
	else
		is_admin=$IS_ADMIN
	fi

	echo "$user_name:$user_pass" >> $tmp_passfile
	check_user=$(ipa user-find | grep $user_name | grep -v grep)
	if [ -z "$check_user" ]; then
		if [ "$is_admin" == "Да" ]; then
			ipa user-add $user_name --first $user_name --last $user_name
			ipa group-add-member $brestusers --users=$user_name
			ipa group-add-member $brestadmins --users=$user_name
			adduser $user_name astra-admin
			adduser $user_name astra-console
			adduser $user_name disk
			adduser $user_name video
			adduser $user_name users
			if [ -z "$check_merge" ]; then
				adduser $user_name kvm
				adduser $user_name libvirt
				adduser $user_name libvirt-admin
				adduser $user_name libvirt-qemu
			fi
		else
			ipa user-add $user_name --first $user_name --last $user_name
			ipa group-add-member $brestusers --users=$user_name
			adduser $user_name astra-console
			adduser $user_name users
			adduser $user_name disk
			adduser $user_name video
			if [ -z "$check_merge" ]; then
				adduser $user_name kvm
				adduser $user_name libvirt
				adduser $user_name libvirt-qemu
			fi
		fi
			ldapmodify -D "cn=Directory Manager" -h $KDC -Y GSSAPI <<- EOF
			dn: uid=$user_name,cn=users,cn=accounts,$SUFFIX
			changetype: modify
			replace: userPassword
			userPassword: $user_pass

			dn: uid=$user_name,cn=users,cn=accounts,$SUFFIX
			changetype: modify
			replace: krbPasswordExpiration
			krbPasswordExpiration: $(date -u -d "@$(($(date +'%s')+(90*24*3600)))" +'%Y%m%d%H%M%S'Z)
			EOF

		if [ "x$?" != "x0" ]; then
			echo "Ошибка добавления пользователя в домен!"
			rm -rf $tmp_folder
			exit 1
		fi
	fi

	check_oned_user=$(oneuser list --csv | cut -d, -f2 | grep -w "${user_name}")
	if [ "$check_oned_user" != "$user_name" ]; then
		if [ "$is_admin" == "Да" ]; then
			oneuser create $user_name "$user_name@${DOMAIN^^}" --driver public --group brestadmins
		else
			oneuser create $user_name "$user_name@${DOMAIN^^}" --driver public
		fi
	fi
	#token_create $user_name
	add_user_host "$user_name" "$FQDN" "$is_admin"
	for host in `onehost list -l NAME --csv | awk NR\>1 | grep -v $FQDN`; do
		add_user_host "$user_name" "$host" "$is_admin"
	done
}
function check_user_define(){
	user_list=$(get_list_user $1)
	for user_check in $user_list
	do
		if [ "$user_check" == "$1" ]; then
			return 0
		fi
	done
	return 1
}
function token_create() {
	if ! [ -d $oneuser_home/$1 ]; then
		echo "folder created"
		mkdir $oneuser_home/$1
		chown $1 $oneuser_home/$1
		chmod 0700 $oneuser_home/$1
	fi
	oneuser token-delete-all $1
	oneuser token-create $1 --time 2000000000 > $oneuser_home/$1/one_auth
	chown $1 $oneuser_home/$1/one_auth
	chmod 0600 $oneuser_home/$1/one_auth
}
function passwd_user(){
	check_user_define $1
	if [ "0x$?" != "0x0" ]; then
		echo "Пользователь не найден!"
		exit 1
	fi
	
	user_name=$1
	echo -n "Укажите пароль пользователя: "
	read -s user_pass
	echo
	while [ -z "$user_pass" ]; do
		echo -n "Укажите пароль пользователя: "
		read -s user_pass
		echo
	done
	echo "$user_name:$user_pass" >> $tmp_passfile
	ldapmodify -D "cn=Directory Manager" -h $KDC -Y GSSAPI <<- EOF
	dn: uid=$user_name,cn=users,cn=accounts,$SUFFIX
	changetype: modify
	replace: userPassword
	userPassword: $user_pass

	dn: uid=$user_name,cn=users,cn=accounts,$SUFFIX
	changetype: modify
	replace: krbPasswordExpiration
	krbPasswordExpiration: $(date -u -d "@$(($(date +'%s')+(90*24*3600)))" +'%Y%m%d%H%M%S'Z)
	EOF
}
function del_user(){
	check_user_define $1
	if [ "0x$?" != "0x0" ]; then
		echo "Пользователь не найден!"
		exit 1
	fi
	
	user_name=$1
#	ipa user-del $user_name
        ipa group-remove-member brestusers --users $user_name || :
        ipa group-remove-member brestadmins --users $user_name || :
	oneuser delete $user_name
	rm -f $oneuser_home/$user_name/one_auth
	rmdir $oneuser_home/$user_name
}

function list_user(){
	echo "${BOLD}Список зарегистрированных пользователей: ${NORMAL}"
	oneuser list | awk NR\>1 | awk {'print $2'}
}

function sync_user_host(){
	for user_n in $(get_list_user)
	do
		is_admin="Нет"
		check_admin=$(id $user_n | grep libvirt-admin)
		if [ "$check_admin" != "" ]; then
			is_admin="Да"
		fi
		add_user_host "$user_n" "$FQDN" "$is_admin"
		for host in `onehost list -l NAME --csv | awk NR\>1 | grep -v $FQDN`; do
			add_user_host "$user_n" "$host" "$is_admin"
		done
	done
}

function get_list_user(){
	user_list=$(ipa user-find --login $1 --pkey-only | awk -F": " '/:/ {print $2}')
	oned_user_list=$(oneuser list | awk NR\>1 | awk {'print $2'})
	res=""
	for user_check in $oned_user_list
	do
		user_n=$(echo "$user_list" | grep "$user_check")
		if [ "$user_n" != "" ]; then
			res="$res $user_n"
		fi
	done
	echo $res
}

if [ -z "$1" ] && [ -z "$2" ]; then
	title
	help
	exit 0
fi

if [ ! -d "$tmp_folder" ]; then
	mkdir $tmp_folder
fi

PASS="0"
ADMIN_NAME="0"
ADMIN_PASS="0"
IS_ADMIN="0"

case $1 in
	create)
		if [ -z $2 ]; then
			echo "${BOLD}Неполный набор параметров${NORMAL}"
			help
			exit 1
		fi
		USER_NAME="$2"
		shift
		shift
		while [[ $# -gt 0 ]]; do
			case "$1" in
				-pass)
					shift
					PASS="$1"
					shift
					;;
				-admin_name)
					shift
					ADMIN_NAME="$1"
					shift
					;;
				-admin_pass)
					shift
					ADMIN_PASS="$1"
					shift
					;;
				-is_admin)
					shift
					IS_ADMIN="$1"
					if [ "$IS_ADMIN" != "Да" ] && [ "$IS_ADMIN" != "Нет" ]; then
						echo "Неправильный параметр для is_admin, это опция принимает только \"Да\" или \"Нет\""
						exit 1
					fi
					shift
					;;
				*)
					echo "Неизвестная опция: $1"
					exit 1
					;;
			esac
		done
		admin_auth
		create_user $USER_NAME
		;;
	token)
		if [ -z $2 ]; then
			echo "${BOLD}Неполный набор параметров${NORMAL}"
			help
			exit 1
		fi
		token_create $2
		;;
	passwd)
		if [ -z $2 ]; then
			echo "${BOLD}Неполный набор параметров${NORMAL}"
			help
			exit 1
		fi
		admin_auth
		passwd_user $2
		;;
	del)
		if [ -z $2 ]; then
			echo "${BOLD}Неполный набор параметров${NORMAL}"
			help
			exit 1
		fi
		admin_auth
		del_user $2
		;;
	list)
		#admin_auth
		list_user
		;;
	sync)
		admin_auth
		sync_user_host
		;;
	help)
		help
		;;
	*) echo "${BOLD}Неправильный параметр${NORMAL}";
			help
			exit 1
		;;
esac

clean_tmp
