diff options
Diffstat (limited to 'scripts/mysqlbug.sh')
-rwxr-xr-x | scripts/mysqlbug.sh | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/scripts/mysqlbug.sh b/scripts/mysqlbug.sh new file mode 100755 index 00000000000..77744777c1c --- /dev/null +++ b/scripts/mysqlbug.sh @@ -0,0 +1,380 @@ +#!/bin/sh +# Create a bug report and mail it to the mysql mailing list +# Based on glibc bug reporting script. + +echo "Finding system information for a MySQL bug report" + +VERSION="@VERSION@" +COMPILATION_COMMENT="@COMPILATION_COMMENT@" +BUGmysql="mysql@lists.mysql.com" +# This is set by configure +COMP_ENV_INFO="CC='@CC@' CFLAGS='@CFLAGS@' CXX='@CXX@' CXXFLAGS='@CXXFLAGS@' LDFLAGS='@LDFLAGS@'" +CONFIGURE_LINE="@CONF_COMMAND@" + +LIBC_INFO="" +for pat in /lib/libc.* /lib/libc-* /usr/lib/libc.* /usr/lib/libc-* +do + TMP=`ls -l $pat 2>/dev/null` + if test $? = 0 + then + LIBC_INFO="$LIBC_INFO +$TMP" + fi +done + +PATH=../client:$PATH:/bin:/usr/bin:/usr/local/bin +export PATH + +BUGADDR=${1-$BUGmysql} +ENVIRONMENT=`uname -a` + +: ${USER=${LOGNAME-`whoami`}} + +COMMAND=`echo $0|sed 's%.*/\([^/]*\)%\1%'` + +# Try to create a secure tmpfile +umask 077 +TEMPDIR=/tmp/mysqlbug-$$ +mkdir $TEMPDIR || (echo "can not create directory in /tmp, aborting"; exit 1;) +TEMP=${TEMPDIR}/mysqlbug + +trap 'rm -f $TEMP $TEMP.x; rmdir $TEMPDIR; exit 1' 1 2 3 13 15 +trap 'rm -f $TEMP $TEMP.x; rmdir $TEMPDIR' 0 + +# How to read the passwd database. +PASSWD="cat /etc/passwd" + +if test -f /usr/lib/sendmail +then + MAIL_AGENT="/usr/lib/sendmail -oi -t" +elif test -f /usr/sbin/sendmail +then + MAIL_AGENT="/usr/sbin/sendmail -oi -t" +else + MAIL_AGENT="rmail $BUGmysql" +fi + +# Figure out how to echo a string without a trailing newline +N=`echo 'hi there\c'` +case "$N" in + *c) ECHON1='echo -n' ECHON2= ;; + *) ECHON1=echo ECHON2='\c' ;; +esac + +# Find out the name of the originator of this PR. +if test -n "$NAME" +then + ORIGINATOR="$NAME" +elif test -f $HOME/.fullname +then + ORIGINATOR="`sed -e '1q' $HOME/.fullname`" +else + # Must use temp file due to incompatibilities in quoting behavior + # and to protect shell metacharacters in the expansion of $LOGNAME + $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP + ORIGINATOR="`cat $TEMP`" + rm -f $TEMP +fi + +if test -n "$ORGANIZATION" +then + if test -f "$ORGANIZATION" + then + ORGANIZATION="`cat $ORGANIZATION`" + fi +else + if test -f $HOME/.organization + then + ORGANIZATION="`cat $HOME/.organization`" + elif test -f $HOME/.signature + then + ORGANIZATION=`sed -e "s/^/ /" $HOME/.signature; echo ">"` + fi +fi + +PATH_DIRS=`echo $PATH | sed -e 's/^:/. /' -e 's/:$/ ./' -e 's/::/ . /g' -e 's/:/ /g' ` + +which_1 () +{ + for cmd + do + # Absolute path ?. + if expr "x$cmd" : "x/" > /dev/null + then + echo "$cmd" + exit 0 + else + for d in $PATH_DIRS + do + file="$d/$cmd" + if test -x "$file" -a ! -d "$file" + then + echo "$file" + exit 0 + fi + done + fi + done + exit 1 +} + +change_editor () +{ + echo "You can change editor by setting the environment variable VISUAL." + echo "If your shell is a bourne shell (sh) do" + echo "VISUAL=your_editors_name; export VISUAL" + echo "If your shell is a C shell (csh) do" + echo "setenv VISUAL your_editors_name" +} + +# If they don't have a preferred editor set, then use emacs +if test -z "$VISUAL" +then + if test -z "$EDITOR" + then + EDIT=emacs + else + EDIT="$EDITOR" + fi +else + EDIT="$VISUAL" +fi + +#which_1 $EDIT +used_editor=`which_1 $EDIT` + +echo "test -x $used_editor" +if test -x "$used_editor" +then + echo "Using editor $used_editor"; + change_editor + sleep 2 +else + echo "Could not find a text editor. (tried $EDIT)" + change_editor + exit 1 +fi + +# Find out some information. +SYSTEM=`( test -f /bin/uname && /bin/uname -a ) || \ + ( test -f /usr/bin/uname && /usr/bin/uname -a ) || echo ""` +ARCH=`test -f /bin/arch && /bin/arch` +MACHINE=`test -f /bin/machine && /bin/machine` +FILE_PATHS= + +for cmd in perl make gmake gcc cc +do + file=`which_1 $cmd` + if test $? = 0 + then + if test $cmd = "gcc" + then + GCC_INFO=`$file -v 2>&1` + elif test $cmd = "perl" + then + PERL_INFO=`$file -v | grep -i version 2>&1` + fi + FILE_PATHS="$FILE_PATHS $file" + fi +done + +admin=`which_1 mysqladmin` +MYSQL_SERVER= +if test -x "$admin" +then + MYSQL_SERVER=`$admin version 2> /dev/null` + if test "$?" = "1" + then + MYSQL_SERVER="" + fi +fi + +SUBJECT_C="[50 character or so descriptive subject here (for reference)]" +ORGANIZATION_C='<organization of PR author (multiple lines)>' +LICENCE_C='[none | licence | email support | extended email support ]' +SYNOPSIS_C='<synopsis of the problem (one line)>' +SEVERITY_C='<[ non-critical | serious | critical ] (one line)>' +PRIORITY_C='<[ low | medium | high ] (one line)>' +CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>' +RELEASE_C='<release number or tag (one line)>' +ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>' +DESCRIPTION_C='<precise description of the problem (multiple lines)>' +HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>' +FIX_C='<how to correct or work around the problem, if known (multiple lines)>' + + +cat > $TEMP <<EOF +SEND-PR: -*- send-pr -*- +SEND-PR: Lines starting with \`SEND-PR' will be removed automatically, as +SEND-PR: will all comments (text enclosed in \`<' and \`>'). +SEND-PR: +From: ${USER} +To: ${BUGADDR} +Subject: $SUBJECT_C + +>Description: + $DESCRIPTION_C +>How-To-Repeat: + $HOW_TO_REPEAT_C +>Fix: + $FIX_C + +>Submitter-Id: <submitter ID> +>Originator: ${ORIGINATOR} +>Organization: +${ORGANIZATION- $ORGANIZATION_C} +>MySQL support: $LICENCE_C +>Synopsis: $SYNOPSIS_C +>Severity: $SEVERITY_C +>Priority: $PRIORITY_C +>Category: mysql +>Class: $CLASS_C +>Release: mysql-${VERSION} ($COMPILATION_COMMENT) +`test -n "$MYSQL_SERVER" && echo ">Server: $MYSQL_SERVER"` +>Environment: + $ENVIRONMENT_C +`test -n "$SYSTEM" && echo "System: $SYSTEM"` +`test -n "$ARCH" && echo "Architecture: $ARCH"` +`test -n "$MACHINE" && echo "Machine: $MACHINE"` +`test -n "$FILE_PATHS" && echo "Some paths: $FILE_PATHS"` +`test -n "$GCC_INFO" && echo "GCC: $GCC_INFO"` +`test -n "$COMP_ENV_INFO" && echo "Compilation info: $COMP_ENV_INFO"` +`test -n "$LIBC_INFO" && echo "LIBC: $LIBC_INFO"` +`test -n "$CONFIGURE_LINE" && echo "Configure command: $CONFIGURE_LINE"` +`test -n "$PERL_INFO" && echo "Perl: $PERL_INFO"` +EOF + +chmod u+w $TEMP +cp $TEMP $TEMP.x + +eval $EDIT $TEMP + +if cmp -s $TEMP $TEMP.x +then + echo "File not changed, no bug report submitted." + cp $TEMP /tmp/failed-mysql-bugreport + echo "The raw bug report exists in /tmp/failed-mysql-bugreport" + echo "If you use this remember that the first lines of the report now is a lie.." + exit 1 +fi + +# +# Check the enumeration fields + +# This is a "sed-subroutine" with one keyword parameter +# (with workaround for Sun sed bug) +# +SED_CMD=' +/$PATTERN/{ +s||| +s|<.*>|| +s|^[ ]*|| +s|[ ]*$|| +p +q +}' + + +while :; do + CNT=0 + + # + # 1) Severity + # + PATTERN=">Severity:" + SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` + case "$SEVERITY" in + ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;; + *) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'." + esac + # + # 2) Priority + # + PATTERN=">Priority:" + PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` + case "$PRIORITY" in + ""|low|medium|high) CNT=`expr $CNT + 1` ;; + *) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'." + esac + # + # 3) Class + # + PATTERN=">Class:" + CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP` + case "$CLASS" in + ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;; + *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'." + esac + + # + # 4) Synopsis + # + VALUE=`grep "^>Synopsis:" $TEMP | sed 's/>Synopsis:[ ]*//'` + case "$VALUE" in + "$SYNOPSIS_C") echo "$COMMAND: \`$VALUE' is not a valid value for \`Synopsis'." ;; + *) CNT=`expr $CNT + 1` + esac + + test $CNT -lt 4 && + echo "Errors were found with the problem report." + + + # Check if subject of mail was changed, if not, use Synopsis field + # + subject=`grep "^Subject" $TEMP| sed 's/^Subject:[ ]*//'` + if [ X"$subject" = X"$SUBJECT_C" -o X"$subject" = X"$SYNOPSIS_C" ]; then + subject=`grep Synopsis $TEMP | sed 's/>Synopsis:[ ]*//'` + sed "s/^Subject:[ ]*.*/Subject: $subject/" $TEMP > $TEMP.tmp + mv -f $TEMP.tmp $TEMP + fi + + while :; do + $ECHON1 "a)bort, e)dit or s)end? $ECHON2" + read input + case "$input" in + a*) + echo "$COMMAND: problem report saved in $HOME/dead.mysqlbug." + cat $TEMP >> $HOME/dead.mysqlbug + xs=1; exit + ;; + e*) + eval $EDIT $TEMP + continue 2 + ;; + s*) + break 2 + ;; + esac + done +done +# +# Remove comments and send the problem report +# (we have to use patterns, where the comment contains regex chars) +# +# /^>Originator:/s;$ORIGINATOR;; +sed -e " +/^SEND-PR:/d +/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;; +/^>Confidential:/s;<.*>;; +/^>Synopsis:/s;$SYNOPSIS_C;; +/^>Severity:/s;<.*>;; +/^>Priority:/s;<.*>;; +/^>Class:/s;<.*>;; +/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;; +/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;; +/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;; +/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;; +/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;; +" $TEMP > $TEMP.x + +if $MAIL_AGENT < $TEMP.x +then + echo "$COMMAND: problem report sent" + xs=0; exit +else + echo "$COMMAND: mysterious mail failure, report not sent." + echo "$COMMAND: problem report saved in $HOME/dead.mysqlbug." + cat $TEMP >> $HOME/dead.mysqlbug +fi + +exit 0 |