#!/bin/sh

. ../eval_tools.sh

HEADER Proxy illegal SET handling support

SKIPIFNOT USING_UCD_SNMP_PROXY_MODULE
SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE
SKIPIF    NETSNMP_DISABLE_SNMPV2C
SKIPIF    NETSNMP_DISABLE_SET_SUPPORT

# XXX: ucd-snmp/proxy doesn't properly support TCP -- remove this once it does
[ "x$SNMP_TRANSPORT_SPEC" = "xtcp" ] && SKIP

#
# Begin test
#

# standard V3 configuration for initial user
. ./Sv3config
# config the proxy
CONFIGAGENT proxy -t 2 -r 1 -v 2c -c testcommunity $SNMP_TRANSPORT_SPEC:${SNMP_TEST_DEST}${SNMP_AGENTX_PORT} system

# Start the agent without initializing the system mib.
ORIG_AGENT_FLAGS="$AGENT_FLAGS"
AGENT_FLAGS="$ORIG_AGENT_FLAGS -I -system_mib -Dproxy"
STARTAGENT

# test to see that the current agent doesn't support the system mib
#CAPTURE "snmpget -On -t 3 $SNMP_FLAGS $AUTHTESTARGS $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT .1.3.6.1.2.1.1.3.0"

#CHECK ".1.3.6.1.2.1.1.3.0 = No Such Object"

#if test "$snmp_last_test_result" = 1; then
  # test the proxy subagent by first running it...

  SNMP_SNMPD_PID_FILE_ORIG=$SNMP_SNMPD_PID_FILE
  SNMP_SNMPD_LOG_FILE_ORIG=$SNMP_SNMPD_LOG_FILE
  SNMP_SNMPD_PID_FILE=$SNMP_SNMPD_PID_FILE.num2
  SNMP_SNMPD_LOG_FILE=$SNMP_SNMPD_LOG_FILE.num2
  SNMP_CONFIG_FILE="$SNMP_TMPDIR/proxy.conf"
  echo "rwcommunity testcommunity" >> $SNMP_CONFIG_FILE
  if [ "$SNMP_TRANSPORT_SPEC" = "udp6" -o "$SNMP_TRANSPORT_SPEC" = "tcp6" ];then
    echo "rwcommunity6 testcommunity" >> $SNMP_CONFIG_FILE
  fi
#  echo "syscontact testcontact" >> $SNMP_CONFIG_FILE
  AGENT_FLAGS="$ORIG_AGENT_FLAGS -Dmib_init"
  ORIG_SNMP_SNMPD_PORT=$SNMP_SNMPD_PORT
  SNMP_SNMPD_PORT="${SNMP_AGENTX_PORT}"
  STARTAGENT
  SNMP_SNMPD_PORT=$ORIG_SNMP_SNMPD_PORT

  # test to see that the agent now supports the system mib
  CAPTURE "snmpget -On $SNMP_FLAGS -t 5 $AUTHTESTARGS $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT sysContact.0"

  
  # we don't know the real value, unfortunately, so we test for what
  # we should *not* get back.
  CHECK ".1.3.6.1.2.1.1.4.0 = No Such Object"

  if test "$snmp_last_test_result" = 0; then

    # test to see that the agent now supports the system mib
    CAPTURE "snmpset -On -Ir $SNMP_FLAGS -t 5 $AUTHTESTARGS $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT sysContact.0 i 42"

    # 5.0.x snmpset shows error on single line
    #CHECK ".1.3.6.1.2.1.1.4.0 = Wrong Type"
    # 5.1.x snmpset shows error on multiple lines
    CHECK "Reason: wrongType"
    CHECK "Failed object: .1.3.6.1.2.1.1.4.0"

  fi

  # stop the subagent
  STOPAGENT

  SNMP_SNMPD_PID_FILE=$SNMP_SNMPD_PID_FILE_ORIG
  SNMP_SNMPD_LOG_FILE=$SNMP_SNMPD_LOG_FILE_ORIG
#fi

# stop the master agent
STOPAGENT

# all done (whew)
FINISHED
