#!/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