#!/pkg/bin/ksh 
# ---------------------------------------------------------------------
# show_tech_mcast_fast -- Runs plaform independent commands for 'show 
#                         tech-support multicast' using show tech infra
#                         "fast" api.
#
# August 2008 - Subhas Sinha
#
# Copyright (c) 2003-2020 by cisco Systems, Inc.
# All rights reserved.
#----------------------------------------------------------------------
#
# This script runs all the show commands required for the show tech-support
# multicast command.
#
# Options:
#   [i_<ipv4|ipv6>_i]      Obtains address family specific information.
#   [v_<vrf>_v]            Run commands for a specific vrf 
#   [s_<source_addr>_s]    Run commands for specified source addr.
#   [g_<group_addr>_g]     Run commands for specified group addr.
#   [h_<0|1>_h]            Obtains only hardware information.
#   <-f disk filename>     Writes output to disk and filename specified.
#   <-d>                   Save in compressed mode 
#   <-t SYS>               This implies the script is to run show commands 
#                          that are to be run only once system wide.
#
# Note that the contents of this script should all remain in one script.
# Because show tech-support multicast needs to be able to operate in low 
# memory conditions, the number of scripts run by the command needs to be 
# minimized. 
#
# This script gets invoked by the show tech multicast command.
# It is the fast version of show_tech_mcast. It  gets indirectly invoked
# by the show tech infra script "show_tech_fast". 
# This script also uses show tech infra api. This is done as follows:
# 1. Create an array of show commands and a corresponding array of 
# executables. 
# 2. Run the show tech infra script - "show_tech_main_fragment".
#    Define a display() function and specify the array(s) of commands 
#    to execute. This is done by passing the array(s) as an argument 
#    to the infra  function "exec_commands".
# 3. Run the show tech infra script - "show_tech_file_fragment".
#
# The show tech infra scripts automatically takes care of collating and 
# saving the results. 
#
# The command array names are prefixed with one of sys|rp|rplc followed by 
# the the component name. This nomenclature is for the for identifying 
# what commands should run on which node. In our case sys_ commands are run 
# once system wide, rp_ commands on rp. 
# 
# This script is invoked once on each active rp.

# Routines used by the script 
##############################



#
# Determine what mcast processes are running.
#
mcast_proc_running () {
    is_mcast_run=$(placed_show | grep "^pim$" | wc -l)
    is_msdp_run=$(placed_show | grep "^msdp$" | wc -l)
    is_autorpma_run=$(placed_show | grep "^autorp_map_agent$" | wc -l)
    is_autorpcrp_run=$(placed_show | grep "^autorp_candidate_rp$" | wc -l)
    is_mldp_run=$(placed_show | grep "^mpls_ldp$" | wc -l)
    is_bgp_run=$(placed_show | grep "^bgp$" | wc -l)
    # these aren't placeable processes
    is_pimma_run=$($cmd_procs | grep "pim_ma" | grep -v "grep" | wc -l)
    is_pim6ma_run=$($cmd_procs | grep "pim6_ma" | grep -v "grep" | wc -l)
}

# 
# This function converts a v4 ip address from hex to dotted decimal
# This is used for display purposes 
# 
hex2addr_v4 () { 
    hex=$1 

    # Strip all leading space and 0x.
    hex=${hex##*0x}

    # Strip all trailing space
    hex=${hex%% *}

    if [[ ${#hex} != 8 ]]; then
        echo "invalid"
    else
        ((first_byte=(16#$hex >> 24) & 16#000000ff))
        ((second_byte=(16#$hex >> 16) & 16#000000ff))
        ((third_byte=(16#$hex >> 8) & 16#000000ff))
        ((fourth_byte=16#$hex & 16#000000ff))
        echo "$first_byte.$second_byte.$third_byte.$fourth_byte"
    fi

} 

# 
# This function converts a v4 ip address from hex to colon delimited
# This is used for display purposes 
# 
hex2addr_v6 () { 
    hex=$1 

    # Strip all leading space and 0x.
    hex=${hex##*0x}

    # Strip all trailing space
    hex=${hex%% *}

    if [[ ${#hex} != 32 ]]; then
        echo "invalid"
    else

        # Insert a ":" after every four hex digits 

        # Note: Getting a "bad substitution" error with substring operations 
        # and using this technique

        # blkptr and blkptr_end is used to point to the begining and end of
        # a 4 hex digit block
        typeset -i blkptr=1
        typeset -i blkptr_end

        # This variable  stores the resultant string 
        v6_addr_str=""

        # For each set of 4 digits
        while [ blkptr -lt 32 ] ; do
            blkptr_end=$blkptr+3
            v6_addr_part=$(echo ${hex} | cut -c ${blkptr}-${blkptr_end})
            v6_addr_str="$v6_addr_str:$v6_addr_part"
            blkptr=$blkptr+4
        done

        # Remove the leading ":"
        v6_addr_str=${v6_addr_str#:}

        echo $v6_addr_str 

    fi

} 

#
# This function is used to create the platform specific 
# command array. For most parts this function works like 
# create_location_specific_array. In addition it adds some 
# platform specific parameters to the commands. 
# Also, this function is called irrespective of whether the 
# command is to be run for a specific location or all locations
init_platform_showtech_mcast () { 

    # If this is for a gsr platform add the additional parameters
    platform=$(get_platform_type)

    if [[ "$platform" != "PRP" ]]; then
        plat_gsr_opts=""
    fi

    if [[ "$platform" != "HFR" ]]; then
        plat_crs_opts=""
    fi

    plat_opts="$plat_opts $plat_gsr_opts $plat_crs_opts"

    if [[ "$platform" = "PANINI" ]]; then
        plat_opts="$plat_opts -u $__tar_file_directory_on_node"
    fi

    # Get node location
    if type node_list_generation >/dev/null 2>&1; then
        location=$(node_list_generation -f MY)
    else
        location=$(node_conversion -E $(uname -n))
    fi

    pq_nodeid=`node_conversion -I $location`
    fq_nodeid=`node_conversion -i $int_node_name`

    # Check if this is a fabric card and ignore it. 
    # This is CRS specific
    if [[ "$platform" = "ASR9k" || "$location" != *SP* ]] ; then
        platform__ksh[1]="platform_show_tech_mcast -n $fq_nodeid -m $location $plat_opts"
        platform_exec[1]="platform show tech multicast $location"
        platform__ksh[2]=''
    fi # location != *SP*
}





# ##################################################################
# Main starts here. 
# ##################################################################

. /pkg/bin/show_tech_main_fragment

#
# Set the default values for all the arguments"
#
pi_mc_plat=''
addr_type="ipv4"
bgp_addr_parm="0x1"
mhost_addr_parm="0x1"
group_addr_hex=""
gmp_gaddr_hex=''
group_addr_str=""
file_name=""
source_addr_hex=""
source_addr_str=""
vrf_name="" ; vrf_parm=""
mrib_cmd_vrf_parm=''
hardware_flag=0
debug_flag=0
plat_opts=""
plat_gsr_opts=""
plat_crs_opts=""
card_type=$(node_type)
bgp_vrf_parm=""

is_active_rp=0
is_mcast_run=0
is_pimma_run=0
is_pim6ma_run=0
is_msdp_run=0
is_autorpma_run=0
is_autorpcrp_run=0
is_mldp_run=0
rploc=''
sby_msdp=''
sby_pim=''
sby_pim_ma=''
sby_autorp_crp=''
sby_autorp_ma=''
sby_gmp=''
sby_mrib=''
sby_mldp=''
sby_bgp=''

#
# Read in the arguments to the script, setting node_required, group, location
# and filename according to these arguments.
#
# Note that it is important for security reasons that users can only enter 
# alphanumeric filenames and nodes and that anywhere calling this script must
# enforce this.  
#


# save the argument list for debug purpose
arg_list=$(echo $@)
default_parser_args=""

while [ "$#" -gt "0" ]; do

    # We check whether this is our clubbed argument 
    # We do this by searching if a argument begins with [i 
    #
    # I have run into issues with ksh pattern matching on the router and 
    # and hence am using this technique.
    typeset -i res; 
    res=$(echo $1 | grep '^\[i_'| wc -l) 

    if [[ "$res" -eq "1" ]] ; then

        # We have a clubbed argument and we extract the parameters. 
        # Issues with ksh pattern matching has led me to use this technique
        # for pattern matching.

        # Retrieve/ set the addr_type parameter
        temparg=${1##*\[i_}; temparg=${temparg%%_i\]*}; addr_type=$temparg

        # if the addr_type is blank then set it to ipv4. 
        # mhost_addr_parm is set to 0x1 by default so nothing needs to be done
        # however, if addr_type is ipv6 then mhost_addr_parm needs to be set 
        if [[ $addr_type = "ipv6" ]]; then 
            mhost_addr_parm="0x2"
            bgp_addr_parm="0x2"
        fi

        plat_opts="$plat_opts -c $card_type -i $addr_type"
        # Retrieve and set the vrf related parameters
        temparg=${1##*\[v_}; temparg=${temparg%%_v\]*}; vrf_name=$temparg

        if [[ $vrf_name != "" ]]; then 
            vrf_parm="-V $vrf_name"
            mrib_vrf_parm="-v $vrf_name"
            mrib_cmd_vrf_parm="-vrf $vrf_name"
            mfib_vrf_parm="-v $vrf_name"
            plat_opts="$plat_opts -v $vrf_name"
            bgp_vrf_parm="-D $vrf_name"
            vrf_name="vrf $vrf_name"
        fi

        # Retrieve and set the source addr related parameter
        temparg=${1##*\[s_}; temparg=${temparg%%_s\]*}; source_addr_hex=$temparg

        if [[ $source_addr_hex != "" ]]; then 
            plat_gsr_opts="$plat_gsr_opts -x $source_addr_hex"
            plat_crs_opts="$plat_crs_opts -x $source_addr_hex"
        fi

        # Retrieve and set the group addr related parameter
        temparg=${1##*\[g_}; temparg=${temparg%%_g\]*}; group_addr_hex=$temparg

        if [[ $group_addr_hex != "" ]]; then 
            plat_gsr_opts="$plat_gsr_opts -y $group_addr_hex"
            plat_crs_opts="$plat_crs_opts -y $group_addr_hex"
        fi

        # Retrieve and set the hardware_flag parameter
        temparg=${1##*\[h_}; temparg=${temparg%%_h\]*}; hardware_flag=$temparg

        # This parameter is processed. Next parameter
        shift 1; 
    else
        # Add non-clubbed arguments to an array that will be passed
        # to default_parser_function
    case "$1" in 
            -t) card_type="$2"
                default_parser_args="$default_parser_args $1 $2"
                shift 2;;
             *) default_parser_args="$default_parser_args $1"
                shift 1;;
    esac
    fi

done

# Parse default arguments
default_parser_function $default_parser_args

# Get the string equivalent of the group hex address 
if [[ $group_addr_hex != "" ]];  then 
    if [[ $addr_type = "ipv6" ]]; then 
        group_addr_str=$(hex2addr_v6 $group_addr_hex)
    else
        group_addr_str=$(hex2addr_v4 $group_addr_hex)
    fi

    # set the platform option as well 
    plat_opts="$plat_opts -g $group_addr_str"     

    # now prefix -g 
    # this will be substituted in the corresponding show command 
    group_addr_hex="-g $group_addr_hex"
    gmp_gaddr_hex="-a $group_addr_hex"
fi 

# Get the string equivalent of the source hex address 
if [[ $source_addr_hex != "" ]];  then 
    if [[ $addr_type = "ipv6" ]]; then 
        source_addr_str=$(hex2addr_v6 $source_addr_hex)
    else
        source_addr_str=$(hex2addr_v4 $source_addr_hex)
    fi 

    # set the platform option as well 
    plat_opts="$plat_opts -s $source_addr_str"     

    # now prefix -s 
    # this will be substituted in the corresponding show command 
    source_addr_hex="-s $source_addr_hex"
fi 

# Set address-family specific multicast addresses
# Also set address-family specific show commands.

if [[ $addr_type = "ipv4" ]] ;then 
    # multicast addresses
    all_routers_addr="224.0.0.2"
    all_pim_routers_addr="224.0.0.13"
    group_membership_addr="224.0.0.22"
    cisco_rp_announce_addr="224.0.1.39"
    cisco_rp_discovery_addr="224.0.1.40"

    all_routers_addr_hex="e0000002"
    all_pim_routers_addr_hex="e000000d"
    group_membership_addr_hex="e0000016"
    cisco_rp_announce_addr_hex="e0000127"
    cisco_rp_discovery_addr_hex="e0000128"

    mrib_clnt_pim="pim"
    mrib_clnt_gmp="igmp"
    mrib_clnt_bcdl="bcdl_agent"
    mrib_clnt_msdp="msdp"
    mlib_clnt_pim="ipv4_pim"
    mlib_clnt_gmp="igmp"

    show_gmp_exec='show igmp'

    # routines
    show_gmp_ksh='igmp_show'
    show_pim_ksh="show_pim_client"
    show_pim_bsr_ksh='show_pim_bsr_client'
    show_mrib_ksh="mrib_show"
    show_mrib_frr_ksh='mrib_show_frr'
    show_mrib_ltrace_ksh="mrib_show_ltrace"
    show_pim_ltrace_ksh="show_ltrace_pim"
    show_mfwd_ltrace_ksh="ipv4_mfwd_show_ltrace"
    show_mfwd_ma_ltrace_ksh="show_ipv4_mfwd_ma_ltrace_client"
    show_cef_ksh="fib_show_command  -O 0x0"
    show_mfwd_ksh="show_ipv4_mfwd_client"
    show_mfwd_nsf_ksh="show_ipv4_mfwd_nsf_client"
    show_access_list_ksh="ipv4_acl_show"
    show_gmp_ltrace_ksh='igmp_show_ltrace'
    show_mrib_cofo_ksh="show_mrib_cofo"
else 
    # multicast addresses
    all_routers_addr="FF01:0:0:0:0:0:0:2"
    all_pim_routers_addr="FF02:0:0:0:0:0:0:D"
    group_membership_addr="FF02:0:0:0:0:0:0:16"

    all_routers_addr_hex="FF010000000000000000000000000002"
    all_pim_routers_addr_hex="FF02000000000000000000000000000D"
    group_membership_addr_hex="FF020000000000000000000000000016"

    mrib_clnt_pim="pim6"
    mrib_clnt_gmp="mld"
    mrib_clnt_bcdl="bcdl_agent"
    mrib_clnt_msdp=""
    mlib_clnt_pim="ipv6_pim"
    mlib_clnt_gmp="mld"

    show_gmp_exec='show mld'

    # routines
    show_gmp_ksh='mld_show'
    show_pim_ksh="show_pim6_client"
    show_pim_bsr_ksh='show_pim6_bsr_client'
    show_mrib_ksh="mrib6_show"
    show_mrib_frr_ksh='mrib6_show_frr'
    show_mrib_ltrace_ksh="mrib6_show_ltrace"
    show_pim_ltrace_ksh="show_ltrace_pim6"
    show_mfwd_ltrace_ksh="ipv6_mfwd_show_ltrace"
    show_mfwd_ma_ltrace_ksh="show_ipv6_mfwd_ma_ltrace_client"
    show_cef_ksh="fib_show_command  -O 0x1"
    show_mfwd_ksh="show_ipv6_mfwd_client"
    show_mfwd_nsf_ksh="show_ipv6_mfwd_nsf_client"
    show_access_list_ksh="ipv6_acl_show"
    show_gmp_ltrace_ksh='mld_show_ltrace'
    show_mrib_cofo_ksh="show_mrib6_cofo"
fi 

pi_mc_plat=`uname -m`
if [[ "$platform" = "PRP" ]] ; then
    #c12000
    cmd_inst='instcmd'
    cmd_sh_plat='show_platform'
    cmd_sh_ctx='dumper_context -c 0x1'
    cmd_sh_blk='show_processes -b'
    cmd_sh_mem='show_memory -s'
    cmd_procs='pidin'
elif [[ "$platform" = "ASR9k" || "$platform" = "asr9k" || "$platform" = "viking" ]] ; then
    #asr9k
    cmd_inst='instcmd'
    cmd_sh_plat='show_platform_vkg -e'
    cmd_sh_ctx='dumper_context -c 0x1'
    cmd_sh_blk='show_processes -b'
    cmd_sh_mem='show_memory -s'
    cmd_procs='pidin'
elif [[ "$platform" = "HFR" || "$platform" = "hfr" ]] ; then
    #crs
    cmd_inst='instcmd'
    cmd_sh_plat='shelfmgr_show_hfr -e'
    cmd_sh_ctx='dumper_context -c 0x1'
    cmd_sh_blk='show_processes -b'
    cmd_sh_mem='show_memory -s'
    cmd_procs='pidin'
elif [[ "$platform" = "ENXR" || "$platform" = "enxr" ]] ; then
    #enxr
    cmd_inst='echo'
    cmd_sh_plat='show_platform'
    cmd_sh_ctx='dumper_context -c 0x1'
    cmd_sh_blk='show_processes -b'
    cmd_sh_mem='show_memory -s'
    cmd_procs='ps -eLf'
elif [[ "$platform" = "PANINI" || "$platform" = "panini" ]] ; then
    #ncs
    cmd_inst='sdr_instcmd'
    cmd_sh_plat='show_platform_sysdb'
    cmd_sh_ctx='corehelper_context -c 0x1 -n all'
    cmd_sh_blk='sh_proc_ng_blocked'
    cmd_sh_mem='show_memory_ng -s'
    cmd_procs='ps -eLf'
elif [[ $pi_mc_plat == 'x86_64' ]] ; then
    #ncs
    cmd_inst='sdr_instcmd'
    cmd_sh_plat='show_platform_sysdb'
    cmd_sh_ctx='corehelper_context -c 0x1 -n all'
    cmd_sh_blk='sh_proc_ng_blocked'
    cmd_sh_mem='show_memory_ng -s'
    cmd_procs='ps -eLf'
else
    cmd_inst='instcmd'
    cmd_sh_plat='show_platform'
    cmd_sh_ctx='dumper_context -c 0x1'
    cmd_sh_blk='show_processes -b'
    cmd_sh_mem='show_memory -s'
    cmd_procs='pidin'
fi

if type node_list_generation >/dev/null 2>&1; then
    node_name=$(node_conversion -N $(node_list_generation -f MY))
else
    node_name=$(uname -n)
fi

fq_nodeid=`node_conversion -i $node_name`
if [[ "$card_type" == *RP ]]; then
    node_output=$(sdr_show_info -l | grep Primary | cut -c12-22)
    #for lindt platform sdr_show_info is not supported. So if its empty run
    #lindt comman to figure out if we are active or standby.
    if [[ "$node_output" == "" ]] ; then
        node_output=$(show_platform_sysdb | grep "Active" | cut -d " " -f1)
    fi
    for name in ${node_output[@]} ; do
        name=$(echo $name | sed -e 's/\n//g')
        node_active=$(node_conversion -N $name)
        if [[ "$node_active" == "$node_name" ]] ; then
            is_active_rp=1
            sby_mldp='-Z false'
            break
        fi
    done

    if [[ $is_active_rp -eq 0 ]] ; then
        echo "Role is standby"
        rploc='standby'
        sby_msdp='-j'
        sby_pim='-a'
        sby_pim_ma='-a'
        sby_autorp_crp='-a'
        sby_autorp_ma='-a'
        sby_gmp='-b'
        sby_mrib='-standby'
        sby_mldp='-Z true'
        sby_bgp='-1'
    fi
fi

# *****************************************************
#  Commands for show tech-support (i.e "location all")
# ******************************************************

# This is a list of commands to be run by the show tech-support that are 
# platform-independent and have a location all option. 

#  General commands for show tech-support multicast (run once)
idx=1
sys_exec[$idx]='show running-config'
sys__ksh[$idx]='nvgen -c -l 1 -t 1 -o 1'
idx=$((idx+1))

sys_exec[$idx]='show ip interface brief'
sys__ksh[$idx]='show_ip_interface -b'
idx=$((idx+1))

sys_exec[$idx]='show install active'
sys__ksh[$idx]="$cmd_inst show install active"
idx=$((idx+1))

sys_exec[$idx]='show install inactive'
sys__ksh[$idx]="$cmd_inst show install inactive all"
idx=$((idx+1))

sys_exec[$idx]='show platform'
sys__ksh[$idx]="$cmd_sh_plat"
idx=$((idx+1))

sys_exec[$idx]='show context'
sys__ksh[$idx]="$cmd_sh_ctx"
idx=$((idx+1))

sys_exec[$idx]='show access-lists $addr_type'
sys__ksh[$idx]="$show_access_list_ksh"
idx=$((idx+1))

sys_exec[$idx]="show mhost $addr_type default-interface"
sys__ksh[$idx]="ip_arm_show_mhost -a $mhost_addr_parm"
idx=$((idx+1))

sys_exec[$idx]='show imds interface brief'
sys__ksh[$idx]='im_show database -l 0x0 -v 0x2'
idx=$((idx+1))

sys_exec[$idx]='show redundancy'
sys__ksh[$idx]='redcon_show'
idx=$((idx+1))

sys_exec[$idx]='show sdr'
sys__ksh[$idx]='sdr_show_info -l'
idx=$((idx+1))

sys_exec[$idx]='show logging'
sys__ksh[$idx]='show_logging'
idx=$((idx+1))
# Commented out since output takes too long to be gathered
#sys_exec[$idx]="show version"
#sys__ksh[$idx]="show_version"
#idx=$((idx+1))

sys_exec[$idx]=''
sys__ksh[$idx]=''

#  General commands for show tech-support multicast (run per node)
idx=1
sys_all_exec[$idx]="show processes aborts"
sys_all__ksh[$idx]="sysmgr_show -o -l aborts"
idx=$((idx+1))

sys_all_exec[$idx]="show processes blocked" 
sys_all__ksh[$idx]="$cmd_sh_blk"
idx=$((idx+1))

sys_all_exec[$idx]="show memory summary"
sys_all__ksh[$idx]="$cmd_sh_mem"
idx=$((idx+1))

sys_all_exec[$idx]="show process ipv4_mfwd_partner"
sys_all__ksh[$idx]="sysmgr_show -o -p ipv4_mfwd_partner" 
idx=$((idx+1))

sys_all_exec[$idx]="show process ipv6_mfwd_partner"
sys_all__ksh[$idx]="sysmgr_show -o -p ipv6_mfwd_partner" 
idx=$((idx+1))

sys_all_exec[$idx]=''
sys_all__ksh[$idx]=''

#  General commands for show tech-support multicast (run per RP)
idx=1
sys_rp_exec[$idx]="show process mrib"
sys_rp__ksh[$idx]="sysmgr_show -o -p mrib" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process mrib6"
sys_rp__ksh[$idx]="sysmgr_show -o -p mrib6" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process pim"
sys_rp__ksh[$idx]="sysmgr_show -o -p pim" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process pim6"
sys_rp__ksh[$idx]="sysmgr_show -o -p pim6" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process igmp"
sys_rp__ksh[$idx]="sysmgr_show -o -p igmp" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process mld"
sys_rp__ksh[$idx]="sysmgr_show -o -p mld" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process ipv4_mfwd_ma"
sys_rp__ksh[$idx]="sysmgr_show -o -p ipv4_mfwd_ma" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process ipv6_mfwd_ma"
sys_rp__ksh[$idx]="sysmgr_show -o -p ipv6_mfwd_ma" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process pim_ma"
sys_rp__ksh[$idx]="sysmgr_show -o -p pim_ma" 
idx=$((idx+1))

sys_rp_exec[$idx]="show process pim6_ma"
sys_rp__ksh[$idx]="sysmgr_show -o -p pim6_ma" 
idx=$((idx+1))

sys_rp_exec[$idx]="show pim issu"
sys_rp__ksh[$idx]="show_pim_bsr_client -L"
idx=$((idx+1))

sys_rp_exec[$idx]="show pim ipv6 issu"
sys_rp__ksh[$idx]="show_pim6_bsr_client -L"
idx=$((idx+1))

platform=$(get_platform_type)
if [ "$platform" = "panini" ] ; then
    sys_rp_exec[$idx]="show issu milestone clients location all"
    sys_rp__ksh[$idx]="issu_show_status -c"
    idx=$((idx+1))
fi


sys_rp_exec[$idx]=''
sys_rp__ksh[$idx]=''

########################################################
#  MSDP commands for show tech-support multicast
########################################################

idx=1
rp_msdp_exec[$idx]="show msdp $rploc $vrf_name summary"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -S -P $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc globals"
rp_msdp__ksh[$idx]="msdp_show -G $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name context private"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -c -h $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name sa-cache summary"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -C -S $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name sa-cache all"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -C -X $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name peer private"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -P -h $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name statistics peer private"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -e -h $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]="show msdp $rploc $vrf_name sa-cache $group_addr_str"
rp_msdp__ksh[$idx]="msdp_show $vrf_parm -C $group_addr_hex $sby_msdp"
idx=$((idx+1))

rp_msdp_exec[$idx]=''
rp_msdp__ksh[$idx]=''

########################################################
#  PIM commands for show tech-support multicast
########################################################

idx=1
rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type group-map detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -m1 -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type topology route-count"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -t -u $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type topology $source_addr_str $group_addr_str detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm $group_addr_hex $source_addr_hex -t -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc vrf all $addr_type topology summary detail"
rp_pim__ksh[$idx]="$show_pim_ksh -V all -t -y -o $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type rpf private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -q 0x4 -w default -p -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type rpf summary"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -q 0x4 -w default -p -u $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type traffic private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -T -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type interface statistics"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -2 $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type join-prune statistic"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -j $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type interface detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -i -x 0x2 -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type tunnel info all private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -v -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type tunnel info all netio private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -v -z -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type neighbor detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -n 1 -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type neighbor inactive"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -n 2"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type interface"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -i -x 0x2"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $addr_type nsf detail private"
rp_pim__ksh[$idx]="$show_pim_ksh -N -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $addr_type nsr"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh -N $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type summary"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -S $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type context detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -X 0 -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc bgp-safi"
rp_pim__ksh[$idx]="$show_pim_ksh -B $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt cache summary"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -K $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt cache detail priv"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -J -o -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt prefix local private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x0 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt prefix remote private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x1 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt mldp local private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x2 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt mldp remote private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x3 -k $sby_pim"

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt p2mp-te local private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x4 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt p2mp-te remote private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x5 -k $sby_pim"

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt ingress-replication local private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x6 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mdt ingress-replication remote private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -Z 0x7 -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $vrf_name $addr_type pe"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -8 $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type mvpn-id"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -I $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type df election-state"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -e $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type bsr election private"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -E -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type bsr rp-cache private"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -R -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show pim $rploc $vrf_name $addr_type bsr candidate-rp private"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -C -k $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $addr_type segmented private detail"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh -z -k -o $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $vrf_name $addr_type database ingress-replication"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -i -D $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $vrf_name $addr_type database p2mp-te"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -p -D $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $vrf_name $addr_type database sr-p2mp"
rp_pim__ksh[$idx]="$show_pim_bsr_ksh $vrf_parm -T $sby_pim"
idx=$((idx+1))

rp_pim_exec[$idx]="show mvpn $rploc $vrf_name $addr_type context detail private"
rp_pim__ksh[$idx]="$show_pim_ksh $vrf_parm -X 1 -o -k $sby_pim"
idx=$((idx+1))

if [ $addr_type = "ipv4" ] ;then 
    rp_pim_exec[$idx]="show pim $rploc $vrf_name topology $cisco_rp_discovery_addr"
    rp_pim__ksh[$idx]="show_pim_client $vrf_parm -t -g $cisco_rp_discovery_addr_hex $sby_pim"
    idx=$((idx+1))

    rp_pim_exec[$idx]="show pim $rploc $vrf_name topology $cisco_rp_announce_addr"
    rp_pim__ksh[$idx]="show_pim_client $vrf_parm -t -g $cisco_rp_announce_addr_hex $sby_pim"
    idx=$((idx+1))
fi 

rp_pim_exec[$idx]=''
rp_pim__ksh[$idx]=''

####################################################
#  BGP MVPN commands for show tech-support multicast
####################################################

idx=1

rp_bgp_mvpn_exec[$idx]="show bgp $rploc $vrf_name $addr_type mvpn"
rp_bgp_mvpn__ksh[$idx]="bgp_show -V default -A $bgp_addr_parm -W 0x5 -t $sby_bgp $bgp_vrf_parm -instance default"
idx=$((idx+1))

rp_bgp_mvpn_exec[$idx]="show bgp $rploc ipv4 mdt"
rp_bgp_mvpn__ksh[$idx]="bgp_show -V default -A 0x1 -W 0x42 -t $sby_bgp -instance default"
idx=$((idx+1))

rp_bgp_mvpn_exec[$idx]=""
rp_bgp_mvpn__ksh[$idx]=""

####################################################
#  PIM MA commands for show tech-support multicast
####################################################

idx=1
rp_pim_ma_exec[$idx]="show pim $rploc $addr_type ma interface detail"
rp_pim_ma__ksh[$idx]="$show_pim_ksh -4 -i -o $sby_pim_ma"
idx=$((idx+1))

rp_pim_ma_exec[$idx]="show pim $rploc $addr_type ma summary"
rp_pim_ma__ksh[$idx]="$show_pim_ksh -4 -S $sby_pim_ma"
idx=$((idx+1))

rp_pim_ma_exec[$idx]=''
rp_pim_ma__ksh[$idx]=''

#################################################
# AutoRP CRP commands for show tech-support multicast 
#################################################

idx=1
rp_autorp_crp_exec[$idx]="show auto-rp candidate-rp $rploc"
rp_autorp_crp__ksh[$idx]="show_candidate_rp_client -cmd 0x1 $sby_autorp_crp"

rp_autorp_crp_exec[$idx]="show auto-rp candidate-rp $roloc traffic"
rp_autorp_crp__ksh[$idx]="show_candidate_rp_client -cmd 0x2 $sby_autorp_crp"

rp_autorp_crp_exec[$idx]=''
rp_autorp_crp__ksh[$idx]=''

#################################################
# AutoRP MA commands for show tech-support multicast 
#################################################

idx=1
rp_autorp_ma_exec[$idx]="show auto-rp mapping-agent $rploc detail private"
rp_autorp_ma__ksh[$idx]="show_map_agent_client -cmd 0x1 -detail -private $sby_autorp_ma"
idx=$((idx+1))

rp_autorp_ma_exec[$idx]="show auto-rp mapping-agent $rploc traffic"
rp_autorp_ma__ksh[$idx]="show_map_agent_client -cmd 0x2 $sby_autorp_ma"
idx=$((idx+1))

rp_autorp_ma_exec[$idx]=''
rp_autorp_ma__ksh[$idx]=''

###################################################
# IGMP/MLD commands for show tech-support multicast 
###################################################

idx=1
rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name summary"
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -S $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name groups summary" 
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -s $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name groups $group_addr_str detail"
rp_gmp__ksh[$idx]="$show_gmp_ksh -g $gmp_gaddr_hex $vrf_parm -d $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name ranges $group_addr_str detail"
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -Q $gmp_gaddr_hex $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name interface"
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -i $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name traffic"
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -T $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc $vrf_name ssm map detail"
rp_gmp__ksh[$idx]="$show_gmp_ksh $vrf_parm -m -d $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc nsf detail"
rp_gmp__ksh[$idx]="$show_gmp_ksh -q -d $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]="$show_gmp_exec $rploc nsr"
rp_gmp__ksh[$idx]="$show_gmp_ksh -N $sby_gmp"
idx=$((idx+1))

rp_gmp_exec[$idx]=''
rp_gmp__ksh[$idx]=''

##############################################
# MRIB commands for show tech-support multicast
##############################################

idx=1
rp_mrib_exec[$idx]="show mrib $rploc $addr_type client filter"
rp_mrib__ksh[$idx]="$show_mrib_ksh -cmd 0x1 -f $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type client detail private"
rp_mrib__ksh[$idx]="$show_mrib_ksh -cmd 0x1 -detail -private $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $vrf_name $addr_type route summary"
rp_mrib__ksh[$idx]="$show_mrib_ksh $mrib_vrf_parm -e -i -S -O $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $vrf_name $addr_type route $source_addr_str $group_addr_str detail private"
rp_mrib__ksh[$idx]="$show_mrib_ksh $mrib_vrf_parm -e -i -O -D -P $source_addr_hex $group_addr_hex $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $vrf_name $addr_type tlc"
rp_mrib__ksh[$idx]="$show_mrib_ksh $mrib_vrf_parm -t $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type nsf detail"
rp_mrib__ksh[$idx]="$show_mrib_ksh -cmd 0x3 -detail $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type nsr end detail"
rp_mrib__ksh[$idx]="$show_mrib_ksh -cmd 0xa -detail $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type iir-interface private"
rp_mrib__ksh[$idx]="$show_mrib_ksh -b -P $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type encap-id private"
rp_mrib__ksh[$idx]="$show_mrib_ksh -q 0x0 -P $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type regdb private"
rp_mrib__ksh[$idx]="$show_mrib_ksh -K -P $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type mdt-interface detail"
rp_mrib__ksh[$idx]="$show_mrib_ksh -x -D $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type bvi interface"
rp_mrib__ksh[$idx]="$show_mrib_ksh -1 -I $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type bvi route summary"
rp_mrib__ksh[$idx]="$show_mrib_ksh -Y $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $rploc $addr_type bvi route"
rp_mrib__ksh[$idx]="$show_mrib_ksh -o $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib evpn bucket-db private"
rp_mrib__ksh[$idx]="$show_mrib_ksh -a $sby_mrib"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $addr_type cofo ip-mcast"
rp_mrib__ksh[$idx]="$show_mrib_cofo_ksh ip-mcast"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $addr_type cofo encap-id"
rp_mrib__ksh[$idx]="$show_mrib_cofo_ksh encap-id"
idx=$((idx+1))

rp_mrib_exec[$idx]="show mrib $addr_type cofo lsm"
rp_mrib__ksh[$idx]="$show_mrib_cofo_ksh lsm"
idx=$((idx+1))

# Add mrib specific commands before the $addr_type = "ipv4" block 
# and modify the array accordingly. 
if [ $addr_type = "ipv4" ] ;then 
    rp_mrib_exec[$idx]="show mrib $rploc $vrf_name route $cisco_rp_discovery_addr"
    rp_mrib__ksh[$idx]="mrib_show $mrib_vrf_parm -g $cisco_rp_discovery_addr_hex -e -i -O $sby_mrib"
    idx=$((idx+1))

    rp_mrib_exec[$idx]="show mrib $rploc $vrf_name route $cisco_rp_announce_addr"
    rp_mrib__ksh[$idx]="mrib_show $mrib_vrf_parm -g $cisco_rp_announce_addr_hex -e -i -O $sby_mrib"
    idx=$((idx+1))
fi

rp_mrib_exec[$idx]=''
rp_mrib__ksh[$idx]=''


#################################################
# MLDP commands for show tech-support multicast (RP only)
#################################################

idx=1
rp_mldp_exec[$idx]="show mpls mldp database details $rploc"
rp_mldp__ksh[$idx]="show_mldp_client -c -k $sby_mldp"
idx=$((idx+1))

rp_mldp_exec[$idx]="show mpls mldp neighbors detail $rploc"
rp_mldp__ksh[$idx]="show_mldp_client -b -k $sby_mldp"
idx=$((idx+1))

rp_mldp_exec[$idx]="show mpls mldp root details $rploc"
rp_mldp__ksh[$idx]="show_mldp_client -d -k $sby_mldp"
idx=$((idx+1))

rp_mldp_exec[$idx]="show mpls mldp forwarding $rploc"
rp_mldp__ksh[$idx]="show_mldp_client -j $sby_mldp"
idx=$((idx+1))

rp_mldp_exec[$idx]=''
rp_mldp__ksh[$idx]=''

#################################################
# LSM commands for show tech-support multicast (RP only)
#################################################

idx=1
rp_lsm_exec[$idx]="show mrib $rploc $addr_type mpls forwarding detail private"
rp_lsm__ksh[$idx]="$show_mrib_frr_ksh -p -P -D $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]="show mrib $rploc $addr_type mpls route summary"
rp_lsm__ksh[$idx]="$show_mrib_ksh -B 0x0 0x1 $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]="show mrib $rploc $addr_type mpls route"
rp_lsm__ksh[$idx]="$show_mrib_ksh -B 0x0 0x0 $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]="show mrib $rploc $addr_type mpls traffic-eng fast-reroute database"
rp_lsm__ksh[$idx]="$show_mrib_frr_ksh -h $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]="show mrib $rploc $addr_type label-table-info"
rp_lsm__ksh[$idx]="$show_mrib_ksh -cmd 0x7 $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]="show mrib $rploc $addr_type mpls traffic-eng backup database"
rp_lsm__ksh[$idx]="$show_mrib_ksh -G -P $sby_mrib"
idx=$((idx+1))

rp_lsm_exec[$idx]=''
rp_lsm__ksh[$idx]=''

###############################################
# LSM commands for show tech-support multicast 
# RP & LC.
###############################################

idx=1
rp_lsm_a_exec[$idx]="show mfib $addr_type lsm idb"
rp_lsm_a__ksh[$idx]="$show_mfwd_ksh -L -T"
idx=$((idx+1))

rp_lsm_a_exec[$idx]=''
rp_lsm_a__ksh[$idx]=''

# Trace commands that are to be run on the rp
idx=1
rp_trace_exec[$idx]="show pim $addr_type trace"
rp_trace__ksh[$idx]="$show_pim_ltrace_ksh"
idx=$((idx+1))

rp_trace_exec[$idx]="show pim $addr_type mlib trace nsr"
rp_trace__ksh[$idx]="mlib_nsr_show_ltrace -C $mlib_clnt_pim"
idx=$((idx+1))

rp_trace_exec[$idx]="$show_gmp_exec trace"
rp_trace__ksh[$idx]="$show_gmp_ltrace_ksh"
idx=$((idx+1))

rp_trace_exec[$idx]="show $mlib_clnt_gmp $addr_type mlib trace nsr"
rp_trace__ksh[$idx]="mlib_nsr_show_ltrace -C $mlib_clnt_gmp"
idx=$((idx+1))

rp_trace_exec[$idx]="show mrib $addr_type trace"
rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh"
idx=$((idx+1))

rp_trace_exec[$idx]="show mrib $addr_type trace lsm"
rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh -L"
idx=$((idx+1))

rp_trace_exec[$idx]="show mfib $addr_type ma trace"
rp_trace__ksh[$idx]="$show_mfwd_ma_ltrace_ksh"
idx=$((idx+1))

rp_trace_exec[$idx]="show mfib $addr_type ma trace error"
rp_trace__ksh[$idx]="$show_mfwd_ma_ltrace_ksh -E"
idx=$((idx+1))

rp_trace_exec[$idx]="show mrib $addr_type trace $mrib_clnt_pim"
rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh -C $mrib_clnt_pim"
idx=$((idx+1))

rp_trace_exec[$idx]="show mrib $addr_type trace $mrib_clnt_gmp"
rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh -C $mrib_clnt_gmp"
idx=$((idx+1))

rp_trace_exec[$idx]="show mrib $addr_type trace $mrib_clnt_bcdl"
rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh -C $mrib_clnt_bcdl"
idx=$((idx+1))

rp_trace_exec[$idx]="show lmrib client trace mpls_ldp"
rp_trace__ksh[$idx]="lmrib_show_ltrace -C mpls_ldp"
idx=$((idx+1))

rp_trace_exec[$idx]="show lmrib client trace te_control"
rp_trace__ksh[$idx]="lmrib_show_ltrace -C te_control"
idx=$((idx+1))

rp_trace_exec[$idx]="show mpls mldp trace"
rp_trace__ksh[$idx]="show_mpls_mldp_ltrace"
idx=$((idx+1))

if [ $addr_type = "ipv4" ];then 
    rp_trace_exec[$idx]="show mrib $addr_type trace $mrib_clnt_msdp"
    rp_trace__ksh[$idx]="$show_mrib_ltrace_ksh -C $mrib_clnt_msdp"
    idx=$((idx+1))

    rp_trace_exec[$idx]="show msdp trace"
    rp_trace__ksh[$idx]="show_ltrace_msdp"
    idx=$((idx+1))

    rp_trace_exec[$idx]="show auto-rp candidate-rp trace"
    rp_trace__ksh[$idx]="autorp_show_ltrace -A"
    idx=$((idx+1))

    rp_trace_exec[$idx]="show auto-rp mapping-agent trace"
    rp_trace__ksh[$idx]="autorp_show_ltrace -B"
    idx=$((idx+1))

    rp_trace_exec[$idx]="show auto-rp lib trace"
    rp_trace__ksh[$idx]="autorp_show_ltrace -L"
    idx=$((idx+1))
 
    rp_trace_exec[$idx]="show autorp_map mlib trace nsr"
    rp_trace__ksh[$idx]="mlib_nsr_show_ltrace -C autorp_map"
    idx=$((idx+1))
fi 

rp_trace_exec[$idx]=''
rp_trace__ksh[$idx]=''

# Trace commands for show tech-support multicast that are to be run on all locations
idx=1
rp_trace_a_exec[$idx]="show mfib $addr_type trace"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -A"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mfib $addr_type trace error"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -A -E"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mlib $addr_type trace"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -B"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mlib $addr_type trace error"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -B -E"
idx=$((idx+1))

rp_trace_a_exec[$idx]=''
rp_trace_a__ksh[$idx]=''

# Trace commands for show tech-support multicast that are to be run on all locations
idx=1
rp_trace_a_exec[$idx]="show mfib $addr_type trace"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -A"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mfib $addr_type trace error"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -A -E"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mlib $addr_type trace"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -B"
idx=$((idx+1))

rp_trace_a_exec[$idx]="show mlib $addr_type trace error"
rp_trace_a__ksh[$idx]="$show_mfwd_ltrace_ksh -B -E"
idx=$((idx+1))

rp_trace_a_exec[$idx]=''
rp_trace_a__ksh[$idx]=''

#  Forwarding commands for show tech-support multicast
#  All nodes
idx=1
rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type route summary "
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -b -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type route $source_addr_str $group_addr_str private"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm $source_addr_hex $group_addr_hex -P -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter "
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -c -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter download"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -c -q -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter mismatch"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -c -j -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter signal"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -c -h -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter infra gsp"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -k 0x1 -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter infra sysdb"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -k 0x2 -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter infra im"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -k 0x3 -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type counter shmwin"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -c -w -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $addr_type connection"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -C -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $vrf_name $addr_type interface detail"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh $mfib_vrf_parm -I -d -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $addr_type nsf"
rp_fwd_a__ksh[$idx]="$show_mfwd_nsf_ksh -l $fq_nodeid"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $addr_type encap identifier"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh -X -T"
idx=$((idx+1))

rp_fwd_a_exec[$idx]="show mfib $addr_type encap registration"
rp_fwd_a__ksh[$idx]="$show_mfwd_ksh -Y -T"
idx=$((idx+1))

if [ $addr_type = "ipv4" ] ;then 
    rp_fwd_a_exec[$idx]="show mfib $vrf_name route $cisco_rp_discovery_addr"
    rp_fwd_a__ksh[$idx]="show_ipv4_mfwd_client $mfib_vrf_parm -g $cisco_rp_discovery_addr_hex -T"
    idx=$((idx+1))

    rp_fwd_a_exec[$idx]="show mfib $vrf_name route $cisco_rp_announce_addr"
    rp_fwd_a__ksh[$idx]="show_ipv4_mfwd_client $mfib_vrf_parm -g $cisco_rp_announce_addr_hex -T"
    idx=$((idx+1))
fi 

rp_fwd_a_exec[$idx]=''
rp_fwd_a__ksh[$idx]=''

#Placement commands
mcast_show_proc_run () {
    idx=1

    rp_proc_run_exec[$idx]="show active rp"
    rp_proc_run__ksh[$idx]="echo Active RP: $is_active_rp"
    idx=$((idx+1))
   
    rp_proc_run_exec[$idx]="show proc run mcast-routing"
    rp_proc_run__ksh[$idx]="echo mcast-routing: $is_mcast_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run msdp"
    rp_proc_run__ksh[$idx]="echo mcast-routing: $is_msdp_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run autorp_map_agent"
    rp_proc_run__ksh[$idx]="echo AutorpMA running: $is_autorpma_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run autorp_candidate_rp"
    rp_proc_run__ksh[$idx]="echo AutorpCRP running: $is_autorpcrp_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run mpls_ldp"
    rp_proc_run__ksh[$idx]="echo MLDP running: $is_mldp_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run bgp"
    rp_proc_run__ksh[$idx]="echo BGP running: $is_bgp_run"
    idx=$((idx+1))

    # these aren't placeable processes
    rp_proc_run_exec[$idx]="show proc run pim_ma"
    rp_proc_run__ksh[$idx]="echo pim ma running: $is_pimma_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]="show proc run pim6_ma"
    rp_proc_run__ksh[$idx]="echo pim6 ma running: $is_pim6ma_run"
    idx=$((idx+1))

    rp_proc_run_exec[$idx]=""
    rp_proc_run__ksh[$idx]=""
}

# Platform script for show tech-support multicast 
platform_exec[1]="platform show tech multicast"
platform__ksh[1]="platform_show_tech_mcast $plat_opts"


# This routine is called by show tech infra
display () { 

    if [[ $hardware_flag -eq 1 ]] ; then 

       if [[ "$card_type" == *RP || "$card_type" == "LC" ]]; then
            # initialize the platform__ksh and platform_exec arrays
            init_platform_showtech_mcast

            # run the platform commands 
            exec_commands platform
       fi

    else 

       # these are commands that are run once per system
       # e.g. show platform
       if [ "$card_type" == "SYS" ]; then
          exec_commands sys
       fi

       # these are commands that are run once per active rp
       if [[ "$card_type" == *RP ]]; then
           #
           # Get RP & Multicast process related info
           #

           mcast_proc_running
           mcast_show_proc_run
           exec_commands rp_proc_run

           exec_commands sys_all
           exec_commands sys_rp

           if [[ $addr_type = "ipv4" ]]; then 

               #
               # Is AutoRP MA running on this node
               #
               if [[ $is_autorpma_run -gt 0 ]]; then
                   exec_commands rp_autorp_ma
               fi

               #
               # Is AutoRP CRP running on this node
               #
               if [[ $is_autorpcrp_run -gt 0 ]]; then
                   exec_commands rp_autorpcrp
               fi

               #
               # Is PIM MA running on this node
               #
               if [[ $is_pimma_run -gt 0 ]]; then
                   exec_commands rp_pim_ma
               fi

               #
               # Is MCAST running on this node
               #
               if [[ $is_mcast_run -gt 0 ]]; then
                   exec_commands rp_pim
                   exec_commands rp_mrib
                   exec_commands rp_lsm
                   exec_commands rp_gmp
               fi

               #
               # Is BGP running on this node
               #
               if [[ $is_bgp_run -gt 0 ]]; then
                   exec_commands rp_bgp_mvpn
               fi

               #
               # Is MSDP running on this node
               #
               if [[ $is_msdp_run -gt 0 ]]; then
                   exec_commands rp_msdp
               fi

               #
               # Is MLDP running on this node
               #
               if [[ $is_mldp_run -gt 0 ]]; then
                   exec_commands rp_mldp
               fi

           else

               #
               # Is PIM6 MA running on this node
               #
               if [[ $is_pim6ma_run -gt 0 ]]; then
                   exec_commands rp_pim_ma
               fi

               #
               # Is PIM6 running on this node
               #
               if [[ $is_mcast_run -gt 0 ]]; then
                   exec_commands rp_pim
                   exec_commands rp_mrib
                   exec_commands rp_lsm
                   exec_commands rp_gmp
               fi

               #
               # Is BGP running on this node
               #
               if [[ $is_bgp_run -gt 0 ]]; then
                   exec_commands rp_bgp_mvpn
               fi
               
           fi

          #
          # Applicable to all RP nodes
          #
          exec_commands rp_lsm_a
          exec_commands rp_trace
          exec_commands rp_trace_a
          exec_commands rp_fwd_a

       fi  # card_type = *RP

       # these are commands that are run once per active LC
       if [ "$card_type" == "LC" ]; then

          exec_commands sys_all
          exec_commands rp_lsm_a
          exec_commands rp_fwd_a
          exec_commands rp_trace_a

       fi  # card_type = LC

    fi  # !hardware_flag = 1

 }

# This function calls the display() function and sends the output to file if
# the file option has been set. 
. /pkg/bin/show_tech_file_fragment
