#!/bin/bash
DEFAULT_ACTIONS="backup_identifyexistingvolumelistfile select_pickfiles schedule_create compression_run service_stop backup_create service_start upload_upload upload_listexisting backup_limitlisttoactualvolumes retention_pickvolumestodelete upload_delete"

check_option()
{
  if [[ -z "${!3}" ]]; then
    log "Configuration $1 for module $2 missing $4 (option name $3)"
    return 1
  fi
  log "Configuration $1, Module $2: Using value ${!3} as $4"
}

echo "Trying config file ${CONFIG_FILE:="/etc/darbackup/darbackup.conf"}"

if [[ ! -e "${CONFIG_FILE}" ]]; then
  echo "Config file ${CONFIG_FILE} not found, attempting to use default values for everything"
else
  source ${CONFIG_FILE}
fi

echo "Logging to ${LOG_FILE:="/var/log/darbackup.log"}"

log()
{
  echo $(date +"%Y-%m-%d %H:%M:%S") "$@" | tee -a ${LOG_FILE}
}

log_pipe()
{
  while read
  do
    log "${REPLY}"
  done
}

run_timed_command()                                                           
{                                                                             
  log "Running $@"                                                            
  (time $@) 2>&1 | log_pipe                                                   
  if [[ "${PIPESTATUS[0]}" != "0" ]]; then                                    
    log "Command failed, aborting"                                            
    exit 1                                                                    
  fi                                                                          
}         

log_exit()
{
  log "Ending run"
}

if touch ${LOG_FILE} 2>&1 > /dev/null; then
  log "Starting run"  
  trap log_exit EXIT 
else
  echo "Error writing to logfile, aborting"
  exit 1
fi

log "Using base directory ${BASE_DIR:="$(dirname ${CONFIG_FILE})"}"

modules=""
if [[ -d "${BASE_DIR}/modules.d/" ]]; then
  log "Attempting to load modules from ${BASE_DIR}/modules.d/"
  shopt -s nullglob
  for m in ${BASE_DIR}/modules.d/*.sh
  do
    module="$(basename ${m} .sh)"
    log "Loading module ${module} from ${m}"
    source ${m}
    modules="${modules} ${module}"
  done
  log "Loaded modules ${modules}"
else
  log "No directory ${BASE_DIR}/modules.d/, skipping module loading"
fi

if [[ -d "${BASE_DIR}/conf.d/" ]]; then
  log "Attempting to load configurations from ${BASE_DIR}/conf.d/"
  shopt -s nullglob
  for c in ${BASE_DIR}/conf.d/*.conf
  do
    config="$(basename ${c} .conf)"
    log "Loading configuration ${config} from ${c}"
    source ${c}
    
    log "Configuration ${config} will run module actions ${CONFIG_MODULE_ACTIONS:="${DEFAULT_ACTIONS}"}"
    for ma in ${CONFIG_MODULE_ACTIONS}
    do
      module_type="$(echo ${ma} | sed 's/_[a-z]*//')"
      action_name="$(echo ${ma} | sed 's/[a-z]*_//')"
      module_prefix="$(echo ${module_type} | tr '[a-z]' '[A-Z]')"   
      module_type_varname="${module_prefix}_MODULE"
      if [[ -z "${!module_type_varname}" ]]; then
        log "Configuration ${config} wants to use module of type ${module_type} but does not specify which instance of the module to use"
        exit 1
      else
        module_name="${module_type}_${!module_type_varname}"
        log "Configuration ${config} wants to use module ${module_name}, checking if it is loaded"
        if echo "${modules}" | grep -q "${module_name}"; then
          if ${module_name}_check_config ${config}; then
            log "Config check for configuration ${config} module ${module_name} successful"
          else
            log "Config check for configuration ${config} module ${module_name} failed, aborting"
            exit 1
          fi
        else
          log "Module ${module_name} not loaded, aborting"
          exit 1
        fi
      fi
    done
  done
  
  for c in ${BASE_DIR}/conf.d/*.conf
  do
    DAR_OPTIONS=""
    export DAR_OPTIONS
    EXISTING_VOLUMES=""
    export EXISTING_VOLUMES
    BACKUP_VOLUMES_TO_DELETE=""
    export BACKUP_VOLUMES_TO_DELETE
    EXISTING_VOLUME_LIST_FILE=""
    export EXISTING_VOLUME_LIST_FILE
    VOLUME_TYPE=""
    export VOLUME_TYPE
    config="$(basename ${c} .conf)"
    log "Loading configuration ${config} from ${c}"
    source ${c}
    
    log "Configuration ${config} will run module actions ${CONFIG_MODULE_ACTIONS:="${DEFAULT_ACTIONS}"}"
    for ma in ${CONFIG_MODULE_ACTIONS}
    do
      module_type="$(echo ${ma} | sed 's/_[a-z]*//')"
      action_name="$(echo ${ma} | sed 's/[a-z]*_//')"
      module_prefix="$(echo ${module_type} | tr '[a-z]' '[A-Z]')"   
      module_type_varname="${module_prefix}_MODULE"
      module_name="${module_type}_${!module_type_varname}"
      log "Running module ${module_name} action ${action_name}"
      ${module_name}_${action_name}
    done
  done
else
  log "No directory ${BASE_DIR}/conf.d/, nothing to do, exiting"
fi
