#!/bin/sh

DATE="$(date '+%Y%m%d%H%M%S')"
CONF_FILE="/etc/ovirt-engine/engine-autobackup.conf"
LOG="/var/log/ovirt-engine/engine-autobackup.log"

SCOPE=
BACKUP_FILES_DIR=
BACKUP_LOGS_DIR=
MAX_BACKUP_FILES=

log() {
    local m="$1"
    local date="$(date '+%Y-%m-%d %H:%M:%S')"
    local pid="$$"
    printf "%s\n" "${date} ${pid}: ${m}" >> "${LOG}"
}

if [ ! -f "$LOG" ]; then
    touch $LOG
fi

# Read values from configuration file
# otherwise use default value
if [ -s "$CONF_FILE" ]; then
    . $CONF_FILE
else
    log "Cannot find the configuration file of autobackup function. Use default configuration." 
    SCOPE="all"
    BACKUP_FILES_DIR="/var/engine-autobackup/files/"
    BACKUP_LOGS_DIR="/var/engine-autobackup/logs/"
    MAX_BACKUP_FILES=100
fi

# Validate the values
if [ -z "$SCOPE" ]; then
    log "Cannot find the value of SCOPE in the configuration file. Use default value: all"
    SCOPE="all"
elif [ "$SCOPE" != "all" -a "$SCOPE" != "db" ]; then
    log "Wrong value for SCOPE. The value of SCOPE should be all or db. Use default value: all"
    SCOPE="all"
fi

if [ -z "$BACKUP_FILES_DIR" ]; then
    log "Cannot find the value of BACKUP_FILES_DIR in the configuration file. Use default value: /var/engine-autobackup/files/"
    BACKUP_FILES_DIR="/var/engine-autobackup/files/"
elif [ ! -d "$BACKUP_FILES_DIR" ]; then
    log "The $BACKUP_FILES_DIR does not exist. Use default value: /var/engine-autobackup/files/"
    BACKUP_FILES_DIR="/var/engine-autobackup/files/"
fi

if [ -z "$BACKUP_LOGS_DIR" ]; then
    log "Cannot find the value of BACKUP_LOGS_DIR in the configuration file. Use default value: /var/engine-autobackup/logs/"
    BACKUP_LOGS_DIR="/var/engine-autobackup/logs/"
elif [ ! -d "$BACKUP_LOGS_DIR" ]; then
    log "The $BACKUP_LOGS_DIR does not exist. Use default value: /var/engine-autobackup/logs/"
    BACKUP_LOGS_DIR="/var/engine-autobackup/logs/"
fi

if [ -z "$MAX_BACKUP_FILES" ]; then
    log "Cannot find the value of MAX_BACKUP_FILES in the configuration file. Use default value: 100"
    MAX_BACKUP_FILES=100
elif [[ ! $MAX_BACKUP_FILES =~ ^[1-9][0-9]*$ ]]; then
    log "The value of MAX_BACKUP_FILES is not integer. Use default value: 100"
    MAX_BACKUP_FILES=100
fi

# Define the backup filename and log filename
BACKUP_FILENAME="${BACKUP_FILES_DIR}engine-backup-${DATE}.bz2"
BACKUP_LOGNAME="${BACKUP_LOGS_DIR}engine-backup-${DATE}.log"

# If necessary create the default directory
if [ ! -d "$BACKUP_FILES_DIR" ]; then
    mkdir -p "$BACKUP_FILES_DIR"
fi

if [ ! -d "$BACKUP_LOGS_DIR" ]; then
    mkdir -p "$BACKUP_LOGS_DIR"
fi

# Execute backup action
log "Starting backup:"
log "Backup command: engine-backup --scope="$SCOPE" --mode=backup --log="$BACKUP_LOGNAME" --file="$BACKUP_FILENAME""
engine-backup --scope="$SCOPE" --mode=backup --log="$BACKUP_LOGNAME" --file="$BACKUP_FILENAME" | tee -a "$LOG"
log "Backup finished."

# Clean up the old backup files
CURRENT_FILES=`ls "${BACKUP_FILES_DIR}"engine-backup-*.bz2|wc -w`
if [ $CURRENT_FILES -gt $MAX_BACKUP_FILES ]; then
    DELETE_NO=$(( CURRENT_FILES - MAX_BACKUP_FILES ))
    ls "${BACKUP_FILES_DIR}"engine-backup-*.bz2|head -n "$DELETE_NO"|xargs rm -f | tee -a "$LOG"
    log "$DELETE_NO old backup file has been removed."
fi
