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