#!/bin/sh # Submit a problem report to a GNATS site. # Copyright (C) 2001 Milan Zamazal # Copyright (C) 1993, 2001 Free Software Foundation, Inc. # Contributed by Brendan Kehoe (brendan@cygnus.com), based on a # version written by Heinz G. Seidl (hgs@cygnus.com). # Further edited by Milan Zamazal (pdm@zamazal.org). # mktemp support by Yngve Svendsen (yngve.svendsen@clustra.com). # # This file is part of GNU GNATS. # # GNU GNATS 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; either version 2, or (at your option) # any later version. # # GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # # $Id: send-pr.in,v 1.1 2004/03/15 20:35:31 as Exp $ # # The version of this send-pr. VERSION=4.0-alpha #SWAN_VERSION= # The submitter-id for your site. SUBMITTER=net # The place where our usual binaries live. BINDIR=@IPSEC_DIR@ # The place where the builtin binaries are located. LIBDIR=@IPSEC_LIBDIR@ LIBEXECDIR=@IPSEC_EXECDIR@ # The default release for this host. DEFAULT_RELEASE="gnats-4.0-alpha" # The default organization. DEFAULT_ORGANIZATION="net" # How to read the passwd database. PASSWD="cat /etc/passwd" # Is the mktemp command available? MKTEMP="yes" ECHON=bsd # By default send-pr connects directly to the database. However, it # can be configured to use an existing template file by setting the # TEMPLATE variable below to point to a PR template generated from # "send-pr -P". TEMPLATE="$LIBDIR/ipsec_pr.template" # send-pr can use mail to submit PRs, instead of connecting to the # database directly. MAILPROG needs to point to a compatible mailer # (sendmail will work). If MAILPROG needs to have the address that # the mail is being sent to specified on the command line, it should # be specified here as well (for example, the command # MAILPROG="mail bugs@foo.bar.com" # should work). If sendmail is used, this should be set to # MAILPROG="/usr/lib/sendmail -oi -t" MAILPROG="/usr/sbin/sendmail -oi -t" # The address that PRs are sent to. Normally this can be left as "bugs"; # however, if using mail to submit PRs, this should be set to the address # where PRs should be sent. MAILADDR="freeswan-bugs@freeswan.org" if [ $ECHON = bsd ] ; then ECHON1="echo -n" ECHON2= elif [ $ECHON = sysv ] ; then ECHON1=echo ECHON2='\c' else ECHON1=echo ECHON2= fi # Configuration file to be read. It must be a shell script that can redefine # the variables above to fit a local configuration. CONFIGFILE=@IPSEC_DIR@/send-pr.conf if [ -r $CONFIGFILE ]; then . $CONFIGFILE fi # if [ -z "$TMPDIR" ]; then TMPDIR=/tmp else if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`" fi fi # TEMP: Temporary copy of the PR, to be edited by the user. # BAD: The PR will end up here if the user aborts. # REF: The 'reference' copy of the PR template, used to verify that the user # actually did edit the template. # FIXFIL: A sed script used to remove comments from the template before # processing. if [ $MKTEMP = yes ]; then TEMP=`mktemp $TMPDIR/pXXXXXX` || exit 1 BAD=`mktemp $TMPDIR/pbadXXXXXX` || exit 1 REF=`mktemp $TMPDIR/pfXXXXXX` || exit 1 FIXFIL=`mktemp $TMPDIR/fixXXXXXX` || exit 1 else TEMP=$TMPDIR/p$$ BAD=$TMPDIR/pbad$$ REF=$TMPDIR/pf$$ FIXFIL=$TMPDIR/fix$$ bad_temp=0 : > $TEMP || bad_temp=1 : > $BAD || bad_temp=1 : > $REF || bad_temp=1 : > $FIXFIL || bad_temp=1 if [ $bad_temp = 1 ]; then rm -f $TEMP $BAD $REF $FIXFIL exit 1; fi fi REMOVE_TEMP="rm -f $TEMP $BAD $REF" # find a user name if [ "$LOGNAME" = "" ]; then if [ "$USER" != "" ]; then LOGNAME="$USER" else LOGNAME="UNKNOWN" fi fi FROM="$LOGNAME" REPLYTO="${REPLY_TO:-${REPLYTO:-$LOGNAME}}" if [ "x$MAILPROG" != "x" ] then RESP_ALIAS="`query-pr --adm-field responsible --adm-key $LOGNAME --adm-subfield alias 2>/dev/null`" else RESP_ALIAS="" fi # Find out the name of the originator of this PR. if [ -n "$NAME" ]; then DEFAULT_ORIGINATOR="$NAME" elif [ -f $HOME/.fullname ]; then DEFAULT_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 if [ "x$RESP_ALIAS" != "x" ] then DEFAULT_ORIGINATOR="$RESP_ALIAS (`cat $TEMP`)" else DEFAULT_ORIGINATOR="$FROM (`cat $TEMP`)" fi rm -f $TEMP fi if [ -z "$ORGANIZATION" ] then ORGANIZATION="$DEFAULT_ORGANIZATION"; fi if [ -n "$ORGANIZATION" -a "x$ORGANIZATION" != "xunknown" ]; then if [ -f "$ORGANIZATION" ]; then ORGANIZATION="`cat $ORGANIZATION`" fi if [ -n "$ORGANIZATION" ]; then ORGANIZATION="$ORGANIZATION" elif [ -f $HOME/.organization ]; then ORGANIZATION="`cat $HOME/.organization`" fi fi if [ "x$ORGANIZATION" = "xunknown" ]; then cat <<__EOF__ It seems that send-pr is not installed with your organization set to a useful value. To fix this, you need to edit the configuration file $CONFIGFILE and fill in the organization with the correct value. __EOF__ ORGANIZATION=""; fi 1>&2 # If they don't have a preferred editor set, then use if [ -z "$VISUAL" ]; then if [ -z "$EDITOR" ]; then EDIT=vi else EDIT="$EDITOR" fi else EDIT="$VISUAL" fi # Find out some information. SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \ ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo "" | sed -e 's,|,\\|,'` # Our base command name. COMMAND=`echo $0 | sed -e 's,.*/,,'` USAGE="Usage: $COMMAND [OPTION]... -b --batch run without printing most messages --barf include a full barf inline rather than just look -c --cc=LINE put LINE to the CC header -d --database=DATABASE submit PR to DATABASE -f --file=FILE read the PR template from FILE (\`-' for stdin) -p --print just print the template and exit --request-id send a request for a user id -s --severity=SEVERITY PR severity -h --help display this help and exit -V --version output version information and exit " REMOVE= BATCH= CC= DEFAULT_SEVERITY= BARF=${BARF-false} if [ "$SYSTEM" != "" ] then DEFAULT_ENVIRONMENT="System: $SYSTEM" fi if [ "$SWAN_VERSION" != "" ] then DEFAULT_VERSION="$SWAN_VERSION"; else DEFAULT_VERSION=`ipsec --versioncode` fi DEFAULT_VERSION=`echo $DEFAULT_VERSION | sed -e 's,\/,\\\/,'` while [ $# -gt 0 ]; do case "$1" in -r) ;; # Ignore for backward compat. -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift ; IN_FILE="$1" if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then echo "$COMMAND: cannot read $IN_FILE" exit 1 fi ;; -b | --batch) BATCH=true ;; --barf) BARF=true ;; -c | --cc) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift ; CC="$1" ;; -d | --database) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift; GNATSDB="$1"; export GNATSDB ;; -s | --severity) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift ; DEFAULT_SEVERITY="$1" ;; -p | -P | --print) PRINT=true ;; --request-id) REQUEST_ID=true ;; -h | --help) echo "$USAGE"; exit 0 ;; -V | --version) echo "$VERSION"; exit 0 ;; -*) echo "$USAGE" ; exit 1 ;; *) echo "$USAGE" ; exit 1 ;; esac shift done if [ "x$SUBMITTER" = "x" ] then SUBMITTER="unknown" fi if [ "x$SUBMITTER" = "xunknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then cat << '__EOF__' It seems that send-pr is not installed with your unique submitter-id. You need to run install-sid YOUR-SID where YOUR-SID is the identification code you received with `send-pr'. `send-pr' will automatically insert this value into the template field `>Submitter-Id'. If you've downloaded `send-pr' from the Net, use `net' for this value. If you do not know your id, run `send-pr --request-id' to get one from your support site. __EOF__ exit 1 fi # So the template generation code finds it. DEFAULT_SUBMITTERID=${SUBMITTER} # Catch some signals. ($xs kludge needed by Sun /bin/sh) xs=0 trap 'rm -f $REF $TEMP $FIXFIL; exit $xs' 0 trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP $FIXFIL; xs=1; exit' 1 3 13 15 if [ "x$PRINT" = "xtrue" ]; then FROM="" REPLYTO="" DEFAULT_ORIGINATOR="" DEFAULT_SUBMITTERID="" fi # If they told us to use a specific file, then do so. if [ -n "$IN_FILE" ]; then if [ "$IN_FILE" = "-" ]; then # The PR is coming from the standard input. cat > $TEMP else # Use the file they named. cat $IN_FILE > $TEMP fi else if [ -n "$TEMPLATE" -a -z "$PRINT_INTERN" ]; then # If their TEMPLATE points to a bogus entry, then bail. if [ ! -f "$TEMPLATE" -o ! -r "$TEMPLATE" -o ! -s "$TEMPLATE" ]; then echo "$COMMAND: can't seem to read your template file (\`$TEMPLATE'), ignoring TEMPLATE" sleep 1 PRINT_INTERN=bad_prform fi fi if [ -n "$TEMPLATE" -a -z "$PRINT_INTERN" ]; then sed "s//$FROM/;s//$REPLYTO/;s//$DEFAULT_ORIGINATOR/;s//$DEFAULT_SUBMITTERID/;s||$DEFAULT_ENVIRONMENT|;s//$DEFAULT_BARF/;s//$DEFAULT_VERSION/;" < $TEMPLATE > $TEMP || ( echo "$COMMAND: could not copy $TEMPLATE" ; xs=1; exit ) else # Which genius thought of iterating through this loop twice, when the # cp command would suffice? for file in $TEMP ; do cat > $file << '__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: SEND-PR: Please consult the send-pr man page `send-pr(1)' or the Texinfo SEND-PR: manual if you are not sure how to fill out a problem report. SEND-PR: Note that the Synopsis field is mandatory. The Subject (for SEND-PR: the mail) will be made the same as Synopsis unless explicitly SEND-PR: changed. SEND-PR: SEND-PR: Choose from the following categories: SEND-PR: __EOF__ # Format the categories so they fit onto lines. CATEGORIES=`${BINDIR}/query-pr --valid-values Category`; l=`echo "$CATEGORIES" | \ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } } END {print max + 1;}'` c=`expr 61 / $l` if [ $c -eq 0 ]; then c=1; fi echo "$CATEGORIES" | \ awk 'BEGIN {printf "SEND-PR: "; i = 0 } { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { printf "\nSEND-PR: " } } END { printf "\nSEND-PR:\n"; }' >> $file cat >> $file << __EOF__ To: $MAILADDR Subject: From: $FROM Reply-To: $REPLYTO Cc: $CC X-send-pr-version: $VERSION X-GNATS-Notify: __EOF__ # # Iterate through the list of input fields. fieldname is the # name of the field. fmtname is the formatted name of the field, # with >, : and extra spaces to cause the field contents to be # aligned. # ${BINDIR}/query-pr --list-input-fields | awk '{a[NR]=$1""; mnr = NR+1; len = length($1) + 2; if (mlen < len) mlen = len; } END { for (x = 1; x < mnr; x++) { b = ">"a[x]":"; printf ("%s %-"mlen"s&\n", a[x], b); } }' | while read fieldname fmtname do fmtname="`echo "$fmtname" | sed 's/[&]$//;'`" upname="`echo $fieldname | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;s/-//g;'`" # Grab the default value for this field. eval 'default_val="$DEFAULT_'${upname}'"' # What's stored in the field? type=`${BINDIR}/query-pr --field-type $fieldname | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` case $type in enum) if [ "$default_val" != "" ] then desc=$default_val; else if [ "$fieldname" != "Category" ] then values=`${BINDIR}/query-pr --valid-values $fieldname | tr '\n' ' ' | sed 's/ *$//g;s/ / | /g;s/^/[ /;s/$/ ]/;'` valslen=`echo "$values" | wc -c` else values="choose from a category listed above" valslen=1; fi if [ "$valslen" -gt 160 ] then desc="<`${BINDIR}/query-pr --field-description $fieldname` (one line)>"; else desc="<${values} (one line)>"; fi dpat=`echo "$desc" | tr '\]\[*+^$|\()&/' '............'` echo "/^>${fieldname}:/ s/${dpat}//" >> $FIXFIL fi echo "${fmtname}${desc}" >> $file ;; multitext) if [ "$default_val" != "" ] then desc=" $default_val"; else desc=" <`${BINDIR}/query-pr --field-description $fieldname` (multiple lines)>"; dpat=`echo "$desc" | tr '\]\[*+^$|\()&/' '............'` echo "s/^${dpat}//" >> $FIXFIL fi echo "${fmtname}" >> $file; echo "$desc" >> $file; ;; *) if [ "$default_val" != "" ] then desc="${default_val}" else desc="<`${BINDIR}/query-pr --field-description $fieldname` (one line)>" dpat=`echo "$desc" | tr '\]\[*+^$|\()&/' '............'` echo "/^>${fieldname}:/ s/${dpat}//" >> $FIXFIL fi echo "${fmtname}${desc}" >> $file ;; esac done done fi if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then cat $TEMP xs=0; exit fi if $BARF then ipsec barf >>$TEMP else ipsec look >>$TEMP fi cp $TEMP $REF chmod u+w $TEMP if [ -z "$REQUEST_ID" ]; then eval $EDIT $TEMP else ed -s $TEMP << '__EOF__' /^Subject/s/^Subject:.*/Subject: request for a customer id/ /^>Category/s/^>Category:.*/>Category: send-pr/ w q __EOF__ fi if cmp -s $REF $TEMP ; then echo "$COMMAND: problem report not filled out, therefore not sent" xs=1; exit fi fi # TEMP is the PR that we are editing. When we're done, REF will contain # the final PR to be sent. while [ -z "$REQUEST_ID" ]; do CNT=0 # # Remove comments. # echo '/^SEND-PR:/d' >> $FIXFIL sed -f $FIXFIL $TEMP > $REF # REF now has the actual PR that we want to send. # # Check that synopsis is not empty. # if grep "^>Synopsis:[ ]*$" $REF > /dev/null then echo "$COMMAND: Synopsis must not be empty." CNT=`expr $CNT + 1` fi if [ "x$MAILPROG" = "x" ] then # Since we're not using mail, use pr-edit to check the PR. We can't # do much checking otherwise, sorry. $LIBEXECDIR/pr-edit --check-initial < $REF || CNT=`expr $CNT + 1` fi [ $CNT -gt 0 -a -z "$BATCH" ] && echo "Errors were found with the problem report." while true; do if [ -z "$BATCH" ]; then $ECHON1 "a)bort, e)dit or s)end? $ECHON2" read input else if [ $CNT -eq 0 ]; then input=s else input=a fi fi case "$input" in a*) if [ -z "$BATCH" ]; then echo "$COMMAND: the problem report remains in $BAD and is not sent." mv $TEMP $BAD else echo "$COMMAND: the problem report is not sent." fi xs=1; exit ;; e*) eval $EDIT $TEMP continue 2 ;; s*) break 2 ;; esac done done # # Make sure the mail has got a Subject. If not, use the same as # in Synopsis. # if grep '^Subject:[ ]*$' $REF > /dev/null then SYNOPSIS=`grep '^>Synopsis:' $REF | sed -e 's/^>Synopsis:[ ]*//'` ed -s $REF << __EOF__ /^Subject:/s/:.*\$/: $SYNOPSIS/ w q __EOF__ fi while : do if [ "x$MAILPROG" != "x" ] then # Use mail to send the PR. if $MAILPROG < $REF then echo "$COMMAND: problem report mailed" xs=0; exit else echo "$MAILPROG failed!" fi else if $LIBEXECDIR/pr-edit --submit < $REF; then echo "$COMMAND: problem report filed" xs=0; exit else echo "$COMMAND: the problem report is not sent." fi fi while true do if [ -z "$BATCH" ]; then $ECHON1 "a)bort or s)end? (file=$REF) $ECHON2" read input case "$input" in a*) break 2 ;; s*) break ;; esac else break 2; fi done done if [ -z "$BATCH" ]; then echo "$COMMAND: the problem report remains in $BAD and is not sent." mv $TEMP $BAD else echo "$COMMAND: the problem report is not sent, is in $REF." fi xs=1; exit; # # $Log: send-pr.in,v $ # Revision 1.1 2004/03/15 20:35:31 as # added files from freeswan-2.04-x509-1.5.3 # # Revision 1.10 2003/07/14 12:26:17 mcr # use | as delimitor for $DEFAULT_ENVIRONMENT. # switch | to \\| when in $DEFAULT_ENVIRONMENT. # this is due to PR#236 where the "uname" output # says GNU/Linux, screwing up sed. # # Revision 1.9 2003/02/03 21:51:06 mcr # if MAILPROG fails, then offer to try again. # # Revision 1.8 2002/12/10 02:28:13 mcr # adjusted template to use gnats-bugs@freeswan.org # fix sed script to deal with version sanitizer. # # Revision 1.7 2002/12/10 02:17:34 mcr # need to init variables first # # Revision 1.6 2002/12/10 02:16:23 mcr # adjusted send-pr to look at LIBDIR, not LIBEXECDIR # # Revision 1.5 2002/09/30 16:04:05 mcr # fix for sed bug in "send-pr" # # Revision 1.4 2002/04/24 07:36:10 mcr # Moved from ./utils/send-pr.sh,v # # Revision 1.3 2001/11/27 15:02:55 mcr # added rcsids. # fixed submission address to be freeswan-bugs@freeswan.org # use new ipsec --versioncode to get version info. # #