#
#    Broadcom Proprietary and Confidential.
#    Copyright © 1996-2020 Broadcom.
#    All Rights Reserved.
#    The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
#
#    File name:   cfgutil.sh
#
#    This file contains several useful functions used by the
#    FOS configuration related scripts.
#
PATH=/bin:/usr/bin:/usr/sbin:/fabos/bin:/fabos/link_bin:/sbin:/fabos/link_abin:/fabos/link_sbin:/fabos/link_rbin:/fabos/factory:/fabos/xtool
RETVAL=0
CAT=/bin/cat
ECHO=echo
DATE=/bin/date
cfglog="/var/log/cfglog"
verbose=0
CFGCMD=""

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

cfglogf() {
    $ECHO $@ >> $cfglog
    if [ $verbose -ge 2 ]; then
	$ECHO $@
    fi

}
CFGLOG="cfglogf"

cfglogf_d() {
    $DATE -u               >> $cfglog
    $ECHO $@               >> $cfglog
    if [ $verbose -ge 2 ]; then
	$ECHO $@
    fi

}
CFGLOGD="cfglogf_d"

cfglog_init() {
  if [ -f "$cfglog" ]; then
      log_size=`wc -c $cfglog | awk '{print $1}'`
      if [ $log_size -gt 102400 ]; then
	  /bin/cp $cfglog $cfglog.1
	  $DATE -u > $cfglog
      fi
  fi
}
CFGLOG_INIT="cfglog_init"

cfgcmd()
{
    $DATE -u               >> $cfglog
    $ECHO -e "CFGCMD $@:"  >> $cfglog
    #time $@                >> $cfglog
    $@                >> $cfglog
    rc=$?                  >> $cfglog
    if [ $rc -ne 0 ]; then
        $ECHO "CFGCMD ERR:$rc, $@" >> $cfglog
    fi
}

if [ $verbose -ge 1 ]; then
    CFGCMD="cfgcmd"
fi

cfglog_reset() {
  if [ -f "$cfglog" ]; then
      /bin/cp $cfglog $cfglog.1
      $DATE -u > $cfglog
  fi
}
CFGLOG_RESET="cfglog_reset"

# not defined yet
if [ "$TO_VERSION" == "" ]; then
  CCM_VERSION="/etc/fabos/config/scripts/ccm_version.conf"

  if [ -f "$CCM_VERSION" ]; then
    TO_MAJOR=`cat $CCM_VERSION  | grep "TO" | /bin/awk '{print $2}'`
    TO_MINOR=`cat $CCM_VERSION | grep "TO" | /bin/awk '{print $3}'`
    TO_PATCH=`cat $CCM_VERSION | grep "TO" | /bin/awk '{print $4}'`
    TO_RELEASE=`cat  $CCM_VERSION | grep "TO" | /bin/awk '{print $5}'`

    FROM_MAJOR=`cat $CCM_VERSION | grep "FROM" | /bin/awk '{print $2}'`
    FROM_MINOR=`cat $CCM_VERSION | grep "FROM" | /bin/awk '{print $3}'`
    FROM_PATCH=`cat $CCM_VERSION | grep "FROM" | /bin/awk '{print $4}'`
    FROM_RELEASE=`cat $CCM_VERSION | grep "FROM" | /bin/awk '{print $5}'`
  fi

  TO_VERSION="$TO_MAJOR$TO_MINOR$TO_PATCH$TO_RELEASE"
  FROM_VERSION="$FROM_MAJOR$FROM_MINOR$FROM_PATCH$FROM_RELEASE"
fi

CHASSISCMD=""
SWITCHCMD=""
VFCONTEXT=0
export VF_ENABLED=0
export CURRENT_VF=0
export MAX_SW_INSTANCE=1
SW_PLATFORM=`/sbin/sin 2>/dev/null | sed -n 's/^.*SWBD\([^,]*\),.*/\1/p'`

### set standby flag
STANDBY="TRUE"
# fabos is on
role=`cat /proc/fss/chassis00/* | grep "role" | /bin/awk '{print $4}'`
if [ ! -z ${role+x} ] && [ "$role" == "2" ]; then
    STANDBY="FALSE"
fi

setcontext_()
{
  if [ "$1" != "chassis" ]; then
      export FABOS_SWITCHNO=$1
      # set CURRENT_VF
      /sbin/getfid $1
      CURRENT_VF=$?

      if [ $CURRENT_VF == 0 ]; then
	  $CFGLOG "setcontetx $1, FID not found"
      fi
  else
      export FABOS_SWITCHNO=-1
      export CURRENT_VF=128
  fi
}

export ROLE_ID=root
export CHASSIS_ROLEID=0
export LOGIN_ID=root
export HOME=/root
export LOGNAME=root
export PWD=/root

######################################################################################
# NAME
#    setcontext - setup switch context enviroment
#
# SYNOPSIS
#    set_context FID | chassis
#
# DESCRIPTION
#    This function to set switch context
#
# OPERANDS
#    FID | chassis
#####################################################################################
setcontext()
{
    if [ "$1" != "chassis" ]; then
        $(eval $(/fabos/cliexec/lscfg_util --switch $1))
    else
        $(eval $(/fabos/cliexec/lscfg_util --chassis))
    fi
}

setcontext_inst()
{
  FID=`lscfg_test --fid $1`
  setcontext $FID
}

######################################################################################
# NAME
#    cmd_chassis - VF mode chassis cmd
#
# SYNOPSIS
#    cmd_chassis cmd cmd-arg ..
#
# DESCRIPTION
#
# OPERANDS
#    cmd cmd-arg ..
#####################################################################################
cmd_chassis()
{
    $CFGLOG "cmd_chassis $@"  
    setcontext chassis
    #$DATE -u            >> $cfglog
    $ECHO -e "CHCMD $@:"  >> $cfglog
#    time $@   >> $cfglog
    $@                  >> $cfglog
    rc=$?
    if [ $rc -ne 0 ]; then
        $ECHO "CMD ERR:$rc, $@" >> $cfglog
    fi
}


##################################################################################
# NAME
#    cmd_switch - VF mode
#
# SYNOPSIS
#    cmd_switch FID cmd cmd-arg ..
#               if FID = -1, execute cmd for all LS
#
# DESCRIPTION
#
# OPERANDS
#    cmd  cmd-arg ..
#####################################################################################
cmd_switch()
{
    $CFGLOG "cmd_switch $@"  
    CUR_SW_VF=$1
    shift

    if [ $CUR_SW_VF -ge 0 ]
    then
        setcontext $CUR_SW_VF
	$CFGLOG "CURRENT CONTEXT -- $CUR_SW_VF"

	#$DATE -u            >> $cfglog
	$CFGLOG "SWCMD $@:"
        #    time $@        >> $cfglog
	$@                    >> $cfglog
	rc=$?
	if [ $rc -ne 0 ]; then
	    $CFGLOG "CMD ERR:$rc, $@"
	fi
    else
	# iterate all LS
	for FID in ${CONTEXTS} ; do
            setcontext $FID  2> /dev/null
            $CFGLOG "CURRENT CONTEXT -- $FID"
	    $DATE -u            >> $cfglog
	    $ECHO -e "CMD $@:"  >> $cfglog
             #    time $@        >> $cfglog
	    $@                  >> $cfglog
	    rc=$?
	    if [ $rc -ne 0 ]; then
		$CFGLOG "CMD ERR:$rc, $@" >> $cfglog
	    fi
	done
    fi
}

# swithc is up
if [ -e /proc/fabos/switch ]; then
  if [ ! -e /fabos/link_sbin/lscfg_test ]
  then
    /bin/ln -s /fabos/cliexec/lscfg_util /fabos/link_sbin/lscfg_test 2> /dev/null
  fi

  if [[ "$(lscfg_test --vf_enabled 2> /dev/null)" == 'VF is enabled.' ]];  then
    CONTEXTS=`lscfg_test --all | /bin/awk 'FNR > 5 {print $2}'`
    MAX_SW_INSTANCE=`lscfg_test --max`
    NUM_SW_TOTAL=$(lscfg_test --all  | awk '/Total/ {print $5}')
    HOME_VF=128
  else
    MAX_SW_INSTANCE=1
    NUM_SW_TOTAL=1
    HOME_VF=
  fi

#  /fabos/bin/fosconfig --show | grep "Virtual Fabric" | grep "enabled" > /dev/null 2>&1
#  if [ $? -ne 0 ]; then VF_ENABLED=0
#  fi

else
  # get it from vf.vonf
  MAX_SW_INSTANCE=`/sbin/getmaxswitch`
fi

/sbin/getvf
VF_ENABLED=$?

SWITCHCMD="cmd_switch"
CHASSISCMD="cmd_chassis"

export HOME_VF