#!/bin/sh

. /etc/rc.subr

name="onapp-run"
start_cmd="onapp-run_start"
stop_cmd=":"
boot_freebsd_onapp_version="3.3.0"

onapp-run_start()
{
    export PATH=$PATH:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin
    ONAPP_SRC="/onapp.src"
    ONAPP_DST="/onapp.dst"
    LOG="${ONAPP_SRC}/onapp-freebsd-prepare.log"
    mkdir -p $ONAPP_SRC $ONAPP_DST
    DEVS="ad ada vtbd"
    ROOTDEV=
    for DEV in ${DEVS}; do
        if [ -e /dev/${DEV}1 ]; then
            ROOTDEV=${DEV}
        fi
    done

    if [ "x${ROOTDEV}" = "x" ]; then
        echo "None of supported block devices (${DEVS}) found !"
        shutdown -p now
    fi

    echo "The /dev/${ROOTDEV}1 will be used"

    if ! mount | grep "/dev/${ROOTDEV}1" >/dev/null 2>&1; then
        echo "Checking /dev/${ROOTDEV}1 ext2 filesystem"
        e2fsck -p /dev/${ROOTDEV}1
        echo "Mounting /dev/${ROOTDEV}1 ${ONAPP_SRC}  ext2fs rw"
        mount -t ext2fs -o rw /dev/${ROOTDEV}1 ${ONAPP_SRC}
        if [ $? -ne 0 ]; then
            shutdown -p now
        fi
    else
        echo "/dev/${ROOTDEV}1 is already mounted on ${ONAPP_SRC}"
    fi
    echo "Started 'onapp-run' from the FreeBSD provisioning ISO version ${boot_freebsd_onapp_version}" >> $LOG

    echo $boot_freebsd_onapp_version > ${ONAPP_SRC}/boot-freebsd-onapp.version

    if [ -e ${ONAPP_SRC}/onapp-freebsd-prepare.conf ]; then
        echo "Running with some post-start OnApp preconfiguration tasks" >> $LOG
        # Dafaults for Xen
        # xn0 - XENHVM  && <  9.0
        # re0 - GENERIC && <  9.0
        # xn0 - GENERIC && >= 9.0
        VIF='xn0'
        VIRTUALIZATION='xen'
	IPADDR=
	NETMASK=
	BROADCAST=
	GATEWAY=
	ROOT_PASSWD=

        . ${ONAPP_SRC}/onapp-freebsd-prepare.conf
        if [ "x${VIRTUALIZATION}" = "xkvm" ]; then
            # intel e1000
            VIF='em0'
            # otherwise
            # VIF='re0'
        fi
        if [ "x${VIRTUALIZATION}" = "xkvm_virtio" ]; then
            VIF='vtnet0'
        fi
        if [ "x${IPADDR}" != "x" -a "x${NETMASK}" != "x" -a "x${BROADCAST}" != "x" -a "x${GATEWAY}" != "x" ]; then
            echo "Configuring network ..." >> $LOG
            ifconfig ${VIF} inet ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST} >> $LOG 2>&1
	    route add default ${GATEWAY} >> $LOG 2>&1
        fi
        if [ "x${ROOT_PASSWD}" != "x" ]; then
            echo "Setting root user password" >> $LOG
            sh -c "chpass -p '${ROOT_PASSWD}' root" >> $LOG 2>&1
        fi

        echo "Configuring nameservers" >> $LOG
        RESOLV_CONF="/etc/resolv.conf"
        if [ -f $RESOLV_CONF ]; then
            cat $RESOLV_CONF | grep -v domain | grep -v nameserver >> ${RESOLV_CONF}.new
        fi
        if [ "x${DOMAIN}" != "x" ]; then
            echo "domain $DOMAIN" >> ${RESOLV_CONF}.new
        fi
        for NAMESERVER in $NAMESERVERS; do
          echo "nameserver $NAMESERVER" >> ${RESOLV_CONF}.new
        done
        mv -f ${RESOLV_CONF}.new ${RESOLV_CONF}

        ETC_LOCALTIME=/etc/localtime
        ZONEINFO_DIR=/usr/share/zoneinfo
        if [ "x${TIME_ZONE}" != "x" -a -e ${ZONEINFO_DIR}/${TIME_ZONE} ]; then
            echo "Set timezone into $TIME_ZONE" >> $LOG
            /bin/cp -a -f ${ZONEINFO_DIR}/${TIME_ZONE} ${ETC_LOCALTIME}
        fi
    fi

    if [ -e ${ONAPP_SRC}/onapp-freebsd-prepare.sh ]; then
        echo "Running OnApp tasks for FreeBSD: ${ONAPP_SRC}/onapp-freebsd-prepare.sh" >> $LOG
        sh ${ONAPP_SRC}/onapp-freebsd-prepare.sh
    else
        echo "${ONAPP_SRC}/onapp-freebsd-prepare.sh not found !" >> $LOG
        shutdown -p now
    fi
}

load_rc_config $name
run_rc_command "$1"
