socsvn commit: r238407 -
soc2012/tzabal/client-side/akcrs-head/usr.sbin/crashreport
tzabal at FreeBSD.org
tzabal at FreeBSD.org
Wed Jun 27 17:09:50 UTC 2012
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 "<?xml version='1.0' encoding='UTF-8'?>" > ${data}
+echo "<crashreport>" >> ${data}
+echo "<header>" >> ${data}
+echo "<type>" >> ${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 "</type>" >> ${data}
+echo "<email>" >> ${data}
+echo "${_email}" >> ${data}
+echo "</email>" >> ${data}
+echo "</header>" >> ${data}
+
+echo "<body>" >> ${data}
+tmp_file=`mktemp /tmp/crashreport.XXXXXX`
+
+if [ "${type}" == 'vmcore' ]; then
+ # Date (date)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "date" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '3p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Hostname (hostname)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "hostname" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '5p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Operating System (ostype)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "ostype" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '6p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Operating System Release (osrelease)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "osrelease" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '7p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Version (version)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "version" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '8p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Architecture (machine)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "machine" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`sed -n '9p' "${_dumpdir}/${_file}"`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Panic Message (panic)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "panic" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${data}
+ result=`cat "${_dumpdir}/${_file}" | sed -n '11p' | \
+ sed -E 's/^panic: (.+)$/\1/'`
+ echo "${result}" >> ${data}
+ echo "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # Backtrace (bt from kgdb)
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "backtrace" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${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 "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # ps -axl
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "ps -axl" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${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 "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # vmstat -s
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "vmstat -s" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${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 "</result>" >> ${data}
+ echo "</command>" >> ${data}
+
+ # vmstat -m
+ echo "<command>" >> ${data}
+ echo "<name>" >> ${data}
+ echo "vmstat -m" >> ${data}
+ echo "</name>" >> ${data}
+ echo "<result>" >> ${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 "</result>" >> ${data}
+ echo "</command>" >> ${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 "</body>" >> ${data}
+ echo "</crashreport>" >> ${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}
More information about the svn-soc-all
mailing list