#!/bin/sh
########################################################
#script pour des sauvegardes incrementielles pour  SME Server
# sur disque dur USB
# adapté de plusieurs sources
# licence GPL
# jppialasse@pialasse.com
#######################################################

# ce script fait une sauvegarde incrementielle
# dans le repertoire main : une image 1:1 de votre repertoire de sauvegarde
# dans le repertoire backup un dossier par jour contenant les fichiers modifié dans leur version precedente
# ce jour la ou supprimé de la sauvegarde principale

# TODO
# - preverification espace disque  suffisant
# - verification UUID correspond pas au /boot ou au /
# - adapatation en contrib avec pannel
# - systeme de restauration avec pannel
# - declanchement en automatique des que disque USB est detecté

###################################
###################################
#
# variables à adapter
#
###################################
###################################
 
###################################
# UUID
#=====>mets les info de ton disque ici 
# commande blkid pour les obtenir
###################################
UUID="votre-UUID-ici"
#LABEL=''

###################################
# repertoire
# repertoire de montage du disque de sauvegardes sans / final
# de preference ne pas modifier
###################################
repertoire="/sauvegarde"

###################################
# days
#  - garder les fichiers incrementiels $days jours
###################################
days="360"

###################################
# HOSTDOMAIN
#  - Utilisé pour le rapport
###################################
HOSTDOMAIN=$HOSTNAME"."`/sbin/e-smith/db configuration gettype DomainName`

###################################
# mail address for status updates
#  - mail pour envoyer le rapport 
# -- vous pouvez ajouter autant de mail que desiré
# -- séparé les par un espace tou dans les guillemets
# ex MAILADRESS="root admin@$HOSTDOMAIN utilisateur1@domain.nz"
###################################
MAILADDR="admin@$HOSTDOMAIN "

###################################
# directory to backup
# - This is the path to the directory you want to archive
###################################
BACKUPDIR="/"

###################################
# excludes file - contains one wildcard pattern per line of files to exclude
#  - This is a rsync exclude file.  See the rsync man page and/or the
#    example_exclude_file
# on peut ajouter des truc a exclure ici mais ne rien enlever de ce qui est deja la
# au risque de mettre en boucle le rsync
###################################
## NE PAS MODIFIER LES 8 LIGNES SUIVANTES
echo '- '$repertoire'/'>/tmp/exclude_rsync
echo '- /proc/*'>>/tmp/exclude_rsync
echo '- /dev/*'>>/tmp/exclude_rsync
echo '- /sys/*'>>/tmp/exclude_rsync
echo '- /media/*'>>/tmp/exclude_rsync
echo '- /mnt/*'>>/tmp/exclude_rsync
echo '- /tmp/*'>>/tmp/exclude_rsync
echo '- /var/log/*'>>/tmp/exclude_rsync
#exemple de ligne a rajouter
#echo '- /home/e-smith/files/ibays/monibay/**'>>/tmp/exclude_rsync
echo '- /home/e-smith/db/mysql/hourly/*'>>/tmp/exclude_rsync
echo '- /home/e-smith/files/ibays/musiques/**'>>/tmp/exclude_rsync
echo '- /home/e-smith/files/ibays/partages/**'>>/tmp/exclude_rsync





###################################
###################################
#
#         Ne rien modifier aprés
#
###################################
###################################

# pour la suite ... le fichier exclude
EXCLUDES="/tmp/exclude_rsync"
#repertoire racine de sauvegarde
ARCHIVEROOT=$repertoire"/rsync"
#directory which holds our current datastore
CURRENT=main
#backup dir
backdir=backup
# directory which we save incremental changes to
INCREMENTDIR=`date +%Y-%m-%d`

# options to pass to rsync
OPTIONS="--force --ignore-errors --delete --delete-excluded \
 --exclude-from=$EXCLUDES --backup --backup-dir=$ARCHIVEROOT/$backdir/$INCREMENTDIR -av"

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin



# our actual rsyncing function
do_rsync()
{
    # make sure our backup tree exists
    mkdir -p $ARCHIVEROOT
    install -d $ARCHIVEROOT/$CURRENT
    install -d $ARCHIVEROOT/$backdir
   echo "debut rsync"
   # -n dry run
   # version classique
   cat /tmp/exclude_rsync
   echo " rsync $OPTIONS  $BACKUPDIR $ARCHIVEROOT/$CURRENT"
   rsync $OPTIONS  $BACKUPDIR $ARCHIVEROOT/$CURRENT  >/tmp/rsyncfiles   
   # version rsync via ssh d'un serveur distant, clefs  ssh échangées entre les deux serveurs devant être installée correctement
   #rsync $OPTIONS  -e "ssh -l root" root@domaine.com:$BACKUPDIR $ARCHIVEROOT/$CURRENT  >/tmp/rsyncfiles
   #  ssh avec clef seulement copiée
   #rsync $OPTIONS  -e "ssh -i ~/.ssh/root@domaine.fr.rsa" root@domaine.com:$BACKUPDIR $ARCHIVEROOT/$CURRENT  >/tmp/rsyncfiles
   echo "fin rsync"
}

# our post rsync accounting function
do_accounting()
{
   echo "do_accounting"
   echo "do_accounting" >>/tmp/rsync_script_tmpfile
   echo "Backup Accounting for Day $INCREMENTDIR on $HOSTDOMAIN:">/tmp/rsync_script_tmpfile
   echo >> /tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo " du -s $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile"
   du -s $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo "état du disque $disque" >>/tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo "df /sauvegarde >>/tmp/rsync_script_tmpfile"
   df /sauvegarde >>/tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo "fichiers pris en compte ce jour">>/tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo "cat /tmp/rsyncfiles  >>/tmp/rsync_script_tmpfile"
   cat  /tmp/rsyncfiles  >>/tmp/rsync_script_tmpfile
   echo "################################################">>/tmp/rsync_script_tmpfile   
   echo "dossiers backup purgés ce jour $ARCHIVEROOT/$backdir">>/tmp/rsync_script_tmpfile
   cat /tmp/rsync_script_purge >>/tmp/rsync_script_tmpfile
   rm /tmp/rsync_script_purge
   echo "################################################">>/tmp/rsync_script_tmpfile
   echo "Mail $MAILADDR -s $HOSTDOMAIN Backup Report < /tmp/rsync_script_tmpfile"
   Mail $MAILADDR -s "$HOSTDOMAIN SSH Backup Report" < /tmp/rsync_script_tmpfile
   echo "rm /tmp/rsync_script_tmpfile"
   rm /tmp/rsync_script_tmpfile
}

# purger les fichiers trop anciens de plus de $days jours
do_purge()
{
 echo "">/tmp/rsync_script_purge
 # on cherche les dossier backup plus ancien que 360 jour sans les sous dossier different du rep 
 # de sauvegarde principal pour effacer
 echo $ARCHIVEROOT/$backdir
 nice find $ARCHIVEROOT/$backdir -type d -mtime +"$days" -maxdepth 1 ! -iname $CURRENT|xargs rm -fr >/tmp/rsync_script_purge

}

#sub pour monter le disque de sauvegarde  et verifier qu'il est connecté
do_mount()
{
# si le dossier pour monter existe aps on le cree
if [ ! -e $repertoire ] 
then 
mkdir $repertoire
fi

connected=$(blkid -t UUID=$UUID)
# si utilisation du LABEL modifier le script 
# en replacant "UUID=" par "LABEL=" , "$UUID" par "$LABEL" et le switch "-U" par "-L"
if [ -z "$connected" ] # pas connecté
         then
              echo "$UUID : pas connecté"
	      Mail $MAILADDR -s "$HOSTDOMAIN Backup: disque absent"	      
	      exit 1

         else #connecté
             disque=$(blkid -t UUID=$UUID |cut -f1 -d:)
             #mounted=$(mount|grep "$device on $repertoire")
             mounted=$(mount|grep "$disque on $repertoire")
	     if  [ -z "$mounted" ] # pas monté
                 then
                      # UUID pas supporté pour vfat
                      #monter=$(mount -U $UUID  $montage -o pamconsole,exec,noauto,managed)
                      monter=$(mount $disque -t auto  $repertoire -o pamconsole,exec,noauto,managed)
                      echo "on monte le disque"
		      #echo $monter
		      # ne retourne rien meme en cas d'echec pfff
		     #remounted=$(mount|grep "$device on $montage")
		     remounted=$(mount|grep "$disque on $montage")
            	      if  [ -z "$remounted" ] # pas monté
                        then
			echo "echec montage : $UUID ,sauvegarde non réalisée"
			exit 1
			fi
		      #if [ -n "$monter" ]
                      #   then
                      #       echo "echec montage : $UUID"
                    #	    exit 1
		     # fi
                 else   #monté
                     echo "$UUID : déjà monté rien à faire"
             fi # fin pas monté
      fi # fin pas connecté
# fin du script de montage
}

# sub pour demonter le disque de sauvegarde
do_umount()
{
echo "on demonte le disque"
umount -f $repertoire
}



do_mount
if [ -f $EXCLUDES ]; then
 if [ -d $BACKUPDIR ]; then
  # now the actual transfer
 do_purge 
 do_rsync && do_accounting
# echo "tout va bien"
 else
  echo "cant find $BACKUPDIR"; exit
 fi
 else
  echo "cant find $EXCLUDES"; exit
fi
do_umount
