#!/bin/bash
######################################################
# Procedure de recuperation interactive de fichier(s)
# depuis les archives de backup.
# 
# Procedure appel
# /root/admin/restore_file [-n]
#   -n flag optionnel d'effacement de /mnt/bu /restore
#
# Une fois la procedure terminee, le fichier demande
# est dans /mnt/bu/restore
#
# Si les repertoires /mnt/bu/ztmp et
#                    /mnt/bu/restore
# n'existent pas, ils sont crees.
#
# Sous-programmes specifiques utilises
#   searchstring   Recherche chaines dans fichiers
#   sec-to_time    Calcul duree execution
#
######################################################

# Definition du support de sauvagarde
DEST="/dev/sdb2"

# Definition des repertoires racines
BACK="/mnt/bu"

# Definition des parametres de travail
RESTORE_DIR="/mnt/bu/restore"
RESTORE_TMP="/mnt/bu/ztmp"
TAR_LIST="file_names.log"
SEARCH_STRING="/root/admin/searchstring"
SEARCH_DIR=""
TAR_RESULT="/tmp/tar_result"
TAR_TEMP_1="/tmp/tar_1"
TAR_TEMP_2="/tmp/tar_2"
TAR_TEMP_3="/tmp/tar_3"
TAR_NAME="/tmp/tar_name"
TAR_HOUR="/tmp/tar_hour"
TAR_YEAR="/tmp/tar_year"
TAR_SIZE="/tmp/tar_size"
TAR_OWN="/tmp/tar_own"

# Variables utiles
ERR=""
START_TIME=""
STOP_TIME=""
FILE_NAME=""

# Localisation site WEB
LWEB="/var/www/"

clear

echo "=> Depart Restore " $(date) $(/root/admin/up_for)
START_TIME=$(date +%s)

# Montage du support de sauvegarde

if [ "$(ls -A $BACK)" ] ; then
  echo "Un device est deja monte : on tente le demontage"
  umount -f $BACK
  if [ $? -eq 1 ] ; then
    echo "Erreur demontage "$(cat /etc/mtab | grep $BACK)" Backup impossible"
    exit
  fi
fi

mount $DEST $BACK
if [ $? -eq 1 ] ; then
  echo "Erreur montage "$DEST
  exit
fi
echo "Etat montage = "$(cat /etc/mtab | grep $DEST)
echo ""

# Verif de la presence des repertoires necessaires
if [ ! -d $RESTORE_DIR ] ; then
  echo "Creation du repertoire "$RESTORE_DIR"
  mkdir $RESTORE_DIR
fi
if [ ! -d $RESTORE_TMP ] ; then
  echo "Creation du repertoire "$RESTORE_TMP"
  mkdir $RESTORE_TMP
fi

# Mise a jour de la base de mlocate
echo -n "Init "$RESTORE_TMP" - "
touch $BACK/ztmp/test ; rm -R $BACK/ztmp/*
until [ $# -eq 0 ] ; do 
  if [ $1 == "-n" ] ; then
    echo -n "Init "$RESTORE_DIR" demandee - "
    touch $RESTORE_DIR/tt
    rm -R $RESTORE_DIR/*
  fi
  shift
done
echo -n "MaJ mlocate - "
updatedb
echo "Fin de la mise a jour !"

ERR=1
while [ $ERR -ne 0 ] ; do
  echo -n " => Nom du fichier a recuperer = "
  read FILE_NAME
  $SEARCH_STRING -s $FILE_NAME -f $TAR_LIST -d | grep ^"  >" | sed 's/  >//' | sort > $TAR_TEMP_1
  $SEARCH_STRING -s $FILE_NAME -f $TAR_LIST -d > $TAR_RESULT
# on regroupe les entetes identiques
  nbr_line=$(cat $TAR_TEMP_1 | wc -l)
  if [ $nbr_line -eq 0 ] ; then
    echo " - Erreur aucun fichier disponible"
  else
    ERR=0
# supprimer tous les espaces multiples
    echo -n "" > $TAR_TEMP_2
    pnt_line=1
    while [ $pnt_line -le $nbr_line ] ; do
      x=$(cat $TAR_TEMP_1 | head -n $pnt_line | tail -n 1)
      echo $x >> $TAR_TEMP_2
      let pnt_line++
    done
    cat $TAR_TEMP_2 | cut -d " " -f 2 > $TAR_OWN
    cat $TAR_TEMP_2 | cut -d " " -f 3 > $TAR_SIZE
    cat $TAR_TEMP_2 | cut -d " " -f 4 > $TAR_YEAR
    cat $TAR_TEMP_2 | cut -d " " -f 5 > $TAR_HOUR
    cat $TAR_TEMP_2 | cut -d " " -f 6 > $TAR_NAME
    paste -d " " $TAR_YEAR $TAR_HOUR $TAR_OWN $TAR_SIZE $TAR_NAME | sort > $TAR_TEMP_1
# regrouper les lignes identiques
    pnt_line=1
    echo -n "" > $TAR_TEMP_2
    while [ $pnt_line -le $nbr_line ] ; do
      x=$(cat $TAR_TEMP_1 | head -n $pnt_line | tail -n 1)
      inc_line=$(cat $TAR_TEMP_1 | grep "$x" | wc -l)
      let pnt_line=pnt_line+inc_line
      echo $(printf "%03d " $inc_line) $x >> $TAR_TEMP_2
    done
  fi     
done

echo "  Rang  Nbr   Date      Heure     Owner "
cat -n $TAR_TEMP_2
tar_min=1
tar_max=$(cat $TAR_TEMP_2 |wc -l)
ERR=1
while [ $ERR -ne 0 ] ; do
  echo -n " -Selection de la ligne du fichier a restorer = "
  read x
  if [ "$(echo $x  | grep "^[ [:digit:] ]*$")" ] ; then
    if [ $x -le $tar_max ] && [ $x -ge $tar_min ] ; then
      cat $TAR_TEMP_2 | head -n $x | tail -n 1
      echo -n " - Est-ce le bon fichier (Y/N) = "
      read yn
      if [ ${yn^^} == "Y" ] ; then
        ERR=0
        ftbr=$(cat $TAR_TEMP_2 | head -n $x | tail -n 1)
      fi
    else
      echo " - Erreur numero de ligne hors limites"
    fi
  else
    echo " - Erreur numero de ligne non numerique"
  fi
done
echo " - Debut de restore"
echo "   - Recherche du fichier dans les archives"
# 006 2012-12-21 11:12 www-data/users 3911 /home/root/www/www/docs/scripts/searchstring
# memoriser les parametres de selection
tar_own=$(echo $ftbr  | cut -d " " -f 4)
tar_size=$(echo $ftbr | cut -d " " -f 5)
tar_year=$(echo $ftbr | cut -d " " -f 2)
tar_hour=$(echo $ftbr | cut -d " " -f 3)
tar_name=$(echo $ftbr | cut -d " " -f 6)

# compter les x.file_names.log qui contiennent le fichier recherche
ERR=1

while [ $ERR -eq 1 ] ; do
  x01=$(cat $TAR_RESULT | wc -l)
  x02=1
  while [ $x02 -le $x01 ] ; do
    xaa=$(cat $TAR_RESULT | head -n $x02 | tail -n 1)
    echo $xaa | grep ^"==>" > /dev/null
    if [ $? -eq 0 ] ; then
      xdir=$(echo $xaa | cut -d " " -f 10)
#     echo $xdir ; exit
    fi
    echo $xaa | grep ^">" > /dev/null
    if [ $? -eq 0 ] ; then
       xown=$(echo $xaa | cut -d " " -f 3)
      xyear=$(echo $xaa | cut -d " " -f 5)
      xhour=$(echo $xaa | cut -d " " -f 6)
      xname=$(echo $xaa | cut -d " " -f 7)
      xsize=$(echo $xaa | cut -d " " -f 4)
#     echo $xdir $xown $xsize $xyear $xtime $xname ; exit
      x90=0
      [[ $xown == $tar_own ]]   && let x90++
      [[ $xyear == $tar_year ]] && let x90++
      [[ $xhour == $tar_hour ]] && let x90++
      [[ $xname == $tar_name ]] && let x90++
      [[ $xsize == $tar_size ]] && let x90++
      if [ $x90 -eq 5 ] ; then
        ERR=0
        let x02=x01
      fi
    fi
  let x02++
  done
done

# aller dans le repertoire pointe par $xdir
echo $xdir | grep daily > /dev/null
[[ $? -eq 0 ]] && cd $BACK/daily
echo $xdir | grep weekly > /dev/null
[[ $? -eq 0 ]] && cd $BACK/weekly
echo $xdir | grep monthly > /dev/null
[[ $? -eq 0 ]] && cd $BACK/monthly

# recuperer le nom du fichier tar
xtar=$(echo $xdir | cut -d "/" -f 5 | cut -d "." -f 1).tar.gz

# vider les repertoires de restore et copier l'archive
echo "   - Copie de "$xtar
cp $xtar $BACK/ztmp/
echo "   - Decompression de "$xtar
cd $BACK/ztmp
gunzip $xtar
echo "   - Eclatement du fichier tar"
tar -xvvf * > ./liste_tar.log
#
echo "   - Copie de "$tar_name" dans "$BACK/restore
echo "   - Liste des fichiers disponibles dans "$BACK/ztmp" dans liste.tar.log"
cp -a ./$tar_name $BACK/restore
cd $BACK/restore
echo "Contenu de "$BACK/restore
ls -l
echo ""
echo "Duree restore "$(/root/admin/sec_to_time $START_TIME $(date +%s))
echo "==================> Fin de restore =================="
echo ""

