#!/bin/bash
MYVER=$(CreoleGet eole_version)
p_nom=${0##*/}
if [ "$1" = "-v"  ] ; then
   echo $MYVER
   exit 0
fi
#####

MODELE=$(CreoleGet eole_module)
DOMAIN_SAMBA=$(CreoleGet smb_workgroup)

SMB_VER="`smbd -V | cut -f 2 -d ' '`"
echo " Version de samba : $SMB_VER"

# Affichage
NORMAL="\\033[0;39m"
ROUGE="\\033[1;31m"
VERT="\\033[1;32m"

CC="c"

function ask_mandatory_value {
# Assigne la valeur entrée dans le terminal à la variable user_input
# La chaîne vide n'est pas acceptée
# Les chaînes différentes de la liste passée en paramètre ne sont pas acceptées
user_input=""
question="$1"
choices="$2"
secret="$3"
while true
do
if [[ "${secret}" = "secret" ]]
    then
            stty -echo
            read -p "$question" user_input
            stty echo
    else
	    read -p "$question" user_input
    fi
    echo
    if [[ -n "${user_input}" ]] && ( [[ -z "${choices}" ]] || [[ "${choices}" =~ (^|[[:space:]])"$user_input"($|[[:space:]]) ]] )
    then
            break
    elif [[ -n "${choices}" ]]
    then
            echo "Les valeurs acceptées sont : ${choices}"
	    echo
    else
            echo "Chaîne nulle non acceptée"
	    echo
    fi
done
}


echo ""
echo "Ce module configure un serveur ${MODELE} comme membre d'un domaine"
echo "cela modifie les fichiers :"
echo ""
echo "  - /etc/samba/smb.conf,"
echo "  - /etc/krb5.conf. (dans le cas d'un domaine Active Directory)"
echo ""
echo "Le serveur change de domaine et les permissions du dossier /data/bureautique sont modifiées"
echo "Pour réaliser l'opération, il vous faudra fournir : "
echo "  - un compte d'administration du domaine ainsi que son mot de passe."
echo "  - pour un Active Directory il faudra en plus fournir le nom du 'PDC'"
echo ""
echo ""
echo "Tapez (c) pour (c)ontinuer l'installation, (q)uitter ? "
echo ""
read -p "Choix [$CC]:" X
if [ "$X" = "" ] ; then
   X=$CC
fi
if ! [ "$X" = "c" ] ; then
   echo "Abandon du traitement"
   exit 0
fi

FIN=0
while [ "$FIN" = "0" ] ; do

#ad ou nt

echo "Entrer le type de domaine à joindre (ad, nt ou amd pour amédée)"
ask_mandatory_value "Type de domaine : " "ad nt amd"
SMB_TYP="`echo -n $user_input | tr [:upper:] [:lower:]`"

#----------------------spécifique AD
if [ "$SMB_TYP" = "ad" ] ; then
    if [ "$(CreoleGet smb_security)" != 'ads' ]; then
        echo 'Utiliser gen_config pour déclarer que le serveur est intégré dans un domaine Active directory (security = ads)'
        exit 0
    fi
  SMB_AD=$(CreoleGet smb_ad_server "controleur-ad")
  SMB_AD_WORKGROUP=$(CreoleGet smb_workgroup)
  REALM=$(CreoleGet ad_realm "domaine-ad.realm")
fi
#----------------------fin

###
#Compte admin
echo "Donner le nom d'un compte autorisé à ajouter des stations au domaine ${REALM}"
ask_mandatory_value "Compte : "
SMB_ADM="`echo -n $user_input | tr [:upper:] [:lower:]`"

echo "Mot de passe pour le compte $SMB_ADM"
ask_mandatory_value "Mot de passe : " "" "secret"
SMB_PASS="${user_input}"

### Fin de la saisie
echo " "
echo "La configuration va commencer avec les éléments suivants : "
echo " "
echo "    Type de domaine (ad, nt ou amd pour amédée) = $SMB_TYP"
### spécifique ad
if [ "$SMB_TYP" = "ad" ] ; then
   echo "    REALM krb  = $REALM"
   echo "    Contrôleur de domaine = $SMB_AD"
   echo "    Domaine de compte abrégé = $SMB_AD_WORKGROUP"
fi
echo " Compte d'administration du domaine = $SMB_ADM (*****)"
echo " "
echo "Tapez (q) pour (q)uitter, (c)ontinuer l'installation, (m)odifier les                 valeurs "
read -p "Choix [c]:" X
if [ "$X" = "q" ] ; then
  echo "Abandon du traitement"
  exit 0
fi
if [ "$X" = "" ] ; then
     X="c"
fi
if [ "$X" = "c" ] ; then
    FIN=1
fi
done
###


echo "Installation"

#####
### spécifique ad
if [ "$SMB_TYP" = "ad" ] ; then
 echo -n "Test installation kerberos"
 if ! [ -x /usr/bin/kinit ] ; then
    echo "Abandon du traitement - kerberos n'est pas installé"
    exit 0
 else
    echo " installation Kerberos OK"
 fi
  #
  # on continue l'install

echo -n "Test authentification kerberos (par kinit -V  ${SMB_ADM}) "
RES1=`echo "${SMB_PASS}" | kinit -V  ${SMB_ADM} 2>&1`
RESOK=`echo "${RES1}" | grep -e "Authenticated to Kerberos"`
if [ "$RESOK" = "" ] ; then
 echo -n "Résultat : $RES1"
 echo "Abandon du traitement"
 exit 0
else
 echo " Kerberos OK"
fi
### kerb est OK le compte et le mot de passe aussi on continue

fi
#### FIN du spécifique AD

echo -n "Nettoyage des caches samba, winbind et nscd"
echo -n " ."
/usr/sbin/service nscd stop  > /dev/null
echo -n "."
/usr/sbin/service smbd stop > /dev/null
/usr/sbin/service nmbd stop > /dev/null
echo -n "."
/usr/sbin/service winbind stop > /dev/null

net cache flush
echo -n "."
rm -f /var/cache/samba/netsamlogon_cache.tdb* /var/cache/samba/winbindd_cache.tdb /var/run/samba/idmap_cache.tdb
echo -n "."
rm -f /var/run/samba/winbindd_cache.tdb /var/run/samba/idmap_cache.tdb
echo -n "."
cp /var/lib/samba/winbindd_idmap.tdb.002 /var/lib/samba/winbindd_idmap.tdb.003  >/dev/null 2>&1
cp /var/lib/samba/winbindd_idmap.tdb.001 /var/lib/samba/winbindd_idmap.tdb.002 >/dev/null 2>&1
cp /var/lib/samba/winbindd_idmap.tdb /var/lib/samba/winbindd_idmap.tdb.001 >/dev/null 2>&1
###echo "$p_nom:ATTENTION : suppression de /var/lib/samba/winbindd_idmap.tdb"
###echo "$p_nom:Pour la version exploit ne plus supprimer idmap car il peut y avoir des relations d'appro et des fichiers en place"
###rm /var/lib/samba/winbindd_idmap.tdb

rm /var/cache/nscd/* > /dev/null 2>&1
echo -n "."

#####
#Mise dans le domaine
#echo "Il reste à joindre le domaine par net join -U"

if [ "$SMB_TYP" == "ad" ]; then
    SMB_JOIN="ads"
else
    SMB_JOIN="rpc"
fi

echo "On joint le domaine (on essaye un net $SMB_JOIN join -U ${SMB_ADM}%*****)"
echo "Patience..."

#suppression du cache group_mapping.tdb
rm -f /var/lib/samba/group_mapping.tdb

RES=`net $SMB_JOIN join -U ${SMB_ADM}%${SMB_PASS}`
RESOK=`echo "${RES}" | grep -e "^Joined "`
if [ "$RESOK" = "" ] ; then
   echo -n "Résultat : $RES"
   echo "Abandon du traitement"
   exit 0
else
   echo " entrée dans Domaine OK ($RES)"
fi
echo -n "Relance winbind et nscd"
echo -n " ."

/usr/sbin/service nscd start  > /dev/null
echo -n "."
/usr/sbin/service winbind start > /dev/null
echo -n "."
echo -n "."
sleep 1
echo ". OK"

echo -n "Relance samba"
/usr/sbin/service smbd start > /dev/null
/usr/sbin/service nmbd start > /dev/null
echo ". OK"

###
prob=0
probutil=1
prob513=1
prob512=1
for (( i=1; i <= 3 ; i++ ));do

	if [ $probutil != 0 ];then
		echo -n "Essai $i: test getent passwd ..."
                sleep 1
      RES=`getent passwd $DOMAIN_SAMBA+${SMB_ADM}`
		if [ "$RES" = "" ] ; then
			echo " Problème avec getent passwd, ne trouve pas le compte ${SMB_ADM}"
			echo "Relance samba....et nouvel essai"
			probutil=1
			if  [ $i = 1 ];then
                echo "Relance samba....et nouvel essai"
				## parfois winbind s'arrete pas
                /usr/sbin/service smbd stop
                /usr/sbin/service nmbd stop
                /usr/sbin/service winbind stop
                echo "Vérification des .tdb"
                /usr/bin/tdbbackup -v  /var/cache/samba/*.tdb /var/lib/samba/*.tdb
			    /usr/sbin/service smbd start
			    /usr/sbin/service nmbd start
				/usr/sbin/service winbind start
			else
				echo "Nouvel essai"

			fi

		else
			probutil=0
			echo " ok"
		fi
	fi

	if [ $prob513 != 0 ];then
		echo -n "Essai $i: test getent group ..."
		sleep 1
#		RES=`getent group | cut -d ':' -f 3 | grep  "1513"`
		RES=`wbinfo --gid-info=1513| cut -d ':' -f 3 | grep "1513"`
		if [ "$RES" = "" ] ; then
			echo " ne trouve pas le groupe 1513 'utilisa. du domaine'"
		      	prob513=1
		else
	      		prob513=0
			echo "utilisa. du domaine 1513: ok"
		fi
	fi
	if [ $prob512 != 0 ];then
		sleep 1
		RES=`wbinfo --gid-info=1512| cut -d ':' -f 3 | grep "1512"`
		if [ "$RES" = "" ] ; then
			echo " ne trouve pas le groupe 1512 'admins du domaine'"
			prob512=1
		else
		      	prob512=0
			echo " - admins du domaine 1512: ok"
		fi
	fi

	echo -n -e "\n"

	prob=$(($probutil+$prob513+$prob512))
	if [ $prob = 0 ];then
		i=3
	fi
done
#prob supérieur à 0
if [ "$prob" -gt "0" ] ; then
   echo " Problème"
   echo "Il est risqué de mettre en place les permissions"
   echo "Abandon du traitement"
   exit 1
else
 echo " Tests getent ...: ok"
fi
echo -n "Mise en place de permissions de base sur le système de fichier"
echo "."
#Droit de base
chmod -R o+rx /data/bureautique/diffusion/
#(ici le -R est utile)
chmod o+rx /data/bureautique/dossiers/
#(on ne touche pas aux sous répertoires de dossiers qui seront à ajuster à la main)
chmod -R o+rx /data/bureautique/imprimantes/
#Quelques acl posix
#droit de lecture pour tous, de modif pour les admin sur diffusion et imprimantes
setfacl -R -m g:1512:rwx,g:1513:rx,u::rwx,g::rx,o::rx /data/bureautique/diffusion/ /data/bureautique/imprimantes/
setfacl -R -d -m g:1512:rwx,g:1513:rx,u::rwx,g::rx,o::rx /data/bureautique/diffusion/ /data/bureautique/imprimantes/

if [ "$SMB_TYP" = "ad" ]; then
    group_admin_locaux=$(CreoleGet smb_admin_users| sed -e "s/@//g")
    if [ "$group_admin_locaux" == "" ]; then
        echo "Si vous souhaitez qu'un groupe d'administrateurs puisse gérer des imprimantes sur le serveur"
        echo "ou donner des droits d'administration sur les partages"
        echo "il est nécessaire de saisir un nom de groupe des administrateurs locaux dans la rubrique 'Samba' mode expert"
        echo "'Utilisateurs ayant des privilèges d'administration sur tous les partages' (variable 'smb_admin_users')"
        echo "syntaxe '@<domaineAD>+<groupe>'"
        echo "utiliser le caractère 'slash' '/' pour les noms de groupe avec un ou des espaces"
        echo "(ex '<domaine>+mon groupe avec espaces' doit être saisi '@<domaine>+mon/groupe/avec/espaces')"
        echo "Adapter la conf sur zephir et relancer 'esbl_samba_join'"
    else
        if [ "$(for i in $group_admin_locaux; do echo $i; done|wc -l)" != "$(expr $(echo -e "$(eval "getent group $(echo -e $group_admin_locaux|sed -e 's%/%\\ %g')") \n"|wc -l) - 1)" ]; then
            echo -e "\n'smb_admin_users' = \n$(CreoleGet smb_admin_users)"
            echo -e $ROUGE
            echo -e "Le(s) groupe(s) des administrateurs locaux défini(s) dans la rubrique samba 'smb_admin_users'"
            echo -e "n'est(ne sont) pas valide(s)"
            echo -e "vérifier dans la rubrique 'Samba' mode expert"
            echo -e "'Utilisateurs ayant des privilèges d'administration sur tous les partages'"
            echo -e "syntaxe '@<domaineAD>+<groupe>'"
            echo -e "utiliser le caractère 'slash' '/' pour les noms de groupe avec un ou des espaces"
            echo -e "(ex '<domaine>+mon groupe avec espaces' doit être saisi '@<domaine>+mon/groupe/avec/espaces')"
            echo -e "Corriger et relancer 'esbl_samba_join' $NORMAL"
            echo "Si le serveur est intégré dans un domaine MicroSoft AD saisir '@<domaine>+admins/du/domaine')"
        else
            net sam createbuiltingroup "Print Operators"  >/dev/null 2>&1
            for groupe_admin in $group_admin_locaux
            do
                prefixe=$(echo $groupe_admin | cut -d '+' -f 1)
                groupe=$(echo $groupe_admin | sed -e 's%/%\\ %g' | cut -d '+' -f 2)
                eval "setfacl -R -m g:$prefixe+$groupe:rwx /data/bureautique/diffusion/ /data/bureautique/imprimantes/"
                eval "setfacl -R -d -m g:$prefixe+$groupe:rwx /data/bureautique/diffusion/ /data/bureautique/imprimantes/"
                eval "net sam addmem print\ operators $prefixe\\\\$groupe -U '${SMB_ADM}'%'${SMB_PASS}'"  >/dev/null 2>&1
            done
            echo -e "\n"
            echo -n "Membre du groupe local Print Operators"
            echo -e "."
            net rpc group members "print operators" -U  ${SMB_ADM}%${SMB_PASS}
        fi
    fi
fi

if [ "$SMB_TYP" = "amd" ] ; then
    echo -n "Membre du groupe local Administrators"
    echo "."
    net rpc group members administrators -U  ${SMB_ADM}%${SMB_PASS}
fi

