#!/bin/sh
#
#    Broadcom Proprietary and Confidential.
#    Copyright © 1996-2020 Broadcom.
#    All Rights Reserved.
#    The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
#
#    Restore script to perform FOS configuration restore for firmware downgrade
#    and firmware restore cases.
#
PROGRAM='cfgut'
cfgutil="/etc/fabos/config/scripts/cfgutil"
umask 0
#
#include cfg utility
#
if [ -e "$cfgutil" ]
then
    . $cfgutil
    rc=$?
    if [ $rc -ne 0 ]
    then
      echo "Error -- $cfgutil err=$rc"
      exit 3
    fi
else
    echo "Error -- could not locate configuration common library $cfgutil"
    exit 3
fi

$CFGLOG_INIT

#$CFGLOG "NUM_SW=$NUM_SW_TOTAL"
#$CFGLOG "HOME_VF=$HOME_VF"
#$CFGLOG "VF_ENABLED=$VF_ENABLED"

CFGPOSTPLAY_PATH="/etc/fabos/config/scripts/cfgpostplay"
CFGREST_PATH="/etc/fabos/config/scripts/cfgrest"
CFGSYNC_PATH="/etc/fabos/config/scripts/cfgsync"

RESTORE_BANNER="Configuration Restore In Progress..."

display_usage () {
    $ECHO "Usage: $PROGNAME -[t:mh]";
    $ECHO "     -t cfgopt   # set/verify unit test [1..7]";
    $ECHO "       1 : setup 9.0.1a cfg unit test cfg and file";
    $ECHO "       2 : verify 9.1 0 to 9.0.1a result";
    $ECHO "       3 : setup 9.1.0 cfg unit test cfg and file";
    $ECHO "       4 : verify 9.0.1a to 9.1.0 result";
    $ECHO "       5 : verify empty CCM path";
    $ECHO "       6 : clean up CCM path";
    $ECHO "       7 : list CCM path";
    $ECHO "       8 : verify CCM postplay path";
    $ECHO "       9 : verify CCM restore path";
    $ECHO "     -m          # /mnt";
    $ECHO "     -h          # this help";
    exit 1;
}

#MAIN
# Get the command-line options
postplay91=0
restore91=0
verbose=0
mnt=0
VERIFYOPT=0
VERIFY_RC=0

while getopts "ymht:" Option
do
    case $Option in
	t ) VERIFYOPT=$OPTARG;;
	m ) mnt=1;;
        h ) display_usage ;;
	\? ) display_usage ;;
	* ) display_usage ;;
    esac
done

value=`/fabos/cliexec/config get cfgut.debug 2`
if [ ! -z ${value+x} ]; then
    verbose=1
fi

VERBOSE=$verbose

$CFGLOG "$PROGRAM $@"

if [ $mnt == 1 ]; then
  CFGPOSTPLAY_PATH="/mnt$CFGPOSTPLAY_PATH"
  CFGREST_PATH="/mnt$CFGREST_PATH"
  CFGSYNC_PATH="/mnt$CFGSYNC_PATH"
fi

#
# cfgut -t1
# set up CCM unit test on pre-9.1
set_ut_901 ()
{
  # reset cfglog
  $CFGLOG_RESET

  $ECHO "Set FWDL 9.0.1a to 9.1.0 unit test configuration"

  setcontext chassis
  $CFGCMD /fabos/cliexec/config set cfgut.enable 2 1

  cfgkey="cfgut.CH.9.1key.1"
  $CFGCMD /fabos/cliexec/config remove $cfgkey

  cfgkey="cfgut.SW.9.1key.4"
  $SWITCHCMD -1 /fabos/cliexec/config remove $cfgkey

  setcontext chassis
  # set 9.0 cfgut key
  cfgkey="cfgut.CH.9.0key.4"
  cfgkey_type=2
  evalue=4
  $CFGCMD /fabos/cliexec/config set $cfgkey $cfgkey_type $evalue
  $ECHO "set 9.0.1a config key value $cfgkey = $evalue"

  if [ $STANDBY == "FALSE" ]; then
    setcontext 128
    # reset syslogadmin -ip 1.2.3.4
    $ECHO "remove 9.1.0 default syslog ip 1.2.3.4"
    $CFGCMD syslogadmin --remove -ip 1.2.3.4

    # set 9.0 syslog facility default value to 4
    $ECHO "set 9.0.1a default facility to 4"
    $CFGCMD syslogadmin --set -facility 4
  fi
}

# cfgut -t3
# Set 9.1.0 ut configuration to test FWDL 9.1.0 to 9.0.1a
set_ut_910 ()
{
  $CFGLOG_RESET

  $ECHO "Set FWDL 9.1.0 to 9.0.1a unit test configuration"

  setcontext chassis
  $CFGCMD /fabos/cliexec/config set cfgut.enable 2 1

  # if unit test is enabled
  cfgut_enable=`/fabos/cliexec/config get cfgut.enable 2`
  if [ $cfgut_enable ]; then

    # add 9.1 new chassis config key
    # config set 9.1 chasis key
    setcontext chassis
    cfgkey="cfgut.CH.9.1key.1"
    cfgkey_type=2
    cfgkey_value=1
    $CHASSISCMD /fabos/cliexec/config set $cfgkey $cfgkey_type $cfgkey_value
    $ECHO "set new 9.1.0 chassis config key $cfgkey = $cfgkey_value"

    # add 9.1 new LS config key
    # config set 9.1 LS key
    cfgkey="cfgut.SW.9.1key.4"
    cfgkey_type=2
    cfgkey_value=4
    $SWITCHCMD -1 /fabos/cliexec/config set $cfgkey $cfgkey_type $cfgkey_value
    $ECHO "set new 9.1.0 LS config key $cfgkey = $cfgkey_value"

    setcontext chassis  
    # change 9.0.1 config key value
    cfgkey="cfgut.CH.9.0key.4"
    cfgkey_type=2
    evalue=8
    value=`/fabos/cliexec/config get $cfgkey $cfgkey_type`
    if [ ! -z ${value+x} ]; then
	if [[ "$value" < "$evalue" ]]; then
	    $CFGLOG "set $cfgkey to $evalue"
	    /fabos/cliexec/config set $cfgkey $cfgkey_type $evalue
	fi
    else
	$ECHO "postplay fail to get $cfgkey to $evalue"
    fi
    $ECHO "set 9.0.1a config key value $cfgkey = $evalue"

    if [ $STANDBY == "FALSE" ]; then
      setcontext 128
      # add syslog ip as 9.1 default
      $ECHO "add 9.1.0 default syslog ip 1.2.3.4"
      $CFGCMD syslogadmin --set -ip 1.2.3.4

      # change 9.1 syslog faciity default value
      $ECHO "set 9.1.0 default facility to 5"
      $CFGCMD syslogadmin --set -facility 5
      
      # file operation
    fi
  fi
}

verify_key ()
{
  $CFGLOG "${FUNCNAME[0]} $@"

  v_cfgkey=$1
  v_cfgkey_type=$2
  evalue=$3

  value=`/fabos/cliexec/config get $v_cfgkey $v_cfgkey_type`
  if [ ! -z ${value+x} ] && [ ! -z "$value" ]; then
    if [[ "$value" == "$evalue" ]]; then
	$ECHO "PASS: $v_cfgkey = $evalue"
    else
	$ECHO "FAIL: $v_cfgkey Exp=$evalue Curr=$value"
	VERIFY_RC=1
    fi
  else
      $ECHO "FAIL: $v_cfgkey not exist"
      VERIFY_RC=1
  fi
}

verify_key_remove ()
{
  $CFGLOG "${FUNCNAME[0]} $@"
  
  v_cfgkey=$1
  v_cfgkey_type=$2
  evalue=$3
  value=`/fabos/cliexec/config get $v_cfgkey $v_cfgkey_type`
  if [ ! -z ${value+x} ] && [ ! -z "$value" ]; then
      $ECHO "FAIL: $v_cfgkey = '$value' expected to be removed"
      VERIFY_RC=1
  else
      $ECHO "PASS: $v_cfgkey not exist"
  fi
}

#
# cfgut -t4
# verify CCM result of FWDL from 9.0.1 to 9.1.0
verify_910 ()
{

  $ECHO "Verify 9.1.0 unit test configuration"

  setcontext chassis
  cfgkey="cfgut.CH.9.1key.1"
  cfgkey_type=2
  cfgkey_value=1
  verify_key $cfgkey $cfgkey_type $cfgkey_value

  cfgkey="cfgut.SW.9.1key.4"
  cfgkey_type=2
  cfgkey_value=4
  # iterate all LS
  for FID in ${CONTEXTS} ; do
      setcontext $FID  2> /dev/null
      verify_key $cfgkey $cfgkey_type $cfgkey_value
  done

  setcontext chassis
  cfgkey="cfgut.CH.9.0key.4"
  cfgkey_type=2
  cfgkey_value=8
  verify_key $cfgkey $cfgkey_type $cfgkey_value

  if [ $STANDBY == "FALSE" ]; then
    setcontext 128

    #sw0:FID128:root> syslogadmin --show -ip
    #syslog.1        1.2.3.4
    cfgkey="syslog"
    evalue="1.2.3.4"
    value=`syslogadmin --show -ip | /bin/awk '{print $2}' | grep $evalue`
    if [ ! -z ${value+x} ] && [ ! -z "$value" ] && [[ "$value" == "$evalue" ]]; then
      $ECHO "PASS: $cfgkey = $evalue"
    else
      $ECHO "FAIL: $cfgkey $evalue should be set"
    fi

    #sw0:FID128:root> syslogadmin --show -facility
    #Syslog facility: LOG_LOCAL5
    cfgkey="facility"
    cfgkey_value="LOG_LOCAL5"
    value=`syslogadmin --show -facility | /bin/awk '{print $3}'`
    if [[ "$value" == "$cfgkey_value" ]]; then
	$ECHO "PASS: $cfgkey = $cfgkey_value"
    else
	$ECHO "FAIL: $cfgkey = $cfgkey_value/$value"
    fi
  fi
}

#
# cfgut -t2
# verify CCM result of FWDL from 9.1.0 to 9.0.1, verify 9.1 restore
verify_901 ()
{ 
  $ECHO "Verify 9.0.1 unit test configuration"

  setcontext chassis
  cfgkey="cfgut.CH.9.1key.1"
  cfgkey_type=2
  verify_key_remove $cfgkey $cfgkey_type

  cfgkey="cfgut.SW.9.1key.4"
  cfgkey_type=2
  # iterate all LS
  for FID in ${CONTEXTS} ; do
      setcontext $FID  2> /dev/null
      verify_key_remove $cfgkey $cfgkey_type
  done

  setcontext chassis
  cfgkey="cfgut.CH.9.0key.4"
  cfgkey_type=2
  cfgkey_value=4
  verify_key $cfgkey $cfgkey_type $cfgkey_value

  if [ $STANDBY == "FALSE" ]; then
    setcontext 128
    #sw0:FID128:root> syslogadmin --show -ip
    #syslog.1        1.2.3.4
    cfgkey="syslog"
    evalue="1.2.3.4"
    value=`syslogadmin --show -ip | /bin/awk '{print $2}' | grep $cfgkey_value`
    if [ ! -z ${value+x} ] && [ ! -z "$value" ]; then
      $ECHO "FAIL: $cfgkey $evalue should be removed"
      VERIFY_RC=1
    else
      $ECHO "PASS: $cfgkey $evalue removed"
    fi

    setcontext 128
    #sw0:FID128:root> syslogadmin --show -facility
    #Syslog facility: LOG_LOCAL7
    cfgkey="facility"
    cfgkey_value="LOG_LOCAL4"
    value=`syslogadmin --show -facility | /bin/awk '{print $3}'`
    if [[ "$value" == "$cfgkey_value" ]]; then
	$ECHO "PASS: $cfgkey = $cfgkey_value"
    else
	$ECHO "FAIL: $cfgkey = $cfgkey_value/$value"
	VERIFY_RC=1
    fi
  fi
}

##
# cfgut -t5
# verify empty CCM scripts
verify_empty_ccm ()
{
  VCCM_RC=0
  if [ ! -z "$(ls -A $CFGPOSTPLAY_PATH)" ]; then
      echo "FAIL: found $(ls -A $CFGPOSTPLAY_PATH)"
      VCCM_RC=1
  fi

  if [ ! -z "$(ls -A $CFGREST_PATH)" ]; then
      echo "FAIL: found $(ls -A $CFGREST_PATH)"
      VCCM_RC=1
  fi

  if [ ! -z "$(ls -A $CFGSYNC_PATH)" ]; then
      echo "FAIL: found $(ls -A $CFGSYNC_PATH)"
      VCCM_RC=1
  fi

  if [ $VCCM_RC -eq 0 ]; then
      echo "PASS: Empty CCM path"
  fi
}

# cfgut -t6
# clean up CCM scripts
cleanup_ccm ()
{
  if [ ! -z "$(ls -A $CFGPOSTPLAY_PATH)" ]; then
    $CFGLOG "clean up $CFGPOSTPLAY_PATH"
    $CFGCMD rm $CFGPOSTPLAY_PATH/*
  fi

  if [ ! -z "$(ls -A $CFGREST_PATH)" ]; then
    $CFGLOG "clean up $CFGREST_PATH"
    $CFGCMD rm $CFGREST_PATH/*
  fi

  if [ ! -z "$(ls -A $CFGSYNC_PATH)" ]; then
    $CFGLOG "clean up $CFGSYNC_PATH"
    $CFGCMD rm $CFGSYNC_PATH/*
  fi
}

# cfgut -t7
# list CCM scripts
list_ccm ()
{
  if [ ! -z "$(ls -A $CFGPOSTPLAY_PATH)" ]; then
    ls -A $CFGPOSTPLAY_PATH
  fi

  if [ ! -z "$(ls -A $CFGREST_PATH)" ]; then
    ls -A $CFGREST_PATH
  fi

  if [ ! -z "$(ls -A $CFGSYNC_PATH)" ]; then
    ls -A $CFGSYNC_PATH
  fi
}

# cfgut -t8
# verify CCM postplay scripts
verify_ccm_postplay ()
{
  VCCM_RC=0

  if [ -z "$(ls -A $CFGPOSTPLAY_PATH)" ]; then
    echo "FAIL: CCM postplay not found"
    VCCM_RC=1
  else 
    echo "PASS: $(ls -A $CFGPOSTPLAY_PATH)"
  fi

  if [ ! -z "$(ls -A $CFGREST_PATH)" ]; then
    echo "FAIL: found $(ls -A $CFGREST_PATH)"
    VCCM_RC=1 
  fi

  if [ ! -z "$(ls -A $CFGSYNC_PATH)" ]; then
   echo "FAIL: found $(ls -A $CFGSYNC_PATH)"
   VCCM_RC=1 
  fi
}

# cfgut -t9
# verify CCM restore scripts
verify_ccm_restore ()
{
  VCCM_RC=0

  if [ ! -z "$(ls -A $CFGPOSTPLAY_PATH)" ]; then
    echo "FAIL: found $(ls -A $CFGPOSTPLAY_PATH)"
    VCCM_RC=1 
  fi

  if [ -z "$(ls -A $CFGREST_PATH)" ]; then
    echo "FAIL: CCM restore not found"
    VCCM_RC=1 
  else
    echo "PASS:$(ls -A $CFGREST_PATH)"
  fi

  if [ ! -z "$(ls -A $CFGSYNC_PATH)" ]; then
    echo "FAIL: found $(ls -A $CFGSYNC_PATH)"
    VCCM_RC=1 
  fi
}


#cfgut -t1 : setup 9.0.1a cfg unit test cfg and file
#cfgut -t2 : verify 9.1 0 to 9.0.1a result
#cfgut -t3 : setup 9.1.0 cfg unit test cfg and file
#cfgut -t4 : verify 9.0.1a to 9.1.0 result
#cfgut -t5 : verify empty CCM path
#cfgut -t6 : clean up CCM path
#cfgut -t7 : list CCM path
#cfgut -t8 : verify CCM postpaly path
#cfgut -t9 : verify CCM restore path
case "${VERIFYOPT}" in
	'1')
	set_ut_901 ;;
	'2')
	verify_901 ;;
	'3')
	set_ut_910 ;;
	'4')
	verify_910 ;;
	'5')
	verify_empty_ccm ;;
	'6')
	cleanup_ccm ;;
	'7')
	list_ccm ;;
	'8')
	verify_ccm_postplay ;;
	'9')
	verify_ccm_restore ;;
	*)
	display_usage ;;
esac

$CFGLOG "Exit $PROGRAM $@"

