From f9019b6cda370f9fdb62a78fd12645203e2e496b Mon Sep 17 00:00:00 2001 From: Romain Dessort Date: Mon, 21 Feb 2011 15:27:57 +0100 Subject: [PATCH] Adding evobackup scripts to backup a server on a pluggable device --- PLAN-SAUVEGARDES.template | 10 -- README | 213 ++++---------------------------------- chroot-ssh.sh | 140 ------------------------- etc/group | 7 -- etc/passwd | 4 - etc/shadow | 4 - etc/sshd_config | 35 ------- evobackup | 6 ++ evobackup-inc.sh | 43 -------- evobackup_local | 155 +++++++++++++++++++++++++++ evobackup_verify | 71 +++++++++++++ zzz_evobackup | 146 -------------------------- 12 files changed, 250 insertions(+), 584 deletions(-) delete mode 100644 PLAN-SAUVEGARDES.template delete mode 100644 chroot-ssh.sh delete mode 100644 etc/group delete mode 100644 etc/passwd delete mode 100644 etc/shadow delete mode 100644 etc/sshd_config create mode 100644 evobackup delete mode 100644 evobackup-inc.sh create mode 100644 evobackup_local create mode 100755 evobackup_verify delete mode 100644 zzz_evobackup diff --git a/PLAN-SAUVEGARDES.template b/PLAN-SAUVEGARDES.template deleted file mode 100644 index b4c05c8..0000000 --- a/PLAN-SAUVEGARDES.template +++ /dev/null @@ -1,10 +0,0 @@ -PLAN DES SAUVEGARDES -==================== - -PORT JAIL ETAT -------------------------------------------------------- -2222 Serveur 1 (IP) 1 -2223 Serveur 2 (IP) 1 -2224 Serveur 3 (IP) 0 -etc.... -....... diff --git a/README b/README index ca237ea..ee4e3fd 100644 --- a/README +++ b/README @@ -1,202 +1,25 @@ -EvoBackup -========= +EvoBackup-usb +============= -EvoBackup est un ensemble de scripts permettant de mettre en place -un service de backups gérant les sauvegardes de plusieurs machines. -Le principe est d'installer des prisons/chroot contenant un service -SSH écoutant sur un port différent dans chaque prison. Chaque serveur -peut ainsi envoyer ses données quotidiennement en "root" via rsync -dans sa propre prison. Les prisons sont ensuite copiées en dehors des -prisons (donc inacccessible par les serveurs) de façon incrémentale -grâce à des "hard links". On peut ainsi conserver des dizaines de -sauvegardes de chaque serveur de façon sécurisé et avec peu de place. +Evobackup-usb est un ensemble de scripts permettant de gérer la sauvegarde d'une +machine sur un média amovible (type disque dur externe). +Important : Le périphérique qui contiendra les backups doit être formater en +ext2/3 pour conserver les droits unix. - ************************** -Serveur 1 ------SSH/rsync -------> * tcp/2222 Serveur * - * de * -Serveur 2 ------SSH/rsync -------> * tcp/2223 Sauvegardes * - ************************** +Installation +------------ -Cette technique de sauvegarde s'appuient sur des technologies -standards. Elle est utilisée depuis plusieurs années par Evolix -pour sauvegarder chaque jour des centaines de serveurs représentant -plusieurs To de données incrémentales. + * Récupérer les 2 scripts evobackup_local et evobackup_verify, et les placer + dans le répertoire /usr/share/scripts/, en leur donnant les droits + d'exécution + * Ajouter une ligne dans /etc/fstab pour le média amovible, du type : + /dev/sdb1 /backup ext3 rw,noauto 0 0 -Serveur de sauvegardes ----------------------- - -Le serveur de sauvegardes doit être sous Debian Lenny. -(testé sous Etch et Lenny, les instructions sont pour Lenny). -Avec les logiciels suivants : - - - OpenSSH - - Rsync (le daemon rsync n'est pas nécessaire) - - Commande "mail" (ou un équivalent) capable d'envoyer - des messages à l'extérieur. - -Un volume d'une taille importante doit être monté sur /backup -Pour des raisons de sécurité on pourra chiffre ce volume. -On créera ensuite les répertoires suivants : - -- /backup/jails : pour les prisons -- /backup/incs : pour les copies incrémentales des prisons -- /etc/evobackup : config des fréquences des copies incrémentales - -Pour la mise en place des backups incrémentaux sur le serveur : -- Mettre en place le script evobackup-inc.sh dans /usr/share/scripts -- Activer le crontab suivant (ajuster éventuellement les heures) : - 30 10 * * * /usr/share/scripts/evobackup-inc.sh - -Si le noyau du serveur est patché avec GRSEC, on évitera pas mal -de warnings en positionnant les paramètres Sysctl suivants : - -# sysctl kernel.grsecurity.chroot_deny_chmod=0 -# sysctl kernel.grsecurity.chroot_deny_mknod=0 - - -Serveurs à sauvegarder ----------------------- - -On peut sauvegarder différents systèmes : Linux, BSD, Windows, MacOSX. -L'un des seuls prérequis est d'avoir rsync. - - -Installation d'une sauvegarde ------------------------------ - -Côté serveur de sauvegardes -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1) On récupère les sources via http://git.evolix.org/git/evolinux/evobackup.git - - - Exporter la variable $JAIL avec le nom d'hôte saisit dans la grille : - - # export JAIL= - - - Se placer dans le bon répertoire puis exécuter : - - # sh chroot-ssh.sh /backup/jails/$JAIL - - Note : Ignorer une éventuelle erreur avec ld-linux-x86-64.so.2 (32bits) ou ld-linux.so.2 (64bits) - - - Editer le fichier /backup/jails/$JAIL/etc/ssh/sshd_config - et remplacer le port SSH utilisé par le prochain disponible - (ou garder celui assigné si c'est la première prison). - Ajouter également la restriction d'IP si possible via "AllowUsers" : - AllowUsers root@IP root@::ffff:IP - - - Ajouter la clé publique du client à sauvegarder dans - /backup/jails/$JAIL/root/.ssh/authorized_keys - - - Puis corrigez les droits SSH : - - # chmod -R 600 /backup/jails/$JAIL/root/.ssh/ - # chown -R root:root /backup/jails/$JAIL/root/.ssh/ - -2) Gestion du lancement des prisons en modifiant le fichier - de démarrage /etc/init.d/ssh (on remplacera $JAIL par sa - vraie valeur). - - - Ajouter à start) : - - mount -t proc proc-chroot /backup/jails/$JAIL/proc/ - mount -t devpts devpts-chroot /backup/jails/$JAIL/dev/pts/ - chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null - - - Ajouter à stop) : - - umount /backup/jails/$JAIL/proc/ - umount /backup/jails/$JAIL/dev/pts/ - kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` - - - Ajouter à reload|force-reload) : - - kill -HUP `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` - - - Ajouter à restart) : - - kill -9 `chroot /backup/jails/$JAIL cat /var/run/sshd.pid` - chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null - -3) On lance la prison : - - # mount -t proc proc-chroot /backup/jails/$JAIL/proc/ - # mount -t devpts devpts-chroot /backup/jails/$JAIL/dev/pts/ - # chroot /backup/jails/$JAIL /usr/sbin/sshd > /dev/null - - Pour vérifier que tout est OK : - - # /etc/init.d/ssh reload - -4) Gestion des sauvegardes incrémentales - - Pour activer les gestions des copies incrémentales, - créer le fichier /etc/evobackup/$JAIL contenant par - exemple : - - +%Y-%m-%d.-0day - +%Y-%m-%d.-1day - +%Y-%m-%d.-2day - +%Y-%m-%d.-3day - +%Y-%m-01.-0month - +%Y-%m-01.-1month - - Quelques explications sur cette syntaxe particulière. - Par exemple, la ligne ci-dessous signifie "garder la sauvegarde du - jour actuel" (à toujours mettre sur la première ligne a priori) : - +%Y-%m-%d.-0day - La ligne ci-dessous signifie "garder la sauvegarde d'hier" : - +%Y-%m-%d.-1day - La ligne ci-dessous signifie "garder la sauvegarde du 1er jour du - mois courant" : - +%Y-%m-01.-0month - Toujours le même principe, on peut garder celle du 1er jours du - mois dernier : - +%Y-%m-01.-1month - - Et bien sûr, on peut garder aussi le 15e jour (pour avoir une sauvegarde - toutes les 15 jours, le 1er janvier de chaque année, etc.) - - -Côté serveur à sauvegarder -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1) Générez une clé SSH pour l'utilisateur "root" : - - # ssh-keygen - - (Ne pas la protéger par une passphrase, sauf si un humain - va l'entrer manuellement à chaque sauvegarde effectuée) - - (La clé générée doit être de type RSA et non DSA !!) - -2) Envoyez "/root/.ssh/id_rsa.pub" au responsable du serveur de - sauvegarde, ainsi que l'adresse IP de la machine. - -3) Ajoutez à la crontab le fichier "zzz_evobackup" - Pour une sauvegarde quotidienne (conseillé), utilisez le répertoire - "/etc/cron.daily/" (sous Linux) ou "/etc/periodic/daily" (sous FreeBSD). - - Il faut éventuellement ajuster le script en supprimant les lignes "--exclude" - si l'on ne souhaite pas exclure les fichiers/répertoires de cette ligne et - ajouter/supprimer les lignes en dessous pour sauvegarder les bons répertoires. - ($rep désigne les données systèmes). Vous pouvez donc choisir librement ce - que vous désirez sauvegarder. - -4) Une fois que tout en place au niveau du serveur de sauvegardes, - on doit initier la première connexion : - - # ssh -p - - -Mise-à-jour du serveur de sauvegardes -------------------------------------- - -En cas d'une mise-à-jour d'un paquet lié à SSH ou rsync côté -serveur de sauvegardes, on mettra à jour ainsi : - -# sh chroot-ssh.sh updateall -# /etc/init.d/ssh restart + * Créer ensuite les répertoires suivants : + mkdir /backup /etc/evobackup + * Enfin, placer le fichier evobackup dans /etc/cron.d/, en adaptant au besoin + les heures d'exécution des scripts. + diff --git a/chroot-ssh.sh b/chroot-ssh.sh deleted file mode 100644 index 904ae73..0000000 --- a/chroot-ssh.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/sh - -# Gregory Colpart -# chroot script for OpenSSH -# $Id: chroot-ssh.sh,v 1.12 2010-07-02 17:40:29 gcolpart Exp $ - -# tested on Debian Etch and recently on Lenny -# Exec this script for jail creation: -# ./chroot-ssh.sh /backup/jails/myserver -# Note: etc/{sshd_config,group,passwd} files should be present - -# For Etch -# Start: chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null -# Reload: kill -HUP `chroot /backup/jails/myserver cat /var/run/sshd.pid` -# Stop: kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid` -# Restart: Stop + Start - -# For Lenny -# Start : -# chroot /backup/jails/myserver mount -t proc proc-chroot /proc/ -# chroot /backup/jails/myserver mount -t devpts devpts-chroot /dev/pts/ -# chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null -# Reload: kill -HUP `chroot /backup/jails/myserver cat /var/run/sshd.pid` -# Stop: kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid` -# Restart: -# kill -9 `chroot /backup/jails/myserver cat /var/run/sshd.pid` -# chroot /backup/jails/myserver /usr/sbin/sshd > /dev/null - -# After *each* ssh upgrade or libs upgrade: -# sh chroot-ssh.sh updateall -# And restart all sshd daemons - -bincopy() { - -chrootdir=$1 - -# TODO : better detection of amd64 arch -cp -f /lib/ld-linux.so.2 $chrootdir/lib/ || cp -f /lib64/ld-linux-x86-64.so.2 $chrootdir/lib64/ -cp /lib/libnss* $chrootdir/lib/ - -for dbin in /bin/bash /bin/cat /bin/chown /bin/mknod /bin/rm /bin/sed /bin/sh /bin/uname /bin/mount /usr/bin/rsync /usr/sbin/sshd /usr/lib/openssh/sftp-server; do - cp -f $dbin $chrootdir/$dbin; - # (comme dans http://www.gcolpart.com/hacks/chroot-bind.sh) - for lib in `ldd $dbin | cut -d">" -f2 | cut -d"(" -f1`; do - cp -p $lib $chrootdir/$lib - done -done - -} - -# synopsis -if [ $# -ne 1 ]; then - echo "Vous devez indiquer un repertoire." - echo "Exemple : chroot-ssh.sh /backup/jails/myserver" - exit 0 -fi - -# are u root? -if [ `whoami` != "root" ]; then - echo "Vous devez executer le script en étant root." - exit 0 -fi - - -if [ -e $1 ]; then - echo "Le repertoire $1 existe deja..." -fi - -if [ "$1" = "updateall" ]; then - - for i in `ls -1 /backup/jails/*/lib/libnss_compat.so.2`; do - chrootdir=`echo $i | cut -d"/" -f1,2,3,4` - echo -n "MaJ $chrootdir ..." - bincopy $chrootdir - echo "...OK" - done - -else - -# where is jail -chrootdir=$1 - -mkdir -p $chrootdir -chown root:root $chrootdir - -# create jail - -echo -n "1 - Creation de la prison..." - - mkdir -p $chrootdir/{bin,dev,etc/ssh,lib,lib64} - mkdir -p $chrootdir/lib/tls/i686/cmov/ - mkdir -p $chrootdir/proc - mkdir -p $chrootdir/root/.ssh - mkdir -p $chrootdir/usr/lib/i686/cmov/ - mkdir -p $chrootdir/lib/i686/cmov/ - mkdir -p $chrootdir/usr/{bin,lib,sbin} - mkdir -p $chrootdir/usr/lib/openssh - mkdir -p $chrootdir/var/log/ - mkdir -p $chrootdir/var/run/sshd - - touch $chrootdir/var/log/{authlog,lastlog,messages,syslog} - touch $chrootdir/etc/fstab - -echo "...OK" - -echo -n "2 - Copie des donnees..." - cp /proc/devices $chrootdir/proc - - cp /etc/ssh/{ssh_host_rsa_key,ssh_host_dsa_key} $chrootdir/etc/ssh/ - cp etc/sshd_config $chrootdir/etc/ssh/ - cp etc/passwd $chrootdir/etc/ - cp etc/shadow $chrootdir/etc/ - cp etc/group $chrootdir/etc/ - -echo ".......OK" - -echo -n "3 - Copie des binaires..." - -bincopy $chrootdir - -echo "......OK" - -echo -n "4 - Creation des devices..." - cd $chrootdir/dev/ - - cp /dev/MAKEDEV ./ - ./MAKEDEV {null,random,urandom,pty} - mkdir pts - #mknod ptmx c 5 2 - -echo "....OK" - -echo -n "5 - Termine." - -# end - -echo "" - -fi - diff --git a/etc/group b/etc/group deleted file mode 100644 index 72a899e..0000000 --- a/etc/group +++ /dev/null @@ -1,7 +0,0 @@ -root:x:0: -daemon:x:1: -shadow:x:42: -staff:x:50: -users:x:100: -nogroup:x:65534: -ssh:x:102: diff --git a/etc/passwd b/etc/passwd deleted file mode 100644 index 85f95e2..0000000 --- a/etc/passwd +++ /dev/null @@ -1,4 +0,0 @@ -root:x:0:0:root:/root:/bin/bash -daemon:x:1:1:daemon:/usr/sbin:/bin/sh -nobody:x:65534:65534:nobody:/nonexistent:/bin/sh -sshd:x:100:65534::/var/run/sshd:/usr/sbin/nologin diff --git a/etc/shadow b/etc/shadow deleted file mode 100644 index 1fdcd4e..0000000 --- a/etc/shadow +++ /dev/null @@ -1,4 +0,0 @@ -root:x:13536:0:99999:7::: -daemon:*:13536:0:99999:7::: -nobody:*:13536:0:99999:7::: -sshd:!:13536:0:99999:7::: diff --git a/etc/sshd_config b/etc/sshd_config deleted file mode 100644 index e3176fc..0000000 --- a/etc/sshd_config +++ /dev/null @@ -1,35 +0,0 @@ -Port 2222 -Protocol 2 - -HostKey /etc/ssh/ssh_host_rsa_key -HostKey /etc/ssh/ssh_host_dsa_key -UsePrivilegeSeparation yes - -KeyRegenerationInterval 3600 -ServerKeyBits 768 -SyslogFacility AUTH -LogLevel INFO -LoginGraceTime 120 -PermitRootLogin yes -StrictModes yes -RSAAuthentication yes -PubkeyAuthentication yes -AuthorizedKeysFile %h/.ssh/authorized_keys - -IgnoreRhosts yes -RhostsRSAAuthentication no -HostbasedAuthentication no -PermitEmptyPasswords no -ChallengeResponseAuthentication no -PasswordAuthentication no - -X11Forwarding no -X11DisplayOffset 10 -PrintMotd no -PrintLastLog yes -TCPKeepAlive yes -UseLogin no - -Subsystem sftp /usr/lib/openssh/sftp-server - -AllowUsers root@IP root@::ffff:IP diff --git a/evobackup b/evobackup new file mode 100644 index 0000000..d4b46e3 --- /dev/null +++ b/evobackup @@ -0,0 +1,6 @@ +#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# Backup serveur local +4 3 * * * root /usr/share/scripts/evobackup_verify on +8 3 * * * root /usr/share/scripts/evobackup_local +3 8 * * * root /usr/share/scripts/evobackup_verify off diff --git a/evobackup-inc.sh b/evobackup-inc.sh deleted file mode 100644 index a735586..0000000 --- a/evobackup-inc.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -# Script backups incrementaux -# Evolix (c) 2007 - -CONFDIR=/etc/evobackup/ -DATE=$(date +"%d-%m-%Y") -LOGFILE=/var/log/evobackup-sync.log -TMPDIR=/tmp/evobackup/ -JAILDIR=/backup/jails/ -INCDIR=/backup/incs/ -MYMAIL=jdoe@example.com - -mkdir -p $TMPDIR - -for i in $( ls $CONFDIR ); do - - mkdir -p "$INCDIR"$i - - # hard copy everyday - cp -alx $JAILDIR$i $INCDIR$i/$DATE - - # list actual inc backups - for j in $( ls $INCDIR$i ); do - echo $j - done > "$TMPDIR"$i.files - - # list non-obsolete inc backups - for j in $( cat $CONFDIR$i ); do - MYDATE=$( echo $j | cut -d. -f1 ) - BEFORE=$( echo $j | cut -d. -f2 ) - date -d "$(date $MYDATE) $BEFORE" "+%d-%m-%Y" - done > "$TMPDIR"$i.keep - - # delete obsolete inc backups - for j in $( grep -v -f "$TMPDIR"$i.keep "$TMPDIR"$i.files ); do - echo "Suppression du backup $j ($i)" - cd $INCDIR$i - rm -rf $j - done - -done | tee -a $LOGFILE | mail -s "[info] EvoBackup - incrementaux" $MYMAIL - diff --git a/evobackup_local b/evobackup_local new file mode 100644 index 0000000..bcf2e9b --- /dev/null +++ b/evobackup_local @@ -0,0 +1,155 @@ +#!/bin/sh + +# +# Script evobackup client +# $Id: evobackup_cron_daily_client,v 1.21 2010-08-22 10:15:42 gcolpart Exp $ +# + +# systeme de la machine ("linux" ou "bsd") +SYSTEME=linux + +# mail de remontee +MAIL=jdoe@example.com + +# operations specifiques + +mkdir -p -m 700 /home/backup + +# Dump LDAP +# slapcat -l /home/backup/ldap.bak + +# Dump MySQL +#mysqldump --defaults-extra-file=/etc/mysql/debian.cnf \ +# --opt --all-databases | gzip --best > /home/backup/mysql.bak.gz + +# for i in $(echo SHOW DATABASES | mysql | egrep -v "^(Database|information_schema)" ); \ +# do mkdir -p /home/mysqldump/$i ; chown -R mysql /home/mysqldump ; \ +# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q --opt -T \ +# /home/mysqldump/$i $i; done + +# Dump par base +# mkdir -p -m 700 /home/mysqldump/BASE +# chown -R mysql /home/mysqldump/ +# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q \ +# --opt -T /home/mysqldump/BASE BASE + +# mkdir -p /home/mysqlhotcopy/ +# mysqlhotcopy BASE /home/mysqlhotcopy/ + +# Dump instanceS MySQL +#oldIFS=$IFS +#IFS=$'\n' +# +## Recherche du mot de passe mysqladmin +#mysqladminpasswd=`cat /root/.my.cnf |grep -m1 'password = .*' |cut -d" " -f3` +# +## Determination des instances MySQL disponibles sur le serveur (hors 3306) +#for instance in `cat /etc/mysql/my.cnf |grep "port\s*=\s\d*"` +#do +# instance=${instance// /} +# instance=${instance// /} +# instance=${instance//port=/} +# if [ "$instance" != "3306" ] +# then +# mysqldump -P $instance --opt --all-databases -u mysqladmin -p$mysqladminpasswd > /home/backup/mysql.$instance.bak +# fi +#done +# +#IFS=$old_IFS + +# Dump PostgreSQL +# su - postgres -c "pg_dumpall > ~/pg.dump.bak" +# mv ~postgres/pg.dump.bak /home/backup/ + +# Exemple de backups... +# On sauvegarde les tables d'une base sauf des exceptions +# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -t 'TABLE1' -t 'TABLE2' BASE +# On sauvegarde uniquement certaines tables d'une base +# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -T 'TABLE1' -T 'TABLE2' BASE + +# Dump MBR / table partitions +#dd if=/dev/sda of=/home/backup/MBR bs=512 count=1 2>&1 | egrep -v "(records in|records out|512 bytes)" +#sfdisk -d /dev/sda > /home/backup/partitions 2>&1 | egrep -v "(Warning: extended partition does not start at a cylinder boundary|DOS and Linux will interpret the contents differently)" + +# Dump routes +#traceroute -n 8.8.8.8 > /home/backup/traceroute-8.8.8.8 +#mtr -r 8.8.8.8 > /home/backup/mtr-8.8.8.8 +#traceroute -n backup.evolix.net > /home/backup/traceroute-backup.evolix.net +#mtr -r backup.evolix.net > /home/backup/mtr-backup.evolix.net +#traceroute -n www.evolix.fr > /home/backup/traceroute-www.evolix.fr +#mtr -r www.evolix.fr > /home/backup/mtr-www.evolix.fr +#traceroute -n www.evolix.net > /home/backup/traceroute-www.evolix.net +#mtr -r www.evolix.net > /home/backup/mtr-www.evolix.net + + +HOSTNAME=$(hostname) + +DATE=$(/bin/date +"%d-%m-%Y") + +DEBUT=$(/bin/date +"%d-%m-%Y ; %H:%M") + +########## LOCK ##################### +if [ ! -s /etc/evobackup/lock ]; then + echo mail > /etc/evobackup/lock +else + echo -e "La sauvegarde est bloquee (cf fichier lock)" | mail -s "[Sauvegarde] Sauvegarde mail non effectuee" $MAIL + exit 1 +fi +##################################### + +if [ $SYSTEME = "linux" ]; then + rep="/bin /boot /lib /opt /sbin /usr" +else + rep="/bsd /bin /boot /sbin /usr" +fi + +rsync -av --delete --force --ignore-errors \ + --exclude "lost+found" \ + --exclude ".nfs.*" \ + --exclude "/var/log" \ + --exclude "/var/log/evobackup*" \ + --exclude "/var/lib/mysql" \ + --exclude "/var/lib/postgres" \ + --exclude "/var/lib/sympa" \ + --exclude "/var/lib/metche" \ + --exclude "/var/run" \ + --exclude "/var/lock" \ + --exclude "/var/state" \ + --exclude "/var/apt" \ + --exclude "/var/cache" \ + --exclude "/usr/src" \ + --exclude "/usr/doc" \ + --exclude "/usr/share/doc" \ + --exclude "/usr/obj" \ + --exclude "dev" \ + --exclude "/var/spool/postfix" \ + --exclude "/var/lib/amavis/amavisd.sock" \ + --exclude "/var/lib/munin/munin-update.stats.tmp" \ + --exclude "/var/lib/php5" \ + --exclude "/var/spool/squid" \ + $rep \ + /etc \ + /root \ + /var \ + /home \ + /srv \ + /vmlinuz \ + /backup/last/ \ + | tail -20 >> /var/log/evobackup_local.log + +FIN=$(/bin/date +"%d-%m-%Y ; %H:%M") + +echo "EvoBackup - $HOSTNAME - START $DEBUT" \ + >> /var/log/evobackup_local.log + +echo "EvoBackup - $HOSTNAME - STOP $FIN" \ + >> /var/log/evobackup_local.log + +tail -10 /var/log/evobackup_local.log | \ + mail -s "[info] EvoBackup - Client $HOSTNAME (local)" \ + $MAIL + +########## UNLOCK ################### +echo -n > /etc/evobackup/lock +##################################### + diff --git a/evobackup_verify b/evobackup_verify new file mode 100755 index 0000000..704edba --- /dev/null +++ b/evobackup_verify @@ -0,0 +1,71 @@ +#!/bin/sh + +# Procedure de sauvegarde sur disque USB + +DATE=$(date +"%Y-%m-%d") +MAIL=jdoe@example.com + +# Mounter le disque USB +if [ "$1" = "on" ]; then + + # On verifie que l'on etait bien en idle + STATE=`cat /etc/evobackup/lock` + if [ "$STATE" = "idle" ]; then + mount /backup 2> /dev/null + sleep 2 + else + echo -e "La sauvegarde est bloquee (cf fichier lock)" | mail -s "[erreur] [Sauvegarde] Depart non effectuee" $MAIL + exit 1 + fi + + # On verifie que le montage est bien effectue + if df | grep /backup > /dev/null ; then + echo "Le disque dur USB est pret pour la sauvegarde." | mail -s "[info] EvoBackup - Disque dur USB OK" $MAIL + echo -n > /etc/evobackup/lock + else + echo -e "Le disque USB est mal active ou un probleme logiciel est intervenu.\nVeuillez verifier que les cables USB et alimentation sont correctement branches,\n et que le disque est bien allume (diode orange).\n\nUne fois ces verifications faites, veuillez en informer equipe@evolix.fr\n\nMerci." | mail -s "[erreur] [Sauvegarde] Probleme disque dur USB" $MAIL + echo error > /etc/evobackup/lock + exit 1 + fi + +# Fin de la sauvegarde +elif [ "$1" = "off" ]; then + + # Lock ? + if [ ! -s /etc/evobackup/lock ]; then + + # On verifie que le disque USB est toujours la + if df | grep /backup > /dev/null ; then + + # Copie incrementale + cp -al /backup/last/ /backup/$DATE + + # Suppresion des vieux backups incrementaux + for backupdir in `ls -d /backup/20* | head -n -30`; do + echo "Suppression du backup $backupdir" + rm -rf $backupdir + done | mail -s "[info] EvoBackup - incrementaux" $MAIL + + # On demonte et on passe en idle + umount /backup + echo idle > /etc/evobackup/lock + + # On peut debrancher le disque USB + echo -e "La sauvegarde s'est correctement deroulee.\nBonne journee !" | mail -s "[info] EvoBackup - Debranchement du disque USB" $MAIL + + else + # Si le disque n'est pas monte + echo -e "La sauvegarde n'a pas pu se terminer correctement pour une raison inconnue.\n\nMerci de ne pas debrancher le disque dur USB." | mail -s "[erreur] [Sauvegarde] Fin de sauvegarde non effectuee" $MAIL + + fi + + else + # Si la sauvegarde etait lockee + echo -e "La sauvegarde n'a pas pu se terminer correctement.\nCela est du a une duree trop longue de la sauvegarde ou bien a une erreur logicielle.\nL'administrateur a ete prevenu.\n\nMerci de ne pas debrancher le disque dur USB." | mail -s "[erreur] [Sauvegarde] Fin de sauvegarde non effectuee" $MAIL + exit 1 + fi + +fi + +# vim: set filetype=sh expandtab shiftwidth=4 softtabstop=4 tabstop=4 : + diff --git a/zzz_evobackup b/zzz_evobackup deleted file mode 100644 index 7f1674f..0000000 --- a/zzz_evobackup +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh - -# -# Script evobackup client -# $Id: evobackup_cron_daily_client,v 1.21 2010-08-22 10:15:42 gcolpart Exp $ -# - -# port SSH -SSH_PORT=2228 - -# systeme de la machine ("linux" ou "bsd") -SYSTEME=linux - -# mail de remontee Evolix -MAIL=jdoe@example.com - -NODE=$(expr `date +%d` % 2) - -# operations specifiques - -mkdir -p -m 700 /home/backup - -# Dump LDAP -# slapcat -l /home/backup/ldap.bak - -# Dump MySQL -# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf \ -# --opt --all-databases | gzip --best > /home/backup/mysql.bak.gz - -# for i in $(echo SHOW DATABASES | mysql | grep -v ^Database); \ -# do mkdir -p /home/mysqldump/$i ; chown -R mysql /home/mysqldump ; \ -# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q --opt -T \ -# /home/mysqldump/$i $i; done - -# Dump par base -# mkdir -p -m 700 /home/mysqldump/BASE -# chown -R mysql /home/mysqldump/ -# mysqldump --defaults-extra-file=/etc/mysql/debian.cnf -Q \ -# --opt -T /home/mysqldump/BASE BASE - -# mkdir -p /home/mysqlhotcopy/ -# mysqlhotcopy BASE /home/mysqlhotcopy/ - -# Dump instanceS MySQL -#oldIFS=$IFS -#IFS=$'\n' -# -## Recherche du mot de passe mysqladmin -#mysqladminpasswd=`cat /root/.my.cnf |grep -m1 'password = .*' |cut -d" " -f3` -# -## Determination des instances MySQL disponibles sur le serveur (hors 3306) -#for instance in `cat /etc/mysql/my.cnf |grep "port\s*=\s\d*"` -#do -# instance=${instance// /} -# instance=${instance// /} -# instance=${instance//port=/} -# if [ "$instance" != "3306" ] -# then -# mysqldump -P $instance --opt --all-databases -u mysqladmin -p$mysqladminpasswd > /home/backup/mysql.$instance.bak -# fi -#done -# -#IFS=$old_IFS - -# Dump PostgreSQL -# su - postgres -c "pg_dumpall > ~/pg.dump.bak" -# mv ~postgres/pg.dump.bak /home/backup/ - -# Exemple de backups... -# On sauvegarde les tables d'une base sauf des exceptions -# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -t 'TABLE1' -t 'TABLE2' BASE -# On sauvegarde uniquement certaines tables d'une base -# pg_dump -p 5432 -h 127.0.0.1 -U USER --clean -F t --inserts -f /home/backup/pg-backup.tar -T 'TABLE1' -T 'TABLE2' BASE - -# Dump MBR / table partitions -# dd if=/dev/sda of=/home/backup/MBR bs=512 count=1 2>&1 | egrep -v "(records in|records out|512 bytes)" -# sfdisk -d /dev/sda > /home/backup/partitions 2>&1 | egrep -v "(Warning: extended partition does not start at a cylinder boundary|DOS and Linux will interpret the contents differently)" - -# Dump routes -# traceroute -n 8.8.8.8 > /home/backup/traceroute-8.8.8.8 -# mtr -r 8.8.8.8 > /home/backup/mtr-8.8.8.8 -# traceroute -n backup.evolix.net > /home/backup/traceroute-backup.evolix.net -# mtr -r backup.evolix.net > /home/backup/mtr-backup.evolix.net -# traceroute -n www.evolix.fr > /home/backup/traceroute-www.evolix.fr -# mtr -r www.evolix.fr > /home/backup/mtr-www.evolix.fr -# traceroute -n www.evolix.net > /home/backup/traceroute-www.evolix.net -# mtr -r www.evolix.net > /home/backup/mtr-www.evolix.net - - -HOSTNAME=$(hostname) - -DATE=$(/bin/date +"%d-%m-%Y") - -DEBUT=$(/bin/date +"%d-%m-%Y ; %H:%M") - -if [ $SYSTEME = "linux" ]; then - rep="/bin /boot /lib /opt /sbin /usr" -else - rep="/bsd /bin /boot /sbin /usr" -fi - -rsync -av --delete --ignore-errors \ - --exclude "lost+found" \ - --exclude ".nfs.*" \ - --exclude "/var/log" \ - --exclude "/var/log/evobackup*" \ - --exclude "/var/lib/mysql" \ - --exclude "/var/lib/postgres" \ - --exclude "/var/lib/sympa" \ - --exclude "/var/run" \ - --exclude "/var/lock" \ - --exclude "/var/state" \ - --exclude "/var/apt" \ - --exclude "/var/cache" \ - --exclude "/usr/src" \ - --exclude "/usr/doc" \ - --exclude "/usr/share/doc" \ - --exclude "/usr/obj" \ - --exclude "dev" \ - --exclude "/var/spool/postfix" \ - --exclude "/var/lib/amavis/amavisd.sock" \ - --exclude "/var/lib/munin/munin-update.stats.tmp" \ - --exclude "/var/lib/php5" \ - --exclude "/var/spool/squid" \ - $rep \ - /etc \ - /root \ - /var \ - /home \ - /srv \ - /vmlinuz \ - -e "ssh -p $SSH_PORT" \ - root@node$NODE.backup.example.com:/var/backup/ \ - | tail -20 >> /var/log/evobackup.log - -FIN=$(/bin/date +"%d-%m-%Y ; %H:%M") - -echo "EvoBackup - $HOSTNAME - START $DEBUT" \ - >> /var/log/evobackup.log - -echo "EvoBackup - $HOSTNAME - STOP $FIN" \ - >> /var/log/evobackup.log - -tail -10 /var/log/evobackup.log | \ - mail -s "[info] EvoBackup - Client $HOSTNAME" \ - $MAIL