#!/bin/bash
# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved.
#
# This script converts guest cron jobs to host ones.

EXAGEAR_ROOT_DIR="$(dirname "$(realpath "${BASH_SOURCE}")")"/../..
EXAGEAR_ROOT_DIR="$(realpath "${EXAGEAR_ROOT_DIR}")"

if [ ! -f "${EXAGEAR_GUEST_CONF}" ] || [ ! -f "${EXAGEAR_CORE_CONF}" ]
then
    echo 'Variables EXAGEAR_GUEST_CONF EXAGEAR_CORE_CONF have to be set.'
    exit 1
fi

. ${EXAGEAR_GUEST_CONF}
. ${EXAGEAR_CORE_CONF}

if [ -z "${EXAGEAR_GUEST_WRAP_MARKER}" ]
then
    echo "Error: variable EXAGEAR_GUEST_WRAP_MARKER is not set. Probably file ${EXAGEAR_GUEST_CONF} is corrupted."
    exit 1
fi

# Check that cron is installed on host, if not then exit
if [ ! -d "/etc/cron.d" ]
then
    exit 0
fi

IMAGE_DIR=${EXAGEAR_ROOT_DIR}/images/${EXAGEAR_IMAGE_NAME}

function copy_crontab {
    local re_rule="$1"
    local ADDED_USERNAME="$2"

    local re_comment='(^[[:space:]]*#)|(^[[:space:]]*$)'
    local re_envvar='^[[:alnum:]]+[[:space:]]*='

    while read; do
        local comment=
        local envvar=
        local rule=

        (echo "$REPLY" | grep -E "$re_comment" > /dev/null) && comment=y
        (echo "$REPLY" | grep -E "$re_envvar" > /dev/null) && envvar=y
        (echo "$REPLY" | grep -E "$re_rule" > /dev/null) && rule=y

        if [ "$comment" == "y" ] || [ "$envvar" == "y" ] ; then
            echo "$REPLY"
        else
            if [ "$rule" != "y" ]; then
                continue;
            fi

            local CONDITION=`echo "$REPLY" | sed -re "s/($re_rule)(.*)/\1/"`
            local ACTION=`echo "$REPLY" | sed -re "s/($re_rule)//"`

            local CMD=
            local STDIN=`echo "$ACTION" | grep -E -o '[^\\]%.*'`
            STDIN=${STDIN:1}

            if [ -z "$STDIN" ] ; then
                CMD="$ACTION"
            else
                CMD=${ACTION:0:$((${#ACTION} - ${#STDIN}))}
            fi
	    printf "%s %s EXAGEAR_CORE_CONF=${EXAGEAR_CORE_CONF} EXAGEAR_GUEST_CONF=${EXAGEAR_GUEST_CONF} ${EXAGEAR_ROOT_DIR}/bin/ubt-wrapper /bin/bash -c %q%s\n"  "${CONDITION}" "${ADDED_USERNAME}" "${CMD}" "${STDIN}"
        fi
    done
}

function update_crontabs {
    rm -f /etc/cron.d/${EXAGEAR_GUEST_WRAP_MARKER}*

    local re_rule_base='^([^[:space:]]+[[:space:]]+)'
    local re_rule_peruser="${re_rule_base}{5}"
    local re_rule_systemwide="${re_rule_base}{6}"

    [ -f "${IMAGE_DIR}/etc/crontab" ] && [ -d "/etc/cron.d" ] && copy_crontab "$re_rule_systemwide" "" < ${IMAGE_DIR}/etc/crontab > /etc/cron.d/${EXAGEAR_GUEST_WRAP_MARKER}_crontab_systemwide

    for it in $(ls ${IMAGE_DIR}/etc/cron.d/ 2>/dev/null); do
        copy_crontab "$re_rule_systemwide" "" < ${IMAGE_DIR}/etc/cron.d/$it > /etc/cron.d/${EXAGEAR_GUEST_WRAP_MARKER}_$it
    done

    for it in $(ls ${IMAGE_DIR}/var/spool/cron/crontabs 2>/dev/null); do
        copy_crontab "$re_rule_peruser" "$it" \
          < ${IMAGE_DIR}/var/spool/cron/crontabs/$it \
          > /etc/cron.d/${EXAGEAR_GUEST_WRAP_MARKER}_peruser_$it
    done
}

update_crontabs
