#!/bin/sh


if [ "$EUID" -ne 0 ]
  then echo "Запускать с учетной записью root!"
  exit 255
fi


. /etc/sudo-samba-schema/setup-vars

# var
show=""
schema=/usr/share/doc/sudo-samba-schema/schema.ActiveDirectory


function showerror {
msg=$1
echo "${msg}"
exit 255
}

function getKrbTicket {
login=$(echo "$1" | sed 's@\\@@g;s/[\]//g;s/\s//g' );
password=$2
echo "$password" | sed 's@\\@@g;s/[\]//g;s/\s//g' | kinit "$login"
if [ $? -ne 0 ]; then 
        showerror 'Ошибка получения билета Kerberos'
fi
}


function getDomainInfo {
	readarray -t DC 2>/dev/null  <<< "$(net ads info | grep -P '^(Realm|Bind Path)' | awk -F ': ' '{print $2}')" 
#DC=("TEST.ALT" "dc=TEST,dc=ALT")
}

function keyPress {
result=""
retval=$1
case ${retval:-0} in
  $DIALOG_OK)
    result=$show 
    ;;
    #echo "YES";;
  $DIALOG_CANCEL)
    		"$DIALOG" \
		--clear \
		--backtitle "Завершение работы" \
		--yesno "Действительно хотите завершить?" 10 30
		case $? in
		$DIALOG_OK)
			break
			;;
		$DIALOG_CANCEL)
			rc=99
			;;
		esac
    exit 255
    ;;
  $DIALOG_ESC)
    echo "ESC pressed."
    exit 255
    ;;
esac
}

function msgbox {
textmsg="$1"
$DIALOG --cr-wrap --title "Сообщение" --clear  --msgbox "${textmsg}" 0 0
test $? = "$DIALOG_ESC" && exit
}


# ---- step 1
function step1 {
$DIALOG --title "SUDO Samba schema extension" "$@" \
        --yesno "Расширение LDAP схемы для хранения правил SUDO.\n 
\nЭто потенциально опасная процедура! Убедитесь, что у вас есть 
резервная копия и права для осуществления этого действия. \n
\n
Продолжая, вы подтверждаете, что \n
- запустили это приложение на контролере домена\n
- у вас есть привилегии (будут запрошены позже)\n
- домен ${DC[0]}\n
- корень домена ${DC[1]}\n
" 18 65
}

function step2 {
# ------------------------------------ step 2
rc=0
backtitle="Запрос привилегий на расширение схемы LDAP"
while test $rc != 1 && test $rc != 250
do
rc=$?
exec 3>&1
value=$($DIALOG  --title "Введите учетные даннные" --ok-label "Отправить" \
           --backtitle "$backtitle" \
	  --insecure "$@" \
	  --mixedform "Данные администратора домена либо иной учетной записи с правами для изменения схемы." \
20 50 0 \
	"Логин          :"      1 1	"Administrator" 1 20 16 0 0 \
	"Пароль         :"      2 1	""  2 20  16 0 1 \
	"Пароль повторно:"      3 1	""  3 20  16 0 1 \
	2>&1 1>&3)
rc=$?
exec 3>&-
show=$(echo "$value" |sed -e 's/^/	/')

	case $rc in
	$DIALOG_CANCEL)
		"$DIALOG" \
		--clear \
		--backtitle "$backtitle" \
		--yesno "Действительно хотите завершить?" 10 30
		case $? in
		$DIALOG_OK)
			break
			;;
		$DIALOG_CANCEL)
			rc=99
			;;
		esac
		;;
	$DIALOG_OK)
		readarray -t CRED 2>/dev/null  <<< $show
		break
		;;
	esac

done


}

# -----------------------------------
getDomainInfo
step1
keyPress "$?"
step2

# ---- step 3
if [[ "${CRED[1]}" != "${CRED[2]}" ]]; then
$DIALOG --cr-wrap --title "Ошибка" --trim "$@"  \
        --msgbox "Пароли администратора не совпадают.
Аварийный выход." 8 40
test $? = "$DIALOG_ESC" && exit
fi

#head -$(grep -B1 -n '^dn:$' ${schema} | head -1 | grep -oP '\d+') ${schema} > /tmp/add-schema.ldif
#test $? = 0 || exit
#tail +$(grep -B1 -n '^dn:$' ${schema} | head -1 | grep -oP '\d+') ${schema} | sed '/^-/d' > /tmp/modify-schema.ldif
#test $? = 0 || exit

for i in "modify-schema.ldif" "add-schema.ldif" ; do
sed "s!DC=X!${DC[1]}!g" $(dirname ${schema})/${i} > /tmp/${i}
if [[ ! -s /tmp/${i} ]]; then
	showerror 'Что-то пошло не так :('
fi
done

/usr/bin/reset
/usr/bin/clear

# всем зажмуриться. начинаем.
getKrbTicket "${CRED[0]}" "${CRED[1]}"

/usr/bin/ldbadd -H /var/lib/samba/private/sam.ldb /tmp/add-schema.ldif --option="dsdb:schema update allowed"=true
if [ $? -ne 0 ]; then 
	showerror 'Ошибка изменения схемы (add)'
fi

/usr/bin/ldbmodify -v -H /var/lib/samba/private/sam.ldb /tmp/modify-schema.ldif --option="dsdb:schema update allowed"=true
if [ $? -ne 0 ]; then 
	showerror 'Ошибка изменения схемы (modify)'
fi

test $? = 0 && echo 'Операция расширения схемы прошла успешно'

echo 'Создаем подразделение (OU=sudoers) для хранения правил'
ou=$(samba-tool ou list | grep -io '^ou=Sudoers$')
if [ $? -eq 0 ]; then
	echo "OU=sudoers,${DC[1]} уже существует"
else
	/usr/bin/samba-tool ou add 'ou=sudoers'
fi

msgbox "Для создания правил можно использовать:\n
Linux: Команду create-sudo-rule \n
Windows: Редактирование ADSI (создать объект sudoRole)\n\n
Для редактирования правил:\n
Linux: ADMC\n
Windows: ADSI или ADUC"

/usr/bin/reset
/usr/bin/clear

