#!/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"

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/imprimantes/

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

