#!/bin/bash

#########################################################
#                                                       #
#           Backup FTP pour serveur OVH                 #
#                GNU/Linux Red Hat 7.2                  #
#                       NCFTP                           #
#               Auteur: Simon Leblanc                   #
#    inspire du script de daniel Polli aka Dansteph     #
#                                                       #
#########################################################

#########################################################
# PARAMETRES                                            #
#########################################################
SERVER=""                                       # Adresse du serveur FTP de backup
USER=""                                         # Nom d'utilisateur du serveur FTP de backup
PASS=""                                         # Mot de passe du serveur FTP de backup
SQLUSER=""                                      # Nom d'utilisateur du serveur MySQL
SQLPASS=""                                      # Mot de passe du serveur MySQL
EMAIL=""                                        # Adresse mail pour l'envoie du resultat
SAVEDIR="/home"                                 # Repertoire a sauvegarder
SAVEDIR1="/usr/local/apache/conf"               # Repertoire a sauvegarder
SAVEDIR2="/var/named"                           # Repertoire a sauvegarder
SAVEDIR3=""                                     # Repertoire a sauvegarder
MYSQLDIR="/home/mysql"                          # Repertoire de mysql
EXCLUDEFILE="/home/backup/exclude_file.txt"     # Nom du fichier contenant les repertoires a exclure
TMPDIR="/home/backup/"                          # Nom du repertoire temporaire
FILEDATANAME="backup_files-"                    # Nom du fichier de sauvegarde des fichiers
FILESQLNAME="backup_mysql-"                     # Nom du fichier de sauvegarde des bases SQL
FILEDUMPNAME="backup_dump-"                     # Nom du fichier de sauvegarde des bases SQL
KEEPDATA=60                                     # Nombre de jours durant lesquels les sauvegardes de fichiers sont gardes
KEEPSQL=15                                      # Nombre de jours durant lesquels les sauvegardes de bases SQL sont gardes
NBVERIFJOUR=30                                  # Nombre de jour pendant lesquels on verifie s'il y a des fichiers a supprimer
TODAY=`date +"%Y%m%d"`                          # Date du jour
STARTTIME=`date +"%s"`
#########################################################

#########################################################
# CONSTANTES                                            #
#########################################################
#pour traduire les codes d'erreur de ncftpput en texte
declare -a CDERR
CDERR[1]="Could not connect to remote host."
CDERR[2]="Could not connect to remote host - timed out."
CDERR[3]="Transfer failed."
CDERR[4]="Transfer failed - timed out."
CDERR[5]="Directory change failed."
CDERR[6]="Directory change failed - timed out."
CDERR[7]="Malformed URL."
CDERR[8]="Usage error."
CDERR[9]="Error in login configuration file."
CDERR[10]="Library initialization failed."
CDERR[11]="Session initialization failed."
CDERR[142]="Delai depassé pour la connexion."
#########################################################

#########################################################
# FONCTIONS                                             #
#########################################################
# Fonction d'envoie de fichier
# Appel: ftp_send backup-20061127.tar.gz
ftp_send() {
    FILENAME=$1
    
    ncftpput -m -u ${USER} -p ${PASS} ${SERVER} "/" ${FILENAME}
    RESULT=$?
}

# Fonction d'envoie du fichier sur le serveur FTP
# Appel: send_file -t=files ou send_file -t=mysql
send_file() {
    if [ "$1" = "-t=files" ]
    then
        ftp_send "${TMPDIR}${FILEDATANAME}${TODAY}.tar.gz"
        
    fi
    
    if [ "$1" = "-t=mysql" ]
    then
        ftp_send "${TMPDIR}${FILESQLNAME}${TODAY}.tar.gz"
        ftp_send "${TMPDIR}${FILEDUMPNAME}${TODAY}.gz"
    fi
}

# Fonction de suppression de fichier sur le serveur ftp (indentation impossible a cause du EOF)
# Appel: ftp_delete backup-20061127.tar.gz
ftp_delete() {
echo ${1}
ncftp -u ${USER} -p ${PASS} ${SERVER} << EOF
rm ${1}
close
quit
EOF
}

# Fonction de parcours et suppression des anciens fichier sur le serveur FTP
# Appel: delete_file -t=files ou delete_file -t=mysql
delete_file() {
    if [ "$1" = "-t=files" ]
    then
        DATEBEGIN=`date --date "${TODAY} ${KEEPDATA} days ago" +"%Y%m%d"`
        FILENAME="${FILEDATANAME}"
        for ((i=1; i <= NBVERIFJOUR ; i++))
        do
            DATETODEL=`date --date "${DATEBEGIN} ${i} days ago" +"%Y%m%d"`
            ftp_delete "${FILENAME}${DATETODEL}.tar.gz"
        done
    fi
    
    if [ "$1" = "-t=mysql" ]
    then
        DATEBEGIN=`date --date "${TODAY} ${KEEPSQL} days ago" +"%Y%m%d"`
        FILENAME1="${FILEDATANAME}"
        FILENAME2="${FILEDUMPNAME}"
        for ((i=1; i <= NBVERIFJOUR ; i++))
        do
            DATETODEL=`date --date "${DATEBEGIN} ${i} days ago" +"%Y%m%d"`
            ftp_delete "${FILENAME1}${DATETODEL}.tar.gz"
            ftp_delete "${FILENAME2}${DATETODEL}.tar.gz"
        done
    fi
}

# Fonction de compression des données
# Appel: compress_data -t=files ou compress_data -t=mysql
compress_data() {
    if [ "$1" = "-t=files" ]
    then
        tar cfzX ${TMPDIR}${FILEDATANAME}${TODAY}.tar.gz ${EXCLUDEFILE} ${SAVEDIR} ${SAVEDIR1} ${SAVEDIR2} ${SAVEDIR3}
    fi
    
    if [ "$1" = "-t=mysql" ]
    then
        tar cfz ${TMPDIR}${FILESQLNAME}${TODAY}.tar.gz ${MYSQLDIR}
        mysqldump --user=${SQLUSER} --password=${SQLPASS} --all-databases | gzip > ${TMPDIR}${FILEDUMPNAME}${TODAY}.gz
    fi
}

# Fonction de compression des données
# Appel: clean_file -t=files ou clean_file -t=mysql
clean_file() {
    if [ "$1" = "-t=files" ]
    then
        rm -f ${TMPDIR}${FILEDATANAME}${TODAY}.tar.gz
    fi
    
    if [ "$1" = "-t=mysql" ]
    then
        rm -f ${TMPDIR}${FILESQLNAME}${TODAY}.tar.gz
        rm -f ${TMPDIR}${FILEDUMPNAME}${TODAY}.gz
    fi
}

# Fonction permettatn d'envoyer le mail final
# Appel: 
send_email() {
    if [ "$1" = "-t=files" ]
    then
        FILESIZE=`ls -l ${TMPDIR}${FILEDATANAME}${TODAY}.tar.gz | awk '{print $5}'`
        FILESIZE=$(($FILESIZE/1000000))
        if [ "${RESULT}" != "0" ]; then
            DATE=`date +%H:%M:%S`
            echo "[$0] -->ERREUR: ${CDERR[$RESULT]} à $DATE Backup NON effectué."
            echo "[$0] -->ERREUR: ${CDERR[$RESULT]} à $DATE Backup NON effectué." | mail -s 'ERREUR BACKUP FTP OVH' $EMAIL
        else
            TOTALTIME=$(((`date +%s`-$STARTTIME)/60))
            DATE=`date +%H:%M:%S`
            echo "[$0] -->Fin de backup normal de $SAVEDIR a $DATE.  Durée: $TOTALTIME mn. Taille: $FILESIZE Mb"
        
            echo -e "Backup effectué à $DATE Status: OK\nDurée du backup: $TOTALTIME minutes\nFichier: ${TMPDIR}${FILEDATANAME}${TODAY}.tar.gz transféré avec une taille de $FILESIZE Mb" | mail -s 'BACKUP FTP OVH OK' $EMAIL
        fi
    fi
    
    if [ "$1" = "-t=mysql" ]
    then
        FILESIZE=`ls -l ${TMPDIR}${FILESQLNAME}${TODAY}.tar.gz | awk '{print $5}'`
        FILESIZE=$(($FILESIZE/1000000))
        if [ "${RESULT}" != "0" ]; then
            DATE=`date +%H:%M:%S`
            echo "[$0] -->ERREUR: ${CDERR[$RESULT]} à $DATE Backup NON effectué."
            echo "[$0] -->ERREUR: ${CDERR[$RESULT]} à $DATE Backup NON effectué." | mail -s 'ERREUR BACKUP FTP OVH' $EMAIL
        else
            TOTALTIME=$(((`date +%s`-$STARTTIME)/60))
            DATE=`date +%H:%M:%S`
            echo "[$0] -->Fin de backup normal de $SAVEDIR a $DATE.  Durée: $TOTALTIME mn. Taille: $FILESIZE Mb"
        
            echo -e "Backup effectué à $DATE Status: OK\nDurée du backup: $TOTALTIME minutes\nFichier: ${TMPDIR}${FILESQLNAME}${TODAY}.tar.gz transféré avec une taille de $FILESIZE Mb" | mail -s 'BACKUP FTP OVH OK' $EMAIL
        fi
    fi
}
#########################################################

#########################################################
# SCRIPT                                                #
#########################################################
OPTION=${1}

compress_data ${OPTION}
send_file ${OPTION}
delete_file ${OPTION}
send_email ${OPTION}
clean_file ${OPTION}

exit $RESULT

