From owner-svn-soc-all@FreeBSD.ORG Wed Jun 27 17:09:50 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 23A7D1065670 for ; Wed, 27 Jun 2012 17:09:49 +0000 (UTC) (envelope-from tzabal@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Wed, 27 Jun 2012 17:09:49 +0000 Date: Wed, 27 Jun 2012 17:09:49 +0000 From: tzabal@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120627170949.23A7D1065670@hub.freebsd.org> Cc: Subject: socsvn commit: r238407 - soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Jun 2012 17:09:50 -0000 Author: tzabal Date: Wed Jun 27 17:09:48 2012 New Revision: 238407 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238407 Log: Testing code for crashreport: extract needed debugging information from a core.txt.X file and generate the report in XML format. Modified: soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport/crashreport.sh Modified: soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport/crashreport.sh ============================================================================== --- soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport/crashreport.sh Wed Jun 27 16:46:02 2012 (r238406) +++ soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport/crashreport.sh Wed Jun 27 17:09:48 2012 (r238407) @@ -13,7 +13,7 @@ print_usage() { - echo "usage: ${PROG} [-d dumpdir] [-f file] [-e email]" + echo "usage: ${PROG} [-d dumpdir] [-f filename] [-e email]" } error() @@ -52,7 +52,7 @@ ;; *) print_usage - exit 2 + exit 1 ;; esac done @@ -70,12 +70,12 @@ if [ ! -d "${_dumpdir}" ]; then error "Dump directory ${_dumpdir} does not exist." - exit 3 + exit 1 fi if [ -z "`ls ${_dumpdir}`" ]; then error "Dump directory ${_dumpdir} is empty." - exit 4 + exit 1 fi @@ -111,7 +111,7 @@ if [ ! -f "${_dumpdir}/${_file}" ]; then error 'Unable to locate file with debugging information.' - exit 5 + exit 1 fi @@ -122,7 +122,7 @@ _email="${crashreport_email}" else error 'No email address for contact is specified.' - exit 6 + exit 1 fi fi @@ -132,25 +132,243 @@ if [ $? -ne 0 ]; then error "Email address ${_email} is invalid." - exit 7 + exit 1 fi +## Form the report +data=`mktemp /tmp/crashreport.XXXXXX` + +echo "" > ${data} +echo "" >> ${data} +echo "
" >> ${data} +echo "" >> ${data} + +output=`file "${_dumpdir}/${_file}"` +if [ "${output}" == "${_dumpdir}/${_file}: ASCII English text" ]; then + type='vmcore' +elif [ "${output}" == "${_dumpdir}/${_file}: POSIX tar archive" ]; then + type='textdump' +else + error 'Unknown type of debugging information.' + exit 1 +fi + +echo "${type}" >> ${data} +echo "" >> ${data} +echo "" >> ${data} +echo "${_email}" >> ${data} +echo "" >> ${data} +echo "
" >> ${data} + +echo "" >> ${data} +tmp_file=`mktemp /tmp/crashreport.XXXXXX` + +if [ "${type}" == 'vmcore' ]; then + # Date (date) + echo "" >> ${data} + echo "" >> ${data} + echo "date" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '3p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Hostname (hostname) + echo "" >> ${data} + echo "" >> ${data} + echo "hostname" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '5p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Operating System (ostype) + echo "" >> ${data} + echo "" >> ${data} + echo "ostype" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '6p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Operating System Release (osrelease) + echo "" >> ${data} + echo "" >> ${data} + echo "osrelease" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '7p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Version (version) + echo "" >> ${data} + echo "" >> ${data} + echo "version" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '8p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Architecture (machine) + echo "" >> ${data} + echo "" >> ${data} + echo "machine" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`sed -n '9p' "${_dumpdir}/${_file}"` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Panic Message (panic) + echo "" >> ${data} + echo "" >> ${data} + echo "panic" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + result=`cat "${_dumpdir}/${_file}" | sed -n '11p' | \ + sed -E 's/^panic: (.+)$/\1/'` + echo "${result}" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # Backtrace (bt from kgdb) + echo "" >> ${data} + echo "" >> ${data} + echo "backtrace" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + # Get only the lines about the backtrace, then remove + # the kgdb prompt, and finally remove the empty lines + cat "${_dumpdir}/${_file}" | \ + sed -n '/^(kgdb)/,/^(kgdb) $/p' | \ + sed -E 's/^\(kgdb\) (.*)$/\1/' | \ + sed '/^ *$/d' > "${tmp_file}" + numline='' + while read line; do + echo "${line}" | egrep '^#[0-9] ' > /dev/null + if [ $? -eq 0 ]; then + if [ -z "${numline}" ]; then + numline="${line}" + else + echo ${numline} >> ${data} + numline="${line}" + fi + else + numline="${numline}${line}" + fi + done < ${tmp_file} + echo ${numline} >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # ps -axl + echo "" >> ${data} + echo "" >> ${data} + echo "ps -axl" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + cat "${_dumpdir}/${_file}" | \ + sed -E -n '/^ps -axl$/,/-{20,}/p' > ${tmp_file} + lines=`wc -l < ${tmp_file}` + start=3 + end=$((lines-2)) + cat ${tmp_file} | sed -E -n "${start},${end}p" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # vmstat -s + echo "" >> ${data} + echo "" >> ${data} + echo "vmstat -s" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + cat "${_dumpdir}/${_file}" | \ + sed -E -n '/^vmstat -s$/,/-{20,}/p' > ${tmp_file} + lines=`wc -l < ${tmp_file}` + start=3 + end=$((lines-2)) + cat ${tmp_file} | sed -E -n "${start},${end}p" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # vmstat -m + echo "" >> ${data} + echo "" >> ${data} + echo "vmstat -m" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + cat "${_dumpdir}/${_file}" | \ + sed -E -n '/^vmstat -m$/,/-{20,}/p' > ${tmp_file} + lines=`wc -l < ${tmp_file}` + start=3 + end=$((lines-2)) + cat ${tmp_file} | sed -E -n "${start},${end}p" >> ${data} + echo "" >> ${data} + echo "" >> ${data} + + # vmstat -z + + # vmstat -i + + # pstat -T + + # pstat -s + + # iostat + + # ipcs -a + + # ipcs -T + + # nfsstat + + # netstat -s + + # netstat -m + + # netstat -id + + # netstat -anr + + # netstat -anA + + # netstat -aL + + # fstat + + # dmesg + + # kernel config + + # ddb capture buffer + + echo "" >> ${data} + echo "
" >> ${data} + + ## Bundle the report -uniname=`mktemp /tmp/crashreport.XXXXXX` -report="${uniname##*/}.tar.gz" -email_file=`mktemp /tmp/crashreport.XXXXXX` -echo "${_email}" > ${email_file} +report="${data##*/}.tar.gz" -tar -czf ${report} -C "${_dumpdir}" "${_file}" -C ${email_file%/*} \ - ${email_file##*/} +tar -czf ${report} -C ${data%/*} ${data##*/} if [ $? -ne 0 ]; then error 'An error occurred while bundling the report.' - exit 8 + exit 1 fi -rm -f "${uniname}" "${email_file}" +rm -f "${data}" "${tmp_file}" ## Send the report to the Central Collector machine @@ -199,7 +417,7 @@ if [ $? -ne 0 ]; then error 'An error occurred while sending the report.' - exit 9 + exit 1 fi rm -f ${host_public_key_file} ${user_private_key_file}