blob: 51ecc2559a6568fbf86a69472fd5ecc42f330dc0 [file] [log] [blame]
#!/system/bin/sh
#set -x
###### KNOWN ISSUES ######
# - qbpfs pull is returning $?=0 when it fails
###### FUNCTIONS ######
cleanupDirs() {
# Cleanup output dirs
cd $tmpOutDirRoot
case $? in 0) ;; *) echo "Couldn\'t cd to $tmpOutDirRoot"; exit 2;; esac
rm -r $outDirBranch
}
setupDirs() {
cd $tmpOutDirRoot
case $? in 0) ;; *) echo "Couldn\'t cd to $tmpOutDirRoot"; exit 4;; esac
mkdir "$outDirBranch" 2>/dev/null
cd "$outDirBranch"
case $? in 0) ;; *) echo "Couldn\'t cd to $outDirBranch"; cleanupDirs ; exit 5;; esac
tmpOutDir="${tmpOutDirRoot}/${outDirBranch}"
bp_dump_tmp_file="${tmpOutDirRoot}/bp-dump_${timestamp}.txt"
bp_dump_dest_file="${outDirRoot}/bp-dump_${timestamp}.txt"
}
processLogs() {
# Initialize communication with the BP
qbpfs hello
case $? in 0) ;; *) echo "qbpfs hello failed"; cleanupDirs ; exit 6;; esac
local errIndex=""
# Retry until we have an error index to retrieve
for i in 1 2 3 4 5 ; do
qbpfs ls # This defeats a dir caching bug in the BP
qbpfs pull "/err/err_index.txt" "${tmpOutDir}/err_index.txt"
case $? in 0) ;; *) echo "qbpfs pull failed"; cleanupDirs ; exit 7;; esac
errIndex=$(cat ${tmpOutDir}/err_index.txt)
rm "${tmpOutDir}/err_index.txt"
case $errIndex in
"")
case $i in
5) echo "Could not find BP log after $i attempts"; cleanupDirs ; exit 8;;
*) echo "Could not find BP log. Retrying...";;
esac
;;
*)
# We found an error index
break
;;
esac
done
qbpfs rm "/err/err_index.txt"
# Dump err_index.txt
echo "file:begin:txt:${outDirBranch}/err_index.txt" > ${bp_dump_tmp_file}
echo "$errIndex" >> ${bp_dump_tmp_file}
echo "file:end:txt:${outDirBranch}/err_index.txt" >> ${bp_dump_tmp_file}
# Do NOT redirect stderr to stdout for bin files. It may confuse the base64 decoder.
dataIndexFile="err_data_index${errIndex}_log00.txt"
qbpfs pull "/err/${dataIndexFile}" "${tmpOutDir}/${dataIndexFile}" 2>&1
case $? in
0)
echo "file:begin:txt:${outDirBranch}/${dataIndexFile}" >> ${bp_dump_tmp_file}
cat "${tmpOutDir}/${dataIndexFile}" >> ${bp_dump_tmp_file}
catRes=$?
echo "file:end:txt:${outDirBranch}/${dataIndexFile}" >> ${bp_dump_tmp_file}
rm "${tmpOutDir}/${dataIndexFile}"
case $catRes in 0) ;; *) echo "cat failed for /err/${dataIndexFile}";; esac
;;
*)
echo "qbpfs pull failed for /err/${dataIndexFile}";;
esac
qbpfs rm "/err/${dataIndexFile}"
binFileExtensions="crs f3 id"
for ext in $binFileExtensions; do
binFile="err_f3_index${errIndex}.${ext}"
qbpfs pull "/err/${binFile}" "${tmpOutDir}/${binFile}" 2>&1
case $? in 0) ;; *) echo "qbpfs pull failed for /err/${binFile}"; continue;; esac
base64 -e "${tmpOutDir}/${binFile}" > "${tmpOutDir}/${binFile}-base64" 2>&1
case $? in
0)
;;
*)
echo "base64 failed for ${tmpOutDir}/${binFile}"
rm "${tmpOutDir}/${binFile}"
continue
;;
esac
echo "file:begin:bin:${outDirBranch}/${binFile}" >> ${bp_dump_tmp_file}
cat "${tmpOutDir}/${binFile}-base64" >> ${bp_dump_tmp_file}
catRes=$?
echo "file:end:bin:${outDirBranch}/${binFile}" >> ${bp_dump_tmp_file}
case $catRes in 0) ;; *) "cat failed for ${tmpOutDir}/${binFile}-base64";; esac
qbpfs rm "/err/${binFile}"
rm "${tmpOutDir}/${binFile}" "${tmpOutDir}/${binFile}-base64"
done
# Grant read permissions to the bug report file
chmod 644 ${bp_dump_tmp_file}
# Move the bp_dump file from tmp location (/cache) to the correct location
# Note: "mv" doesn't work here -- produces "Cross-device link" error
cat ${bp_dump_tmp_file} >> ${bp_dump_dest_file}
chmod 644 ${bp_dump_dest_file}
rm ${bp_dump_tmp_file}
}
###### MAIN ROUTINE ######
# Generate a timestamp if none passed in from parent script
timestamp=$(date +'%Y-%m-%d_%H-%M-%S')
tmpOutDirRoot="/cache"
outDirRoot="/data/panicreports"
outDirBranch="${timestamp}"
cd $outDirRoot
case $? in 0) ;; *) echo "Couldn\'t cd to $outDirRoot"; exit 9;; esac # Do not execute if /data/panicreports does not exist
echo "Dumping QCOM BP logs @ $timestamp"
setupDirs
processLogs
cleanupDirs