[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #!/bin/bash 2 # 3 ##### Script de sauvegarde de divers paramètres SE3 ##### 4 # 5 # Auteur : Stephane Boireau (Bernay/Pont-Audemer (27)) 6 # 7 ## $Id: sauve_system.sh 7744 2013-03-31 23:47:51Z keyser $ ## 8 # 9 # Dernière modif: 09/07/2011 10 11 # Chemin des sauvegardes: 12 #dossier_svg="/home/sauvegardes/fichiers_se3" 13 dossier_svg="/var/se3/save" 14 15 # =============================== 16 # Volume maximum pour effectuer la sauvegarde de /var/lib/ldap 17 volume_ldap_max="100" #### J'AI SUPPRIMé CE CHOIX... C'EST VITE ENORME AVEC SARGE #### 18 # Si le volume de /var/lib/ldap dépasse 100Mo, on ne fait pas d'archive de /var/lib/ldap 19 # Seul un export LDIF sera alors effectué. 20 # =============================== 21 22 # Pour conserver des fichiers de sauvegarde sur une année à raison de une par semaine. 23 # En mettant 'oui' ci-dessous, 52 dossiers seront générés au bout d'une année. 24 svg_hebdo="non" 25 26 if [ -z "$1" -o "$1" = "--help" -o "$1" = "-h" ]; then 27 echo "Script permettant d'effectuer la sauvegarde:" 28 echo " - de l'annuaire LDAP" 29 echo " - de /etc" 30 echo " - des bases MySQL suivantes: 'se3db' et 'mysql'" 31 echo " - de /var/lib/samba ou juste /var/lib/samba/secrets.tdb" 32 echo "" 33 echo "Usage : - Passer en paramètre \$1 la durée de vie en secondes du script de" 34 echo " sauvegarde." 35 echo " Passé ce délai, si le script est relancé, les tâches de sauvegarde" 36 echo " précédentes seront interrompues." 37 echo " - Passer 'conservation_hebdo' en paramètre \$2" 38 echo " pour conserver des exemplaires par semaine sur une année." 39 echo " - Passer 'backuppc' en paramètre \$2 ou \$3" 40 echo " si la sauvegarde est lancée par backuppc." 41 echo " - Passer 'forcer' en paramètre \$2 ou \$3" 42 echo " si la sauvegarde doit être lancée malgré le fonctionnement" 43 echo " de backuppc." 44 echo " - Passer 'noacl' en paramètre \$2 ou \$3 ou \$4" 45 echo " pour ne pas sauvegarder les ACL de /home et /var/se3" 46 echo " - Passer 'varlibsamba' en paramètre \$2 ou \$3 ou \$4 ou \$5" 47 echo " pour sauvegarder tout /var/lib/samba et pas seulement" 48 echo " le /var/lib/samba/secrets.tdb" 49 exit 50 fi 51 52 # On bascule en mode conservation de 52 sauvegardes par an 53 # en plus du roulement sur 7 jours si le paramètre ci-dessous est passé: 54 if [ "$2" = "conservation_hebdo" ]; then 55 svg_hebdo="oui" 56 fi 57 58 # Chemin des fichiers de lock: 59 chemin_lock="/var/lock" 60 61 # Nom du fichier de lock: 62 fich_lock="$chemin_lock/svgse3.lck" 63 64 # Valeur TMP: 65 ladate=$(date +"%Y.%m.%d-%H.%M.%S") 66 67 68 69 # La sauvegarde peut être lancée en autonome ou bien via backupc. 70 # Si backuppc tourne, la sauvegarde autonome est désactivée. 71 # Sinon, elle peut être lancée manuellement ou via une tâche cron. 72 # Pour lancer la sauvegarde depuis backuppc, 73 # passer dans les paramètres ($2 ou $3) la chaine 'backuppc' 74 if echo "$*" | grep "forcer" | grep -v grep > /dev/null; then 75 # Le paramètre 'forcer' permet de lancer manuellement la sauvegarde, même si backuppc tourne. 76 # Ne le faites que si voys êtes sûr de ne pas prvoquer une collision de sauvegardes 77 # entre votre sauvegarde manuelle et la sauvegarde backuppc. 78 quitter="non" 79 else 80 if echo "$*" | grep "backuppc" | grep -v grep > /dev/null; then 81 quitter="non" 82 else 83 if ps aux | grep backuppc | grep -v grep > /dev/null; then 84 quitter="oui" 85 fi 86 fi 87 fi 88 89 if [ "$quitter" = "oui" ]; then 90 exit 91 fi 92 93 94 95 # Est-ce que la sauvegarde précédente est terminée? 96 # et/ou s'est déroulée normalement? 97 if [ -e "$fich_lock" ]; then 98 t1=$(cat $fich_lock) 99 t_expiration=$(($t1+$1)) 100 t2=$(date +%s) 101 difference=$(($t2-$t1)) 102 heures=$(($difference/3600)) 103 minutes=$((($difference-3600*$heures)/60)) 104 secondes=$(($difference-3600*$heures-60*$minutes)) 105 if [ $t2 -gt $t_expiration ]; then 106 echo "Problème avec $O" > /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 107 echo "Tâche initiée en $t1 et il est $t2 soit $heures}H$minutes}M$secondes}S." >> /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 108 echo "La tâche de sauvegarde a dépassé le délai imparti." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 109 echo "Le fichier de lock n'a pas été supprimé." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 110 echo "Les processus encore en cours vont être supprimés." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 111 112 if [ $(ps aux | grep $0 | grep -v grep | wc -l) -ge 2 ]; then 113 echo "Plusieurs exemplaires du script $0 tournent:" >> /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 114 ps aux | grep $0 | grep -v grep >> /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 115 116 # Problème comment identifier le processus courant? 117 # $(pidof $0) n'a pas l'air de fonctionner. 118 # Dois-je effectuer: 119 #rm -f $fich_lock 120 #killall $0 121 # Je viens de tester, cela ne fonctionne pas... 122 # Cela pose un problème... 123 # Si la première partie de la sauvegarde ne s'arrête pas et qu'on tue le processus, 124 # le script svg_se3... va se poursuivre et lancer la sauvegarde de la partie suivante... 125 # Si elle merdouille elle aussi, il peut falloir un certain nombre de tours pour tout purger. 126 fi 127 128 # Est-ce que je pourrais me contenter de tuer tous les processus qui touchent à $dossier_svg 129 if ps aux | grep $dossier_svg | grep -v "grep " > /dev/null; then 130 echo "Liste des processus dégagés lors du nettoyage:" >> /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 131 ps aux | grep $dossier_svg | grep -v "grep " >> /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 132 ps aux | grep $dossier_svg | grep -v "grep " | tr "\t" " " | sed -e "s/ \{2,\}/ /g" | cut -d" " -f2 | while read PID 133 do 134 echo "kill -9 $PID" | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 135 kill -9 $PID 2>&1 | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 136 done 137 138 if ps aux | grep $dossier_svg | grep -v "grep " > /dev/null; then 139 echo "Un des processus ne s'est pas arrêté." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 140 echo "On abandonne." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 141 quitter="oui" 142 else 143 echo "Le nettoyage a été effectué, mais il est curieux que le script ait dépassé le temps imparti pour la sauvegarde." | tee -a /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 144 quitter="non" 145 fi 146 147 mail_admin=$(ldapsearch -xLLL uid=admin mail | grep "^mail: " | sed -e "s/^mail: //") 148 mail_ssmtp=$(grep "^root=" /etc/ssmtp/ssmtp.conf | cut -d"=" -f2) 149 150 if [ ! -z "$mail_admin" ]; then 151 mail $mail_admin -s "[Serveur SE3] Problème avec le processus de sauvegarde" < /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 152 fi 153 154 if [ ! -z "$mail_ssmtp" ]; then 155 mail $mail_ssmtp -s "[Serveur SE3] Problème avec le processus de sauvegarde" < /root/tmp/rapport_nettoyage_svgse3_$ladate}.txt 156 fi 157 158 if [ $quitter = "oui" ]; then 159 exit 160 fi 161 fi 162 163 rm -f $fich_lock 164 else 165 echo "Une tâche de sauvegarde est déjà en cours..." 166 echo "Elle n'a pas atteint sa durée limite autorisée." 167 echo "Veuillez patienter." 168 exit 169 fi 170 fi 171 172 173 174 # Création d'un fichier de LOCK: 175 date +%s > $fich_lock 176 177 178 #Couleurs 179 COLTITRE="\033[1;35m" # Rose 180 COLPARTIE="\033[1;34m" # Bleu 181 182 COLTXT="\033[0;37m" # Gris 183 COLCHOIX="\033[1;33m" # Jaune 184 COLDEFAUT="\033[0;33m" # Brun-jaune 185 COLSAISIE="\033[1;32m" # Vert 186 187 COLCMD="\033[1;37m" # Blanc 188 189 COLERREUR="\033[1;31m" # Rouge 190 COLINFO="\033[0;36m" # Cyan 191 192 echo -e "$COLTITRE" 193 echo "************************************" 194 echo "* Sauvegarde des fichiers de conf, *" 195 echo "* de l'annuaire, des bases,... *" 196 echo "************************************" 197 198 echo -e "$COLCMD\c" 199 mkdir -p "$dossier_svg" 200 mkdir -p "$dossier_svg/mysql" 201 mkdir -p "$dossier_svg/ldap" 202 mkdir -p "$dossier_svg/samba" 203 mkdir -p "$dossier_svg/etc" 204 mkdir -p "$dossier_svg/acl" 205 206 ladate=$(date +"%Y.%m.%d-%H.%M.%S"); 207 jour=$(date +%a| tr -d ".") 208 semaine=$(date +%V) 209 210 if [ $svg_hebdo = "oui" ]; then 211 if [ -e "$dossier_svg/svg_hebdo/num_semaine.txt" ]; then 212 if [ $semaine != $(cat "$dossier_svg/svg_hebdo/num_semaine.txt") ]; then 213 # C'est une nouvelle semaine qui commence... on met de côté la sauvegarde de la semaine précédente. 214 echo $semaine > "$dossier_svg/svg_hebdo/num_semaine.txt" 215 # On supprime la sauvegarde de l'année précédente si elle existe 216 if [ -d "$dossier_svg/svg_hebdo/semaine_$semaine}" ]; then 217 rm -fr $dossier_svg/svg_hebdo/semaine_$semaine} 218 fi 219 # et on (re)crée le dossier 220 mkdir -p $dossier_svg/svg_hebdo/semaine_$semaine} 221 #cp -a $dossier_svg/mysql $dossier_svg/svg_hebdo/semaine_${semaine} 222 #cp -a $dossier_svg/ldap $dossier_svg/svg_hebdo/semaine_${semaine} 223 #cp -a $dossier_svg/samba $dossier_svg/svg_hebdo/semaine_${semaine} 224 #cp -a $dossier_svg/etc $dossier_svg/svg_hebdo/semaine_${semaine} 225 226 transfert_hebdo="y" 227 else 228 transfert_hebdo="n" 229 fi 230 else 231 if [ -e $dossier_svg/mysql ]; then 232 # Une sauvegarde au moins a déjà été effectuée. 233 if [ ! -z "$(ls $dossier_svg/mysql)" ]; then 234 transfert_hebdo="y" 235 else 236 transfert_hebdo="n" 237 fi 238 else 239 transfert_hebdo="n" 240 fi 241 fi 242 243 244 if [ $transfert_hebdo = "y" ]; then 245 mkdir -p $dossier_svg/svg_hebdo/semaine_$semaine}/mysql 246 for base in se3db mysql 247 do 248 liste=($(ls -t $dossier_svg/mysql/$base.*.sql)) 249 if [ ${#liste[*]} -gt 0 ]; then 250 # On récupère la première sauvegarde de la semaine 251 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/mysql/ 252 fi 253 done 254 255 256 mkdir -p $dossier_svg/svg_hebdo/semaine_$semaine}/ldap 257 liste=($(ls -t $dossier_svg/ldap/DB_CONFIG.*)) 258 if [ ${#liste[*]} -gt 0 ]; then 259 # On récupère la sauvegarde la plus récente de la semaine 260 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/ldap/ 261 fi 262 liste=($(ls -t $dossier_svg/ldap/ldap.*.ldif)) 263 if [ ${#liste[*]} -gt 0 ]; then 264 # On récupère la sauvegarde la plus récente de la semaine 265 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/ldap/ 266 fi 267 if [ -e $dossier_svg/ldap/ldap.se3sav.tar.gz ]; then 268 cp -a $dossier_svg/ldap/ldap.se3sav.tar.gz $dossier_svg/svg_hebdo/semaine_$semaine}/ldap/ 269 fi 270 271 272 mkdir -p $dossier_svg/svg_hebdo/semaine_$semaine}/samba 273 #if ls $dossier_svg/samba/ | grep "var_lib_samba." > /dev/null; then 274 test=$(ls $dossier_svg/samba/ | grep 'var_lib_samba\.') 275 if [ ! -z "$test" ]; then 276 liste=($(ls -t $dossier_svg/samba/var_lib_samba.*.tar.gz)) 277 if [ ${#liste[*]} -gt 0 ]; then 278 # On récupère la sauvegarde la plus récente de la semaine 279 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/samba/ 280 fi 281 fi 282 #if ls $dossier_svg/samba/ | grep "var_lib_samba_secrets_tdb." > /dev/null; then 283 test=$(ls $dossier_svg/samba/ | grep 'var_lib_samba_secrets_tdb.') 284 if [ ! -z "$test" ]; then 285 liste=($(ls -t $dossier_svg/samba/var_lib_samba_secrets_tdb.*)) 286 if [ ${#liste[*]} -gt 0 ]; then 287 # On récupère la sauvegarde la plus récente de la semaine 288 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/samba/ 289 fi 290 fi 291 292 mkdir -p $dossier_svg/svg_hebdo/semaine_$semaine}/etc 293 liste=($(ls -t $dossier_svg/etc/etc.*.tar.gz)) 294 if [ ${#liste[*]} -gt 0 ]; then 295 # On récupère la sauvegarde la plus récente de la semaine 296 cp -a $liste[0]} $dossier_svg/svg_hebdo/semaine_$semaine}/etc/ 297 fi 298 299 # On ne conserve pas dans le roulement les ACL... trop gros 300 301 echo $semaine > "$dossier_svg/svg_hebdo/num_semaine.txt" 302 fi 303 fi 304 305 echo -e "$COLTXT" 306 echo "Sauvegarde de MySQL" 307 echo -e "$COLCMD\c" 308 #/etc/init.d/mysql stop 309 #ls /var/lib/mysql | while read A 310 #do 311 # if [ -d "/var/lib/mysql/$A" ]; then 312 # base=$(echo "$A" | sed -e "s!/$!!") 313 # if [ -e "$dossier_svg/mysql/$base.$jour.tar.gz" ]; then 314 # rm -f "$dossier_svg/mysql/$base.$jour.tar.gz" 315 # fi 316 # tar -czf "$dossier_svg/mysql/$base.$jour.tar.gz" /var/lib/mysql/$base 317 # fi 318 #done 319 #/etc/init.d/mysql start 320 if [ -e /root/.my.cnf ]; then 321 #ls /var/lib/mysql | while read A 322 for base in se3db mysql 323 do 324 #if [ -d "/var/lib/mysql/$A" ]; then 325 if [ -d "/var/lib/mysql/$base" ]; then 326 #base=$(echo "$A" | sed -e "s!/$!!") 327 if [ -e "$dossier_svg/mysql/$base.$jour.sql" ]; then 328 rm -f "$dossier_svg/mysql/$base.$jour.sql" 329 # sup scories 330 rm -f "$dossier_svg/mysql/$base.$jour..sql" 331 fi 332 mysqldump -uroot --default-character-set=latin1 $base > "$dossier_svg/mysql/$base.$jour.sql" 333 fi 334 done 335 # SINON: ENVOYER UN MAIL D'AVERTISSEMENT... A FAIRE 336 fi 337 echo "" 338 339 echo -e "$COLTXT" 340 echo "Sauvegarde de LDAP" 341 echo -e "$COLCMD\c" 342 #ldapsearch -xLLL -D "cn=admin,$(cat /etc/ldap/ldap.conf | grep '^BASE' | tr '\t' " " | sed -e 's/ \{2,\}/ /g' | cut -d' ' -f2)" -w $(cat /etc/ldap.secret) > "$dossier_svg/ldap/ldap.$jour.ldif" 343 rm -f $dossier_svg/ldap/ldap.$jour..ldif 344 ldapsearch -xLLL -D $(grep ^rootdn /etc/ldap/slapd.conf|tr "\t" " " | sed -e "s/ \{2,\}/ /g" | sed -e "s/'//g" | sed -e 's/"//g' | cut -d" " -f2) -w $(cat /etc/ldap.secret) > "$dossier_svg/ldap/ldap.$jour.ldif" 345 #===================================== 346 test_volume=$(du -sk "$dossier_svg/ldap/ldap.$jour.ldif" | tr "\t" " " | cut -d" " -f1) 347 if [ "$test_volume" = "0" ]; then 348 mail_admin=$(ldapsearch -xLLL uid=admin mail | grep "^mail: " | sed -e "s/^mail: //") 349 mail_ssmtp=$(grep "^root=" /etc/ssmtp/ssmtp.conf | cut -d"=" -f2) 350 351 echo "La sauvegarde LDAP générée cette nuit est vide. 352 L'état du LDAP doit perturber le fonctionnement du serveur. 353 Il faut réagir avant que le roulement sur 7 jours soit achevé sinon vous n'aurez plus de sauvegarde valide de l'annuaire LDAP (sauf si la sauvegarde hebdomadaire est activée, auquel cas vous avez un roulement des fichiers sur une année)." > /root/tmp/rapport_pb_ldap_svgse3_$ladate}.txt 354 355 if [ ! -z "$mail_admin" ]; then 356 mail $mail_admin -s "[Serveur SE3] Problème avec le processus de sauvegarde" < /root/tmp/rapport_pb_ldap_svgse3_$ladate}.txt 357 fi 358 359 if [ ! -z "$mail_ssmtp" ]; then 360 mail $mail_ssmtp -s "[Serveur SE3] Problème avec le processus de sauvegarde" < /root/tmp/rapport_pb_ldap_svgse3_$ladate}.txt 361 fi 362 else 363 if [ "$svg_hebdo" != "oui" ]; then 364 mkdir -p "$dossier_svg/svg_ldap_secu" 365 #ls -t -1 /var/se3/save/ldap/*.ldif | head -n1 366 cp "$dossier_svg/ldap/ldap.$jour.ldif" "$dossier_svg/svg_ldap_secu/ldap.$(date +%d).ldif" 367 fi 368 fi 369 #===================================== 370 cp -f /var/lib/ldap/DB_CONFIG $dossier_svg/ldap/DB_CONFIG.$jour 371 rm -f $dossier_svg/ldap/DB_CONFIG.$jour. 372 #if [ "$(du -sm /var/lib/ldap | tr '\t' ' ' | cut -d' ' -f1)" -lt $volume_ldap_max ]; then 373 # /etc/init.d/slapd stop 374 # if [ -e "$dossier_svg/ldap/var_lib_ldap.$jour.tar.gz" ]; then 375 # rm -f "$dossier_svg/ldap/var_lib_ldap.$jour.tar.gz" 376 # fi 377 # tar -czf "$dossier_svg/ldap/var_lib_ldap.$jour.tar.gz" /var/lib/ldap 378 # /etc/init.d/slapd start 379 #fi 380 # Au cas où, on archive le LDAP vierge: 381 if [ ! -e "$dossier_svg/ldap/ldap.se3sav.tar.gz" -a -e /var/lib/ldap.se3sav ]; then 382 if [ $(du -sk /var/lib/ldap.se3sav/ | tr "\t" " " | cut -d" " -f1) -le 10000 ]; then 383 # En principe le dossier fait ~1.5Mo 384 tar -czf $dossier_svg/ldap/ldap.se3sav.tar.gz /var/lib/ldap.se3sav 385 fi 386 fi 387 echo "" 388 389 echo -e "$COLTXT" 390 if echo "$*" | grep "varlibsamba" > /dev/null; then 391 echo "Sauvegarde de /var/lib/samba" 392 echo -e "$COLCMD\c" 393 if [ -e "$dossier_svg/samba/var_lib_samba.$jour.tar.gz" ]; then 394 rm -f "$dossier_svg/samba/var_lib_samba.$jour.tar.gz" 395 rm -f "$dossier_svg/samba/var_lib_samba.$jour..tar.gz" 396 fi 397 if [ -e "$dossier_svg/samba/var_lib_samba_secrets_tdb.$jour" ]; then 398 rm -f "$dossier_svg/samba/var_lib_samba_secrets_tdb.$jour" 399 rm -f "$dossier_svg/samba/var_lib_samba_secrets_tdb..$jour" 400 fi 401 402 tar -czf "$dossier_svg/samba/var_lib_samba.$jour.tar.gz" /var/lib/samba 403 else 404 echo "Sauvegarde de /var/lib/samba/secrets.tdb" 405 echo -e "$COLCMD\c" 406 if [ -e "$dossier_svg/samba/var_lib_samba.$jour.tar.gz" ]; then 407 rm -f "$dossier_svg/samba/var_lib_samba.$jour.tar.gz" 408 rm -f "$dossier_svg/samba/var_lib_samba.$jour..tar.gz" 409 fi 410 if [ -e "$dossier_svg/samba/var_lib_samba_secrets_tdb.$jour" ]; then 411 rm -f "$dossier_svg/samba/var_lib_samba_secrets_tdb.$jour" 412 rm -f "$dossier_svg/samba/var_lib_samba_secrets_tdb..$jour" 413 fi 414 cp /var/lib/samba/secrets.tdb "$dossier_svg/samba/var_lib_samba_secrets_tdb.$jour" 415 fi 416 echo "" 417 418 echo -e "$COLTXT" 419 echo "Sauvegarde de /etc" 420 echo -e "$COLCMD\c" 421 if [ -e "$dossier_svg/etc/etc.$jour.tar.gz" ]; then 422 rm -f "$dossier_svg/etc/etc.$jour.tar.gz" 423 rm -f "$dossier_svg/etc/etc.$jour..tar.gz" 424 fi 425 tar -czf "$dossier_svg/etc/etc.$jour.tar.gz" /etc 426 427 if ! echo "$*" | grep noacl > /dev/null; then 428 echo -e "$COLTXT" 429 echo "Sauvegarde des ACL de /var/se3" 430 echo -e "$COLCMD\c" 431 if [ -e "$dossier_svg/acl/varse3_acl.bz2" ]; then 432 rm -f "$dossier_svg/acl/varse3_acl.bz2" 433 fi 434 cd /var/se3 435 getfacl -R . | bzip2 > $dossier_svg/acl/varse3_acl.bz2 436 fi 437 438 chown -R root:root "$dossier_svg" 439 chmod -R 700 "$dossier_svg" 440 echo "" 441 442 rm -f $fich_lock 443 444 echo -e "$COLTITRE" 445 echo "***********" 446 echo "* Terminé *" 447 echo "***********" 448 echo -e "$COLTXT" 449
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 |