#!/bin/sh

rc=0
LT_SKUTYPE=254
SB_LT_SKUTYPE=252
FRU_DEP_DISABLE_FILE="/var/db/disable_fru_deprecation"

# do not allow validation if it cannot work
check_validate_ok() {
    type get_xmltags > /dev/null 2>&1 ||
    . ${PKGTOOLS:-/usr/libexec}/pkg_funcs.sh
    get_xmltags $PKGSETS/${PKGSET:-active}/os-kernel abi osmajor
    current_abi=${abi:-$CURRENT_ABI}
    current_osmajor=${osmajor:-$CURRENT_OSMAJOR}
    current_osmajor=${current_osmajor:-`uname -r | sed 's,JNPR-\([1-9][0-9]*\).*,\1,'`}
    get_xmltags $PKGDIR abi osmajor
    if [ ${abi:-0} -gt ${current_abi:-0} ]; then
        Error Cannot validate abi $abi on $current_abi
    fi
    if [ ${osmajor:-0} -gt ${current_osmajor:-0} ]; then
        Error Cannot validate osmajor $osmajor on $current_osmajor
    fi
    return 0
}

# discard the require-product packages we do not need
trim_contents() {
    (cd ${1:-.}
    set -f
    # we do not want to hear from _pkg_require_
    export PKG_REQUIRE_ECHO=:
    # logic similar to product_check
    egrep '<(basename|require-product)>' packages.xml |
    grep -B2 require-product | sed '/^-/d;s,</.*,,;s,[<>], ,g' |
    while read tag val
    do
        : tag="$tag" val="$val"
        case $tag in
        basename) eval "$tag=$val"; continue;;
        esac
        if ! _pkg_require_ product - "$val"; then
            rm -f contents/$basename.tgz
        fi
    done
    set +f
    )
}

# fail s/w upgrade for chassis which is
# deprecated (release > Last Supported S/W version)
deprecated_chassis_check() {
    product_model=`sysctl -qn hw.product.model`
    pvi_model=`sysctl -qn hw.product.pvi_model`

    if [ ! -z "$pvi_model" ]; then
	product_model="$pvi_model"
    fi

    # update with new deprecated chassis-names
    case "$product_model" in
    mx80)
	echo "Product/chassis:$product_model "
	echo "is deprecated in this S/W version"
        exit 1
        ;;
    esac
}

# skip deprecated_chassis_check check if $FRU_DEP_DISABLE_FILE file is present
if [ ! -e "$FRU_DEP_DISABLE_FILE" ]; then
    deprecated_chassis_check
else
    case "$-" in *x*) echo "skip Chassis Deprecation check";; esac
fi

case "domestic" in
limited) ;;
*)
    sku=`sysctl -n hw.re.skutype 2> /dev/null`
    if [ a$sku = a$LT_SKUTYPE -o a$sku = a$SB_LT_SKUTYPE ]; then
        echo "This RE supports only -limited package"
        exit 1
    fi
esac

case "$PKG_BOOTSTRAP,$PKG_BASENAME" in
,*-x86-64*)
    case `uname -m` in
    i386)
	vm=`sysctl -n kern.vm_guest`
	case "$vm" in
	none) 
	    xsdt=`kenv hint.acpi.0.xsdt 2> /dev/null`
	    if test -z ${xsdt}; then
        echo "WARNING: This software does not support xsdt for 64-bit operating system"
        echo "WARNING: Using rsdt for 64-bit operating system."
		exit 1
	    fi
	    ;;
	esac
	;;
    esac
    ;;
esac
case "$PKG_BOOTSTRAP$PKG_BUNDLE" in
""|junos*upgrade*|junos*install*)
    tdir=/tmp/t$$mp

    # we don't need anything here
    rm -rf $PKGDIR/upgrade $PKGDIR/+[A-Z]*

    if test -s $PKGDIR/pkgtools.tgz; then
	mkdir -p $tdir
	tar zxf $PKGDIR/pkgtools.tgz -C $tdir
	veriexec -onoext -C $tdir $tdir/pkg/manifest
    fi
    ;;
esac

if [ $rc = 0 -a -s /usr/libexec/pkg_add.sh ]; then
    # re-use of _pkg_require_

    PKG_PRODUCT=${PKG_PRODUCT:-`sysctl -n hw.product.model 2> /dev/null`}
    case "$PKG_PRODUCT" in
    ""|Unknown|unknown|media) ;;
    *)
        . /usr/libexec/pkg_add.sh

        trim_contents $PKGDIR
        ;;
    esac
fi

case `sysctl -n hw.re.name 2> /dev/null` in
RE-ACX710) ;;			# NOT a VM platform!
*RE-ACX*|*RE-S-2X00x8*|*RE-S-2X00x6*|*RE-PTX-2X00x8*|*RE-S-EX9200-2X00x6*|*RE_SRX_2X00x6*|*RE-S-X6-128G-K*|*RE-S-X6-128G-LT*)
    echo "Checking vmhost version compatibility"
    lts_version=`vhclient uname -r | awk -F'[^0-9]*' '{print $5}'`
    if [ $lts_version -eq 22 ]; then
         VMHOST_VERSION_MAJOR_MIN=10
         VMHOST_VERSION_MAJOR_MAX=11
    else
         VMHOST_VERSION_MAJOR_MIN=7
         VMHOST_VERSION_MAJOR_MAX=8
    fi
    vmhost_version_major=`vhclient sh /etc/install/vmhost_version_get_major.sh`
    if [ $vmhost_version_major -lt $VMHOST_VERSION_MAJOR_MIN ]; then
	echo "VMHost version too old for Junos"
	rc=1
    fi
    if [ $vmhost_version_major -gt $VMHOST_VERSION_MAJOR_MAX ]; then
	echo "Junos version too old for VMHost"
	rc=1
    fi
    ;;
*RE-PTX-2X00x6*)
    echo "Checking vmhost version compatibility"
    lts_version=`vhclient uname -r | awk -F'[^0-9]*' '{print $5}'`
    if [ $lts_version -eq 22 ]; then
         VMHOST_VERSION_MAJOR_MIN=10
         VMHOST_VERSION_MAJOR_MAX=11
    else
         VMHOST_VERSION_MAJOR_MIN=7
         VMHOST_VERSION_MAJOR_MAX=8
    fi
    vmhost_version_major=`vhclient sh /etc/install/vmhost_version_get_major.sh`
    if [ $vmhost_version_major -lt $VMHOST_VERSION_MAJOR_MIN ]; then
	echo "VMHost version too old for Junos"
	rc=1
    fi
    if [ $vmhost_version_major -gt $VMHOST_VERSION_MAJOR_MAX ]; then
	echo "Junos version too old for VMHost"
	rc=1
    fi
    ;;
esac

case "${PKGSET:-upgrade}" in
validate*) check_validate_ok;;
esac

exit $rc
