Skip to content

Instantly share code, notes, and snippets.

@nmicic
Last active October 19, 2022 13:32
Show Gist options
  • Select an option

  • Save nmicic/c6e2d38de4ff119c07ed0624320e80f5 to your computer and use it in GitHub Desktop.

Select an option

Save nmicic/c6e2d38de4ff119c07ed0624320e80f5 to your computer and use it in GitHub Desktop.
UcadCryptoMon.sh
#!/bin/bash
### Ver 4.4 # 17th Oct 2022
###Contact: nmicic@cisco.com
### NOTE script monitor for the following errors on DPC only
### ucam_cavecreek_dh_p1_sync()[2995]: cpaCyDhKeyGenPhase1() Failed with Status: -2!
###
### NOTE: Please copy/paste script from begin #!/bin/bash to the ###END
### NOTE: Please copy/paste script from begin #!/bin/bash to the ###END
### NOTE: Please copy/paste script from begin #!/bin/bash to the ###END
read -r -d '' HELP_README << README_BEGIN_END
# get to debug shell after cli test-commands password ...
To run:
cd /var/tmp
cat > UcadCryptoMon_script.sh
<copy/paste this script>
CTRL+D
... then:
chmod +x UcadCryptoMon_script.sh
./UcadCryptoMon_script.sh
exit
NOTE: To stop get in debug shell run in debug shell on Active MIO:
/var/tmp/UcadCryptoMon_script.sh -r
exit
NOTE: To restart script after stopping, please wait couple of minutes! Stopping depends on time $SleepIntervalDPC and $SleepIntervalMIO
NOTE: To Check if script is running on cards:
/var/tmp/UcadCryptoMon_script.sh -c
NOTE: Always check if script is running after starting it, if script re-run is too fast after stopping may not be running on all cards.
#
README_BEGIN_END
### Script start
RebootEnabled="No" # Yes/No
ScheduledReboot=Yes # Yes/No
ScheduledHour=0 # 0=Midnight, 1=1h, 2=2h, ... etc
MinimumActiveCardsAllowingReboot=7
MinimumOfflineCardsAllowingReboot=0
# Please don't change anything below this line!
# Please don't change anything below this line!
# Please don't change anything below this line!
# Please don't change anything below this line!
# Please don't change anything below this line!
UCADDIR="/mnt/hd-raid/data/ucad"
DEBUG=0
DPCDEBUG1=0
DPCDEBUG2=0
LastAction="enableReboot"
TriggerRebootNow="No"
FuncRebootCardCNT=0
FuncRebootCard1stTime=""
DPCRandomTest="No" # Yes/No
SimulateProcUcad="No" # Yes/No
mySLOT=`sn-dlutil --my-slot`
myCPU=`sn-dlutil --my-cpu`
ActiveMIO=$( sn-dlutil --master-spc-slot )
myCARDCPU="card"$mySLOT"-cpu"$myCPU
#CmdMatchingString="(ucad|ucam).*Failed with Status: -2"
CmdMatchingString="(ucad|ucam).*(Failed with Status: -2|Packet Processing Failed with Status)"
CmdExec="dmesg"
SleepIntervalMIO=10 # Please don't change this - it may mess up Minute check in _func_main_mio
SleepIntervalDPC=60 # Changing may impact on Scheduled Reboot Minutee check.
CaseNotMatcheched=0
MaxUcadMinutesDeletion=120
MaxInd=60
deltaUPTIME=0
MEMMAX=8196
MEMINIT=0
j=0
i=0
Count=0
Index=0
PrevDay=0
Day=0
_DayWeek=0
PrevHour=0
Hour=0
PrevMinute=0
Minute=0
CntDay=0
CntHour=0
SCRIPTNAME="UcadCryptoMon"
SCRIPTFILENAME="$SCRIPTNAME"_script.sh
SCRIPTPATH="/var/tmp"
SCRIPTFULLPATH="$SCRIPTPATH"/"$SCRIPTFILENAME"
KEEPRUNNINGFILE="/var/tmp/keeprunning_"$SCRIPTNAME"_script_sh.txt"
LASTRUNFILE="/var/tmp/lastrun_"$SCRIPTNAME"_script_sh.txt"
STOPPEDFILE="/var/tmp/stopped_"$SCRIPTNAME"_script_sh.txt"
CARDEXECUTEDFILE="/var/tmp/cardexecute_"$SCRIPTNAME"_script_sh.txt"
CARDREMOVEDFILE="/var/tmp/cardremoved_"$SCRIPTNAME"_script_sh.txt"
ERRORFILE="/var/tmp/error_"$SCRIPTNAME"_script_sh.txt"
MEMORYCHECKFILE="/var/tmp/memorycheck_"$SCRIPTNAME"_script_sh.txt"
DISABLEREBOOTFILE="/var/tmp/disableReboot_"$SCRIPTNAME"_script_sh.txt"
#begin _icp_qat_stats
ICP_DIR=""
QatHang=0
QatWC=""
QatStats=""
QatInfo=""
TotalHangQat=0
FirstHangQat=""
CollectedFirstQat=0
#end _icp_qat_stats
#begin _ucad_buffers_delta_icp
PREVALLOC1=0
PREVALLOC2=0
PREVALLOC3=0
PREVALLOC4=0
PREVFREE1=0
PREVFREE2=0
PREVFREE3=0
PREVFREE4=0
MAX_ICP_COLL=2
SLEEP_ICP_COLL=0.5
IcpInflights=""
ESPpkts=""
#end _ucad_buffers_delta_icp
for ((i=0;i<32;i++)); do DebugCondition["$i"]=0;done
ARGV1=$1
Threshold_LastCollection[1]=64
Threshold_LastCollection[2]=65
Threshold_TotalALL[1]=10000
Threshold_TotalALL[2]=10001
Threshold_PerDayOfWeek[1]=2048
Threshold_PerDayOfWeek[2]=2049
Threshold_PerHour[1]=256
Threshold_PerHour[2]=257
Threshold_LastPeriod[1]=128
Threshold_LastPeriod[2]=129
test $DPCDEBUG1 -ne 0 && echo ThresholdCounter ErrStatus1 ${Threshold_LastCollection[1]} ${Threshold_TotalALL[1]} ${Threshold_PerDayOfWeek[1]} ${Threshold_PerHour[1]} ${Threshold_LastPeriod[1]} > /dev/kmsg
test $DPCDEBUG1 -ne 0 && echo ThresholdCounter ErrStatus2 ${Threshold_LastCollection[2]} ${Threshold_TotalALL[2]} ${Threshold_PerDayOfWeek[2]} ${Threshold_PerHour[2]} ${Threshold_LastPeriod[2]} > /dev/kmsg
# cat /proc/ucad/debug/stats_raw | awk 'BEGIN{printf "BEGIN /proc/ucad/debug/stats_raw::%d::",systime()} {printf "%s;" substr($0,25)} END{printf ";END\n"}' | tr -d " " > /dev/kmsg
### Init counters BEGIN
PrevCounterDay=0
PrevHourCounter=0
PrevIndexCounter=0
CounterNames=( "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" )
ErrStatus1=0
ErrStatus2=0
###
for cntName in "${CounterNames[@]}";do
CntPrevUnixTime[$cntName]=0
CntCurrUnixTime[$cntName]=0
CntDeltUnixTime[$cntName]=0
Counter[$cntName]=0
PrevCounter[$cntName]=0
DeltaCounter[$cntName]=0
TotalALL[$cntName]=0
TotalPerDayOfWeek[$cntName]=0
TotalPerHour[$cntName]=0
TotalLastPeriod[$cntName]=0
if [ $cntName == "1" ] ;then
for ((i=0;i<=7;i++)); do CounterPerDayOfWeek1[$i]=0;done
for ((i=0;i<24;i++)); do CounterIndexValuePerHour1[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueA[$i]=0;CounterIndexsUptimeA[$i]=0;done
fi
if [ $cntName == "2" ] ;then
for ((i=0;i<=7;i++)); do CounterPerDayOfWeek2[$i]=0;done
for ((i=0;i<24;i++)); do CounterIndexValuePerHour2[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueB[$i]=0;CounterIndexsUptimeB[$i]=0;done
fi
if [ $cntName == "3" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekSACreate[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourSACreate[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueSACreate[$i]=0;done
fi
if [ $cntName == "4" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekSADestroy[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourSADestroy[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueSADestroy[$i]=0;done
fi
if [ $cntName == "5" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekSANum[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourSANum[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueSANum[$i]=0;done
fi
if [ $cntName == "6" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekDMAXmitPkts[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourDMAXmitPkts[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueDMAXmitPkts[$i]=0;done
fi
if [ $cntName == "7" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekDMARecvPkts[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourDMARecvPkts[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueDMARecvPkts[$i]=0;done
fi
if [ $cntName == "8" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekDPPollCount[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourDPPollCount[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueDPPollCount[$i]=0;done
fi
if [ $cntName == "9" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekRXWarnCCKRetry[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourRXWarnCCKRetry[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueRXWarnCCKRetry[$i]=0;done
fi
if [ $cntName == "10" ];then
# for ((i=0;i<=7;i++)); do CounterPerDayOfWeekRXErrEarlyDrop[$i]=0;done
# for ((i=0;i<24;i++)); do CounterIndexValuePerHourRXErrEarlyDrop[$i]=0;done
for ((i=0;i<$MaxInd;i++)); do CounterIndexsValueRXErrEarlyDrop[$i]=0;done
fi
done
test $DEBUG -ne 0 && echo "$SCRIPTNAME" :: Index_ErrStatus1: ${CounterIndexsValueA[@]} Index_ErrStatus2: ${CounterIndexsValueB[@]} > /dev/kmsg
test $DEBUG -ne 0 && echo "$SCRIPTNAME" :: Uptime_ErrStatus1: ${CounterIndexsUptimeA[@]} Uptime_ErrStatus2: ${CounterIndexsUptimeB[@]} > /dev/kmsg
for ((i=0;i<$MaxInd;i++)); do CounterIndexQatHang[$i]=0;done
### Init counters END
export STARENT_EVLOG_HI_SEV_LOCAL=1
export STAROS_CHASSIS_INSTANCE=0
[ -r /var/run/message_domain ] && . /var/run/message_domain
function _func_close_all_descriptors {
for fd in $(ls /proc/$$/fd); do
eval "exec $fd>&-"
done
return 0
}
function _func_init_script {
test $DEBUG -ne 0 && set -vx
trap "" INT QUIT TSTP HUP
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin:$PATH
LastMinuteExecution=`find $LASTRUNFILE -mmin -1 2> /dev/null | wc -l`
test $LastMinuteExecution -eq 1 && ( echo "$myCARDCPU" :: "$0" :: "$$" :: "$ARGV1" :: _func_init_script :: `date` > $ERRORFILE ; exit )
ps -C $SCRIPTFILENAME -opid,comm | grep -v $$ | grep $SCRIPTNAME | grep -v PID | awk '{exec="kill -9 "$1;print exec;system(exec)}'
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_init_script :: `date` > $KEEPRUNNINGFILE
MEMINIT=$(cat /proc/self/status | grep ^Vm | awk '{print $2}' | sort -n -r | head -1)
MEMMAX=$(( $MEMINIT * 4 ))
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_init_script :: `date` > $LASTRUNFILE
test $DEBUG -ne 0 && set +vx
}
function _func_run_script_in_background {
test $DEBUG -ne 0 && set -vx
if [ "$ARGV1" != "-b" ]; then
LastMinuteExecution=`find $LASTRUNFILE -mmin -1 2> /dev/null | wc -l`
test $LastMinuteExecution -eq 0 && ( rm -f $LASTRUNFILE ; "$0" -b &>/dev/null & disown )
echo "$myCARDCPU" :: "$0" :: "$$" :: done
exit $?
fi
test $DEBUG -eq 0 && _func_close_all_descriptors
test $DEBUG -ne 0 && set -vx
}
function _func_self_memory_check {
MEMCURR=$(cat /proc/self/status | grep ^Vm | awk '{print $2}' | sort -n -r | head -1)
test $MEMMAX -le $MEMCURR && ( echo "$MEMMAX" "$MEMCURR" > $MEMORYCHECKFILE ; exit )
test $DEBUG -ne 0 && echo $0 :: $$ :: $j :: $myCARDCPU :: _func_self_memory_check :: "$MEMMAX" "$MEMCURR"
DebugCondition[26]=$(( ${DebugCondition[26]} + 1 ))
}
function _func_send_trap {
###UPDATE: Doesn't work on DPC2 or SF - TODO
test $is_like_dpc -eq 1 && ( echo $0 :: $$ :: $myCARDCPU :: ERROR :: _func_send_trap :: `date` > $ERRORFILE ; exit )
#then script will send trap example:
#Mon Jan 28 11:13:58 2019 Internal trap notification 322 (ThreshIPSECIKEFailures) context "context" service "service" threshold 1 measured value 2
echo unittest > /flash/ThreshIPSECIKEFailures.txt
echo trap generate 322 >> /flash/ThreshIPSECIKEFailures.txt
echo end >>/flash/ThreshIPSECIKEFailures.txt
cli configure /flash/ThreshIPSECIKEFailures.txt
DebugCondition[27]=$(( ${DebugCondition[27]} + 1 ))
}
function _func_reboot_card {
test $is_like_mio -eq 1 && ( echo $0 :: $$ :: $j :: $myCARDCPU :: _func_reboot_card :: `date` > $ERRORFILE ; exit)
test $FuncRebootCardCNT -eq 0 && FuncRebootCard1stTime=$( date +%Y_%m_%d__%H_%M_%S___%s )
FuncRebootCardCNT=$(( $FuncRebootCardCNT + 1 ))
echo $SCRIPTNAME" "$$" :: FuncRebootCardCNT:"$FuncRebootCardCNT" :: Rebooting card: "$myCARDCPU" RebootEnabled:"$RebootEnabled > /dev/kmesg
logger -t $SCRIPTNAME -p local7.err "$SCRIPTNAME" :: :: "$$" :: Rebooting card: "$myCARDCPU" RebootEnabled:"$RebootEnabled"
### _func_send_trap # TODO
test $FuncRebootCardCNT -le 1 && _func_monitoring_dpc
sleep 1
DebugCondition[8]=$(( ${DebugCondition[8]} + 1 ))
if [ $RebootEnabled == "Yes" ];then
test ! -f $DISABLEREBOOTFILE && ps -C sitmain -opid,comm | grep sitmain | awk '{exec="kill -9 "$1;print exec;system(exec)}'
DebugCondition[9]=$(( ${DebugCondition[9]} + 1 ))
exit
fi
#cli card reboot $mySLOT -force -noconfirm
#sleep 5
#/sbin/reboot -f
}
function _func_monitoring_dpc {
cat /proc/ucad/debug/stats_raw | awk 'BEGIN{printf "BEGIN /proc/ucad/debug/stats_raw::%d::",systime()} {printf "%s;" substr($0,25)} END{printf ";END\n"}' | tr -d " " > /dev/kmsg
echo "ESPpkts::"$ESPpkts"+ QatInfo::"$QatInfo"+ IcpInflights::"$IcpInflights"+" | head -1 > /dev/kmsg
echo "$SCRIPTNAME" :: :: "$$" :: Unixtime:$Unixtime :: FuncRebootCardCNT:"$FuncRebootCardCNT" FuncRebootCard1stTime:$"$FuncRebootCard1stTime" PrevUPTIME:$PrevUPTIME :: ::SleepIntervalDPC:"$SleepIntervalDPC":: Card: "$myCARDCPU" > /dev/kmsg
echo "$SCRIPTNAME" :: $Week $Year $Mont $Day $Hour $Minute $Second :: Index:"$Index" TotalCounter :: Err1: CntPrevUnixTime:${CntPrevUnixTime[1]} CntCurrUnixTime:${CntCurrUnixTime[1]} CntDeltUnixTime:${CntDeltUnixTime[1]} Counter1:${Counter[1]} PrevCounter1:${PrevCounter[1]} DeltaCounter:${DeltaCounter[1]} ALL1:${TotalALL[1]} PerDayOfWeek1:${TotalPerDayOfWeek[1]} PerHour1:${TotalPerHour[1]} LastPeriod1:${TotalLastPeriod[1]} Err2: CntPrevUnixTime:${CntPrevUnixTime[2]} CntCurrUnixTime:${CntCurrUnixTime[2]} CntDeltUnixTime:${CntDeltUnixTime[2]} Counter2:${Counter[2]} PrevCounter2:${PrevCounter[2]} DeltaCounter:${DeltaCounter[2]} ALL2:${TotalALL[2]} PerDayOfWeek2:${TotalPerDayOfWeek[2]} PerHour2:${TotalPerHour[2]} LastPeriod2:${TotalLastPeriod[2]} > /dev/kmsg
echo "$SCRIPTNAME" :: $Week $Year $Mont $Day $Hour $Minute $Second :: Index:"$Index" Threshold ErrStatus1 LastCollection1:${Threshold_LastCollection[1]} TotalALL:${Threshold_TotalALL[1]} PerDayOfWeek1:${Threshold_PerDayOfWeek[1]} PerHour1:${Threshold_PerHour[1]} LastPeriod1:${Threshold_LastPeriod[1]} ErrStatus2 LastCollection2:${Threshold_LastCollection[2]} TotalALL:${Threshold_TotalALL[2]} PerDayOfWeek2:${Threshold_PerDayOfWeek[2]} PerHour2:${Threshold_PerHour[2]} LastPeriod2:${Threshold_LastPeriod[2]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Hour:"$Hour" :: PerHour_ErrStatus1: ${CounterIndexValuePerHour1[@]} PerHour_ErrStatus2: ${CounterIndexValuePerHour2[@]} Day:"$Day" :: PerDayOfWeek_ErrStatus1: ${CounterPerDayOfWeek1[@]} PerDayOfWeek_ErrStatus2: ${CounterPerDayOfWeek2[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Index_ErrStatus1: ${CounterIndexsValueA[@]} Index_ErrStatus2: ${CounterIndexsValueB[@]} > /dev/kmsg
#echo "$SCRIPTNAME" :: Index:"$Index" :: Index_ErrStatus1: Uptime_ErrStatus1: ${CounterIndexsUptimeA[@]} Uptime_ErrStatus2: ${CounterIndexsUptimeB[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Index_SACreate: ${CounterIndexsValueSACreate[@]} Index_SADestroy: ${CounterIndexsValueSADestroy[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Index_SANum: ${CounterIndexsValueSANum[@]} Index_DPPollCount: ${CounterIndexsValueDPPollCount[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Index_DMAXmitPkts: ${CounterIndexsValueDMAXmitPkts[@]} Index_DMARecvPkts: ${CounterIndexsValueDMARecvPkts[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: Index_RXWarnCCKRetry: ${CounterIndexsValueRXWarnCCKRetry[@]} Index_RXErrEarlyDrop: ${CounterIndexsValueRXErrEarlyDrop[@]} > /dev/kmsg
echo "$SCRIPTNAME" :: Index:"$Index" :: CounterIndexQatHang: ${CounterIndexQatHang[@]} DebugCondition: ${DebugCondition[@]} > /dev/kmsg
DebugCondition[22]=$(( ${DebugCondition[22]} + 1 ))
### Below for future use:
UPTIME=$( cat /proc/uptime | cut -f1 -d. )
DATETIME=`date -u +"%Y-%m-%d %H:%M:%S %Z Unixtime:%s"`
HOUR=$( date +%H )
mkdir -p /tmp/ucad 2> /dev/null 1> /dev/null
echo $DATETIME" :: "$myCARDCPU" :: Uptime: "$UPTIME :: DATETIME:$DATETIME > /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo "$SCRIPTNAME" :: $Week $Year $Mont $Day $Hour $Minute $Second :: Index:"$Index" TotalCounter :: Err1: CntPrevUnixTime:${CntPrevUnixTime[1]} CntCurrUnixTime:${CntCurrUnixTime[1]} CntDeltUnixTime:${CntDeltUnixTime[1]} Counter1:${Counter[1]} PrevCounter1:${PrevCounter[1]} DeltaCounter:${DeltaCounter[1]} ALL1:${TotalALL[1]} PerDayOfWeek1:${TotalPerDayOfWeek[1]} PerHour1:${TotalPerHour[1]} LastPeriod1:${TotalLastPeriod[1]} Err2: CntPrevUnixTime:${CntPrevUnixTime[2]} CntCurrUnixTime:${CntCurrUnixTime[2]} CntDeltUnixTime:${CntDeltUnixTime[2]} Counter2:${Counter[2]} PrevCounter2:${PrevCounter[2]} DeltaCounter:${DeltaCounter[2]} ALL2:${TotalALL[2]} PerDayOfWeek2:${TotalPerDayOfWeek[2]} PerHour2:${TotalPerHour[2]} LastPeriod2:${TotalLastPeriod[2]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo "$SCRIPTNAME" :: $Week $Year $Mont $Day $Hour $Minute $Second :: Index:"$Index" Threshold ErrStatus1 LastCollection1:${Threshold_LastCollection[1]} TotalALL:${Threshold_TotalALL[1]} PerDayOfWeek1:${Threshold_PerDayOfWeek[1]} PerHour1:${Threshold_PerHour[1]} LastPeriod1:${Threshold_LastPeriod[1]} ErrStatus2 LastCollection2:${Threshold_LastCollection[2]} TotalALL:${Threshold_TotalALL[2]} PerDayOfWeek2:${Threshold_PerDayOfWeek[2]} PerHour2:${Threshold_PerHour[2]} LastPeriod2:${Threshold_LastPeriod[2]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo "$SCRIPTNAME" :: Index:"$Index" :: Hour:"$Hour" :: PerHour_ErrStatus1: ${CounterIndexValuePerHour1[@]} PerHour_ErrStatus2: ${CounterIndexValuePerHour2[@]} Day:"$Day" :: PerDayOfWeek_ErrStatus1: ${CounterPerDayOfWeek1[@]} PerDayOfWeek_ErrStatus2: ${CounterPerDayOfWeek2[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_ErrStatus1: ${CounterIndexsValueA[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_ErrStatus2: ${CounterIndexsValueB[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Uptime_ErrStatus1: ${CounterIndexsUptimeA[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Uptime_ErrStatus2: ${CounterIndexsUptimeB[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_SACreate: ${CounterIndexsValueSACreate[@]} Index_SADestroy: ${CounterIndexsValueSADestroy[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_SANum: ${CounterIndexsValueSANum[@]} Index_DPPollCount: ${CounterIndexsValueDPPollCount[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_DMAXmitPkts: ${CounterIndexsValueDMAXmitPkts[@]} Index_DMARecvPkts: ${CounterIndexsValueDMARecvPkts[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: Index_RXWarnCCKRetry: ${CounterIndexsValueRXWarnCCKRetry[@]} Index_RXErrEarlyDrop: ${CounterIndexsValueRXErrEarlyDrop[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo Index:"$Index" :: CounterIndexQatHang: ${CounterIndexQatHang[@]} >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo "ESPpkts::"$ESPpkts"+ QatInfo::"$QatInfo"+ IcpInflights::"$IcpInflights"+" | head -1 >> /tmp/ucad/status_"$myCARDCPU"_H"$HOUR".txt
echo $DATETIME" :: "$myCARDCPU" :: Uptime: "$UPTIME :: DATETIME:$DATETIME > /tmp/ucad/stats_raw_"$myCARDCPU"_H"$HOUR".txt
(date +%s;cat /proc/ucad/debug/stats_raw ) >> /tmp/ucad/stats_raw_"$myCARDCPU"_H"$HOUR".txt
echo $DATETIME" :: "$myCARDCPU" :: Uptime: "$UPTIME :: DATETIME:$DATETIME > /tmp/ucad/stats_cooked_"$myCARDCPU"_H"$HOUR".txt
( date +%s;cat /proc/ucad/debug/stats_cooked ) >> /tmp/ucad/stats_cooked_"$myCARDCPU"_H"$HOUR".txt
#echo $DATETIME" :: "$myCARDCPU" :: Uptime: "$UPTIME :: DATETIME:$DATETIME > /tmp/ucad/ctx_stats_"$myCARDCPU"_H"$HOUR".txt
#cat /proc/ucad/ipsec/ctx_stats >> /tmp/ucad/ctx_stats_"$myCARDCPU"_H"$HOUR".txt
#echo $DATETIME" :: "$myCARDCPU" :: Uptime: "$UPTIME :: DATETIME:$DATETIME > /tmp/ucad/svc_stats_"$myCARDCPU"_H"$HOUR".txt
#cat /proc/ucad/ipsec/svc_stats >> /tmp/ucad/svc_stats_"$myCARDCPU"_H"$HOUR".txt
( date;ls -la /tmp/icp/;find /tmp/icp/ -print -exec cat {} \; ) | gzip -c > /tmp/ucad/ucad_icp_buffers_"$myCARDCPU"_H"$HOUR".txt.gz
#tar cfv /tmp/ucad/icp_"$myCARDCPU"_H"$HOUR".tar /proc/icp_dh89*
( date;find /proc/icp_dh8* -type f -print -exec head -5120 {} \; ) | gzip -c > /tmp/ucad/icp_proc_"$myCARDCPU"_H"$HOUR".txt.gz
( date;dmesg ) | gzip -c > /tmp/ucad/dmesg_"$myCARDCPU"_H"$HOUR"_M"$Minute".txt.gz
#cat /proc/interrupts /proc/softirqs /proc/stat /proc/loadavg /proc/uptime /proc/meminfo /proc/vmstat /proc/net/boxer /proc/boxer/mcdma/summary /proc/net/snmp6 /proc/net/snmp /proc/net/sockstat6 /proc/net/sockstat | gzip -c > /tmp/ucad/proc_info_"$myCARDCPU"_H"$HOUR".txt.gz
(date;find /proc/interrupts /proc/softirqs /proc/stat /proc/loadavg /proc/uptime /proc/meminfo /proc/vmstat /proc/net/boxer /proc/boxer/mcdma/summary /proc/net/snmp6 /proc/net/snmp /proc/net/sockstat6 /proc/net/sockstat /proc/boxer/mcdma/ -print -exec cat {} \; ) | gzip -c > /tmp/ucad/proc_info_"$myCARDCPU"_H"$HOUR".txt.gz
gzip -f /tmp/ucad/*txt /tmp/ucad/*tar 2> /dev/null 1> /dev/null
find /tmp/ucad/ -type f -mmin +"$MaxUcadMinutesDeletion" -delete
}
function _func_test_dpc {
echo TEST BEGIN `date` > /dev/kmsg
Rnd=$(( $RANDOM % 32 ))
for ((i=0;i<$Rnd;i++)); do echo $Rnd' ucam_cavecreek_dh_p1_sync()[2995]: cpaCyDhKeyGenPhase1() Failed with Status: -2!' > /dev/kmsg ;done
Rnd=$(( $RANDOM % 32 ))
for ((i=0;i<$Rnd;i++)); do echo $Rnd' ucam ucad Packet Processing Failed with Status: 1!' > /dev/kmsg ;done
echo TEST END `date` > /dev/kmsg
DebugCondition[24]=$(( ${DebugCondition[24]} + 1 ))
}
function _func_read_counters {
test "$Index" == "" && echo ASSERT 125 $LINE && exit
CounterNames=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10")
for cntName in "${CounterNames[@]}";do
PrevCounter[$cntName]=${Counter[$cntName]}
CntPrevUnixTime[$cntName]=${CntCurrUnixTime[$cntName]}
CntCurrUnixTime[$cntName]=$Unixtime
CntDeltUnixTime[$cntName]=$(( ${CntCurrUnixTime[$cntName]} - ${CntPrevUnixTime[$cntName]} ))
done
read -r ErrStatus1 ErrStatus2 PrevUPTIME PrevPrev AWKNR <<< "$( $CmdExec | tr -d '[]' | awk -v prevuptime=$PrevUPTIME 'BEGIN{cnt1=0;cnt2=0;uptime[1]=0} {err1=0;err2=0;if(/Packet Processing Failed with Status: 1/){err1=1};if(/Failed with Status: -2/){err2=1};split($1,uptime,".");if(prevuptime<uptime[1]){if(err1==1){cnt1=cnt1+1};if(err2==1){cnt2=cnt2+1}}} END{print cnt1" "cnt2" "uptime[1]" "prevuptime" "NR}' )"
Counter[1]=$ErrStatus1;
Counter[2]=$ErrStatus2;
read -r Counter[3] Counter[4] Counter[6] Counter[7] Counter[8] Counter[9] Counter[10] <<< "$( grep -v -E "(^Recv|^Send|^$)" /proc/ucad/debug/stats_raw | awk '{if(/(SA Create |SA Destroy |DP Poll Count |RX Warn, CCK Retry |RX Err, Early Drop |DMA Recv Pkts |DMA Xmit Pkts )/){cntname=substr($0,0,24);cntval1=substr($0,25);cntval2=sprintf("%f","0x"cntval1);split(cntval2,decimal,".");printf ("%s ",decimal[1])};} END{printf "\n"}' )"
#read -r Counter["SACreate"] Counter["SADestroy"] Counter["DMAXmitPkts"] Counter["DMARecvPkts"] Counter["DPPollCount"] Counter["RXWarnCCKRetry"] Counter["RXErrEarlyDrop"]
if [ $SimulateProcUcad == "Yes" ];then
Counter[3]=$(( ${Counter[3]} + $RANDOM ))
Counter[4]=$(( ${Counter[4]} + $RANDOM ))
Counter[6]=$(( ${Counter[6]} + $RANDOM ))
Counter[7]=$(( ${Counter[7]} + $RANDOM ))
Counter[8]=$(( ${Counter[8]} + $RANDOM ))
Counter[9]=$(( ${Counter[9]} + $RANDOM ))
Counter[10]=$(( ${Counter[10]} + $RANDOM ))
fi
Counter[5]=$(( ${Counter[3]} - ${Counter[4]} ))
# Below should be seprate _update type function - TODO
CounterNames=("3" "4" "5" "6" "7" "8" "9" "10")
for cntName in "${CounterNames[@]}";do
DeltaCounter[$cntName]=$(( ${Counter[$cntName]} - ${PrevCounter[$cntName]} ))
test $cntName == "3" && CounterIndexsValueSACreate["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "4" && CounterIndexsValueSADestroy["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "5" && CounterIndexsValueSANum["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "6" && CounterIndexsValueDMAXmitPkts["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "7" && CounterIndexsValueDMARecvPkts["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "8" && CounterIndexsValueDPPollCount["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "9" && CounterIndexsValueRXWarnCCKRetry["$Index"]=${DeltaCounter[$cntName]}
test $cntName == "10" && CounterIndexsValueRXErrEarlyDrop["$Index"]=${DeltaCounter[$cntName]}
done
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc _read1 ${Counter[1]} ${Counter[2]} $PrevUPTIME $PrevPrev $PrevPrev :: `date` > /dev/kmsg
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc _read2 ${Counter[3]} ${Counter[4]} ${Counter[6]} ${Counter[7]} ${Counter[8]} ${Counter[9]} ${Counter[10]} :: `date` > /dev/kmsg
}
function _func_update_event_agregated_counters {
cntName=$1
VAL=$2
test "$Index" == "" && echo ASSERT 123 $LINE && exit
test $Index -ge $MaxInd && echo ASSERT 234 $LINE && exit
test $Index -lt 0 && echo ASSERT 234 $LINE && exit
#Index=$3
#PrevUPTIME=$4
#Unixtime=$5
test ${Counter[$cntName]} -ne $VAL && echo ERROR _func_update_counters $cntName $VAL ${Counter[$cntName]} :: `date` > /dev/kmsg && exit
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_update_counters $cntName $VAL ${Counter[$cntName]} "$Index" $PrevUPTIME $Unixtime :: `date` > /dev/kmsg
if [ $cntName == "1" ]; then
TotalALL[$cntName]=$(( ${TotalALL[$cntName]} + ${Counter[$cntName]} ))
PrevIndexCounter=${CounterIndexsValueA["$Index"]}
CounterIndexsValueA["$Index"]=${Counter[$cntName]}
CounterIndexsUptimeA["$Index"]=$PrevUPTIME":"$Unixtime
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc MaxInd:$MaxInd Day:$Day PrevDay:$PrevDay PrevHour:$PrevHour Hour:$Hour :: PrevUPTIME $PrevUPTIME :: $cntName :: Counter:${Counter[$cntName]} :: Index:"$Index" :: PrevIndexCounter:$PrevIndexCounter :: CounterIndexsValue: ${CounterIndexsValueA["$Index"]} :: ${TotalLastPeriod[$cntName]} :: `date` > /dev/kmsg
if [ $PrevDay -ne $Day ] ; then
test $DPCDEBUG1 -ne 0 && echo PrevCounterDay1 _DayWeek: ${CounterPerDayOfWeek1[$_DayWeek]} > /dev/kmsg
PrevCounterDay=${CounterPerDayOfWeek1[$_DayWeek]}
CounterPerDayOfWeek1[$_DayWeek]=0
TotalPerDayOfWeek[$cntName]=$(( ${TotalPerDayOfWeek[$cntName]} - $PrevCounterDay ))
CntDay=$(( $CntDay + 1 ))
fi
CounterPerDayOfWeek1[$_DayWeek]=$(( ${CounterPerDayOfWeek1[$_DayWeek]} + ${Counter[$cntName]} ))
TotalPerDayOfWeek[$cntName]=$(( ${TotalPerDayOfWeek[$cntName]} + ${Counter[$cntName]} ))
if [ $PrevHour -ne $Hour ];then
PrevHourCounter=${CounterIndexValuePerHour1[$Hour]}
CounterIndexValuePerHour1[$Hour]=0
CntHour=$(( $CntHour + 1 ))
TotalPerHour[$cntName]=$(( ${TotalPerHour[$cntName]} - $PrevHourCounter ))
fi
CounterIndexValuePerHour1[$Hour]=$(( ${CounterIndexValuePerHour1[$Hour]} + ${Counter[$cntName]} ))
TotalPerHour[$cntName]=$(( ${TotalPerHour[$cntName]} + ${Counter[$cntName]} ))
TotalLastPeriod[$cntName]=$(( ${TotalLastPeriod[$cntName]} + ${CounterIndexsValueA["$Index"]} - $PrevIndexCounter ))
fi
if [ $cntName == "2" ]; then
test ${Counter[$cntName]} -ne $VAL && echo ERROR _func_update_counters $cntName $VAL ${Counter[$cntName]} :: `date` > /dev/kmsg && exit
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_update_counters $cntName $VAL ${Counter[$cntName]} "$Index" $PrevUPTIME $Unixtime :: `date` > /dev/kmsg
TotalALL[$cntName]=$(( ${TotalALL[$cntName]} + ${Counter[$cntName]} ))
PrevIndexCounter=${CounterIndexsValueB["$Index"]}
CounterIndexsValueB["$Index"]=${Counter[$cntName]}
CounterIndexsUptimeA["$Index"]=$PrevUPTIME":"$Unixtime
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc MaxInd:$MaxInd :: PrevUPTIME $PrevUPTIME :: $cntName :: Counter:${Counter[$cntName]} :: Index:"$Index" :: PrevIndexCounter:$PrevIndexCounter :: CounterIndexsValue: ${CounterIndexsValueB["$Index"]} :: ${TotalLastPeriod[$cntName]} :: `date` > /dev/kmsg
if [ $PrevDay -ne $Day ] ; then
PrevCounterDay=${CounterPerDayOfWeek2[$_DayWeek]}
test $DPCDEBUG1 -ne 0 && echo PrevCounterDay2 _DayWeek: ${CounterPerDayOfWeek2[$_DayWeek]} > /dev/kmsg
CounterPerDayOfWeek2[$_DayWeek]=0
TotalPerDayOfWeek[$cntName]=$(( ${TotalPerDayOfWeek[$cntName]} - $PrevCounterDay ))
CntDay=$(( $CntDay + 1 ))
fi
CounterPerDayOfWeek2[$_DayWeek]=$(( ${CounterPerDayOfWeek2[$_DayWeek]} + ${Counter[$cntName]} ))
TotalPerDayOfWeek[$cntName]=$(( ${TotalPerDayOfWeek[$cntName]} + ${Counter[$cntName]} ))
if [ $PrevHour -ne $Hour ];then
PrevHourCounter=${CounterIndexValuePerHour2[$Hour]}
CounterIndexValuePerHour2[$Hour]=0
CntHour=$(( $CntHour + 2 ))
TotalPerHour[$cntName]=$(( ${TotalPerHour[$cntName]} - $PrevHourCounter ))
fi
CounterIndexValuePerHour2[$Hour]=$(( ${CounterIndexValuePerHour2[$Hour]} + ${Counter[$cntName]} ))
TotalPerHour[$cntName]=$(( ${TotalPerHour[$cntName]} + ${Counter[$cntName]} ))
TotalLastPeriod[$cntName]=$(( ${TotalLastPeriod[$cntName]} + ${CounterIndexsValueB["$Index"]} - $PrevIndexCounter ))
fi
if [ $cntName != "1" ] && [ $cntName != "2" ];then
echo ASSERT 236 $LINE && exit
fi
}
function _func_check_tresholds_events_conditions {
cntName=$1
if [ $cntName == "1" ] || [ $cntName == "2" ] ;then
test ${Counter[$cntName]} -ge ${Threshold_LastCollection[$cntName]} && TriggerRebootNow="Yes" && DebugCondition[1]=$(( ${DebugCondition[1]} + 1 ))
test ${TotalALL[$cntName]} -ge ${Threshold_TotalALL[$cntName]} && TriggerRebootNow="Yes" && DebugCondition[2]=$(( ${DebugCondition[2]} + 1 ))
test ${TotalPerDayOfWeek[$cntName]} -ge ${Threshold_PerDayOfWeek[$cntName]} && TriggerRebootNow="Yes" && DebugCondition[5]=$(( ${DebugCondition[5]} + 1 ))
test ${TotalPerHour[$cntName]} -ge ${Threshold_PerHour[$cntName]} && TriggerRebootNow="Yes" && DebugCondition[4]=$(( ${DebugCondition[4]} + 1 ))
test ${TotalLastPeriod[$cntName]} -ge ${Threshold_LastPeriod[$cntName]} && TriggerRebootNow="Yes" && DebugCondition[3]=$(( ${DebugCondition[3]} + 1 ))
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_check_tresholds_conditions1 line $LINENO :: `date` > /dev/kmsg
else
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_check_tresholds_conditions2 line $LINENO :: `date` > /dev/kmsg
fi
}
function _func_check_reboot_conditions {
if [ $ScheduledReboot=="Yes" ] && [ $Hour -eq $ScheduledHour ] && [ $TriggerRebootNow == "Yes" ] ; then
[ $mySLOT -eq 1] && [ $Minute -ge 3 ] && [ $Minute -lt 10 ] && DebugCondition[10]=$(( ${DebugCondition[10]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 2] && [ $Minute -ge 10 ] && [ $Minute -lt 17 ] && DebugCondition[11]=$(( ${DebugCondition[11]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 3] && [ $Minute -ge 17 ] && [ $Minute -lt 24 ] && DebugCondition[12]=$(( ${DebugCondition[12]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 4] && [ $Minute -ge 24 ] && [ $Minute -lt 31 ] && DebugCondition[13]=$(( ${DebugCondition[13]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 7] && [ $Minute -ge 31 ] && [ $Minute -lt 38 ] && DebugCondition[14]=$(( ${DebugCondition[14]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 8] && [ $Minute -ge 38 ] && [ $Minute -lt 45 ] && DebugCondition[15]=$(( ${DebugCondition[15]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 9] && [ $Minute -ge 45 ] && [ $Minute -lt 42 ] && DebugCondition[16]=$(( ${DebugCondition[16]} + 1 )) && _func_reboot_card
[ $mySLOT -eq 10] && [ $Minute -ge 52 ] && [ $Minute -lt 59 ] && DebugCondition[17]=$(( ${DebugCondition[17]} + 1 )) && _func_reboot_card
DebugCondition[6]=$(( ${DebugCondition[6]} + 1 ))
fi
test $ScheduledReboot=="No" && test $TriggerRebootNow == "Yes" && DebugCondition[7]=$(( ${DebugCondition[7]} + 1 )) && _func_reboot_card
}
function _func_intel_ring_dump {
cat << DONT_REMOVE_THIS_LINE_BEGIN_END_M > /tmp/Intel_ring_dump.tgz.base64
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
AMQAAA==
DONT_REMOVE_THIS_LINE_BEGIN_END_M
cd /tmp/
openssl base64 -d -in Intel_ring_dump.tgz.base64 -out Intel_ring_dump.tgz 2> /dev/null
tar zxf Intel_ring_dump.tgz
mv /tmp/Intel_ring_dump/* /tmp/
rm -f /tmp/Intel_ring_dump.tgz
rm -rf /tmp/Intel_ring_dump/
MD5WC=$( md5sum -c MD5SUM.txt | grep OK |wc -l )
test $MD5WC -ne 4 && touch /tmp/MD5SUM_ERROR.txt
}
function _func_main_dpc {
test $is_like_mio -eq 1 && ( echo $0 :: $$ :: $myCARDCPU :: ERROR :: _func_main_dpc :: `date` > $ERRORFILE ; exit )
j=0
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc :: `date` > /dev/kmsg
PrevUPTIME=$( $CmdExec | tr -d '[]' | awk 'END{print $1}' | cut -f1 -d. )
echo "$SCRIPTNAME" :: :: "$$" :: started:`date` > /dev/kmsg
_func_intel_ring_dump
while [ -f $KEEPRUNNINGFILE ] ; do
test $DEBUG -ne 0 && echo $0 :: $$ :: $j :: $myCARDCPU :: `date`
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc inside while :: `date` > /dev/kmsg
UPTIME=$( cat /proc/uptime | cut -f1 -d. )
Unixtime=$( date +%s )
PrevDay=$Day;PrevHour=$Hour;PrevMinute=$Minute
read -r Week Year Mont _Day _Hour _Minute Second _DayWeek <<< "$(date +'%W %Y %m %d %H %M %S %w')"
Day=$( expr $_Day + 0 );Hour=$( expr $_Hour + 0 );Minute=$( expr $_Minute + 0 )
#Index change please see below NOTE
Index=$Minute
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc time $PrevDay $PrevHour :: $Week $Year $Mont $Day $Hour $Minute $Second :: `date` > /dev/kmsg
test $DPCRandomTest == "Yes" && _func_test_dpc
_func_read_counters
# echo "ErrStatus1" ${Counter[1]} && exit
_func_update_event_agregated_counters "1" ${Counter[1]}
_func_check_tresholds_events_conditions "1"
_func_update_event_agregated_counters "2" ${Counter[2]}
_func_check_tresholds_events_conditions "2"
_ucad_buffers_delta_icp
_icp_qat_stats
test $TotalHangQat -eq 1 && _func_monitoring_dpc && CollectedFirstQat=1
test $TotalHangQat -eq 2 && _func_monitoring_dpc && CollectedFirstQat=2
test $DPCDEBUG1 -ne 0 && echo $0 :: $$ :: $myCARDCPU :: :: _func_main_dpc before _func_monitoring_dpc :: `date` > /dev/kmsg
# test $PrevHour -ne $Hour && _func_monitoring_dpc && DebugCondition[20]=$(( ${DebugCondition[20]} + 1 ))
# test "$Minute" == "" && echo ASSERT Minute $LINE && exit
if [ $Minute -eq 0 ] || [ $Minute -eq 12 ] || [ $Minute -eq 24 ] || [ $Minute -eq 36 ] || [ $Minute -eq 48 ] ; then
_func_monitoring_dpc && DebugCondition[20]=$(( ${DebugCondition[20]} + 1 ))
fi
test $DPCDEBUG2 -ne 0 && _func_monitoring_dpc && DebugCondition[21]=$(( ${DebugCondition[21]} + 1 ))
_func_check_reboot_conditions
_func_self_memory_check
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_main_dpc :: `date` > $LASTRUNFILE
j=$(( $j + 1 ))
Count=$(( $Count + 1 ))
################################# Index/Minute stuff - NOTE: please be careful.
#Index=$(( $Count % $MaxInd ))
Index=$Minute # This is only if SleepIntervalDPC is 60. Otherwise, we have to use: Index=$(( $Count % $MaxInd ))
#################################
Unixtime=$( date +%s )
sleep $(( $SleepIntervalDPC - ($Unixtime % $SleepIntervalDPC )))
# sleep $SleepIntervalDPC
DebugCondition[31]=$(( ${DebugCondition[31]} + 1 ))
done
exit
} # END _func_main_dpc
function _icp_qat_stats {
ICP_DIR=$( find /proc/ -maxdepth 1 -type d -name icp_dh\* | head -1 )
QatHang=$( grep -e "ERROR" -e "Qat is not responding" -e "Please restart the device" "$ICP_DIR"/qat* | wc -l )
TotalHangQat=$(( $TotalHangQat + $QatHang ))
test $TotalHangQat -eq 1 && FirstHangQat=$( date +%Y_%m_%d__%H_%M_%S___%s )
QatWC=$( wc -l "$ICP_DIR"/qat* | awk '{print $1}' | tr "\n" ";" )
QatStats=$( grep -h -e "Firmware" "$ICP_DIR"/qat* | awk '{print $5}' | tr "\n" ";" )
QatInfo=$QatHang"::"$QatWC"::"$QatStats::"$TotalHangQat"
test $DPCDEBUG1 -ne 0 && echo $QatInfo
CounterIndexQatHang[$Index]=$QatHang
test $DPCDEBUG1 -ne 0 && ${CounterIndexQatHang[@]}
}
function _ucad_buffers_delta_icp {
mkdir -p /tmp/icp 2> /dev/null 1> /dev/null
cat /dev/null > /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
STATS_RAW=$(cat /proc/ucad/debug/stats_raw | awk 'BEGIN{printf "/proc/ucad/debug/stats_raw;%x",systime()} {printf "%s;" substr($0,25)} END{printf ";\n"}' | tr -d " " );
echo $STATS_RAW > /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
grep -H "" /proc/icp_dh*/qat* | awk -F"/" '{print $4}' >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
cat /proc/ucam/dist >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
for((i=0;i<=$MAX_ICP_COLL;i++));do
#read -r TIME ALLOC1 ALLOC2 ALLOC3 ALLOC4 FREE1 FREE2 FREE3 FREE4 <<< $( grep ESP /proc/ucad/debug/stats_cooked | grep -v fai | awk 'BEGIN{printf "%x",systime()} {printf "%s" substr($0,25)} END{printf "\n"}' | sed -E "s/\s+/ /"g | awk '{for (i=1;i<=NF; i++){printf("%d ","0x"$i)}}' )
#DELTA1=$(( $ALLOC1 - $FREE1 ))
#DELTA2=$(( $ALLOC2 - $FREE2 ))
#DELTA3=$(( $ALLOC3 - $FREE3 ))
#DELTA4=$(( $ALLOC4 - $FREE4 ))
#DELTA_ALLOC1=$(( $ALLOC1 - $PREVALLOC1 ))
#DELTA_ALLOC2=$(( $ALLOC2 - $PREVALLOC2 ))
#DELTA_ALLOC3=$(( $ALLOC3 - $PREVALLOC3 ))
#DELTA_ALLOC4=$(( $ALLOC4 - $PREVALLOC4 ))
#DELTA_FREE1=$(( $FREE1 - $PREVFREE1 ))
#DELTA_FREE2=$(( $FREE2 - $PREVFREE2 ))
#DELTA_FREE3=$(($FREE3 - $PREVFREE3 ))
#DELTA_FREE4=$(( $FREE4 - $PREVFREE4 ))
#PREVALLOC1=$ALLOC1
#PREVALLOC2=$ALLOC2
#PREVALLOC3=$ALLOC3
#PREVALLOC4=$ALLOC4
#PREVFREE1=$FREE1
#PREVFREE2=$FREE2
#PREVFREE3=$FREE3
#PREVFREE4=$FREE4
#DELALLOC12=$(( $ALLOC1 - $ALLOC2 ))
#DELALLOC13=$(( $ALLOC1 - $ALLOC3 ))
#DELALLOC14=$(( $ALLOC1 - $ALLOC4 ))
#SUM1=$(( $DELTA1 + $DELTA2 + $DELTA3 + $DELTA4 ))
#SUM2=$(( $DELTA_ALLOC1 + $DELTA_ALLOC2 + $DELTA_ALLOC3 + $DELTA_ALLOC4 ))
#echo $TIME :: $DELTA1 $DELTA2 $DELTA3 $DELTA4 :: sum1:$SUM1 :: $DELTA_ALLOC1 $DELTA_ALLOC2 $DELTA_ALLOC3 $DELTA_ALLOC4 :: sum2:$SUM2 :: $ALLOC1 $ALLOC2 $ALLOC3 $ALLOC4 :: 0 $DELALLOC12 $DELALLOC13 $DELALLOC14 >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
grep "ESP Pkts" /proc/ucad/debug/stats_cooked >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
cat /proc/icp_dh8*/et_ring_ctrl/*/conf | grep inflights | grep -v 'inflights: 0,' >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
sleep $SLEEP_ICP_COLL
done
STATS_RAW=$(cat /proc/ucad/debug/stats_raw | awk 'BEGIN{printf "/proc/ucad/debug/stats_raw;%x",systime()} {printf "%s;" substr($0,25)} END{printf ";\n"}' | tr -d " " );
echo $STATS_RAW >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
grep -H "" /proc/icp_dh*/qat* | awk -F"/" '{print $4}' >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
cat /proc/ucam/dist >> /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt
ln -sf /tmp/icp/icp_"$myCARDCPU"_M"$Minute".txt /tmp/icp/latest.txt
IcpInflights=$( cat /proc/icp_dh8*/et_ring_ctrl/*/conf | grep inflights | grep -v 'inflights: 0,' | awk -F"inflights:" '{print $2}' | sed -e "s/Name:/:/" | tr -d "," | tr "\n" ";" | tr -d " " )
ESPpkts=$( grep "ESP Pkts" /proc/ucad/debug/stats_cooked | awk 'BEGIN{printf "%x",systime()} {printf "%s" substr($0,25)} END{printf "\n"}' | sed -E "s/\s+/;/"g )
}
function _check_if_script_is_runnning_all_cards {
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' | sort -n ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
echo === $IP ===
grep $IP" " /etc/hosts
ssh $IP "cat $LASTRUNFILE;ls -la $KEEPRUNNINGFILE $LASTRUNFILE $SCRIPTFULLPATH;echo ps::;ps -ef | grep $SCRIPTNAME | grep -v cat | grep -v grep"
done
}
function _func_exec_scripts_on_all_cards {
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_exec_scripts_on_all_cards :: `date` > $CARDEXECUTEDFILE
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_exec_scripts_on_all_cards :: `date` > $LASTRUNFILE
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
scp $SCRIPTFULLPATH "$IP":"$SCRIPTFULLPATH"
test $DEBUG -ne 0 && echo scp $SCRIPTFULLPATH "$IP":"$SCRIPTFULLPATH" > /dev/kmsg
sleep 1
test ! -f $KEEPRUNNINGFILE && ( echo $0 :: $$ :: $myCARDCPU :: ERROR :: _func_exec_scripts_on_all_cards :: `date` > $ERRORFILE ; exit )
ssh $IP "chmod +x $SCRIPTFULLPATH;$SCRIPTFULLPATH"
sleep 1
done
sleep 30
}
function _func_remove_scripts_from_all_cards {
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_remove_scripts_from_all_cards :: `date` > $CARDREMOVEDFILE
ps -C $SCRIPTFILENAME -opid,comm | grep -v $$ | grep $SCRIPTNAME | grep -v PID | awk '{exec="kill -9 "$1;print exec;system(exec)}'
test $is_like_dpc -eq 1 && exit
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
set -vx
ssh $IP rm -f $KEEPRUNNINGFILE
set +vx
sleep 1
done
rm -f $KEEPRUNNINGFILE
cat /dev/null > $STOPPEDFILE
exit
}
function _disable_reboot_on_all_cards {
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' | sort -n ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
ssh $IP touch $DISABLEREBOOTFILE
done
}
function _enable_reboot_on_all_cards {
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' | sort -n ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
ssh $IP rm -f $DISABLEREBOOTFILE
done
}
function _check_reboot_enabled_disabled_on_all_cards {
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' | sort -n ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
echo === $IP ===
grep $IP" " /etc/hosts
ssh $IP ls -la $DISABLEREBOOTFILE
done
}
function _check_if_there_are_offline_cards {
cat /dev/null > /tmp/cli_show_card_table.txt
DPCOfflineCardCount=0
DPCActiveCardCount=0
DPCOfflineCardCount=$( cli show card table | grep DPC | grep Offline | wc -l )
DPCActiveCardCount=$( cat /tmp/cli_show_card_table.txt | grep DPC | grep Active | wc -l )
#test $DEBUG -ne 0 && echo $DPCActiveCardCount
#test $DEBUG -ne 0 && echo $DPCOfflineCardCount
if [ $DPCActiveCardCount -lt $MinimumActiveCardsAllowingReboot ] || [ $DPCOfflineCardCount -gt $MinimumOfflineCardsAllowingReboot ]; then
#test $DEBUG -ne 0 && echo Disable_reboot
test $LastAction == "enableReboot" && _disable_reboot_on_all_cards
LastAction="disableReboot"
else
#test $DEBUG -ne 0 && echo Enable_reboot
test $LastAction == "disableReboot" && _enable_reboot_on_all_cards
LastAction="enableReboot"
fi
rm -f /tmp/cli_show_card_table.txt
}
function _sync_tmp_ucad_from_all_dpc_cards {
ping bcast -c 2 -w 0.2 -b >& /dev/null
IpNeighShowReach=( $( ip neigh show | grep 172.16 | grep REACHABLE | awk '{print $1}' | sort -n ))
i=0;for IP in "${IpNeighShowReach[@]}";do i=$(( $i + 1 )); IPX[$i]=$IP;done;iLAST=$i;
for ((i=1;i<=$iLAST;i++)); do
IP=${IPX[$i]};
CARD=$( grep "$IP"" " /etc/hosts | grep -v alt | head -1| awk '{print $2}' )
DAY=$( date +%w ) # Using Day of the week to reduce amount of data
DIRCPY="$UCADDIR"/"$CARD"/"$DAY"
mkdir -p $DIRCPY
touch "$DIRCPY"/lastrun.txt
if [ "$ARGV1" == "-b" ]; then
rsync --remove-source-files --temp-dir=/mnt/hd-raid/temp --fdatasync --timeout=5 --time-limit=9 -ave "ssh -o \"UsePrivilegedPort no\"" "$CARD":/tmp/ucad/ $DIRCPY 1> /dev/null 2> /dev/null
else
rsync --remove-source-files --temp-dir=/mnt/hd-raid/temp --fdatasync --timeout=5 --time-limit=9 -ave "ssh -o \"UsePrivilegedPort no\"" "$CARD":/tmp/ucad/ $DIRCPY
fi
done
find /mnt/hd-raid/data/ucad/ -type f -mtime +8 -delete # hard coded to 8 and in relation with DAY=$( date +%w ) which is 7
}
function _func_main_mio {
test $is_like_dpc -eq 1 && ( echo $0 :: $$ :: $myCARDCPU :: ERROR :: _func_main_mio :: `date` > $ERRORFILE ; exit )
j=0
_func_exec_scripts_on_all_cards
mkdir -p $UCADDIR
while [ -f $KEEPRUNNINGFILE ] ; do
ActiveMIO=$( sn-dlutil --master-spc-slot )
PrevDay=$Day
PrevHour=$Hour
PrevMinute=$Minute
read -r Week Year Mont _Day _Hour _Minute _Second <<< "$(date +'%W %Y %m %d %H %M %S')"
Second=$( expr $_Second + 0 )
Day=$( expr $_Day + 0 )
Hour=$( expr $_Hour + 0 )
Minute=$( expr $_Minute + 0 )
####eval `date +"export WD=%a;export Hour=%H;export Minute=%M;export Second=%S;export Unixtime=%s"`
#### Check if there are offline cards in the system
if [ $mySLOT -eq $ActiveMIO ] && [ $PrevMinute -ne $Minute ] ; then
if [ $ScheduledReboot=="Yes" ] ; then
test $Hour -eq $ScheduledHour && _check_if_there_are_offline_cards
else
_check_if_there_are_offline_cards
fi
fi
if [ $Minute -eq $mySLOT ] && [ $Second -le 30 ]
then
_func_exec_scripts_on_all_cards
fi
mkdir -p /tmp/ucad/
touch /tmp/ucad/mio_lastrun."$Minute"
if [ $mySLOT -eq $ActiveMIO ] ; then
if [ $Minute -eq 1 ] || [ $Minute -eq 13 ] || [ $Minute -eq 25 ] || [ $Minute -eq 37 ] || [ $Minute -eq 49 ] ; then
test -d $UCADDIR && _sync_tmp_ucad_from_all_dpc_cards
fi
fi
test $DEBUG -ne 0 && echo $0 :: $$ :: $j :: $myCARDCPU :: `date`
_func_self_memory_check
echo $0 :: $$ :: $j :: $myCARDCPU :: _func_main_mio :: `date` > $LASTRUNFILE
j=$(( $j + 1 ))
Unixtime=$( date +%s )
sleep $(( $SleepIntervalMIO - ($Unixtime % $SleepIntervalMIO )))
done
exit
}
is_like_mio=0
is_like_dpc=0
case "$(sn-dlutil --my-type)" in
36) echo "MIO"; is_mio=true; TYPE=MIO; is_like_mio=1;;
37) echo "DPC"; is_dpc=true; TYPE=DPC; is_like_dpc=1;;
40) echo "DPC2"; is_dpc2=true; TYPE=DPC2; is_like_dpc=1;;
39) echo "MIO2"; is_mio2=true; TYPE=MIO2; is_like_mio=1;;
*) echo "NOT_ASR5500"; TYPE=NOT_ASR5500; exit ;;
esac
test "$ARGV1" == "-c" && _check_if_script_is_runnning_all_cards && exit
test "$ARGV1" == "-e" && _check_reboot_enabled_disabled_on_all_cards && exit
test "$ARGV1" == "-r" && _func_remove_scripts_from_all_cards && exit
test "$ARGV1" == "-d" && set -vx && _func_main_dpc && exit # DPC Debugging only
test "$ARGV1" == "-m" && set -vx && _func_main_mio && exit # MIO Debugging only
test "$ARGV1" == "-s" && _sync_tmp_ucad_from_all_dpc_cards && exit
test "$ARGV1" == "-b" && _func_init_script
test "$ARGV1" != "-b" && _func_run_script_in_background && exit
test $is_like_dpc -eq 1 && _func_main_dpc
test $is_like_mio -eq 1 && _func_main_mio
### END
### END
### END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment