#!/bin/bash

cmddir=`dirname $0`
cmdname=`basename $0`

eR='\e[31m';eG='\e[32m';eY='\e[33m';eB='\e[34m';eN='\e[0m'

function eecho () {
    C=$1; shift
    echo -e "$C$*$eN"
}

function ececho () {
    rc=$1; shift
    id=$1; shift
    if [ $rc -eq 0 ]; then
        eecho $eG "$id succeeded."
    else
        eecho $eR "$id failed."
    fi   
}

function eexec () {
    id=`printf "[%03d]#" $1`; shift
    eret=$1; shift
    eecho $eB "$id $*" 
    if [ -n $verbose ]; then
    	( $* )
    else   
    	( $* ) >/dev/null
    fi
    ret=$?
    [ -n "$eret" -a "$eret" -ne 0 ] \
    	&& ret=$(( ret - eret ))
    ececho $ret $id
    return $ret
}


while getopts ":hqvA:" option; do
  case $option in
    h)  # help
    	cat << EOF
Usage: $cmdname [OPTION]... 

  -h        help
  -q        quick test
  -v	    be verbose
  -A [ARCH] architecture specific tests

examples:
  
  $cmdname -q	    # quick test
  $cmdname -v 	    # verbose test
  
EOF
    	exit 0
    	;;
    q)  # just do quick tests
	quick=1
    	;;
    v)  # be verbose 
	verbose=1
    	;;
    A)  # architecture specific
	arch="$OPTARG"
    	;;
  esac
done
shift $(($OPTIND - 1))

eecho $eY "Linux-VServer Test [V0.04] (C) 2003-2004 H.Poetzl"

KERN=`uname -srm`
VSRV=`which vserver 2>/dev/null`

if [ -n "$VSRV" ]; then
    VDIR=`dirname $VSRV`;
else
    if [ -d /usr/lib/util-vserver ]; then
    	VDIR="/usr/lib/util-vserver"
    else
    	VDIR="/usr/lib/vserver"
    fi
fi

if [ -f $VDIR/util-vserver-vars ]; then
    TYPE="E"
else
    TYPE="J"
fi

echo -en $eR
out=`chcontext --ctx 1 grep '[[]' /proc/self/status`
rc=$?
if [ $rc -eq 0 ]; then 
    echo -en $eG
    echo "chcontext is working."
    [ -n "$verbose" ] && echo $out | grep -v '^$'
else
    echo "chcontext failed!" 
    echo $out | grep -v '^$'
    chc_fail=1
fi
echo -en $eN

echo -en $eR
out=`chbind --ip 127.0.0.1 grep 'ipv4' /proc/self/status`
rc=$?
if [ $rc -eq 0 ]; then 
    echo -en $eG
    echo "chbind is working." 
    [ -n "$verbose" ] && echo $out | grep -v '^$'
else
    echo "chbind failed!" 
    echo $out | grep -v '^$'
    chb_fail=1
fi
echo -en $eN
echo $out

CHCO=`chcontext 2>&1 | grep version | sed 's/version //g'`
CHBI=`chbind 2>&1 | grep version | sed 's/version //g'`
VSTL=`which chbind chcontext vserver`
[ -f /etc/init.d/vservers ] && VSTL="$VSTL /etc/init.d/vservers"

echo "$KERN/$CHCO/$CHBI [$TYPE]"
[ -n "$verbose" ] && uname -a
[ -n "$verbose" ] && md5sum $VSTL
echo "---"

if [ -n "$quick" -o -n "$chb_fail" -o -n "$chc_fail" ]; then
    [ -z "$chb_fail" -a -z "$chc_fail" ] && exit 0
    [ -n "$chb_fail" -a -n "$chc_fail" ] && exit 3
    [ -n "$chb_fail" ] && exit 2
    exit 1
fi


eexec   1   0 "chcontext --ctx 100 grep context /proc/self/status"
eexec  11   1 "chcontext --secure --ctx 100 mknod /tmp/x c 0 0"
eexec  31   0 "chcontext --hostname zaphod uname -a"

eexec 101   0 "chbind --ip 192.168.0.42 true"
eexec 102   0 "chbind --ip 192.168.0.1/255.255.255.0 --ip 10.0.0.1/24 true"


exit 0
