BUGMAIL(1)

     NAME
          bugmail - ClearDDTS mail notification generator

     SYNOPSIS
          bugmail

     DESCRIPTION
          The bugmail program is  invoked by the ddtsd daemon whenever
          there is any mail notification work to be performed.

          Based on defect record files found in its  spool  directory,
          the  bugmail  program  mails notification messages regarding
          database changes to certain users.

          When a defect is submitted or modified, the old version (if
          any) is saved in  the  spool  directory.  The new version is
          retrieved in the ~ddts/allbugs directory. If a defect record
          is entirely new, the spooled record  file just  contains the
	  Identifier of the new record.

          For each bug record found in its  spool  directory,  bugmail
          compares  the  old and new versions of the record, and sends
          electronic mail to notify certain users about  the  changes.
          In  particular,  a  mail message is generated for each state
          transition that the record  appears  to  have  gone  through
          between the new and old versions.

          The notified users  include  the  submitter  of  the  defect
          record  (found  in  the  Submitter-mail field), the engineer
          responsible  for  resolving  the  defect   (found   in   the
          Engineer-mail  field), the most recent responsible engineer,
          if different from the current one (found  in  the  Engineer-
          mail  field of the old copy of the record), other interested
          users (found in the Other-mail field), and the users  to  be
          notified  for that project regarding the state transition(s)
          that occurred (see the ~ddts/projects//proj.notify
          file).

          Normally, all mail messages  to  the  user  who  caused  the
          transaction  to  occur  are  suppressed,  because  that user
          presumably does not need to be notified. But that policy can
          be changed by the administrator by adding the line:

               Allow-updater-mail: Y

          to the ~ddts/etc/ddtsrc file.  This  will  make  it  so  the
          updater  is not  automatically  excluded  from  the  list of
          recipients.

          Also, multiple state transitions will only generate one mail
          message unless the user commits each change separately.

          The bugmail program must run real-user-id ddts.   It  should
          not be run directly by users.

     ADDRESS DETERMINATION
          Here is how bugmail  determines  which  email  addresses  to
          notify.

          First, notification mail is normally  not sent to the person
          performing the change  (see  Allow-updater-mail  above).  To
          be more technically  precise, bugmail compares defect record
          field Updated-by to the  userid in  question; if they match,
          mail is suppressed.

          Addresses  to  which  email  will  be  sent  come  from  the
          Submitter-mail, Engineer-mail, and Other-mail  fields in the
          defect, and from  the  proj.notify  list for the state(s) of
          the defect.

          For the Submitter-mail, the actual logic is as follows:

            If the first 5 characters of this defect's
              Identifier matches this DDTS site's site ID
              (i.e., submitted on this site)
            AND Submitter-id is not null
            AND Submitter-mail is not null
            AND Submitter-id is not equal to Updated-by
            then send email to Submitter-mail
	  
          NOTE: The field "Old-Machids" in ~ddts/etc/ddtsrc can contain
	  a space separated list of site IDs. The Identifier is matched
	  against this list as well.  This list should be the previous 
	  site IDs for this installation if the site ID ever changed.
	  It must be manually editted by the Administrator.

          Likewise for Engineer-mail:

            If this record's Engineer field is not null
            AND Engineer-mail is not null
            AND Engineer is not equal to Updated-by
            then send email to Engineer-mail

          NOTE: If the Engineer has changed, mail is sent to both the
          old and the new values of Engineer-mail.

          Similarly for Other-mail but there is no corresponding "-id"
          and "-mail":

            For each token in Other-mail
              if token != Updated-by
                send notification mail to 'token'

          Similarly for the project notification lists:

           - Determine the states that the defect transitioned
             through.
           - For each state "X" that the defect transitioned
             through on the current transaction, retrieve
             X-notify from the proj.notify.
           - For each token on each retrieved list, if it is not
             equal to Updated-by then send notification mail.

          Each token  in  X-notify  can be a  combination  of  mail
          addresses, field names from the current defect and field
          names from the proj.notify.

          For example:
                O-notify: fred $A-notify $Opened-mail

          In this example, the notification list would contain "fred",
          the contents of A-notify from the proj.notify file and the
          contents of the field Opened-mail in the defect that bugmail
          is currently processing.  The assumption in this example is
          that the current defect does not define a field A-notify.
          Otherwise the contents of the defect would take precedence.
   
	  All the notifications are built and queued in a table, then
	  sent  at  the  very  end.  This  process  inherently  drops
          duplicates since the key to the table is the  mail  address
          to which mail is being sent.  So if the same user is listed
          as Submitter-mail and on the project notify list for example,
          they do not receive two copies of the mail.

	  NOTE:  If the userid is  specified  differently  in the two
          places, i.e. as a simple userid in one place and as a fully-
          qualified email address in the other, the user might receive
          duplicate mail.

     NOTIFICATION MAIL CUSTOMIZATIONS
          For each  user to  which  bugmail intends  to  send  email,
          bugmail   will   choose  one   template  to   retrieve  the
          configuration  parameters.  It  will  look  for  one in the
          following places in this order:

             ~ddts/www/user_prefs/.notify.tmpl
             ~ddts/class/$class/notify.tmpl
             ~ddts/class/$class/mail.subject


          The first notification template that applies is used.  The
          username is  the name  of the  user  (email address)  that
          bugmail is trying to notify.  (A system controlled email
          alias is also acceptable as a "username").

          No  matter  which  file  bugmail  uses,  it  sets  certain
          variables and  expects a Message-template file (see below)
          to be able to derive certain fields.

          The following  variables are  defined  before  running the
          notify.tmpl file in the context of  the new version of the
          defect:

            $OLDSTATUS - The previous state letter of the defect
                         record.

            $TRANSITION - State transition (new state letter) for
                          which the mail is being generated.

            $TRANSITION-TYPE - Analysis of changes to the defect:
                       "new"  - no old bug
                       "transition" - State/Class/Project changed
              "assign" - Engineer changed
              "modify" - something changed

            $RECIPIENT - The email address (possibly stripped) for
                         which we are sending mail. (See Notify-
                         domain later)
          
          In addition, all the old fields are also available to the
          notification template and have been renamed to have "--"
          prepended to the names.  For example, the old headline can
          be accessed via the name "$--Headline" while the new headline
          is accessed with "$Headline".

     Setting Bugmail Fields

          The notify.tmpl  can set any field the administrator wants
          to set, but only the following are currently being used:
          __________________________________________________________
          Subject                     Subject of mail message (Required)
          Message-template            Template to run instead of
                                      master.tmpl to notify users
          Suppress-mail               (Y/N) suppress mail if no changes
          Display-added-enclosures    (Y/N) should change_history
                                print added enclosures?
          Show-enclosures-on-submit   (Y/N) should change_history
                                      show all enclosures on submit?
          Bugmail-diff-command        $~/bin/bugmail_diff
          __________________________________________________________

          The Subject field is mandatory and  will be used  for  the
          subject of the email notification message.

          If a  Message-template  field  points  to  a  non-existent
          template file  then NO MAIL WILL BE SENT  for  that ID and
          user.  For  ease of  upgrading, Message-template  will  be
          preset to the value of "$~/class/$Class/master.tmpl" if it
          exists, but this can be changed. The Message-template file
	  is processed with the contents of the new defect with
	  $OPERATION set to 'n'.

          The Suppress-mail field tells bugmail not to send an email
          if there are no unsuppressed differences to the defect. If
          this field is set and "nothing" changes, no email is sent.
          If the  change_history  filter is  NOT run in the Message-
          template  file, then this  flag  has no effect and mail is
          still sent out.

          The field  Display-added-enclosures  determines what to do
          when diffing enclosures when an enclosure is added. If set
          to "N",  only the string "Enclosure %s has been added." is
          added to  the mail  message.  If  set  to "Y",  the entire
          enclosure   is  shown.   This  flag  is  used  to  prevent
          redundancy in  the mail  message.  Some  templates  do not
          print  all  enclosures,  so you  would want  to print  the
          added one  during a  diff.  But many other templates print
          all enclosures in the notification mail and this means the
          added enclosure would already be in the mail message. This
          flag does not control what happens with a "new" bug.

          The field  Show-enclosures-on-submit  is  similar  to  the
          Display-added-enclosures   flag,   but  it  only  controls
          enclosures when  the bug  has just  been submitted (no old
          bug). If set to  "Y" (default is "N"), the contents of all
          enclosures is  shown in the  change_history portion of the
          output.  This flag  is independent  of the  Display-added-
          enclosures flag.

          The field  Bugmail-diff-command  is  meant  to contain the
          path to  the  command  used  to  compute  the  differences
          between two  versions of  a enclosure  with the same name.
          The default  value is  $~/bin/bugmail_diff.  The script is
          expected to take three arguments:

             bugmail_diff "title" oldfile newfile
          where oldfile  and newfile are  paths to  temporary  files
          containing the old text and the new text.

          The exit status of the bugmail_diff program is ignored. If
          the bugmail_diff  program prints any text to stdout,  then
          it will be assumed that there are differences to report on
          this enclosure  and the text of the  bugmail_diff  program
          output will be printed.

          Users can create their own bugmail_diff program by copying
          and modifying the example bugmail_diff program and setting
          the derived value of  Bugmail-diff-command  to be the path
          of this new program.

          History enclosures are not compared.

          Suppressing Bugmail
 
 
          The    Administrator    can    create    a   file    named
          ~ddts/class/$class/bugmail_ignore_fields  in dfile format.
          The fields that the  Administrator puts  in this file will
          be ignored  by the  change_history  filter.  Values do not
          need  to be  placed in the dfile,  just  the names  of the
          fields.  See the dfile(5)  man page to find out more about
          this format.  Enclosure differences  can be  suppressed by
          changing the Bugmail-diff-command to specifically suppress
          changes.  Any  field  that  is "unset"  while deriving the
          message  template   (not  the  notify.tmpl)  will  not  be
          included in the change_history.

          Debugging Problems


          The  bugmail  program  appends  messages  to  a log  file,
          ~ddts/spool/LOG,  recording  all  defect  records  it  has
          processed.    The   log  file  may  be  examined  if  mail
          notification problems occur. The size of LOG is controlled
          by  the  ClearDDTS  cleanup  utility,  ddtsclean(1).   The
          Administrator  can  add  the   following  setting  to  the
          ~ddts/etc/ddtsrc  file to control how verbose  bugmail is:

            Bugmail-verbose-log: Y

          Administrators  trying  to  debug  their customizations to
          control bugmail will  probably want to  set this field, at
          least temporarily.

FILES

  ~ddts/class/$class/notify.tmpl             Template to configure bugmail
  ~ddts/class/$class/bugmail_ignore_fields   List of fields to not compare
  ~ddts/spool/bugmail                        Spool directory for bugmail
  ~ddts/spool/LOG                            Log file
  ~ddts/conf/*                               Configuration files
  ~ddts/etc/ddtsrc                           Configuration file
  ~ddts/allbugs/??/*                         New versions of defect records

SEE ALSO
      bugs(1), bugs.in(1), ddtsd(1), ddtsclean(1)