#!/bin/sh # Copyright (C) 2000-2002, 2004 MySQL AB # All rights reserved. Use is subject to license terms. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # 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="5.1.56-ndb-7.1.15-cluster-gpl" COMPILATION_COMMENT="MySQL Cluster Server (GPL)" BUGmysql="mysql@lists.mysql.com" # This is set by configure COMP_CALL_INFO="CC='ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' CFLAGS=' -g -O3 -DUNIV_LINUX -DUNIV_LINUX' CXX='ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' CXXFLAGS='-g -O3' LDFLAGS='' ASFLAGS=''" COMP_RUN_INFO="CC='ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' CFLAGS=' -g -O3 -DUNIV_LINUX -DUNIV_LINUX' CXX='ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' CXXFLAGS=' -g -O3 -fno-implicit-templates -fno-exceptions -fno-rtti' LDFLAGS=' -rdynamic ' ASFLAGS=''" CONFIGURE_LINE="./configure '--prefix=/usr/local/mysql' '--localstatedir=/usr/local/mysql/data' '--libexecdir=/usr/local/mysql/bin' '--with-comment=MySQL Cluster Server (GPL)' '--with-server-suffix=-cluster-gpl' '--enable-thread-safe-client' '--enable-local-infile' '--with-pic' '--with-fast-mutexes' '--with-client-ldflags=-static' '--with-mysqld-ldflags=-static' '--with-zlib-dir=bundled' '--with-big-tables' '--with-libevent' '--with-ssl' '--with-readline' '--with-embedded-server' '--with-partition' '--with-perfschema' '--with-innodb' '--with-falcon' '--with-ndbcluster' '--with-archive-storage-engine' '--with-blackhole-storage-engine' '--with-csv-storage-engine' '--without-example-storage-engine' '--with-federated-storage-engine' '--with-extra-charsets=all' '--with-classpath=/export/home/my/cluster-jars/junit-dep-4.8.1.jar:/export/home/my/cluster-jars/junit-4.8.1.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/mysql-connector-java-5.1.12-bin.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/ant-contrib.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/jboss-common-jdbc-wrapper.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/junit-3.8.2.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/commons-logging.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/log4j-1.2.9.jar:/export/home/my/cluster-jars/mysql-connector-java-5.1.12/src/lib/c3p0-0.9.1-pre6.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/openjpa-1.2.2.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/geronimo-jta_1.1_spec-1.1.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/serp-1.13.1.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/commons-pool-1.3.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/derby-10.2.2.0.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/geronimo-jpa_3.0_spec-1.0.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/commons-collections-3.2.jar:/export/home/my/cluster-jars/apache-openjpa-1.2.2/lib/commons-lang-2.1.jar' 'CC=ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' 'CFLAGS=-g -O3' 'CXX=ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc' 'CXXFLAGS=-g -O3'" 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 # Honor debian sensible-editor if test -x "/usr/bin/sensible-editor" then EDIT=/usr/bin/sensible-editor else EDIT=emacs fi 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='' LICENCE_C='[none | licence | email support | extended email support ]' SYNOPSIS_C='' 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='' ENVIRONMENT_C='' DESCRIPTION_C='' HOW_TO_REPEAT_C='' FIX_C='' cat > $TEMP <'). SEND-PR: From: ${USER} To: ${BUGADDR} Subject: $SUBJECT_C >Description: $DESCRIPTION_C >How-To-Repeat: $HOW_TO_REPEAT_C >Fix: $FIX_C >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"` >C compiler: gcc (GCC) 4.3.2 >C++ compiler: gcc (GCC) 4.3.2 >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_CALL_INFO" && echo "Compilation info (call): $COMP_CALL_INFO"` `test -n "$COMP_RUN_INFO" && echo "Compilation info (used): $COMP_RUN_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." mv -f $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 are now 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