Provided by: gnats_4.1.0-5_amd64 bug

NAME

       gnatsd - GNATS network server

SYNOPSIS

       gnatsd [--database database | -d database] [--not-inetd | -n] [--max-access-level level | -m level]
              [--version | -V] [--help | -h]

DESCRIPTION

       gnatsd is used to service remote GNATS requests such as querying PRs, PR creation, deletion, and editing,
       and  miscellaneous  database  queries.  It uses a simple ASCII-based command protocol (similar to SMTP or
       POP3) for communicating with remote clients.

       It also provides a security model based either on IP-based authentication (generally a terrible idea)  or
       username/passwords.   Passwords  may  be  encrypted using UNIX crypt() or MD5 (for operating systems that
       support it).  Plaintext passwords are also supported but strongly discouraged.

       All of the GNATS clients are capable of communicating via the GNATS  remote  protocol  to  perform  their
       functions.

       gnatsd should be run by the GNATS user (by default gnats), and it is usually started from inetd(8).

OPTIONS

       -V, --version
            Prints the program version to stdout and exits.

       -h, --help
            Prints a short help text to stdout and exits.

       -d, --database
            Specifies  the default database which is to be serviced by this invocation of gnatsd.  (The selected
            database may be changed via the CHDB command; this is simply the  default  if  no  CHDB  command  is
            issued.)  If no database is specified, the database named default is assumed.  This option overrides
            the database specified in the GNATSDB environment variable.

       --not-inetd, -n
            As its name suggests, indicates that gnatsd is not being invoked from inetd.  This can be used  when
            testing gnatsd, or if it being run via ssh or some other mechanism.

            This  has  the  effect  of using the local hostname where gnatsd is being invoked for authentication
            purposes, rather than the remote address of the connecting client.

       --max-access-level, -m
            Specifies the maximum access level that the connecting client can authenticate to. Authentication is
            as  normal  but  if  the  user  or host authenticates at a higher level, access level is set to this
            level.

COMMAND PROTOCOL

       Commands are issued to gnatsd as one or more words followed  by  a  carriage-return/linefeed  pair.   For
       example, the CHDB (change databases) command is sent as
              CHDB database<CR><LF>
       [the CRLF will not be explicitly written for future examples]

       Replies from gnatsd are returned as one or more response lines containing a 3-digit numeric code followed
       by a human-readable string; the line is terminated with a  <CR><LF>  pair.   For  example,  one  possible
       response to the CHDB command above would be:
              210 Now accessing GNATS database 'database'.

       The  three-digit  code  is  normally  followed  by  a  single  ASCII space (character 0x20).  However, if
       additional response lines are to be returned from the server, there will be a single dash  (`-')  instead
       of the space character after the three-digit code.

       Response  code  values  are  divided  into ranges.  The first digit reflects the general type of response
       (such as "successful" or "error"), and the subsequent digits identify the specific type of response.

       Codes 200-299
              Positive response indicating that  the  command  was  successful.   No  subsequent  data  will  be
              transmitted  with the response.  [In particular, code 210 (CODE_OK) is used as the positive result
              code for most simple commands.]

              Commands that expect additional data from the client  (such  as  SUBM  or  VFLD)  use  a  two-step
              mechanism  for sending the data.  The server will respond to the initial command with either a 211
              (CODE_SEND_PR) or 212 (CODE_SEND_TEXT) response line, or an error code if an error  occurred  with
              the  initial  command.   The  client  is  then  expected to send the remaining data using the same
              quoting mechanism as described for server responses in the 300-349 range.  The  server  will  then
              send a final response line to the command.

       Codes 300-399
              Positive  response  indicating  that the query request was successful, and that a PR or other data
              will follow.  Codes 300-349 are used when  transmitting  PRs,  and  350-399  are  used  for  other
              responses.

              Codes  in  the  300-349  range  are  followed  by a series of CRLF-terminated lines containing the
              command response, usually a PR.  The final line of the result is a single  period  (`.').   Result
              lines that begin with a period have an extra period prepended to them.

              Codes  in  the  350-399 range use a different scheme for sending their responses.  The three-digit
              numeric code will be followed by either a dash (`-') or a single space.  If the code  is  followed
              by  a dash, that indicates that another response line will follow.  The final line of the response
              has a single space after the three-digit code.

              In previous versions of the protocol the first line of a CODE_INFORMATION (310) response was to be
              ignored.  This is no longer the case.  Instead, any lines marked with code CODE_INFORMATION_FILLER
              (351) are to be ignored.  This allows the server to transmit additional headers  or  other  human-
              readable text that can be safely ignored by the clients.

       Codes 400-599
              An error occurred, usually because of invalid command parameters or invalid input from the client,
              missing arguments to the comamand, or a command was issued out of  sequence.   The  human-readable
              message  associated  with  the  response  line  describes the general problem encountered with the
              command.

              Multiple error messages may be returned  from  a  command;  in  this  case  the  `-'  continuation
              character is used on all but the last response line.

       Codes 600-799
              An  internal  error  occurred on the server, a timeout occurred reading data from the client, or a
              network failure occurred.  These errors are of the "this should not occur"  nature,  and  retrying
              the  operation  may  resolve  the  problem.   Fortunately, most GNATS transactions are idempotent;
              unfortunately, locking the database or a PR are not repeatable actions (we cannot determine if  an
              existing lock is the one we originally requested, or someone else's).

COMMANDS

       Note  that  the  set  of  GNATS commands and their responses is somewhat inconsistent and is very much in
       flux.  At present the GNATS clients are  rather  simple-minded  and  not  very  strict  about  processing
       responses.   For  example,  if  the  server  were  to issue a code 300 (CODE_PR_READY) response to a CHDB
       command, the client would happily expect to see a PR appear (and would print it out if one was sent).

       It is thus suggested that any clients that use the GNATS protocol  be  equally  flexible  about  the  way
       received  responses  are  handled;  in  particular,  only  the first digit of the response code should be
       assumed to be meaningful, although subsequent digits are needed in some cases (codes 300-399). No attempt
       should be made to parse the message strings on error response lines; they are only intended to be read by
       humans, and will be changed on a regular basis.

       Almost every command may result in the response 440 (CODE_CMD_ERROR).  This indicates that  there  was  a
       problem  with  the  command  arguments,  usually  because  of  insufficient  or  too many arguments being
       specified.

       USER [<userid> [<password>]]
            Specifies the userid and password for database access.  Both a username and a password may be given,
            only  a username may be given, or both may be omitted; if both are omitted, the current access level
            is returned.

            The possible server responses are:

            350 (CODE_INFORMATION)
                   The current access level is specified.

            422 (CODE_NO_ACCESS)
                   A matching username and password could not be found.

            200 (CODE_OK)
                   A matching username and password was found, and the login was successful.

       QUIT Requests that the connection be closed.  Possible responses:

            201 (CODE_CLOSING)
                   Normal exit.

            The quit command has the dubious distinction of being the only command that cannot fail.

       LIST <list type>
            Describes various aspects of the database.  The lists are returned as a list  of  records,  one  per
            line.  Each line may contain a number of colon-separated fields.

            Possible values for list type include

              Categories
                     Describes the legal categories for the database.

              Submitters
                     Describes the set of submitters for the database.

              Responsible
                     Lists  the  names  in  the  responsible administrative file, including their full names and
                     email addresses.

              States Lists the states listed in the state administrative file, including the state type (usually
                     blank for most states; the closed state has a special type).

              FieldNames
                     Lists the entire set of PR fields.

              InitialInputFields
                     Lists the fields that should be present when a PR is initially entered.

              InitialRequiredFields
                     Lists  fields  that  have to be present and nonempty when a PR is initially entered (fields
                     containing only blank characters such as spaces or newlines are considered empty.)

              Databases
                     Lists the set of databases.

            The possible responses are:

            301 (CODE_TEXT_READY)
                   Normal response, followed by the records making up the list as described above.

            416 (CODE_INVALID_LIST)
                   The requested list does not exist.

       FTYP <field> [<field> ...]
            Describes the type of data held in the field(s) specified with the command.   The  currently-defined
            data types are:

            Text   A plain text field, containing exactly one line.

            MultiText
                   A text field possibly containing multiple lines of text.

            Enum   An  enumerated  data  field;  the  value  is  restricted to one entry out of a list of values
                   associated with the field.

            MultiEnum
                   The field contains one or more enumerated values.  Values are separated with spaces or colons
                   (:).

            Integer
                   The field contains an integer value, possibly signed.

            Date   The field contains a date.

            TextWithRegex
                   The value in the field must match one or more regular expressions associated with the field.

            The possible responses are:

            350 (CODE_INFORMATION)
                   The normal response; the supplied text is the data type.

            410 (CODE_INVALID_FIELD_NAME)
                   The specified field does not exist.

            If  multiple field names were given, multiple response lines will be sent, one for each field, using
            the standard continuation protocol; each response except the last will have a dash (`-') immediately
            after the response code.

       FTYPINFO <field> <property>
            Provides  field-type-related  information.   Currently, only the property `separators' for MultiEnum
            fields is supported.  When `separators' is specified, the possible return codes are:

            350 (CODE_INFORMATION)
                   A proper MultiEnum field was specified and the returned text  is  the  string  of  separators
                   specified for the field in the dbconfig file, quoted within ''.

            435 (CODE_INVALID_FTYPE_PROPERTY)
                   The  `separators'  property is not defined for this field, i.e. the specified field is not of
                   type MultiEnum.

            Currently, specifying a different property than `separators' results in return code 435 as above.

       FDSC <field> [<field> ... ]
            Returns a human-readable description of the listed field(s).  The possible responses are:

            350 (CODE_INFORMATION)
                   The normal response; the supplied text is the field description.

            410 (CODE_INVALID_FIELD_NAME)
                   The specified field does not exist.

            Like the FVLD command, the standard continuation protocol will  be  used  if  multiple  fields  were
            specified with the command.

       FIELDFLAGS <field> [<field> ... ]
            Returns  a  set  of  flags  describing  the  specified  field(s).  The possible responses are either
            410 (CODE_INVALID_FIELD_NAME), meaning that the  specified  field  is  invalid  or  nonexistent,  or
            350 (CODE_INFORMATION) which contains the set of flags for the field.  The flags may be blank, which
            indicate that no special flags have been set for this field.

            Like the FDSC and FTYP commands, multiple field names may be listed with the command, and a response
            line will be returned for each one in the order that the fields appear on the command line.

            The flags include:

            textsearch
                   The field will be searched when a text field search is requested.

            allowAnyValue
                   For fields that contain enumerated values, any legal value may be used in the field, not just
                   ones that appear in the enumerated list.

            requireChangeReason
                   If the field is edited, a reason for  the  change  must  be  supplied  in  the  new  PR  text
                   describing the reason for the change.  The reason must be supplied as a multitext PR field in
                   the new PR whose name is field-Changed-Why (where field  is  the  name  of  the  field  being
                   edited).

            readonly
                   The field is read-only, and cannot be edited.

       FVLD <field>
            Returns one or more regular expressions or strings that describe the valid types of data that can be
            placed in field.  Exactly what is returned is dependent on the type of data that can  be  stored  in
            the  field.   For  most fields a regular expression is returned; for enumerated fields, the returned
            values are the list of legal strings that can be held in the field.

            The possible responses are:

            301 (CODE_TEXT_READY)
                   The normal response, which is followed by the list of regexps or strings.

            410 (CODE_INVALID_FIELD_NAME)
                   The specified field does not exist.

       VFLD <field>
            VFLD can be used to validate a given value for a field in the database.  The client issues the  VFLD
            command  with the name of the field to validate as an argument.  The server will either respond with
            212 (CODE_SEND_TEXT), or 410 (CODE_INVALID_FIELD_NAME) if the specified field does not exist.

            Once the 212 response is received from the server, the client should then send the line(s)  of  text
            to  be  validated,  using the normal quoting mechanism described for PRs.  The final line of text is
            followed by a line containing a single period, again as when sending PR text.

            The server will then either respond with 210 (CODE_OK), indicating that the text is  acceptable,  or
            one or more error codes describing the problems with the field contents.

       INPUTDEFAULT <field> [<field> ... ]
            Returns  the  suggested  default  value  for  a  field when a PR is initially created.  The possible
            responses are either 410(CODE_INVALID_FIELD_NAME), meaning that the specified field  is  invalid  or
            nonexistent, or 350 (CODE_INFORMATION) which contains the default value for the field.

            Like the FDSC and FTYP commands, multiple field names may be listed with the command, and a response
            line will be returned for each one in the order that the fields appear on the command line.

       RSET Used to reset the internal server state.  The current query expression is cleared, and the index  of
            PRs may be reread if it has been updated since the start of the session.
            The possible responses are:

            200 (CODE_OK)
                   The state has been reset.

            440 (CODE_CMD_ERROR)
                   One or more arguments were supplied to the command.

            6xx (internal error)
                   There were problems resetting the state (usually because the index could not be reread).  The
                   session will be immediately terminated.

       LKDB Locks the main GNATS database.  No subsequent database locks will succeed until the lock is removed.
            Sessions that attempt to write to the database will fail.
            The possible responses are:

            200 (CODE_OK)
                   The lock has been established.

            440 (CODE_CMD_ERROR)
                   One or more arguments were supplied to the command.

            431 (CODE_GNATS_LOCKED)
                   The database is already locked, and the lock could not be obtained after 10 seconds.

            6xx (internal error)
                   An  internal  error  occurred,  usually  because  of  permission  or other filesystem-related
                   problems.  The lock may or may not have been established.

       UNDB Unlocks the database.  Any session may steal a database lock; no checking of any sort is done.
            The possible responses are:

            200 (CODE_OK)
                   The lock has been removed.

            432 (CODE_GNATS_NOT_LOCKED)
                   The database was not locked.

            440 (CODE_CMD_ERROR)
                   One or more arguments were supplied to the command.

            6xx (internal error)
                   The database lock could not be removed, usually because of permissions or  other  filesystem-
                   related issues.

       LOCK <PR> <user> [<pid>]
            Locks  the  specified PR, marking the lock with the name user and the optional pid.  (No checking is
            done that the user or pid arguments are valid or meaningful; they are simply treated as strings.)

            The EDIT command requires that the PR be locked before it may be successfully executed.  However, it
            does  not  require  that  the lock is owned by the editing session, so the usefulness of the lock is
            simply as an advisory measure.

            The APPN and REPL commands lock the PR as part of the editing process, and they do not require  that
            the PR be locked before they are invoked.

            The possible responses are:

            440 (CODE_CMD_ERROR)
                   Insufficient or too many arguments were specified to the command.

            300 (CODE_PR_READY)
                   The  lock was successfully obtained; the text of the PR (using the standard quoting mechanism
                   for PRs) follows.

            400 (CODE_NONEXISTENT_PR)
                   The PR specified does not exist.

            430 (CODE_LOCKED_PR)
                   The PR is already locked by another session.

            6xx (internal error)
                   The PR lock could not be created, usually because of permissions or other  filesystem-related
                   issues.

       UNLK <PR>
            Unlocks PR.  Any user may unlock a PR, as no checking is done to determine if the requesting session
            owns the lock.

            The possible responses are:

            440 (CODE_CMD_ERROR)
                   Insufficient or too many arguments were specified to the command.

            200 (CODE_OK)
                   The PR was successfully unlocked.

            433 (CODE_PR_NOT_LOCKED)
                   The PR was not locked.

            6xx (internal error)
                   The PR could not be unlocked, usually  because  of  permission  or  other  filesystem-related
                   problems.

       DELETE <PR>
            Deletes  the  specified PR.  The user making the request must have admin privileges.  If successful,
            the PR is removed from the filesystem and the index file; a  gap  will  be  left  in  the  numbering
            sequence for PRs.  No checks are made that the PR is closed.

            The possible responses are:

            200 (CODE_OK)
                   The PR was successfully deleted.

            422 (CODE_NO_ACCESS)
                   The user requesting the delete does not have admin privileges.

            430 (CODE_LOCKED_PR)
                   The PR is locked by another session.

            431 (CODE_GNATS_LOCKED)
                   The database has been locked, and no PRs may be updated until the lock is cleared.

            6xx (internal error)
                   The  PR could not be successfully deleted, usually because of permission or other filesystem-
                   related problems.

       CHEK [initial]
            Used to check the text of an entire PR for errors.  Unlike the VFLD command, it accepts an entire PR
            at once instead of the contents of an individual field.

            The  initial  argument  indicates  that  the  PR  text  to be checked is for a PR that will be newly
            created, rather than an edit or replacement of an existing PR.

            After the CHEK command is issued, the  server  will  respond  with  either  a  440  (CODE_CMD_ERROR)
            response indicating that the command arguments were incorrect, or a 211 (CODE_SEND_PR) response code
            will be sent.

            Once the 211 response is received from the server, the client should send the PR using the normal PR
            quoting  mechanism;  the final line of the PR is then followed by a line containing a single period,
            as usual.

            The server will then respond with either a 200 (CODE_OK) response, indicating there were no problems
            with the supplied text, or one or more error codes listing the problems with the PR.

       EDIT <PR>
            Verifies  the  replacement  text  for  PR.   If  the  command  is successful, the contents of PR are
            completely replaced with the supplied text.  PR must previously  have  been  locked  with  the  LOCK
            command.

            The possible responses are:

            431 (CODE_GNATS_LOCKED)
                   The database has been locked, and no PRs may be updated until the lock is cleared.

            433 (CODE_PR_NOT_LOCKED)
                   The PR was not previously locked with the LOCK command.

            400 (CODE_NONEXISTENT_PR)
                   The  specified  PR  does  not currently exist.  The SUBM command should be used to create new
                   PRs.

            211 (CODE_SEND_PR)
                   The client should now transmit the replacement PR text using the normal PR quoting mechanism.
                   After  the  PR  has  been  sent, the server will respond with either a 200 (CODE_OK) response
                   indicating the edit was successful, or one or more error codes listing problems  with  either
                   with the replacement PR text, or errors encountered while updating the PR file or index.

       APPN <PR> <field>

       REPL <PR> <field>
            Appends  to  or  replaces the contents of field in PR with the supplied text.  The command returns a
            201 (CODE_SEND_TEXT) response; the client should then transmit the  new  field  contents  using  the
            standard PR quoting mechanism.  After the server has read the new contents, it then attempts to make
            the requested change to the PR.

            The possible responses are:

            200 (CODE_OK)
                   The PR field was successfully changed.

            400 (CODE_NONEXISTENT_PR)
                   The PR specified does not exist.

            410 (CODE_INVALID_FIELD_NAME)
                   The specified field does not exist.

            402 (CODE_UNREADABLE_PR)
                   The PR could not be read.

            431 (CODE_GNATS_LOCKED)
                   The database has been locked, and no PRs may be updated until the lock is cleared.

            430 (CODE_LOCKED_PR)
                   The PR is locked, and may not be altered until the lock is cleared.

            413 (CODE_INVALID_FIELD_CONTENTS)
                   The supplied (or resulting) field contents are not valid for the field.

            6xx (internal error)
                   An internal error  occurred,  usually  because  of  permission  or  other  filesystem-related
                   problems.  The PR may or may not have been altered.

       SUBM  Submits  a  new  PR  into  the  database.  The supplied text is verified for correctness, and if no
       problems are found a new PR is created.

            The possible responses are:

            431 (CODE_GNATS_LOCKED)
                   The database has been locked, and no PRs may be submitted until the lock is cleared.

            211 (CODE_SEND_PR)
                   The client should now transmit the new PR text using the normal quoting mechanism.  After the
                   PR  has  been  sent,  the server will respond with either a 200 (CODE_OK) response indicating
                   that the new PR has been created (and mail sent to the appropriate persons), or one  or  more
                   error codes listing problems with the new PR text.

       CHDB <database> [<userid> [<password>]]
              Switches  the  current  database to the name specified in the command.  An optional username or an
              optional username and password may be given.

            The possible responses are:

            422 (CODE_NO_ACCESS)
                   The user does not have permission to access the requested database.

            417 (CODE_INVALID_DATABASE)
                   The database specified does not exist, or one or more configuration errors  in  the  database
                   were encountered.

            210 (CODE_OK)
                   The  current  database is now database.  Any operations performed will now be applied to that
                   database.  The user access level for the new database is also returned.

       DBLS   Lists the known set of databases.

            The possible responses are:

            6xx (internal error)
                   An internal error was encountered while trying to obtain the  list  of  available  databases,
                   usually  due  to  lack  of  permissions  or other filesystem-related problems, or the list of
                   databases is empty.

            301 (CODE_TEXT_READY)
                   The list of databases follows, one per line, using the standard quoting mechanism.  Only  the
                   database names are sent.

       DBDESC <databasename>
              Returns a human-readable description of the specified database.  Responses include:

            6xx (internal error)
                   An  internal  error  was  encountered  while  trying to read the list of available databases,
                   usually due to lack of permissions or other  filesystem-related  problems,  or  the  list  of
                   databases is empty.

            350 (CODE_INFORMATION)
                   The normal response; the supplied text is the database description.

            417 (CODE_INVALID_DATABASE)
                   The specified database name does not have an entry.

       EXPR <query expression>
              Specifies  a  query  expression  used  to limit which PRs are returned from the QUER command.  The
              expression uses the normal query expression syntax, as described in the manual  entry  for  query-
              pr(1).

            Multiple EXPR commands may be issued; the expressions are boolean ANDed together.

            Expressions are cleared by the RSET command.

            Possible responses include:

            415 (CODE_INVALID_EXPR)
                   The specified expression is invalid, and could not be parsed.

            200 (CODE_OK)
                   The expression has been accepted, and will be used to limit the results returned from QUER.

       QFMT <query format>
            Use  the  specified  query format to format the output of the QUER command.  The query format may be
            either the name of a query format known to the server, or an actual query format.
            The possible responses are:

            200 (CODE_OK)
                   The normal response, which indicates that the query format is acceptable.

            440 (CODE_CMD_ERROR)
                   No query format was supplied.

            418 (CODE_INVALID_QUERY_FORMAT)
                   The specified query format does not exist, or could not be parsed.

       QUER [PR] [PR] [...]
            Searches the contents of the database for PRs that match the (optional) specified  expressions  with
            the EXPR command.  If no expressions were specified with EXPR, the entire set of PRs is returned.

            If one or more PRs are specified on the commandline, only those PRs will be searched and/or output.

            The  format  of the output from the command is determined by the query format selected with the QFMT
            command.

            The possible responses are:

            418 (CODE_INVALID_QUERY_FORMAT)
                   A valid format was not specified with the QFMT command prior to invoking QUER.

            300 (CODE_PR_READY)
                   One or more PRs will be output using the requested query format.  The PR text is quoted using
                   the normal quoting mechanisms for PRs.

            220 (CODE_NO_PRS_MATCHED)
                   No PRs met the specified criteria.

       ADMV <field> <key> [<subfield>]
            Returns  an  entry  from an adm file associated with field.  key is used to look up the entry in the
            data file.  If subfield is specified, only the value of that subfield is returned; otherwise, all of
            the fields in the adm data file are returned, separated by colons (`:').

            The responses are:

            410 (CODE_INVALID_FIELD_NAME)
                   The specified field does not exist.

            221 (CODE_NO_ADM_ENTRY)
                   An  adm  entry  matching  the  key  was  not  found,  or  the field does not have an adm file
                   associated with it.

            350 (CODE_INFORMATION)
                   The normal response; the supplied text is the requested field(s).

ENVIRONMENT VARIABLES

       The GNATSDB environment variable is used to determine which database to use.  For a  local  database,  it
       contains  the  name  of  the database to access.  gnatsd cannot service remote databases (tho it might be
       interesting if it could) so the database is always assumed to be local.

       If GNATSDB is not set and the --database option is not supplied, it is assumed that the database is local
       and that its name is default.

SEE ALSO

       Keeping Track: Managing Messages With GNATS (also installed as the GNU Info file gnats.info)

       databases(5),  dbconfig(5),  delete-pr(8),  edit-pr(1)  file-pr(8),  gen-index(8),  gnats(7),  gnatsd(8),
       mkcat(8), mkdb(8), pr-edit(8), query-pr(1), queue-pr(8), send-pr(1).

COPYING

       Copyright (c) 2000, 2003 Free Software Foundation, Inc.

       Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice
       and this permission notice are preserved on all copies.

       Permission  is  granted  to copy and distribute modified versions of this manual under the conditions for
       verbatim copying, provided that the entire resulting derived work is distributed under  the  terms  of  a
       permission notice identical to this one.

       Permission is granted to copy and distribute translations of this manual into another language, under the
       above conditions  for  modified  versions,  except  that  this  permission  notice  may  be  included  in
       translations approved by the Free Software Foundation instead of in the original English.