You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
415 lines
11 KiB
415 lines
11 KiB
#!/bin/sh
|
|
|
|
############################################
|
|
# Version: V5.0 2022-06-27
|
|
# 1. adjust frame of xbug
|
|
# 2. record testcase name to testcase.txt
|
|
# 3. compatible with bash and dash
|
|
############################################
|
|
|
|
#Global parms
|
|
#define platform name
|
|
LINUX_PLATFORM="linux"
|
|
ANDROID_PLATFORM="android"
|
|
OH_PLATFORM="oh"
|
|
plat_name=""
|
|
|
|
if [ ! -n "`which awk`" ]; then
|
|
plat_name=$OH_PLATFORM
|
|
elif [ -n "`which getprop`" ]; then
|
|
plat_name=$ANDROID_PLATFORM
|
|
else
|
|
plat_name=$LINUX_PLATFORM
|
|
fi
|
|
|
|
# root pack is eng dir
|
|
if [ $plat_name = ${ANDROID_PLATFORM} ]; then
|
|
if [ ! -d /vendor/bin/xbugs ];then
|
|
if [ ! -d /eng/vendor/bin/xbugs ];then
|
|
SCRIPT_ROOT_PATH="$(dirname `which xbug+`)/xbugs"
|
|
else
|
|
SCRIPT_ROOT_PATH="/eng/vendor/bin/xbugs"
|
|
fi
|
|
else
|
|
SCRIPT_ROOT_PATH="/vendor/bin/xbugs"
|
|
fi
|
|
elif [ $plat_name = ${LINUX_PLATFORM} ]; then
|
|
if [ ! -d /vendor/bin/xbug ];then
|
|
SCRIPT_ROOT_PATH="$(dirname `which xbug+`)/xbugs"
|
|
else
|
|
SCRIPT_ROOT_PATH="/vendor/bin/xbug"
|
|
fi
|
|
elif [ $plat_name = ${OH_PLATFORM} ]; then
|
|
SCRIPT_ROOT_PATH="/vendor/bin/xbugs"
|
|
fi
|
|
|
|
DFX_LOG_PATH="/data/xbug"
|
|
SYS_LOG_PATH="${DFX_LOG_PATH}/log"
|
|
SYS_SPEC_LOG_PATH="${SYS_LOG_PATH}/special"
|
|
|
|
SCRIPT_CLEAN_PATH="${SCRIPT_ROOT_PATH}/common/clean"
|
|
SCRIPT_BACKGROUD_PATH="${SCRIPT_ROOT_PATH}/common/backgroud"
|
|
SCRIPT_COLLECT_PATH="${SCRIPT_ROOT_PATH}/common/collector"
|
|
SCRIPT_SPECIAL_PATH="${SCRIPT_ROOT_PATH}/special"
|
|
|
|
# prepare
|
|
start_time=$(date +%s)
|
|
xbug_version="XBUG+ V5.0 2022-06-27 log catcher tool."
|
|
# 0: no operatiron 1: have prepare operatiron
|
|
xbug_prepare_flag=0
|
|
# 0: default collect if xbug_prepare_flag=0 1: collect system logs 2: collect specical logs
|
|
xbug_collect_flag=0
|
|
# test case name
|
|
test_name=""
|
|
log_dir=${DFX_LOG_PATH}
|
|
run_cmd=""
|
|
if [ ! -d ${SYS_SPEC_LOG_PATH} ]; then
|
|
mkdir -p ${SYS_SPEC_LOG_PATH}
|
|
fi
|
|
|
|
#Help
|
|
usage()
|
|
{
|
|
printf "\n ${xbug_version}\n\n"
|
|
echo " usage: xbug+ [-m] [COMMAND] [-n] [NAME]"
|
|
echo ""
|
|
echo " -h Help"
|
|
echo " -s special script name + input paramters"
|
|
echo " -o save log path"
|
|
echo " -n test case name"
|
|
echo " -m clean: clear historical logs"
|
|
echo " tasks: clear historical logs and start some backgroud tasks."
|
|
echo " collect: collect logs, backgroud tasks informations "
|
|
echo " example: xbug+ -m clean -s uos_clean"
|
|
echo " example: xbug+ -m collect -s uos -n 001"
|
|
printf " example: xbug+ -m collect -s uos -s "pidinfo 2 3 4" -n 001\n\n"
|
|
|
|
exit 1
|
|
}
|
|
|
|
check_script_path()
|
|
{
|
|
local script_path=$1
|
|
if [ $plat_name = ${OH_PLATFORM} ]; then
|
|
if [ ! -d ${script_path} -o `ls ${script_path} | toybox wc -l` -eq 0 ]; then
|
|
exit 1
|
|
fi
|
|
elif [ $plat_name = ${ANDROID_PLATFORM} ]; then
|
|
if [ ! -d ${script_path} -o `ls ${script_path} | busybox wc -l` -eq 0 ]; then
|
|
exit 1
|
|
fi
|
|
else
|
|
if [ ! -d ${script_path} -o `ls ${script_path} | wc -l` -eq 0 ]; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
#Execute scripts in SCRIPT_PATH
|
|
# $1 platform type android or linux
|
|
# $2 save path of log
|
|
# $3 script path
|
|
# $4 script name
|
|
execute_script()
|
|
{
|
|
#Check
|
|
check_script_path $3
|
|
|
|
#Add to list
|
|
local result=""
|
|
for I in $3/*; do
|
|
if [ $4 = ${I##*/} ]; then
|
|
result=$I
|
|
break
|
|
fi
|
|
done
|
|
if [ -z ${result} ]; then
|
|
echo "Error, no script found, exit."
|
|
exit 1
|
|
fi
|
|
|
|
#Execute
|
|
echo "${result} $@" >> ${DFX_LOG_PATH}/${runing_log_name}.txt
|
|
${result} $@ 2>> ${DFX_LOG_PATH}/${runing_log_name}.txt
|
|
}
|
|
|
|
# check platform is Android or Linux
|
|
check_platform()
|
|
{
|
|
if [ ! -n "`which awk`" ]; then
|
|
echo "OH Start:`date +%Y%m%d%H%M%S`"
|
|
elif [ -n "`which getprop`" ]; then
|
|
echo "Android Platform Start:`date +%Y%m%d%H%M%S`"
|
|
else
|
|
echo "Linux Platform Start:`date +%Y%m%d%H%M%S`"
|
|
fi
|
|
}
|
|
|
|
# dftevent interface
|
|
record_testcase()
|
|
{
|
|
testcase_info="[`date +%Y%m%d%H%M%S`]:$@"
|
|
log_path=${DFX_LOG_PATH}/testcase.txt
|
|
if [ ! -f $log_path ]; then
|
|
touch $log_path
|
|
fi
|
|
if [ `cat $log_path | wc -l` -gt 100 ]; then
|
|
tail -n 50 $log_path > tmp.txt
|
|
mv tmp.txt $log_path
|
|
fi
|
|
echo "$testcase_info" >> $log_path
|
|
}
|
|
|
|
append_cmd()
|
|
{
|
|
run_cmd=${run_cmd}"execute_script ${plat_name} ${SYS_LOG_PATH} $@;"
|
|
}
|
|
|
|
append_spec_cmd()
|
|
{
|
|
run_cmd=${run_cmd}"execute_script ${plat_name} ${SYS_SPEC_LOG_PATH} $@;"
|
|
}
|
|
|
|
execute_dir_script()
|
|
{
|
|
path=$1
|
|
fst_prepare="system_clean"
|
|
if [ $path = ${SCRIPT_CLEAN_PATH} ];then
|
|
append_cmd $path $fst_prepare
|
|
fi
|
|
files=$(ls $path)
|
|
for filename in $files
|
|
do
|
|
if [ $filename != $fst_prepare ];then
|
|
#echo "file: $filename"
|
|
append_cmd $path $filename
|
|
fi
|
|
done
|
|
}
|
|
|
|
show_specical_dir_script()
|
|
{
|
|
for file in `ls $1`; do
|
|
if [ -d $1"/"$file ]; then
|
|
show_specical_dir_script $1"/"$file
|
|
else
|
|
echo $1"/"$file
|
|
fi
|
|
done
|
|
}
|
|
|
|
do_specical_dir_script()
|
|
{
|
|
local path=$1
|
|
local script_name=$2
|
|
shift 2
|
|
|
|
for file in `ls $path`; do
|
|
if [ -d $path"/"$file ]; then
|
|
do_specical_dir_script $path"/"$file $script_name $@ #$2 dst script name
|
|
else
|
|
# find the script
|
|
if [ $script_name = $file ]; then
|
|
# linux logpath paramters
|
|
append_spec_cmd $path $file $@
|
|
special_exit_flag=1
|
|
# must collect logs
|
|
if echo $path |egrep -q "collector";then
|
|
echo "special collect logs: $file $@"
|
|
if [ $xbug_collect_flag -eq 0 ];then
|
|
xbug_collect_flag=2
|
|
fi
|
|
else
|
|
echo "special prepare or clean operation: $file $@"
|
|
xbug_prepare_flag=1
|
|
fi
|
|
return
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
execute_special_dir_script()
|
|
{
|
|
local special_name=$1
|
|
special_exit_flag=0
|
|
|
|
if [ $plat_name = ${ANDROID_PLATFORM} ];then
|
|
if [ -d ${SYS_SPEC_LOG_PATH} ]; then
|
|
rm -rf ${SYS_SPEC_LOG_PATH}
|
|
mkdir -p ${SYS_SPEC_LOG_PATH}
|
|
fi
|
|
fi
|
|
if [ -n "${special_name}" ];then
|
|
do_specical_dir_script ${SCRIPT_SPECIAL_PATH} $@
|
|
fi
|
|
|
|
if [ $special_exit_flag -eq 0 ];then
|
|
echo "invalid input, special script as follows:"
|
|
echo "exp: xbug+ -s xxx"
|
|
show_specical_dir_script ${SCRIPT_SPECIAL_PATH}
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
kill_backgroud_tasks()
|
|
{
|
|
# tvos-h (also linux, but not ubuntu, whose progress 'ps' has only arguments with -w, -l and -T)
|
|
if [ ${plat_name} = ${LINUX_PLATFORM} ] && [ -z "`which dpkg`" ]; then
|
|
for J in `ps -l | grep xbug | grep -v grep | grep -v xbug+ | sed -e 's/ \+/ /g' | cut -d" " -f 3`
|
|
do
|
|
kill $J
|
|
done
|
|
# others
|
|
else
|
|
for J in `ps -ef | grep xbug | grep -v grep | grep -v xbug+ | sed -e 's/ \+/ /g' | cut -d" " -f 2`
|
|
do
|
|
kill $J
|
|
done
|
|
fi
|
|
}
|
|
|
|
system_status_logs()
|
|
{
|
|
echo "--- before kill backgroud tasks" > ${SYS_LOG_PATH}/system_status.log 2>&1
|
|
if [ ${plat_name} = ${LINUX_PLATFORM} ] && [ -z "`which dpkg`" ]; then
|
|
ps -l >> ${SYS_LOG_PATH}/system_status.log 2>&1
|
|
else
|
|
ps -eZfww >> ${SYS_LOG_PATH}/system_status.log 2>&1
|
|
fi
|
|
}
|
|
|
|
show_log_dir_size()
|
|
{
|
|
echo "----------- log dirs size -----------"
|
|
du -sh /data/*
|
|
echo "-------------------------------------"
|
|
}
|
|
|
|
clean_log_dir()
|
|
{
|
|
if [ -d ${log_dir}/log ]; then
|
|
rm -rf ${log_dir}/log
|
|
fi
|
|
}
|
|
|
|
################main################
|
|
printf "${xbug_version}\n"
|
|
check_platform
|
|
if [ $plat_name = ${LINUX_PLATFORM} ];then
|
|
kill_backgroud_tasks
|
|
fi
|
|
|
|
show_log_dir_size
|
|
|
|
while getopts "m:n:o:s:h" opt; do
|
|
case $opt in
|
|
m)
|
|
case $OPTARG in
|
|
clean)
|
|
xbug_prepare_flag=1
|
|
if [ $plat_name = ${ANDROID_PLATFORM} ];then
|
|
kill_backgroud_tasks
|
|
fi
|
|
execute_dir_script ${SCRIPT_CLEAN_PATH}
|
|
;;
|
|
tasks)
|
|
xbug_prepare_flag=1
|
|
if [ $plat_name = ${ANDROID_PLATFORM} ];then
|
|
kill_backgroud_tasks
|
|
fi
|
|
execute_dir_script ${SCRIPT_CLEAN_PATH}
|
|
execute_dir_script ${SCRIPT_BACKGROUD_PATH}
|
|
;;
|
|
collect)
|
|
xbug_collect_flag=1
|
|
;;
|
|
*)
|
|
echo "Error: invalid args ${line}, exit!"
|
|
usage
|
|
exit 0
|
|
;;
|
|
esac
|
|
;;
|
|
n)
|
|
test_name=${OPTARG}
|
|
;;
|
|
o)
|
|
if [ $(echo ${OPTARG}|cut -c 1) != "/" ];then
|
|
log_dir=$(pwd)/${OPTARG}
|
|
else
|
|
log_dir=${OPTARG}
|
|
fi
|
|
;;
|
|
s)
|
|
execute_special_dir_script ${OPTARG}
|
|
;;
|
|
h|H)
|
|
usage
|
|
;;
|
|
?)
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
#add testcase to file
|
|
record_testcase ${test_name}
|
|
# Rename xbug run log
|
|
test_time=`date +%Y%m%d%H%M%S`
|
|
if [ -n "${test_name}" ]; then
|
|
log_name="xbug_logs_"${test_name}"_"${test_time}
|
|
runing_log_name="xbug_logs_"${test_name}"_run_details_"${test_time}
|
|
else
|
|
log_name="xbug_logs_"${test_time}
|
|
runing_log_name="xbug_logs_run_details_"${test_time}
|
|
fi
|
|
echo > ${DFX_LOG_PATH}/${runing_log_name}.txt
|
|
|
|
# default add collect logs operation
|
|
if [ ${xbug_collect_flag} -eq 1 ]; then
|
|
execute_dir_script ${SCRIPT_COLLECT_PATH}
|
|
fi
|
|
|
|
# exec cmd
|
|
eval ${run_cmd}
|
|
|
|
#if only prepre operation; exit
|
|
if [ ${xbug_collect_flag} -eq 0 ]; then
|
|
if [ ${xbug_prepare_flag} -eq 1 ];then
|
|
echo "clean or start backgourd task finished."
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
#kill all backgroud tasks, record the ps and dir info
|
|
system_status_logs
|
|
kill_backgroud_tasks
|
|
#pack logs
|
|
if [ "`ls -A ${SYS_LOG_PATH}`" = "" ]; then
|
|
echo "NOTICE (${SYS_LOG_PATH}): No such file or directory!"
|
|
else
|
|
cd ${DFX_LOG_PATH}
|
|
if [ ! -d ${log_dir} ]; then
|
|
echo "[${log_dir}]: No such directory! store log to ${DFX_LOG_PATH}"
|
|
log_dir=${DFX_LOG_PATH}
|
|
fi
|
|
echo "--- taring ${log_dir}/${log_name}.tar.gz"
|
|
echo "--- log dir file" >> ${SYS_LOG_PATH}/system_status.log 2>&1
|
|
ls -l log >> ${SYS_LOG_PATH}/system_status.log
|
|
tar -zcf ${log_dir}/${log_name}.tar.gz log/
|
|
if [ $? -ne 0 ]; then
|
|
echo "tar error! (${DFX_LOG_PATH}/${log_name}.tar.gz)"
|
|
exit 1
|
|
fi
|
|
clean_log_dir
|
|
md5sum ${log_dir}/${log_name}.tar.gz
|
|
cd - >/dev/null
|
|
fi
|
|
|
|
# print time
|
|
end_time=$(date +%s)
|
|
time_spend=$((${end_time} - ${start_time}))
|
|
echo "Finished. (time: ${time_spend}s)"
|
|
|