#!/bin/sh # # Script evobackup client # $Id: evobackup_cron_daily_client,v 1.21 2010-08-22 10:15:42 gcolpart Exp $ # # lang = C pour gerer les outputs en anglais LANGUAGE=C LANG=C # Verification qu'un autre evobackup n'est pas deja lance PIDFILE=/var/run/evobackup.pid if [ -e $PIDFILE ]; then # Killing the childs of evobackup. for pid in $(ps h --ppid $(cat $PIDFILE) -o pid | tr -s '\n' ' '); do kill -9 $pid; done # Then kill the main PID. kill -9 $(cat $PIDFILE) echo "$0 tourne encore (PID `cat $PIDFILE`). Processus killé" >&2 fi echo "$$" > $PIDFILE trap "rm -f $PIDFILE" EXIT # port SSH SSH_PORT=2228 # systeme de la machine ("linux" ou "bsd") SYSTEME=linux # mail de remontee 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 --force --events --hex-blob | gzip --best > /home/backup/mysql.bak.gz # Dump des BDD en .sql.gz # mkdir -p /home/mysqldump/ # for i in $(mysql -e 'show databases' -s --skip-column-names | egrep -v "^(Database|information_schema|performance_schema)"); do # mysqldump --force --events --hex-blob $i | gzip --best > /home/mysqldump/${i}.sql.gz # done # for i in $(echo SHOW DATABASES | mysql | egrep -v "^(Database|information_schema|performance_schema)" ); \ # do mkdir -p /home/mysqldump/$i ; chown -RL mysql /home/mysqldump ; \ # mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --force -Q --opt --events --hex-blob --skip-comments -T \ # /home/mysqldump/$i $i; done # Dump par base # mkdir -p -m 700 /home/mysqldump/BASE # chown -RL mysql /home/mysqldump/ # mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --force -Q \ # --opt --events --hex-blob --skip-comments -T /home/mysqldump/BASE BASE # mkdir -p /home/mysqlhotcopy/ # mysqlhotcopy BASE /home/mysqlhotcopy/ # Dump instanceS MySQL # ## 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) #grep -E "^port\s*=\s*\d*" /etc/mysql/my.cnf |while read instance; do # instance=$(echo $instance |tr -d '\t') # instance=${instance// /} # instance=${instance//port=/} # if [ "$instance" != "3306" ] # then # mysqldump -P $instance --opt --all-databases --hex-blob -u mysqladmin -p$mysqladminpasswd > /home/backup/mysql.$instance.bak # fi #done # 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 MongoDB # Creation d'un utilisateur en lecture seule : # > use admin # > db.addUser("mongobackup", "PASS", true); #mongodump -u mongobackup -pPASS -o /home/backup/mongodump/ >/dev/null 2>&1 |grep -v "^connected to:" # Dump Redis # cp /var/lib/redis/dump.rdb /home/backup/ ## Dump ElasticSearch ## Disable ES translog flush #curl -s -XPUT 'localhost:9200/_settings' -d '{"index.translog.disable_flush": true}' >/dev/null ## Flushes translog #curl -s 'localhost:9200/_flush' | grep -qe '"ok":true' ## If it succeed, do an rsync of the datadir #if [ $? -eq 0 ]; then # rsync -a /var/lib/elasticsearch /home/backup/ #else # echo "Error when flushing ES translog indexes." #fi ## In any case re-enable translog flush #curl -s -XPUT 'localhost:9200/_settings' -d '{"index.translog.disable_flush": false}' > /dev/null # 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 for addr in 8.8.8.8 backup.evolix.net www.evolix.fr www.evolix.net; do mtr -r $addr > /home/backup/mtr-${addr} traceroute -n $addr > /home/backup/traceroute-${addr} done # Dump des processus ps aux >/home/backup/ps.out # Dump des connexions reseaux en cours netstat -taupen >/home/backup/netstat.out # Liste des paquets installes dpkg -l >/home/backup/packages 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 -avzh --stats --delete --delete-excluded --force --ignore-errors --partial \ --exclude "lost+found" \ --exclude ".nfs.*" \ --exclude "/var/log" \ --exclude "/var/log/evobackup*" \ --exclude "/var/lib/mysql" \ --exclude "/var/lib/postgres" \ --exclude "/var/lib/postgresql" \ --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/*.tmp" \ --exclude "/var/lib/php5" \ --exclude "/var/spool/squid" \ --exclude "/var/lib/elasticsearch" \ --exclude "/var/lib/amavis/tmp" \ --exclude "/var/lib/clamav/*.tmp" \ --exclude "/home/mysqltmp" \ $rep \ /etc \ /root \ /var \ /home \ /srv \ -e "ssh -p $SSH_PORT" \ root@node$NODE.backup.example.com:/var/backup/ \ | tail -30 >> /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