[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3master/usr/share/se3/scripts/ -> correctSID.sh (source)

   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


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1