#!/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_AD="di-a47cb22952d1.dreal-99.di.cete-mediterranee.i2"
SMB_ADM="admin.${DOMAIN_SAMBA}"
SMB_PASS="eole"
SMB_TYP="amd"


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

CC="c"


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

if [ -r  /usr/share/eole/ad2003.output ] ; then
   source /usr/share/eole/ad2003.output
   nouv=0
else
   nouv=1
fi
FIN=0
while [ "$FIN" = "0" ] ; do
#ad ou nt
X="";
echo "Retour chariot pour accepter la valeur entre crochet"
read -p "Le domaine a joindre est de type (ad) (nt) (amd) pour amédée) ? [$SMB_TYP]" X
if ! [ "$X" = "" ] ; then
	 SMB_TYP="`echo -n $X | tr [:upper:] [:lower:]`"
fi
#----------------------spécifique AD
if [ "$SMB_TYP" = "ad" ] ; then
    if [ "$smb_active_directory" == 'non' ]; then

        echo 'Utiliser gen_config pour déclarer que le serveur est intégré dans un domaine Active directory'
        exit 0

    fi
   ## default un peu different pour ad
   if ! [ -r  /usr/share/eole/ad2003.output ] ; then
       #
       SMB_ADM="administrateur"
       SMB_PASS="hello"
   fi
   #nom du PDC active directory. Cela determine le reste.

X="`echo -n $smb_ad_server | tr [:upper:] [:lower:]`"

  if ! [ "$X" = "" ] ; then
    SMB_AD="`echo -n $X | tr [:upper:] [:lower:]`"
  fi
  #echo " PDC=$SMB_AD"
  #Calcul du domaine abrege
  if [ "$SMB_AD_WORKGROUP" = "" ] ; then
    #La fin du nom sans le i2 ?
    SMB_AD_WORKGROUP="`echo $SMB_AD | cut -f 2 -d '.'`"
  fi
  #echo "SMB_AD_WORKGROUP=$SMB_AD_WORKGROUP"

#  read -p "Quel est le nom (abrégé) de votre domaine de compte. ? [$SMB_AD_WORKGROUP]" X
X="`echo -n $smb_workgroup | tr [:upper:] [:lower:]`"

 if ! [ "$X" = "" ] ; then
    SMB_AD_WORKGROUP="`echo -n $X | tr [:upper:] [:lower:]`"
  fi
  #Calcul du domaine long
  if [ "$SMB_AD_DOM" = "" ] ; then
    #La fin du nom sans le nom du serveur ?
    SMB_AD_DOM="`echo $SMB_AD | cut -f "2-" -d '.'`"
  fi

#  read -p "Quel est le nom (long) de votre domaine de compte. ? [$SMB_AD_DOM]" X
X="`echo -n $smb_realm | tr [:lower:] [:upper:]`"
  if ! [ "$X" = "" ] ; then
   SMB_AD_DOM="`echo -n $X | tr [:upper:] [:lower:]`"
  fi
  REALM_SRV="`echo -n $SMB_AD | tr [:lower:] [:upper:]`"
  REALM="`echo $REALM_SRV | cut -f "2-" -d '.'`"
fi
#----- fin ad
if [ "$SMB_TYP" = "nt" ] ; then
   if [ "$nouv" = "1" ] ; then
      SMB_ADM="administrateur"
   fi
fi
###
#Compte admin
read -p "Donner le nom d'un compte autorisé à ajouter des stations au domaine ? [$SMB_ADM]" X
if ! [ "$X" = "" ] ; then
   SMB_ADM="`echo -n $X | tr [:upper:] [:lower:]`"
fi
#read -p "Donner son mot de passe ? [$SMB_PASS]" X
stty -echo
read -p "Donner son mot de passe ? [*****]" X
stty echo
if ! [ "$X" = "" ] ; then
   SMB_PASS="$X"
fi
### 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ége =$SMB_AD_WORKGROUP"
   echo "    Domaine AD =$SMB_AD_DOM"
   echo "    REALM krb  = $REALM"
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"
#Sauvegarde des choix
echo "SMB_AD=\"$SMB_AD\"" >  /usr/share/eole/ad2003.output
echo "SMB_TYP=\"$SMB_TYP\"" >>  /usr/share/eole/ad2003.output
echo "SMB_AD_WORKGROUP=\"$SMB_AD_WORKGROUP\"" >>  /usr/share/eole/ad2003.output
echo "SMB_AD_DOM=\"$SMB_AD_DOM\"" >>  /usr/share/eole/ad2003.output
echo "SMB_ADM=\"$SMB_ADM\"" >>  /usr/share/eole/ad2003.output
echo "SMB_PASS=\"$SMB_PASS\"" >>  /usr/share/eole/ad2003.output
chmod 600 /usr/share/eole/ad2003.output


#####
### spécifique ad
if [ "$SMB_TYP" = "ad" ] ; then
 echo -n "Test installation kerberos"
 if ! [ -x /usr/bin/kinit ] ; then
   ## Il faut peut etre un apt-get update
   echo " Kerberos n'est pas installé"
   echo "Il faut peut être actualiser la liste des paquets (si le serveur a moins d'un jour) "
   echo "Actualiser la liste des paquets  (o)ui ou (n)on "
   CC="n"
   X=""
   read -p "Choix [$CC]:" X
   if [ "$X" = "" ] ; then
     X=$CC
   fi
   if [ "$X" = "o" ] ; then
      echo "Actualisation des listes"
      apt-get update
   fi
   echo -n " patientez, tentative d'installation du paquet "
   ### Pour un ${MODELE}
   apt-get -y install krb5-user
  fi
  if ! [ -x /usr/bin/kinit ] ; then
    echo "Abandon du traitement"
    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

#je stop group_win s'il est en cours
killall -q group_win.sh

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

## Peut être nettoyer le cache (nscd)  et ou le winbind cache (tdb)
## Peut être pas
# mise à niveau avec la commande 'net cache' rm -f /var/run/samba/gencache.tdb
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..."
# /usr/sbin/service winbind stop > /dev/null

#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

