[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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
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 |