[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

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

   1  #!/bin/bash
   2  # version 1.1
   3  # Auteur : Olivier Lacroix
   4  
   5  ## $Id: quota_fixer_mysql.sh 7420 2012-09-24 22:12:04Z keyser $ ##
   6  
   7  
   8  
   9  ##### Met à jour, ajoute, supprime les références à un groupe (user) dans la table quotas de se3db puis recalcule le quota applicable à chacun #####
  10  ##### (le quota appliqué est le max des quotas applicables en fonction des groupes d'appartenance de user) #####
  11  
  12  
  13  # Si pas de répertoire home on quitte (cas des se3 utilisés que pour la sauvegarde)
  14  PASDEHOME=`cat /etc/fstab | grep /home`
  15  if [ -z "$PASDEHOME" ]; then
  16      echo "Pas de dossier /home sur ce serveur"
  17      exit
  18  fi
  19  
  20  
  21  #Couleurs
  22  COLTITRE="\033[1;35m"   # Rose
  23  COLPARTIE="\033[1;34m"  # Bleu
  24  COLTXT="\033[0;37m"     # Gris
  25  COLCHOIX="\033[1;33m"   # Jaune
  26  COLDEFAUT="\033[0;33m"  # Brun-jaune
  27  COLSAISIE="\033[1;32m"  # Vert
  28  COLCMD="\033[1;37m"     # Blanc
  29  COLERREUR="\033[1;31m"  # Rouge
  30  COLINFO="\033[0;36m"    # Cyan
  31  
  32  AIDE()
  33  {
  34  echo -e "$COLERREUR\c"
  35  echo -e "$0 a besoin d'arguments pour fonctionner"
  36  echo -e "$COLINFO\c"
  37  echo "UTILISATION 1: suppression de quota"
  38  echo -e "$COLTXT\c"
  39  echo "3 arguments: user_or_group , partition , suppr"
  40  echo ""
  41  echo -e "$COLSAISIE\c"
  42  echo "ex: ./quota_fixer_mysql.sh Profs /home suppr"
  43  echo "Supprime le quota fixé pour les Profs sur /home (le quota fixé dépendra alors des appartenances des users à d'autres groupes)"
  44  echo ""
  45  echo -e "$COLINFO\c"
  46  echo "UTILISATION 2: actualisation des quotas (utile lors de la modification des groupes d'appartenance d'un user)"
  47  echo -e "$COLTXT\c"
  48  echo "3 arguments: user_or_group , partition , actu"
  49  echo ""
  50  echo -e "$COLSAISIE\c"
  51  echo "ex: ./quota_fixer_mysql.sh hugov /var/se3 actu"
  52  echo "Recalcule le quota effectivement applicable pour Victor Hugo en fonction de ses groupes d'appartenance"
  53  echo ""
  54  echo -e "$COLSAISIE\c"
  55  echo "ex: ./quota_fixer_mysql.sh Toutlemonde Toutespartitions actu"
  56  echo "Recalcule le quota effectivement applicable pour tous les utilisateurs de l annuaire sur /home et /var/se3"
  57  echo ""
  58  echo -e "$COLINFO\c"
  59  echo "UTILISATION 3: ajout ou mise à jour de quotas"
  60  echo -e "$COLTXT\c"
  61  echo "Passer en arguments dans l'ordre :"
  62  echo "- le nom du groupe ou de l'utilisateur dont vous voulez fixer le quota"
  63  echo "- la partition sur laquelle on applique le quota"
  64  echo "- le quota soft à fixer en Mo (ou 0 pour quota illimité affecté à cet user ou groupe)"
  65  echo "- le quota hard à fixer en Mo."
  66  echo -e "$COLSAISIE\c"
  67  echo "ex1: ./quota_fixer_mysql.sh Profs /home 200 200"
  68  echo "reglera le quota par defaut des Profs à 200Mo soft et hard sur home"
  69  echo "ATTENTION: le quota effectivement attribué dépend aussi des autres appartenances à divers groupes."
  70  echo "Si un prof appartient à un groupe ayant le droit à 300Mo soft, il aura 300Mo d'autorisation. "
  71  echo ""
  72  echo "ex2: ./quota_fixer_mysql.sh hugov /home 10 10"
  73  echo "fixera un quota de 10Mo soft et hard sur home pour l'utilisateur hugov"
  74  echo "ATTENTION: tout quota fixé sur un utilisateur particulier est prépondérant par rapport à ceux appliqués en fonction de l'appartenance aux groupes."
  75  echo "Si hugov est un Prof et que le quota appliqué aux Profs est de 200Mo, hugov ne disposera que de 10Mo."
  76  echo -e "$COLTXT\c"
  77  exit 1
  78  }
  79  
  80  if [ "$1" = "--help" -o "$1" = "-h" ]
  81  then
  82  AIDE
  83  fi
  84  
  85  ERREUR()
  86  {
  87  echo -e "$COLERREUR"
  88  echo "ERREUR!"
  89  echo -e "$1"
  90  echo -e "$COLTXT"
  91  exit 1
  92  }
  93  
  94  #il faudrait tester plus finement les arguments passés :s
  95  if [ $# -ne 4 -a $# -ne 3 ]; then
  96  AIDE
  97  fi
  98  
  99  ## recuperation des variables necessaires pour interoger mysql ###
 100  WWWPATH="/var/www"
 101  if [ -e $WWWPATH/se3/includes/config.inc.php ]; then
 102  dbhost=`cat $WWWPATH/se3/includes/config.inc.php | grep "dbhost=" | cut -d = -f2 | cut -d \" -f2`
 103  dbname=`cat $WWWPATH/se3/includes/config.inc.php | grep "dbname=" | cut -d = -f 2 |cut -d \" -f 2`
 104  dbuser=`cat $WWWPATH/se3/includes/config.inc.php | grep "dbuser=" | cut -d = -f 2 | cut -d \" -f 2`
 105  dbpass=`cat $WWWPATH/se3/includes/config.inc.php | grep "dbpass=" | cut -d = -f 2 | cut -d \" -f 2`
 106  else
 107  ERREUR "Fichier de configuration inaccessible, le script ne peut se poursuivre."
 108  fi
 109  
 110  ### recuperation des parametres actuels de l'annuaire dans la base ####
 111  BASEDN=`echo "SELECT value FROM params WHERE name=\"ldap_base_dn\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 112  
 113  ############# debut des fonctions ###############
 114  FIXERQUOTA()
 115  {
 116  part=$1
 117  quotas=$2
 118  quotah=$3
 119  
 120  for user in $liste_users
 121  do
 122  
 123  #lance quota.sh pour fixer les quotas sur le système de fichiers pour chaque user de $liste_users après avoir calculé le quota applicable
 124  #initialise la variable $indicegrp pour chaque user
 125  indice_grp=0
 126  
 127  #si user existe dans base mysql appliquer le quota de la base (QUOTA USER PREPONDERANT SUR CELUI DE TOUT GROUPE)
 128  if [ -n "$(echo \"$test_exist_user\"|grep $user)" ]; then
 129    qsoft=`echo "SELECT quotasoft FROM quotas WHERE nom=\"$user\" AND type=\"u\" AND partition=\"$part\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 130    qhard=`echo "SELECT quotahard FROM quotas WHERE nom=\"$user\" AND type=\"u\" AND partition=\"$part\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 131  else
 132  #sinon, calcul du quota_max applicable à $user
 133  
 134  #filtre les groupes auxquels appartient $user
 135  #obtenir la liste $liste_quotas des quotas correspondants à la liste des groupes $liste_appartenance
 136  liste_appartenance=""
 137  liste_quotas=""
 138  for grp in $liste_groupes
 139  do
 140  # 3 lignes suivantes a virer : plus de groupes utilisateur groupOfNames :
 141  # test1=$(ldapsearch -x -LLL cn=$grp -b $BASEDN | grep uid | grep $user)
 142  # test2=$(ldapsearch -x -LLL "cn=$grp" | grep memberUid | cut -d" " -f2 | grep $user)
 143  # test_appartenance="$test1$test2"
 144  test_appartenance=$(ldapsearch -xLLL -b ou=Groups,$BASEDN cn=$grp memberUid | grep " $user$")
 145  
 146  if [ -n "$test_appartenance" ]; then
 147  liste_appartenance="$liste_appartenance $grp"
 148  quotasoft=`echo "SELECT quotasoft FROM quotas WHERE nom=\"$grp\" AND type=\"g\" AND partition=\"$part\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 149  liste_quotas="$liste_quotas $quotasoft"
 150  fi
 151  done
 152  
 153  
 154  #déterminer le quota max applicable sur $liste_quotas
 155  quota_max="1"
 156  i=1 # à la place de 0 pour corriger bug d'apparition d'un espace au debut de $liste_appartenance
 157  for quota in $liste_quotas
 158  do
 159      i=$[$i+1]
 160      if [ $quota -eq 0 ]; then
 161          quota_max=0
 162          indice_grp=$i
 163      else
 164          if [ "$quota_max" -lt "$quota" -a $quota_max -ne 0 ]; then
 165          quota_max="$quota"
 166          indice_grp=$i
 167          fi
 168      fi
 169  done
 170  
 171  
 172  if [ $indice_grp -eq 0 ]; then
 173      #user n'appartient à aucun groupe dans la base mysql
 174      qsoft=0
 175      qhard=0
 176  
 177  else #user appartient à un grp dans la base mysql
 178    #extraire les quotas soft et hard applicables
 179    groupe_preponderant=$(echo "$liste_appartenance" | cut -d " " -f$indice_grp)
 180    qsoft=`echo "SELECT quotasoft FROM quotas WHERE nom=\"$groupe_preponderant\" AND type=\"g\" AND partition=\"$part\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 181    qhard=`echo "SELECT quotahard FROM quotas WHERE nom=\"$groupe_preponderant\" AND type=\"g\" AND partition=\"$part\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 182  fi
 183  fi
 184  
 185  # securite et correctif pour eviter un quota sur les comptes importants :
 186  if [ "$user" = "admin" -o "$user" = "adminse3" -o "$user" = "root" -o "$user" = "www-se3" ]; then
 187      #user est un compte systeme : on imposte un quota 0. CORRECTIF du 26/09/10 pour effet retroactif sur le compte adminse3 qui n'etait pas protege.
 188      qsoft=0
 189      qhard=0
 190  fi
 191  
 192  echo "je fixe le quota pour $user sur la partition $part :"
 193  echo "quota soft : $qsoft"
 194  echo "quota hard : $qhard"
 195  echo
 196  # appliquer le quota à $user
 197  # /usr/share/se3/scripts/quota.sh $user $[$qsoft*1000] $[$qhard*1000] $part
 198  # GAIN DE PERF DE 1 A 4 EN COURCUITANT quota.sh
 199  CREER_FICHIER $user $part
 200  /usr/sbin/setquota -F xfs $user $[$qsoft*1000] $[$qhard*1000] 0 0 $part
 201  done
 202  }
 203  
 204  CREER_FICHIER()
 205  {
 206      if [ "$2" = "/home" ]; then
 207  ### protège les serveurs vmware (essentiellement) contre la création des homes de tous les users par création d'un fichier vide sur /home
 208        if [ ! -e /home/$1 ] ; then
 209          if [ ! -e /home/quotas_tmp ]; then
 210            mkdir /home/quotas_tmp
 211            chmod 700 /home/quotas_tmp
 212          fi
 213          
 214          if [ ! -e /home/quotas_tmp/$1 ]; then
 215            touch /home/quotas_tmp/$1
 216            chown $1 /home/quotas_tmp/$1
 217          fi
 218        fi
 219      else
 220        if [ ! -e /var/se3/quotas_tmp ]; then
 221          mkdir /var/se3/quotas_tmp
 222          chmod 700 /var/se3/quotas_tmp
 223        fi
 224        
 225        if [ ! -e /var/se3/quotas_tmp/$1 ]; then
 226          touch /var/se3/quotas_tmp/$1
 227          chown $1 /var/se3/quotas_tmp/$1
 228        fi
 229      fi
 230  }
 231  ################### fin des fonctions #####################
 232  
 233  ################### début du script proprement dit #####################
 234  user_grp=$1
 235  partition=$2
 236  quotas=$3
 237  quotah=$4
 238  
 239  [ "$partition" != "/home" -a "$partition" != "/var/se3" -a "$partition" != "Toutespartitions" ] && exit
 240  
 241  #creation de la liste des users pour lesquels il faut refixer les quotas: $liste_users
 242  if [ "$user_grp" = "Toutlemonde" ] ; then
 243    
 244    #~ liste_users=$(ldapsearch -x -b ou=People,$BASEDN uid | grep "^dn: " | cut -d, -f1 | cut -d= -f2)
 245    liste_users=$(ldapsearch -x -b ou=People,$BASEDN uid | grep "^uid: " | cut -d" " -f2 | grep -v "^admin$" | grep -v "^www-se3$" | grep -v "^root$" )
 246    #~ type="g"
 247    if [ "$2" = "Toutespartitions" ]; then
 248      partition=/home
 249      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 250      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 251      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 252      FIXERQUOTA /home $quotas $quotah
 253      partition=/var/se3
 254      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 255      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 256      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 257      FIXERQUOTA $partition $quotas $quotah
 258    else
 259      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 260      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 261      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 262      
 263      FIXERQUOTA $partition $quotas $quotah
 264    fi
 265  else
 266    TST_GRP=$(ldapsearch -xLLL "cn=$1" -b ou=Groups,$BASEDN)
 267    if [ -z "$TST_GRP" ]; then
 268            TST_UID=$(ldapsearch -xLLL uid="$1")
 269            if [ -z "$TST_UID" ]; then
 270              echo "Impossible de trouver le groupe ou l'utilisateur passé en paramètre dans l'annuaire Ldap"
 271          ERREURFLAG=1
 272            else
 273              #c'est un user
 274              liste_users=$1
 275              type="u"
 276            fi
 277    else
 278            #c'est un groupe: on liste les users du groupe
 279            type="g"
 280            TST_GRP_POSIX=$(ldapsearch -xLLL "cn=$1" -b ou=Groups,$BASEDN | grep memberUid)
 281            #echo "Liste groupe: $TST_GRP_POSIX"
 282            if [ -z "$TST_GRP_POSIX" ]; then
 283              liste_users=$(ldapsearch -x -LLL cn=$1 -b $BASEDN | grep uid | cut -d " " -f2 |  cut -d "=" -f2 | cut -d "," -f1)
 284            else
 285          TST_GRP_VIDE=$(ldapsearch -xLLL "cn=$1" -b ou=Groups,$BASEDN | grep member)
 286          if [ -z "$TST_GRP_VIDE" ]; then
 287          echo "Le groupe passe en argument est vide."
 288          else
 289          liste_users=$(ldapsearch -x -LLL "cn=$1" | grep memberUid | cut -d " " -f2)
 290          fi
 291            fi
 292    fi
 293  
 294    # efface le groupe ou user de la base si demandé (APRES AVOIR LISTE LES USERS CONCERNES)
 295    if [ "$3" = "suppr" ]; then
 296            echo "SUPPRESSION DES QUOTAS SUR $user_grp: RECALCUL DES QUOTAS EN FONCTION DES APPARTENANCES A D'AUTRES GROUPES."
 297  
 298      # PATCH pour suppression des users-groupes ayant disparu de l'annuaire : on supprime toute référence de tout "type" dans la table.
 299      if [ "$ERREURFLAG" = "1" ]; then
 300          `echo "DELETE FROM quotas WHERE nom=\"$user_grp\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 301      else
 302          # dans ce cas, on sait si type=u ou g, on supprime uniquement l'entrée correspondante. (un groupe et un utilisateur peuvent avoir le meme nom)
 303          `echo "DELETE FROM quotas WHERE nom=\"$user_grp\" AND type=\"$type\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 304      fi
 305    fi
 306  
 307  # PATCH pour suppression des users-groupes ayant disparu de l'annuaire
 308  [ "$ERREURFLAG" = "1" ] && echo ERREUR "Sortie."  
 309  
 310    # on empeche les betises !
 311    liste_users="$(echo "$liste_users" | grep -v "^admin$" | grep -v "^adminse3$" | grep -v "^www-se3$" | grep -v "^root$" )"
 312    
 313    # complete mysql ou mise à jour suivant le cas.
 314    if [ "$3" != "suppr" -a "$3" != "actu" ]; then
 315            test_exist=`echo "SELECT nom FROM quotas WHERE nom=\"$user_grp\" AND type=\"$type\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 316            # regarde s'il s'agit d'un update ou d'une insert
 317            if [ -n "$test_exist" ]; then
 318              echo "$user_grp EXISTE DANS LA BASE DE QUOTAS: MISE A JOUR EFFECTUEE"
 319              $(`echo "UPDATE quotas SET quotasoft=$quotas, quotahard=$quotah WHERE nom=\"$user_grp\" AND type=\"$type\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`)
 320            else
 321              echo "$user_grp INEXISTANT DANS LA BASE DE QUOTAS: AJOUT DE CELUI CI ET RECALCUL DES QUOTAS DE SES UTILISATEURS"
 322              echo "INSERT INTO quotas VALUES ('$type','$user_grp',$quotas, $quotah,'$partition')" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N
 323            fi
 324    fi
 325    
 326    #certaines requetes mysql et LDAP placées avant la boucle for qui suit pour éviter de les refaire inutilement
 327    #liste les users qui sont dans la base: leur quota sera prépondérant sur tout quota appliqué à leurs groupes
 328    #test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 329    #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 330    #liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 331    
 332    if [ "$2" = "Toutespartitions" ]; then
 333      partition=/home
 334      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 335      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 336      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 337      FIXERQUOTA /home $quotas $quotah
 338      partition=/var/se3
 339      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 340      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 341      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 342      FIXERQUOTA $partition $quotas $quotah
 343    else
 344      test_exist_user=`echo "SELECT nom FROM quotas WHERE type=\"u\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 345      #liste les groupes qui ont encore un quota affecté après les changements -> on regardera si $user appartient à chacun d'eux
 346      liste_groupes=`echo "SELECT nom FROM quotas WHERE type=\"g\" AND partition=\"$partition\"" | mysql -h $dbhost $dbname -u $dbuser -p$dbpass -N`
 347      
 348      FIXERQUOTA $partition $quotas $quotah
 349    fi
 350  fi
 351  
 352  rm -R /home/quotas_tmp > /dev/null 2>&1
 353  rm -R /var/se3/quotas_tmp > /dev/null 2>&1
 354  ############# fin du script #####################
 355  


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