#!/bin/bash -e

# ./restore.sh 202webSiteParametersSetup.sh CT202-containerBackup-20230220-164100.tar.lzo
# ./restore.sh 206ldapParametersSetup.sh CT206-containerBackup-20230221-090655.tar.lzo

#
# restore.sh
#
# Verifica le pre-condizioni necessarie al corretto ripristino del servizio. 
#

#
# Parametri
#
# specificParametersSetup:
#               nome dello script che imposta i parametri specifici
#               del servizio.
#
# containerBackupName:
#               nome del file che contiene il backup del container da
#               ripristinare
#
# serviceName:  nome del servizio interessato dal restore
#               Impostato dallo script di set up dei parametri specifico
#               del servizio.
#
# container:    identificativo del container che eroga il servizio.
#               Impostato dallo script di set up dei parametri specifico
#               del servizio.
#
# pathOfData:   path dell'area dati gestita dal servizio, se presente;
#               "NULL" altrimenti.
#               Impostato dallo script di set up dei parametri specifico
#               del servizio.
#
# e_mailAddress:
#               indirizzo di posta elettronica al quale inviare i report
#               relativi ai backup e ai restore.
#               Impostato dallo script di set up dei parametri specifico
#               del servizio.
#

########################################################################
#
# Predispone l'ambiente di esecuzione
#

#
# Attenzione!!!!
#    la variabile pmxBackupRestorePath e' valorizzata all'interno
#    del file /etc/profile
#

# Importa le variabili di ambiente
source /etc/profile

# Importa la definizione delle costanti simboliche
source $pmxBackupRestorePath/scripts/symbolicConstantsSetup.sh

# Importa la definizione delle utilities
source "$UTILITIES"

# Importa la definizione dei messaggi di log
source "$LOG_MESSAGES"
#
########################################################################

# Controlla che il numero dei parametri sia corretto, in caso contrario
# esce segnalando la condizione d'errore
checkParams $# 2 "$(dateTime) $msgIncorrectParameterNumber \
                                 <specificParametersSetup> \
                                 <containerBackupName>"
                                
# Inizializza la variabile mnemonica per il nome dello script di
# setup dei parametri specifico del servizio
specificParametersSetup=$1

# Inizializza la variabile mnemonica per il nome del file che
# contiene il backup del container da ripristinare
containerBackupName=$2

# Forma il path assoluto del file di setup dei parametri per il servizio
specificParametersSetupPath="$pmxBackupRestorePath/parametersSetup/$specificParametersSetup"

# Controlla se il file di setup dei parametri per il servizio è presente,
# in caso contrario esce segnalando la condizione d'errore
checkFileExistence "$specificParametersSetupPath" \
                   "$(dateTime) $msgNoSuchParametersFile: $specificParametersSetupPath"
                   
# Importa la definizione dei parametri specifici del backup
# del servizio
source "$specificParametersSetupPath"

# Debug
container=800
                   
# Verifica se il container esiste, nel caso esce
# segnalando la condiizone d'errore
checkContainerExistence "$container" \
                   "$(dateTime) $msgContainerMustBeRemoved"

# Debub
container=202

# Nel caso, controlla se il file che contiene il backup
# dell'area dati è presente
if test "$pathOfData" != "NULL"
then
   # Costruisce il nome del file di backup dell'area dati

   # Estrae dal nome del file che contiene il backup del container da
   # ripristinare l'istante in cui è stato effettuato il backup
   # seguito dall'estensione .tar.lzo
   restoreTimeAndExtension=$(echo $containerBackupName | cut -d'-' -f3,4)
   
   # Forma il nome del file di backup dell'area dati
   dataBackupName="CT$container-dataBackup-$restoreTimeAndExtension"
   
   # Forma il path assoluto del file di backup dell'area dati
   dataBackupAbsolutePath=$PATH_OF_DATA_BACKUPS/$dataBackupName
   
   # Controlla se il file che contiene il backup dell'area dati
   # è correttamente specificato
   checkFileExistence "$dataBackupAbsolutePath" \
                      "$(dateTime) $msgNoSuchDataBackupFile"
fi

# Forma il path assoluto del file che contiene il backup del container
# da ripristinare
containerBackupAbsolutePath=$PATH_OF_CONTAINER_BACKUPS/$containerBackupName

# Controlla se il file che contiene il backup del container
# da ripristinare è correttamente specificato
checkFileExistence "$containerBackupAbsolutePath" \
                   "$(dateTime) $msgNoSuchContainerBackupFile"

# Debug
# container=203

# Controlla se il container specificato nel file dei parametri specifici
# del servizio e quello nel nome del backup coincidono, in caso contrario
# esce segnalando la condizione di errore
checkForContainerMatch "$containerBackupName" \
                       "$container" \
                       "$(dateTime) $msgNotMatchingContainers"                

# Assegna alla variabile caller il proprio nome
caller=$(basename $0)
            
# Cattura l'istante di inizio del restore da utilizzarsi nella formazione
# dei nomi dei file per questo utilizzati 
restoreTime=$(date +"%Y%m%d-%H%M%S")

# Forma il nome del file di log per il restore
logFileName="CT$container-restoreLogFile-$restoreTime.txt"

# Forma il path assoluto del file di backup
logFilePath=$PATH_OF_LOGS/$logFileName

# Traccia l'ingresso nello script
appendToLog "$restoreTime $msgIntoTheScript" \
            "$logFilePath"

# Traccia il path del file di log
appendToLog "$(dateTime) \
             $msgLogFilePath \
             $logFilePath" \
            "$logFilePath"

# Traccia il path del file che contiene il backup del container
# da ripristinare
appendToLog "$(dateTime) $msgContainerBackupPath \
             $containerBackupAbsolutePath" \
            "$logFilePath"

# Gestisce la presenza o l'assenza dell'area dati
if test "$pathOfData" = "NULL"
then
   # Traccia l'assenza dell'area dati
   appendToLog "$(dateTime) $msgNoServiceDataArea" \
               "$logFilePath"
else
   # Traccia il path del file di backup dell'area dati di servizio
   appendToLog "$(dateTime) $msgDataBackupPath \
                $dataBackupAbsolutePath" \
               "$logFilePath"
fi

# Avvia il restore     
$PATH_OF_SCRIPTS/serviceRestore.sh \
                                   "$caller" \
                                   "$serviceName" \
                                   "$container" \
                                   "$pathOfData" \
                                   "$dataBackupAbsolutePath" \
                                   "$containerBackupAbsolutePath" \
                                   "$logFilePath"

# Traccia l'uscita dallo script
appendToLog "$(dateTime) $msgOutOfTheScript" \
            "$logFilePath"

# Invia per posta elettronica il file di log del backup
# all'indirizzo servicesbackup.iasi@iasi.cnr.it
#mail -s "Restore $serviceName - $(dateTime)" \
#        "servicesbackup.iasi@iasi.cnr.it" \
#        < \
#        "$PATH_OF_LOGS/$logFileName"
           
# Invia per posta elettronica il file di log del backup
# all'indirizzo servicesbackup.iasi@iasi.cnr.it
mail -s "Restore $serviceName - $(dateTime)" \
        "$e_mailAddress" \
        < \
        "$PATH_OF_LOGS/$logFileName"
exit
