#!/bin/bash
MYVER="2.4"
p_date="23/04/2014"
p_nom=${0##*/}
if [ "$1" = "-v"  ] ; then
   echo $MYVER
   exit 0
fi
#####
## version 1.0.4  grep -P n'est pas toujour compilé, remplacement par perl
## Version 1.0.5 du "23/10/2009" : le fichier param peut dépendre de .site
## Version 1.0.6 du "19/02/2010" : validation des tdb, supression de /var/run/samba/gencache.tdb
## Version 1.0.7 du 07/07/2010 : on n'affiche plus les mdp
##         1.0.8 du 08/07/2010 : on propose un apt-get update
##         1.0.9 du 03/08/2010 : Rajout de net rpc rights grant du droit SePrintyOperatorPrivilege
##         1.0.9 du 03/08/2010 : rajout -I $eq_serv_ip à la fin de rcp grant
##         1.1.0 du 01/10/2010 : le rpc grant n'est fait que pour les domaines amédee,
#                                on purge le cache de  nscd,
#                                les démons sont stoppés pendant le nettoyage des caches et relancé ensuite (avant cette version on effacait et on faisait un restart, c'était pas trés correct)
#         1.1.1 du 2011 04 12 /usr/share/${eq_modele}/bin/exxl_service au lieu de service pour samba
#         1.1.1.a du 2011 04 12 /usr/share/eole/bin/exxl_service avec chemine en dur
#         1.2 du 2011 09 13 Modif de krb5.conf selon la version de krb5-user (1.6 ou 1.8.1) Pbas
#         1.3 du 2011 09 16 Si krb5.conf présent: demande de remplacement avec validation auto Pbas
# correction        1.3.a test version samba 3.5.6 pour executer group_win.sh
# correction        1.3.b on supprime les tdb avant la mise dans le domaine + arrêt de group_win -Pbas
######

##cgu init variables V1

eq_modele="esbl"
eq_ver="-v2"
DATECD=30/01/2012
eq_serv_domsamba=$(CreoleGet smb_workgroup)


SMB_AD="di-a47cb22952d1.dreal-99.di.cete-mediterranee.i2"
SMB_ADM="admin.${eq_serv_domsamba}"
SMB_PASS="eole"
SMB_TYP="amd"
EQUI_VER="$VER"

echo "$p_nom version $MYVER du $p_date"

# Historique
# 09/04/2009 V 0.9.2 version initiale avec mise en place des permissions
# 16/04/2009 V 0.9.5 test sur un equilinux b2.0.1 :
# les noms des groupes nt ne sont pas en minuscules !
# La mise dans le domaine se fait en mode RPC et                 pas ADS

SMB_VER="`smbd -V | cut -f 2 -d ' '`"
echo " Version de samba : $SMB_VER"
echo " Version          : ${eq_modele}${eq_ver}"
echo " CD du (MM/JJ/AA) : $DATECD"
TESTE=0
if [ "$EQUI_VER" = "1.0.0" ] ; then
     TESTE=1
fi
if [ "$EQUI_VER" = "1.0.0.d" ] ; then
     TESTE=1
fi
if [ "$EQUI_VER" = "1.0.0.e" ] ; then
	     TESTE=1
fi
if [ "$EQUI_VER" = "2.0.1" ] ; then
     TESTE=1
fi
#on force à 1
TESTE=1
if  [ "$TESTE" = "1" ] ; then
    CC="c"
else
    echo "ATTENTION programme non testé dans cette configuration Linux"
    CC="q"
fi
echo ""
echo "Ce module configure un serveur ${eq_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.
## modif V2
#   X="";
#   echo "Retour chariot pour accepter la valeur entre crochet"
#   read -p "Quel est le nom (complet) de votre contr▒leur Active Dir. ? [$SMB_AD]" X
X="`echo -n $smb_ad_nom_long_controleur | tr [:upper:] [:lower:]`"
## fin modif V2
  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"
## modif V2
#  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:]`"
## fin modif V2
 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
## modif V2
#  read -p "Quel est le nom (long) de votre domaine de compte. ? [$SMB_AD_DOM]" X
X="`echo -n $smb_ad_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 ${eq_modele}
   apt-get -y install krb5-user
 # a faire !!
   ### Pour un equilinux
 # cd /tmp;wget --no-proxy -q "http://pneinfra.appli.i2/pub/rpm/krb5                -workstation-1.4.3-5.5.20060mlcs4.i586.rpm" -O krb5-workstation-1.4.3-5.5.2                0060mlcs4.i586.rpm;rpm -i krb5-workstation-1.4.3-5.5.20060mlcs4.i586.rpm
  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
rm -f /var/run/samba/gencache.tdb
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 -n "Relance samba"
/usr/sbin/service smbd start > /dev/null
/usr/sbin/service nmbd start > /dev/null
echo ". OK"
#echo "Il reste à joindre le domaine par net join -U"
echo "On joint le domaine (on essaye un net rpc join -U ${SMB_ADM}%*****)"
echo "Patience..."
/usr/sbin/service winbind stop > /dev/null
RES=`net rpc 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"

###
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 $eq_serv_domsamba+${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/
#rm -rf /var/log/samba/*
if [ "$SMB_TYP" = "amd" ] ; then
  echo "Rajout du droit d'admin des imprimantes pour le compte Admin du domaine: (3 s d'attente)"
  echo -n "net rpc rights grant ${SMB_ADM} SePrintOperatorPrivilege -U ${SMB_ADM}%****** : "
  #rajout du droit admin des imprimantes pour le compte Admin du domaine (bug Samba 3.4.5)
  #http://ti2appli.appli.i2/mantis/view.php?id=1352
  net sam createbuiltingroup administrators -U  ${SMB_ADM}%${SMB_PASS}
  net sam createbuiltingroup users  -U  ${SMB_ADM}%${SMB_PASS}
  net rpc group addmem administrators administrateurs -U  ${SMB_ADM}%${SMB_PASS}
  net rpc group members administrators -U  ${SMB_ADM}%${SMB_PASS}
  sleep 3
  net rpc rights grant ${SMB_ADM} SePrintOperatorPrivilege -U ${SMB_ADM}%${SMB_PASS}  -I $(CreoleGet adresse_ip_eth0)
fi

V=`net -V|cut -d " " -f 2`

#
if [[ ("$V" = "3.5.6") || ("$V" = "3.5.8") || ("$V" = "3.6.3") ]] ; then
/usr/share/eole/sbin/group_win.sh&
      sleep 5
      echo
      echo
      echo ok
fi
