[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #!/bin/bash 2 3 # 4 ## $Id: correctSID.sh 7061 2012-04-02 09:22:45Z dbo $ ## 5 # 6 ##### Change dans l'annuaire LDAP le SID en fonction du SID existant dans la base MySQL ##### 7 # 8 9 REPSAVE=/var/se3/save/ldap 10 11 function usage { 12 echo "Synchronise le SID samba stocke dans l'annuaire LDAP, mysql (se3db) et dans le secrets.tdb." 13 echo "Attention: avant de lancer ce script, verifier la coherence du SID avec testSID.sh" 14 echo 15 echo "Usage : Aucune option pour un script interactif" 16 echo " -t teste les sid UNIQUEMENT : renvoie 0 si tout va bien, 1 en cas d'erreur (le script ne proposera pas de corriger)" 17 echo " -s importe le sid du secrets.tdb de samba" 18 echo " -m importe le sid de mysql (table params de se3db) (option par defaut)" 19 echo " -l si l'annuaire ne comporte qu'un seul SID, corrige par rapport l'annuaire" 20 echo " -q mode silencieux (corrige les erreurs)" 21 echo " --noldapsave ne sauvegarde pas l'annuaire LDAP avant de le corriger (DANGEREUX)" 22 echo " -c corrige le mot de passe AdminPw LDAP dans le secrets.tdb (cas de probleme de connexion generalise des clients)" 23 echo " --videcache vide les fichiers cache tdb de samba : permet de resoudre des problemes generalises d'impression, d'integration..." 24 echo " --simulation genere le fichier de correction LDAP mais ne corrige pas" 25 echo "" 26 echo "Remarques: -t l'emporte sur tout le reste : seul le testSID est effectue." 27 echo " -s , -l et -m sont incompatibles. -m l'emporte !" 28 exit $1; 29 } 30 31 while getopts "cqmshtl-:" cmd 32 do 33 if [ "$cmd" == "-" ] ; then 34 case $OPTARG in 35 noldapsave ) NOLDAPSAVE=1 ;; 36 videcache ) VIDECACHE=1;; 37 simulation ) SIMUL=1 ;; 38 * ) echo "option longue inconnue..." 39 usage 1 ;; 40 esac 41 else 42 case $cmd in 43 q) QUIET=1 ;; 44 s) if [ "$MYSQLSID" == "" ]; then 45 MYSQLSID=0 46 fi ;; 47 m) MYSQLSID=1 ;; 48 c) CORRECTADMINPWSAMBA=1 ;; 49 t) TESTSIDOPT=1 ;; 50 # ajout de la possibilite de restaurer par rapport a l'annuaire LDAP pour permettre une restauration automatique depuis backuppc 51 l) MYSQLSID=2 ;; 52 h) usage 0 ;; 53 ?) echo "BAD OPTION" 54 usage 1 ;; 55 esac 56 fi 57 done 58 59 ERREUR() 60 { 61 echo "ERREUR!" 62 echo -e "$1" 63 exit 1 64 } 65 66 POURSUIVRE() 67 { 68 REPONSE="" 69 while [ "$REPONSE" != "o" -a "$REPONSE" != "O" -a "$REPONSE" != "n" ] 70 do 71 echo -n "Doit-on poursuivre? (o/N)" 72 read REPONSE 73 if [ -z "$REPONSE" ]; then 74 REPONSE="n" 75 fi 76 done 77 78 if [ "$REPONSE" != "o" -a "$REPONSE" != "O" ]; then 79 ERREUR "Abandon!" 80 fi 81 } 82 83 ################### initialisation des variables ################################### 84 # Recuperation des parametres mysql 85 if [ -e /var/www/se3/includes/config.inc.php ]; then 86 dbhost=`cat /var/www/se3/includes/config.inc.php | grep "dbhost=" | cut -d = -f 2 |cut -d \" -f 2` 87 dbname=`cat /var/www/se3/includes/config.inc.php | grep "dbname=" | cut -d = -f 2 |cut -d \" -f 2` 88 dbuser=`cat /var/www/se3/includes/config.inc.php | grep "dbuser=" | cut -d = -f 2 |cut -d \" -f 2` 89 dbpass=`cat /var/www/se3/includes/config.inc.php | grep "dbpass=" | cut -d = -f 2 |cut -d \" -f 2` 90 else 91 echo "Fichier de conf inaccessible" >> $SE3LOG 92 echo "sauve.sh: Status FAILED" >> $SE3LOG 93 exit 1 94 fi 95 96 # Recuperation des params LDAP 97 BASEDN=`echo "SELECT value FROM params WHERE name='ldap_base_dn'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 98 if [ -z "$BASEDN" ]; then 99 echo "Impossible d'acceder au parametre BASEDN" 100 exit 1 101 fi 102 ADMINRDN=`echo "SELECT value FROM params WHERE name='adminRdn'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 103 if [ -z "$ADMINRDN" ]; then 104 echo "Impossible d'acceder au parametre ADMINRDN" 105 exit 1 106 fi 107 ADMINPW=`echo "SELECT value FROM params WHERE name='adminPw'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 108 if [ -z "$ADMINPW" ]; then 109 echo "Impossible d'acceder au parametre ADMINPW" 110 exit 1 111 fi 112 COMPUTERDN=`echo "SELECT value FROM params WHERE name='computersRdn'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 113 if [ -z "$COMPUTERDN" ]; then 114 echo "Impossible d'acceder au parametre COMPUTERDN" 115 exit 1 116 fi 117 SMBVERSION=`echo "SELECT value FROM params WHERE name='smbversion'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 118 if [ -z "$SMBVERSION" ]; then 119 echo "Impossible d'acceder au parametre smbversion" 120 exit 1 121 fi 122 if [ ! "$SMBVERSION" = "samba3" ]; then 123 echo "Version de samba incorrecte." 124 exit 1 125 fi 126 127 # slapd doit etre demarre pour les ldapmodify et ldapdelete 128 /etc/init.d/slapd start > /dev/null 129 130 MYSQLDOMAINSID=`echo "SELECT value FROM params WHERE name='domainsid'" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N` 131 OLDDOMAINSID=`net getlocalsid |cut -d : -f 2 |sed -e "s/ //g"` 132 dateheure=`date +%Y%m%d_%T` 133 134 mkdir -p $REPSAVE 135 FICHIER_CORRECTIONS_LDAP=$REPSAVE/correctSIDmod_$dateheure.ldif 136 137 LISTESID1=`ldapsearch -xLLL | grep "sambaSID" | grep -v "^sambaSID: S-1-5-32-546$" | cut -d"-" -f1-7 | sort | cut -d" " -f2 | uniq` 138 LISTESID2=`ldapsearch -xLLL | grep "sambaPrimaryGroupSID" | grep -v "^sambaPrimaryGroupSID: S-1-5-32-546$" | cut -d"-" -f1-7 | sort | cut -d" " -f2 | uniq` 139 LISTESID=`echo -e "$LISTESID1\n$LISTESID2" | sort | uniq` 140 141 ###################### partie correction des sid (affichee si besoin) ############################ 142 if [ "`echo "$LISTESID" | grep -v "$MYSQLDOMAINSID"`" != "" -o "`echo "$MYSQLDOMAINSID" | grep "$OLDDOMAINSID"`" == "" ]; then 143 if [ "$TESTSIDOPT" == "1" ]; then 144 # on remplace le script testsid.sh par correctSID.sh -t 145 ERREUR "SID incoherents entre ldap, mysql et samba (secrets.tdb)." 146 fi 147 148 ############# affichage des sid presents ############## 149 echo "Le SID actuellement dans la table params est :" 150 echo "$MYSQLDOMAINSID" 151 echo 152 echo "Le SID actuellement utilise par samba (secrets.tdb) est :" 153 echo "$OLDDOMAINSID" 154 echo 155 echo "Le(s) SID present(s) dans l'annuaire sont :" 156 echo "$LISTESID" 157 echo 158 159 ############## correction des sid ################## 160 if [ "$QUIET" != "1" -a "$MYSQLSID" == "" ]; then 161 if [ "$SIMUL" == "1" ]; then 162 echo "*************** SIMULATION DE CORRECTION DU SID ******************" 163 else 164 echo "*************** CORRECTION DU SID ******************" 165 fi 166 echo "1) en fonction de la table params de mysql" 167 echo "2) en fonction du sid SAMBA contenu dans le secrets.tdb" 168 [ "`echo "$LISTESID" | wc -l`" == "1" ] && echo "3) en fonction de l'unique sid present dans l'annuaire" 169 echo "Autre) Quitter" 170 echo "****************************************************" 171 if [ "$SIMUL" == "1" ]; then 172 echo "VOUS NE RISQUEZ RIEN : MODE SIMULATION." 173 fi 174 echo -n "Choix du mode de migration (quitter par defaut): " 175 read choix 176 case $choix in 177 1) MYSQLSID=1 ;; 178 2) MYSQLSID=0 ;; 179 3) [ "`echo "$LISTESID" | wc -l`" == "1" ] && MYSQLSID=2 ;; 180 *) exit ;; 181 esac 182 fi 183 184 # option par defaut : on regle par rapport au SID mysql 185 if [ "$MYSQLSID" == "" ]; then 186 MYSQLSID=1 187 fi 188 189 # le DOMAINSID qui sert a toutes les corrections ulterieures est rempli 190 if [ "$MYSQLSID" == "1" ]; then 191 echo "Correction en fonction de mysql..." 192 DOMAINSID="$MYSQLDOMAINSID" 193 else 194 if [ "$MYSQLSID" == "0" ]; then 195 echo "Correction en fonction du secrets.tdb..." 196 DOMAINSID=`net getlocalsid |cut -d : -f 2 |sed -e "s/ //g"` 197 else 198 # ajout de la possibilite de restaurer par rapport a l'annuaire LDAP pour restauration automatisee depuis backuppc 199 echo "Correction en fonction de l'annuaire LDAP..." 200 DOMAINSID="$LISTESID" 201 fi 202 fi 203 204 if [ "$NOLDAPSAVE" == "1" -o "$SIMUL" == "1" ]; then 205 # pour migration etch notamment et autres scripts sauvegardant l annuaire par ailleurs 206 echo "Pas de sauvegarde de l'annuaire a cause des options --noldapsave ou --simulation" 207 echo 208 else 209 echo "Sauvegarde de l'annuaire actuel dans $REPSAVE/export_$dateheure.ldif" 210 echo 211 slapcat > $REPSAVE/export_$dateheure.ldif 212 fi 213 214 if [ "$MYSQLSID" != "1" ]; then 215 if [ "$MYSQLDOMAINSID" != "$DOMAINSID" ]; then 216 echo "Les sid mysql et celui choisi $DOMAINSID ne correspondent pas !" 217 if [ "$SIMUL" == "1" ] ; then 218 echo "Le SID mysql pourrait etre corrige dans la table params en fonction du sid choisi : $DOMAINSID ." 219 else 220 echo "Le SID mysql va etre corrige dans la table params en fonction du sid choisi : $DOMAINSID ." 221 if [ "1" != "$QUIET" ]; then 222 POURSUIVRE 223 fi 224 mysql -D $dbname -e "UPDATE params SET value=\"$DOMAINSID\" WHERE name='domainsid'" 225 fi 226 fi 227 fi 228 229 if [ "$MYSQLSID" != "0" ]; then 230 if [ "`echo "$DOMAINSID" | grep -v "$OLDDOMAINSID"`" != "" ]; then 231 echo "Le sid du secrets.tdb et celui choisi $DOMAINSID ne correspondent pas !!" 232 echo "Correction du SID samba a effectuer par rapport au SID choisi : $DOMAINSID ." 233 if [ "$SIMUL" == "1" ]; then 234 echo "Aucune modification effectuee" 235 echo 236 else 237 if [ "1" != "$QUIET" ]; then 238 POURSUIVRE 239 fi 240 net setlocalsid $DOMAINSID 241 fi 242 fi 243 fi 244 245 if [ "`echo "$LISTESID" | grep -v "$DOMAINSID"`" != "" ]; then 246 echo "Certains sid de l'annuaire ldap ne correspondent pas au choix effectue : $DOMAINSID ." 247 echo "L'ensemble de l'annuaire doit etre corrige en fonction du SID choisi !!" 248 if [ "1" != "$QUIET" -a "$SIMUL" != "1" ]; then 249 POURSUIVRE 250 fi 251 echo "Patience..." 252 253 # On prepare les modifs 254 ########### correction du sambaDomain ###################### 255 ligne=`ldapsearch -xLLL objectClass=sambaDomain dn | grep dn |cut -d, -f -1 |cut -c 5-` 256 ERR=1 257 uid=`echo $ligne|cut -d, -f1` 258 ldapsearch -xLLL "$uid" sambaSID | egrep "$DOMAINSID|^sambaSID: S-1-5-32-546$" >/dev/null&& ERR=0 259 if [ $ERR = 1 ]; then 260 echo "dn: $ligne,$BASEDN">$FICHIER_CORRECTIONS_LDAP 261 echo "changetype: modify">>$FICHIER_CORRECTIONS_LDAP 262 echo "replace: sambaSID">>$FICHIER_CORRECTIONS_LDAP 263 echo "sambaSID: $DOMAINSID">>$FICHIER_CORRECTIONS_LDAP 264 echo "">>$FICHIER_CORRECTIONS_LDAP 265 fi 266 267 ########### correction du sambaSamAccount ###################### 268 ldapsearch -xLLL objectClass=sambaSamAccount dn | grep dn | cut -d, -f -2 | cut -c 5- | while true 269 do 270 read ligne 271 if [ -z "$ligne" ]; then 272 break; 273 fi 274 ERR=1 275 uid=`echo $ligne|cut -d, -f1` 276 ldapsearch -xLLL "$uid" sambaSID | egrep "$DOMAINSID|^sambaSID: S-1-5-32-546$" >/dev/null&& ERR=0 277 tst_root=`echo $ligne|grep cn=root` 278 [ ! -z $tst_root ] && ligne=$(echo $ligne | cut -d, -f1) 279 280 if [ $ERR = 1 ]; then 281 rid=`ldapsearch -xLLL "$uid" sambaSID |grep sambaSID |cut -d- -f8` 282 echo "dn: $ligne,$BASEDN">>$FICHIER_CORRECTIONS_LDAP 283 echo "changetype: modify">>$FICHIER_CORRECTIONS_LDAP 284 echo "replace: sambaSID">>$FICHIER_CORRECTIONS_LDAP 285 echo "sambaSID: $DOMAINSID-$rid">>$FICHIER_CORRECTIONS_LDAP 286 echo "">>$FICHIER_CORRECTIONS_LDAP 287 fi 288 289 ERR=1 290 ldapsearch -xLLL "$uid" sambaPrimaryGroupSID | egrep "$DOMAINSID|S-1-5-32-546$" >/dev/null&& ERR=0 291 292 293 if [ $ERR = 1 ]; then 294 pid=`ldapsearch -xLLL "$uid" sambaPrimaryGroupSID |grep sambaPrimaryGroupSID |cut -d- -f8` 295 echo "dn: $ligne,$BASEDN">>$FICHIER_CORRECTIONS_LDAP 296 echo "changetype: modify">>$FICHIER_CORRECTIONS_LDAP 297 echo "replace: sambaPrimaryGroupSID">>$FICHIER_CORRECTIONS_LDAP 298 echo "sambaPrimaryGroupSID: $DOMAINSID-$pid">>$FICHIER_CORRECTIONS_LDAP 299 echo "">>$FICHIER_CORRECTIONS_LDAP 300 fi 301 done 302 303 # correction des groupes mappes 304 ldapsearch -xLLL objectClass=sambaGroupMapping dn | grep dn | cut -d, -f -2 | cut -c 5- | while true 305 do 306 read ligne 307 if [ -z "$ligne" ]; then 308 break; 309 fi 310 ERR=1 311 uid=`echo $ligne|cut -d, -f1` 312 ldapsearch -xLLL "$uid" sambaSID | egrep "$DOMAINSID|^sambaSID: S-1-5-32-546$" >/dev/null&& ERR=0 313 [ "$uid" == "cn=nogroup" ] && ERR=0 314 if [ $ERR = 1 ]; then 315 tst_root=`echo $ligne|grep cn=root` 316 [ ! -z $tst_root ] && ligne=$(echo $ligne | cut -d, -f1) 317 rid=`ldapsearch -xLLL "$uid" sambaSID |grep sambaSID |cut -d- -f8` 318 echo "dn: $ligne,$BASEDN">>$FICHIER_CORRECTIONS_LDAP 319 echo "changetype: modify">>$FICHIER_CORRECTIONS_LDAP 320 echo "replace: sambaSID">>$FICHIER_CORRECTIONS_LDAP 321 echo "sambaSID: $DOMAINSID-$rid">>$FICHIER_CORRECTIONS_LDAP 322 echo "">>$FICHIER_CORRECTIONS_LDAP 323 fi 324 done 325 326 if [ "$SIMUL" == "1" ]; then 327 echo "La liste des modifications a effectuer a ete listee dans $FICHIER_CORRECTIONS_LDAP." 328 echo "Aucune modification effectuee" 329 echo 330 else 331 ldapmodify -x -D $ADMINRDN,$BASEDN -w $ADMINPW -f $FICHIER_CORRECTIONS_LDAP 332 #~ rm $FICHIER_CORRECTIONS_LDAP 333 echo "La liste des modifications effectuee a ete listee dans $FICHIER_CORRECTIONS_LDAP." 334 echo "Annuaire corrige." 335 echo 336 fi 337 fi 338 else 339 [ "$TESTSIDOPT" == "1" ] && exit 0 # TESTSID : pas d'erreur 340 fi 341 342 ############## Verification qu'il n'y a bien qu'un seul sambaDomainName ################## 343 test_ligne=`ldapsearch -xLLL objectClass=sambaDomain dn |grep dn |cut -d, -f -1 |cut -c 5- | wc -l` 344 if [ "$test_ligne" != "1" ]; then 345 echo "ERREUR! Vous avez plus d'un nom de domaine:" 346 LISTE=`ldapsearch -xLLL objectClass=sambaDomain dn |grep dn |cut -d, -f -1 |cut -c 5-` 347 echo "$LISTE" 348 DOMAINNAME=`cat /etc/samba/smb.conf | grep workgroup | sed -e "s/ //g" | cut -d"=" -f2` 349 if [ "$SIMUL" == "1" ]; then 350 echo "L'annuaire devrait etre corrige par rapport a votre smb.conf qui contient \"$DOMAINNAME\"." 351 echo "Aucune modification effectuee" 352 echo 353 else 354 echo "L'annuaire va etre corrige par rapport a votre smb.conf qui contient \"$DOMAINNAME\"." 355 echo 356 if [ "$QUIET" != "1" ]; then 357 POURSUIVRE 358 fi 359 echo "$LISTE" | grep -v "$DOMAINNAME" | while read A 360 do 361 echo $A,$BASEDN >> $REPSAVE/sambaDomainName_a_virer_$dateheure.ldif 362 done 363 ldapdelete -x -D $ADMINRDN,$BASEDN -w $ADMINPW -f $REPSAVE/sambaDomainName_a_virer_$dateheure.ldif 364 fi 365 fi 366 367 ####################### partie correction du mot de passe LDAP dans le secrets.tdb ############################## 368 if [ "$CORRECTADMINPWSAMBA" == "1" ]; then 369 echo "Correction du mot de passe LDAP (ldap.secret) dans le secrets.tdb (cas de probleme de connexion generalise des clients)." 370 echo "ATTENTION : Un redemarrage de samba est necessaire !!!" 371 echo 372 if [ "1" != "$QUIET" ]; then 373 POURSUIVRE 374 fi 375 smbpasswd -w $ADMINPW > /dev/null 376 /etc/init.d/samba restart 377 echo "Effectue." 378 fi 379 380 ################### partie vide les cache de samba en cas de problme d'impression gnralis ou autre ##################### 381 if [ "$VIDECACHE" == "1" ]; then 382 echo "On vide les fichier tdb cache de samba" 383 if [ "1" != "$QUIET" ]; then 384 echo "ATTENTION : Un redemarrage de samba est necessaire !!!" 385 echo 386 POURSUIVRE 387 fi 388 echo "Arret de samba" 389 /etc/init.d/samba stop > /dev/null 390 echo "On vide les tdb en cache." 391 rm -f /var/cache/samba/*.tdb 392 rm -f /var/cache/samba/printing/*.tdb 393 echo "Demarrage de samba" 394 /etc/init.d/samba start > /dev/null 395 echo "Effectue." 396 fi 397 # faut il lancer une correction de mdp root dans samba ? 398 #/usr/share/se3/scripts/change_root_smbpass.sh
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |