#!/bin/sh

# Configure properties -------------------------------------------------
__configure_jail () {
    local _value _CONF _fulluuid _dataset _prop _prop_name

    _CONF="$CONF_NET
           $CONF_JAIL
           $CONF_RCTL
           $CONF_CUSTOM
           $CONF_SYNC
           $CONF_FTP
           $CONF_GIT"

    _fulluuid="$1"
    _dataset="$2"

    for _prop in $_CONF ; do
        _prop_name=${_prop}
        eval _prop="\$${_prop}"
        if [ ! -z "${_prop}" ] ; then
            case "${_prop_name}" in
                tag) _value="${tag}"
                    ;;
                host_domainname) _value="${host_domainname}"
                    ;;
                host_hostname) _value="${host_hostname}"
                    ;;
                host_hostuuid) _value="${host_hostuuid}"
                    ;;
                jail_zfs_dataset) _value="${jail_zfs_dataset}"
                    ;;
                basedirs) _value="${basedirs}"
                    ;;
                hack88) _value="${hack88}"
                    ;;
                resolver) _value="${resolver}"
                    ;;
                ip4_autostart) _value="${ip4_autostart}"
                    ;;
                ip4_autoend) _value="${ip4_autoend}"
                    ;;
                ip4_autosubnet) _value="${ip4_autosubnet}"
                    ;;
                type) _value="${type}"
                    ;;
                boot) _value="${boot}"
                    ;;
                vnet) _value="${vnet}"
                    ;;
                mount_procfs) _value="${mount_procfs}"
                    ;;
                mount_linprocfs) _value="${mount_linprocfs}"
                    ;;
                gitlocation) case "${gitlocation}" in
                                 "-") gitlocation="https://github.com"
                                     ;;
                             esac
                             _value="${gitlocation}"
                    ;;
                vnet0_mac) case "${vnet0_mac}" in
                               "-") vnet0_mac="none"
                                   ;;
                           esac
                           _value="${vnet0_mac}"
                    ;;
                vnet1_mac) case "${vnet1_mac}" in
                               "-") vnet1_mac="none"
                                   ;;
                           esac
                           _value="${vnet1_mac}"
                    ;;
                vnet2_mac) case "${vnet2_mac}" in
                               "-") vnet2_mac="none"
                                   ;;
                           esac
                           _value="${vnet2_mac}"
                    ;;
                vnet3_mac) case "${vnet3_mac}" in
                               "-") vnet3_mac="none"
                                   ;;
                           esac
                           _value="${vnet3_mac}"
                    ;;
                *) _value="${_prop}"
                    ;;
            esac

            if [ "$1" != "generate" ] ; then
                _mountpoint="$(__get_jail_prop mountpoint ${_fulluuid} \
                    ${_dataset})"
                echo "** ${prop_name}=${_value}"
                __ucl_set "${_mountpoint}" "${_prop_name}" "${_value}"
                unset _value
            elif [ "$1" = "generate" ] ; then
                _fulluuid="$2"
                _dataset="$3"
                _mountpoint="$4"

                if [ -z "${_mountpoint}" ] ; then
                    _mountpoint="${iocroot}/jails/${_fulluuid}"
                fi

                if [ -z "${_dataset}" ] ; then
                    _dataset="${pool}${_mountpoint}"
                fi

                __ucl_set "${_mountpoint}" "${_prop_name}" "${_value}" "1"
            fi
        fi
    done

    for _prop in ${CONF_ZFS} ; do
        _prop_name=${_prop}
        eval _prop="\$${_prop}"

        if [ ! -z "${_prop}" ] && [ "${_prop}" != "readonly" ] ; then
            _value="${_prop}"
            zfs set ${_prop_name}="${_value}" ${_dataset}
        fi

    done
}

__jail_rc_conf () {
cat << EOT

cron_flags="$cron_flags -J 15"

# Disable Sendmail by default
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

# Run secure syslog
syslogd_flags="-c -ss"

# Enable IPv6
ipv6_activate_all_interfaces="YES"
EOT
}

# This is mostly for pkg autoinstall
# expects fulluuid to be passed in as $1
__resolv_conf () {
    local _name _resolver _resolver_default _fulluuid _dataset
    _fulluuid="$1"
    _dataset="$2"
    _default_resolver="$(__get_default_prop resolver default)"
    _resolver="$(__get_jail_prop resolver ${_fulluuid} ${_dataset})"

    if [ "${_resolver}" != "none" ] ; then
        echo "${_resolver}" | tr \; \\n
    elif [ "${_resolver}" == "none" ] && [ "${_default_resolver}" != "none" ] ; then
        echo "${_default_resolver}" | tr \; \\n
    else
        cat /etc/resolv.conf
    fi
}

__pkg_install () {
    local _chrootdir="$1"

    if [ -e $pkglist ] ; then
        echo "* Installing extra packages.."
        for i in $(cat $pkglist) ; do
            __info "installing: $i"
            pkg -c $_chrootdir install -qy $i
        done
    fi
}

__reset_jail_props () {
    local _name _dataset uuid tag
    _name=$1

    if [ -z "${_name}" ] ; then
        __die "missing UUID!"
    fi

    _dataset="$(__find_jail ${_name})" || exit $?

    if [ -z "${_dataset}" ] ; then
        __die "${_name} not found!"
    fi

    if [ ${_name} = "ALL" ] ; then
        echo " "
        echo "  WARNING: This will reset ALL jails!"
        echo " "
        echo -n "  Are you sure? y[N]: "
        read answer
        if [ "$answer" = "Y" -o "$answer" = "y" ] ; then
            echo "  Resetting all jails."

            __reset_jail_props_all

            exit 0
        else
            echo "  Command not confirmed.  No action taken."
            exit 1
        fi
    fi

    # Cache properties to set again later
    uuid=$(__check_name ${_name} ${_dataset} 2> /dev/null)
    host_hostuuid="${uuid}"
    tag="$(__get_jail_prop tag ${uuid} ${_dataset})"
    vnet0_mac="$(__get_jail_prop vnet0_mac ${uuid} ${_dataset})"
    vnet1_mac="$(__get_jail_prop vnet1_mac ${uuid} ${_dataset})"
    vnet2_mac="$(__get_jail_prop vnet2_mac ${uuid} ${_dataset})"
    vnet3_mac="$(__get_jail_prop vnet3_mac ${uuid} ${_dataset})"
    basedirs="$(__get_jail_prop basedirs ${uuid} ${_dataset})"
    hack88="$(__get_jail_prop hack88 ${uuid} ${_dataset})"
    jail_zfs_dataset="$(__get_jail_prop jail_zfs_dataset ${uuid} ${_dataset})"
    resolver="$(__get_jail_prop resolver ${uuid} ${_dataset})"
    ip4_autostart="$(__get_jail_prop ip4_autostart ${uuid} ${_dataset})"
    ip4_autoend="$(__get_jail_prop ip4_autoend ${uuid} ${_dataset})"
    ip4_autosubnet="$(__get_jail_prop ip4_autosubnet ${uuid} ${_dataset})"
    gitlocation="$(__get_jail_prop gitlocation ${uuid} ${_dataset})"
    type="$(__get_jail_prop type ${uuid} ${_dataset})"
    boot="$(__get_jail_prop boot ${uuid} ${_dataset})"
    vnet="$(__get_jail_prop vnet ${uuid} ${_dataset})"
    host_hostname="$(__get_jail_prop host_hostname ${uuid} ${_dataset})"
    mount_procfs="$(__get_jail_prop mount_procfs ${uuid} ${_dataset})"
    mount_linprocfs="$(__get_jail_prop mount_linprocfs ${uuid} ${_dataset})"

    __configure_jail ${uuid} ${_dataset}
}

__reset_jail_props_all () {
    local _jails _fulluuid
    _jails="$(__find_jail ALL | \
            awk 'BEGIN { FS = "/" } ; { if (length($NF)==36) { print }}')"

    for _jail in ${_jails} ; do
        # _jail is actually a dataset, so fulluuid needs to be faked.
        _fulluuid=$(__check_name "name" ${_jail} 2> /dev/null)
        __reset_jail_props "${_fulluuid} ${_jail}"
    done
}
