Skip to content
Snippets Groups Projects
Select Git revision
  • 8952e09c942fb06ff7323fc34e43527e45558182
  • master default protected
  • srv
  • github
  • 1.0
5 results

backup_nocloud.sh

Blame
  • user avatar
    David Beniamine authored
    8952e09c
    History
    backup_nocloud.sh 6.86 KiB
    #!/bin/bash
    #
    
    # Copyright (C) 2017  Tetras Libre <admin@tetras-libre.fr>
    # Author: Beniamine, David <David.Beniamine@tetras-libre.fr>
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    
    # If $1 is not 0, exit with message $2
    test_and_fail(){
        if [ $1 -ne 0 ]
        then
            echo "Echec de la sauvegarde : '$2'"
            sync
            umount -f $dev
            exit $1
        fi
    }
    
    # Retourne le premier element
    premier(){
        echo $1
    }
    
    # Supprime la sauvegarde la plus ancienne
    supprimer_anciennes_sauvegardes(){
        dir=`premier \`/bin/ls $dest/.. | grep $postfix \``
        [ -z "$dir" ] && return 1
        do_log "Plus de place suppression de la sauvegarde la plus ancienne: $dir"
        rm -rf $dest/../$dir
    }
    
    do_log(){
        echo "Sauvegarde NoCloud - $@"
    }
    
    sauvegarde_serveur(){
        if $mysql
        then
            do_log "Sauvegarde mysql"
            mysqldump --events --single-transaction --flush-logs --all-databases \
                | gzip > /root/db.sql.gz
            test_and_fail $? "Impossible de sauvegarde la base de donnée mysql"
        fi
        if $postgres
        then
            do_log "Sauvegarde postgresql"
             sudo -u postgres pg_dumpall > /root/pg_dump.sql
            test_and_fail $? "Impossible de sauvegarde la base de donnée postgresql"
             gzip /root/pg_dump.sql
         fi
        if $gitlab
        then
            # the backup should be in /var/opt/gitlab/backups thus in srv_directories
            do_log "Creation de la sauvegarde gitlab"
            /usr/bin/gitlab-rake $voptminus gitlab:backup:create
            backup_path=`grep "'backup_path'" /etc/gitlab/gitlab.rb  | sed 's/^.*= "\(.*\)"$/\1/'`
            if [ -d "$backup_path" ]
            then
                /bin/ls -dt $backup_path/* | tail -n +11 | xargs rm -rf
            fi
        fi
        do_log "Creation de l'archive configuration serveur"
        tar czf$vopt $dest/serveur.tgz $srv_directories
    }
    
    sauvegarde_donnees(){
        cp $voptminus -r /home $dest/Donnees
    }
    
    sauvegarde_seafile(){
        # On sauvegarde le contenu des bibliothèques
        echo "Sauvegarde - Contenu Seafile"
        if [ ! -d /mnt/seafile-fuse ] ; then mkdir /mnt/seafile-fuse ; fi
        # Demonte le dossier si file au cas ou le dernier backup l'ait laisse dans un drole d'etat
        fusermount -zu /mnt/seafile-fuse
        /srv/$seafile/seafile-server-latest/seaf-fuse.sh start /mnt/seafile-fuse
        /usr/bin/rsync -rtv --exclude 'seafile-data/storage' --modify-window=2 /mnt/seafile-fuse/ /$dest/contenus_seafile/
        /bin/sync
        /srv/$seafile/seafile-server-latest/seaf-fuse.sh stop
    }
    
    usage(){
        echo "Utilisation $0 [options] device"
        echo "Device doit etre un disque non monte"
        echo "Options"
        echo "  -h | --help             Affiche cette aide et quitte"
        echo "  -v | --verbose          Active le mode verbeux"
        echo "  -d | --data             Sauvegarde les donnees (/home)"
        echo "  -p | --postgresql       Sauvegarde postgresql (implique --config)"
        echo "  -m | --mysql            Sauvegarde mysql (implique --config)"
        echo "  -c | --config           Sauvegarde le serveur ($srv_directories)"
        echo "  -g | --gitlab           Sauvegarde gitlab (implique --config)"
        echo "  -u | --unifi            Sauvegarde unifi (/var/lib/unifi, implique --config)"
        echo "  -s | --seafile  host    Sauvegarde seafile host  (seafile fuse)"
        echo "  -e | --encfs    pass    Use encfs protected directories with given password"
    }
    
    dest=/mnt/backup
    date=`date +%Y-%m-%d_%H-%M-%S`
    postfix=_sauvegarde_`hostname`
    srv_directories="/root /etc /srv /var/www /usr /lib /opt /var/opt"
    data_directories="/home"
    ACTIONS=""
    gitlab=false
    mysql=false
    postgres=false
    encfs=false
    
    # Transform long options to short ones
    for arg in "$@"; do
      shift
      set -- "$@" `echo $arg | sed 's/^-\(-.\).*$/\1/'`
    done
    optspec=":hvdcgus:mpe:"
    while getopts "$optspec" optchar; do
        case "${optchar}" in
            h)
                usage
                exit 0
                ;;
            v)
                vopt="v"
                voptminus="-v"
                ;;
            d)
                ACTIONS+="\nsauvegarde_donnees"
                ;;
            c)
                ACTIONS+="\nsauvegarde_serveur"
                ;;
            g)
                ACTIONS+="\nsauvegarde_serveur"
                gitlab=true
                ;;
            u)
                ACTIONS+="\nsauvegarde_serveur"
                srv_directories+=" /var/lib/unifi"
                ;;
            s)
                seafile="$OPTARG"
                ACTIONS+="\nsauvegarde_seafile"
                ;;
            m)
                mysql=true
                ACTIONS+="\nsauvegarde_serveur"
                ;;
            p)
                postgres=true
                ACTIONS+="\nsauvegarde_serveur"
                ;;
            e)
                encfs=true
                ENCPASS="$OPTARG"
                ;;
            *)
                echo "Option inconnue -$optchar"
                usage
                exit 1
                ;;
        esac
    done
    shift $(($OPTIND - 1))
    ACTIONS=`echo -e $ACTIONS | sort -u | sed /^$/d`
    
    if [ -z "$1" ]
    then
        usage
        test_and_fail 1 "Pas de disque donnée, abandon"
    fi
    # $1 should be an unmounted device like /dev/sdb1
    dev=$1
    
    do_log "démarrage le `date`"
    
    [ ! -d $dest ] && mkdir $dest
    
    /bin/mount -t auto $dev $dest
    test_and_fail $? "Impossible de monter le disque destination, abandon"
    
    if $encfs
    then
        crypted="$dest/crypted"
        encfsmount="$dest/backups"
        encfscmd="/usr/bin/encfs --stdinpass $crypted $encfsmount"
        if [ ! -d $crypted ]
        then
            # First call with --encfs
            rm -rf $encfsmount
            echo -e "y\ny\np\n$ENCPASS\n" | $encfscmd
        else
            echo -e "$ENCPASS\n" | $encfscmd
        fi
        test_and_fail $? "Impossible de monter le coffre chiffré"
        unset ENCPASS
        dest=$encfsmount
    fi
    
    dest=$dest/$date$postfix
    mkdir $dest
    
    for action in $ACTIONS
    do
        $action
        ret=$?
        while [ $ret -ne 0 ]
        do
            if [ `df --output=avail .  | sed 1d` -lt $((1024*1024)) ]
            then
                supprimer_anciennes_sauvegardes
                test_and_fail $? "Plus d'espace sur le disque et pas d'ancienne sauvegarde a supprimer"
                $action
                ret=$?
            else
                test_and_fail 1 "l'action '$action' a planté innopinement"
            fi
        done
        nom=${action/_/ }
        do_log "$nom reussie"
    done
    
    # force sync of files to disk before unmounting
    /bin/sync
    do_log "Resultats de la sauvegarde:"
    du -h -d 1 $dest/
    df -h $dev
    do_log "Demontage du disque veuillez patienter avant de le retirer"
    if $encfs
    then
        fusermount -u $encfsmount
    fi
    umount $dev
    do_log "Sauvegarde terminee le `date`"