Man Linux: Main Page and Category List

NAME

       mimedefang-multiplexor - Process pool controller for mail filters.

SYNOPSIS

       mimedefang-multiplexor [options]

DESCRIPTION

       mimedefang-multiplexor manages a pool of Perl processes for scanning e-
       mail.  It is designed to work in  conjunction  with  mimedefang(8)  and
       mimedefang.pl(8).

       mimedefang-multiplexor  opens  a  UNIX-domain  socket  and  listens for
       requests for work from mimedefang.  As requests  come  in,  mimedefang-
       multiplexor  creates  Perl  processes as needed to scan mail.  The Perl
       processes are not killed when scanning is completed,  but  continue  to
       run  in  a  loop.   Perl  processes  are  re-used for subsequent e-mail
       messages.  This eliminates the large overhead of starting  a  new  Perl
       process for each incoming message.

       To  avoid  memory  leaks, the Perl processes are killed after they have
       handled some number of scans.

OPTIONS

       -U user
              Runs the multiplexor as user rather than root.  This  option  is
              mandatory,  and must match the -U option supplied to mimedefang.

       -m minSlaves
              The minimum number of Perl processes  to  keep  running  at  all
              times.  The default is zero.

       -x maxSlaves
              The  maximum number of Perl processes to run simultaneously.  If
              a request comes in and  all  processes  are  busy,  a  temporary
              failure is signalled to the SMTP peer.  The default is 2.

       -r maxRequests
              The maximum number of requests a given process handles before it
              is killed and a replacement started.  The default is 500.

       -i idleTime
              The idle time in seconds after which  to  kill  of  excess  Perl
              processes.  That is, if the process is idle for longer than this
              time, and there are more than minSlaves running, the process  is
              killed.   Note  that  this is implemented as a timer which ticks
              every idleTime seconds; therefore, processes may be idle for  up
              to  twice  this  time  before  they are killed.  The default for
              idleTime is 300 seconds.

       -b busyTime
              The longest a Perl process is allowed to spend  scanning  an  e-
              mail  before  it is declared hung up and killed.  The default is
              120 seconds.

       -Z     This option specifies that the  multiplexor  should  accept  and
              process  "status  updates"  from  busy  slaves.   Note that this
              consumes one extra file  descriptor  per  slave,  plus  a  small
              amount of CPU time per status update.

       -c cmdTime
              The timeout for communication between mimedefang-multiplexor and
              mimedefang,  or  between  mimedefang-multiplexor  and   a   Perl
              scanning  process.   The  default  is  10 seconds.  This timeout
              should be kept quite short.

       -w waitTime
              When mimedefang-multiplexor starts the initial slaves, or  needs
              to  bring  the number of running slaves up to the number defined
              by the -m option, it does not start  all  the  slaves  at  once,
              because this could overload your server.  Instead, it starts one
              slave every waitTime seconds.  The default value for waitTime is
              3.

       -W waitTime
              If  you  use  this  option,  mimedefang-multiplexor  will  never
              activate a slave until waitTime seconds have elapsed  since  the
              last   slave  activation.   This  could  result  in  mail  being
              tempfailed if slave activations do not keep pace  with  incoming
              mail.   However,  it  may  be preferable to tempfail mail rather
              than allow the load on your server to spike up too quickly.  The
              default  value  for  this  option is 0, meaning that mimedefang-
              multiplexor will start slaves as quickly as necessary to keep up
              with incoming mail.

       -z spooldir
              Set the spool directory to spooldir.  If this option is omitted,
              the spool directory defaults to /var/spool/MIMEDefang.

       -s pathName
              The UNIX-domain socket on which  mimedefang-multiplexor  listens
              for requests.  This should be specified as an absolute pathname.
              If this option is  not  supplied,  it  defaults  to  mimedefang-
              multiplexor.sock under the spool directory.

       -a socket
              A  socket for listening for requests.  This is similar to the -s
              socket, except that a restricted set of requests are  processed.
              On  this  socket,  the  multiplexor  will  only process requests
              asking for status;  it  will  not  accept  any  commands  to  do
              scanning  or  that  would  consume  a  slave.   See  the  SOCKET
              SPECIFICATION section for the format of socket.

       -p fileName
              Causes mimedefang-multiplexor to  write  its  process-ID  (after
              becoming a daemon) to the specified file.

       -f filter_path
              Normally,  mimedefang-multiplexor  executes a Perl filter script
              called mimedefang.pl to scan the e-mail.  However, you can  have
              it  execute  any program you like by specifying the full path to
              the program with the -f option.   This  program  must  obey  the
              protocol  documented  in mimedefang-protocol(7); see that manual
              page for details.

              Note that the -f option does not specify  the  "filter"  to  use
              with  mimedefang.pl;  instead,  it  specifies  the  program  for
              mimedefang-multiplexor to execute.  You almost certainly  should
              not  use  this  option  unless you wish to replace mimedefang.pl
              with your own program.

       -F rules_path
              Specifies  the  path  to  the   filter   rules.    By   default,
              /etc/mimedefang-filter  is  used.  If you use the -F option, its
              value is passed to the underlying Perl filter program using  -f.

       -l     Log  certain  events,  including  the output of the Perl slaves’
              standard-error, using syslog.  Normally,  the  multiplexor  does
              not log much information.

       -d     Write   debugging   information  about  event-handling  code  in
              /var/log/mimedefang-event-debug.log.  This is  only  of  use  to
              people debugging mimedefang-multiplexor.

       -R kbytes
              Limits  the  resident-set  size of the slave filter processes to
              kbytes kilobytes.  This limit is not supported on all  operating
              systems; it is known to work on Linux.

       -M kbytes
              Limits  the  total  memory  space  of  slave filter processes to
              kbytes kilobytes.  This limit  is  supported  on  all  operating
              systems which support the setrlimit(2) system call.  This should
              include most modern UNIX systems.

              We recommend that you monitor your slave  filter  processes  and
              get  a feel for how much memory they use.  You should then limit
              the memory to two or three times the worst-case  that  you  have
              observed.   This  can  help  mitigate  denial-of-service attacks
              which use complicated MIME messages to  force  mimedefang.pl  to
              consume lots of memory.

       -h     Print usage information and exit.

       -t filename
              Log  statistical  information  to  filename.   See  the  section
              STATISTICS for more information.

       -T     Log statistical information using syslog(2).  You may use any -t
              and -T together, in which case statistical information is logged
              in a file and using syslog.

       -u     Flush  the  statistics  file  after  every   write.    Normally,
              mimedefang-multiplexor does not flush the file; this is the best
              choice for minimizing disk I/O on a busy mail server.   However,
              if you wish to watch statistics entries in real-time, you should
              enable flushing.

       -D     Do not fork into the background and become a  daemon.   Instead,
              stay  in  the foreground.  Useful mainly for debugging or if you
              have a supervisory process managing mimedefang-multiplexor.

       -q queue_size
              Normally, if all  slaves  are  busy  and  mimedefang-multiplexor
              receives  another  request,  it fails it with the error "No free
              slaves."  However,  if  you  use  the  -q  option,  then  up  to
              queue_size  requests will be queued.  As soon as a slave becomes
              free, the queued requests will be handed off in FIFO order.   If
              the queue is full and another request comes in, then the request
              is failed with "No free slaves".

       -Q queue_timeout
              Queued requests should not stay on the queue indefinitely.  If a
              queued request cannot be processed within queue_timeout (default
              30) seconds of being placed on the queue, it is  failed  with  a
              "Queued  request  timed out" message.  See the section "QUEUEING
              REQUESTS" for more discussion.

       -O sock
              Listen on a notification socket for connections from  listeners.
              mimedefang-multiplexor  can  inform  external  programs of state
              changes by sending messages over  a  notification  socket.   The
              external  programs  connect  to  this socket and then listen for
              notifications.  See the section  SOCKET  SPECIFICATION  for  the
              format of sock.

              See  the  mimedefang-notify(7)  man  page  for  details  of  the
              notification protocol.

       -N map_sock
              Listen on a map socket for Sendmail SOCKETMAP  connections.   As
              of  Sendmail 8.13, you can define a Sendmail map type that talks
              to a daemon over a  socket.   mimedefang-multiplexor  implements
              that  protocol;  consult  the  mimedefang-filter(5) man page for
              detils (see the SOCKET MAPS section).

              See the section SOCKET SPECIFICATION for the format of map_sock.

       -I backlog
              When  mimedefang-multiplexor  creates  a  listening  socket,  it
              calculates the "backlog" argument  to  listen(2)  based  on  the
              maximum  number of slaves.  However, you can explicitly set this
              backlog with the -I option.  Setting the backlog to a high value
              (around  30-50) may help on a very busy server.  If you see mail
              log messages  saying  "MXCommand:  socket:  Connection  refused"
              during busy periods, then that’s an indication you need a higher
              listen backlog.

       -L interval
              Log the slave status every interval seconds.  This logs  a  line
              using syslog; the line looks like this:

       Slave status: Stopped=s Idle=i Busy=b Killed=k Queued=q Msgs=m Activations=a

              Here,  "Stopped"  is the number of non-running slaves, "Idle" is
              the number of idle slaves, "Busy" is the number of busy  slaves,
              "Killed"  is  the  number  of  killed  slaves  yet to be reaped,
              "Queued" is the number of queued requests, "Msgs" is  the  total
              number   of  messages  processed  since  the  multiplexor  began
              running, and "Activations" is the number of times a Perl process
              has been started since the multiplexor began running.

              If  you  supply  an  interval  of  0  (which is the default), no
              periodic status logging is performed.  If you supply an interval
              of less than 5 seconds, it is silently reset to 5 seconds.

       -S facility
              Specifies  the syslog facility for log messages.  The default is
              mail.  See openlog(3) for a list of valid facilities.   You  can
              use either the short name ("mail") or long name ("LOG_MAIL") for
              the facility name.

       -E     Specifies that the multiplexor should create  an  embedded  Perl
              interpreter.   This  can  improve performance dramatically.  But
              see the section "EMBEDDING PERL" for more information.

       -X n   Specifies that the multiplexor should initiate a "tick"  request
              every  n  seconds.   This  causes  your filter_tick function (if
              defined) to be called.  Note that you have no control over which
              slave  executes filter_tick.  If all slaves are busy when a tick
              occurs, that tick request is skipped and a  warning  message  is
              logged.

       -P n   Specifies  that  the  multiplexor  should run n tick requests in
              parallel.  Each tick is run as often as specified  with  the  -X
              argument.   (If  you  omit  the  -P option, then the multiplexor
              behaves as if -P 1 had been specified.)

              If you run parallel ticks, each  tick  is  assigned  an  integer
              identifying  its  "type".  The type ranges from 0 to n-1.  While
              there may be as many as n tick requests running at a time,  only
              one tick of each type will be active at any time.

       -Y label
              Sets  the tag used in the multiplexor’s syslog messages to label
              instead of mimedefang-multiplexor.

       -y n   Limits the maximum number of concurrent recipok checks to n on a
              per-domain  basis.   The  value  of n can range from 0 (in which
              case no limit is applied) to maxSlaves, where maxSlaves  is  the
              argument  to  the  -x option.  If n is outside that range, it is
              ignored (and no limit is applied.)

              The recipok  command  ultimately  invokes  the  filter_recipient
              function   in   your   filter.    If  you  are  doing  recipient
              verification against servers that may be slow or unreliable, you
              can  use  the  -y  option  to  limit  the  number  of concurrent
              recipient verifications per domain.  That way, if  one  domain’s
              server  becomes very slow, it won’t consume all available slaves
              for recipient verification.  Instead, its RCPT commands will  be
              tempfailed  and  there  will  be slaves available to handle RCPT
              commands for other domains.

SOCKET SPECIFICATION

       The -a, -N and -O options take a socket as an  argument.   This  socket
       can be specified as:

       /path/to/socket
              A UNIX-domain socket

       inet:portnum
              A   TCP   socket  bound  to  port  portnum,  but  which  accepts
              connections only from the IPv4 loopback address (127.0.0.1).

       inet_any:portnum
              A TCP socket bound to port portnum which will accept connections
              from any address.  Use inet_any with caution!

       inet6:portnum
              A  TCP  socket  bound  to  port  portnum  listening  on the IPv6
              loopback address.

       inet6_any:portnum
              A TCP socket  bound  to  port  portnum  listening  on  the  IPv6
              wildcard address.

QUEUEING REQUESTS

       Normally,  if  all  slaves are busy, any additional requests are failed
       immediately.  However, the  -q  and  -Q  options  allow  you  to  queue
       requests  for  a  short  amount  of time.  This facility is intended to
       gracefully handle a temporary overload; most of the  time,  your  queue
       should be empty.

       Because  mimedefang  checks the number of free slaves when a connection
       is opened and fails the connection if there are  no  free  slaves,  the
       intent  of  the  queue  is  to allow SMTP transactions that are already
       underway  to  continue  if  there  is  a  slight  overload.   Any   new
       connections  will  be  failed  if  all  slaves  are  busy, but existing
       connections are allowed to  continue.   Queuing  requests  may  improve
       throughput on extremely busy servers.

       Note  that  if  you  supply  the -q option to mimedefang, then even new
       connections are allowed to  queue.   This  may  improve  throughput  by
       keeping the slave utilization higher.

       The  -R  option to mimedefang can be used to reserve a specified number
       of slaves for connections from the  loopback  address.   Using  the  -R
       option  has  the  side-effect  of  permitting  new connections from the
       loopback address to queue.

EMBEDDING PERL

       Normally, when mimedefang-multiplexor activates a slave, it  forks  and
       execs  mimedefang.pl.   However,  if  the multiplexor was compiled with
       embedded Perl support, and you supply the -E command-line  option,  the
       multiplexor works like this:

       1      It   creates   an   embedded   Perl   interpreter,  and  sources
              mimedefang.pl with a special command-line argument telling it to
              read the filter, but not to enter the main loop.

       2      Each time a slave is activated, the multiplexor calls fork() and
              runs   the    mimedefang.pl    main    loop.     This    invokes
              filter_initialize and then runs the main loop.

       On  some platforms (for example, Red Hat Linux 7.3 with Perl 5.6.1), it
       is not safe to destroy and recreate a Perl interpreter without  causing
       a memory leak.  On those platforms, if you attempt to reread the filter
       file (by sending the multiplexor a HUP signal or reread  command),  the
       filter will not be re-read, and a message will be logged to syslog.  On
       those platforms, you must kill and restart MIMEDefang if you change the
       filter file.

       On  most  platforms,  however,  a  filter  reread  is  accomplished  by
       destroying  and  re-creating  the  embedded  interpreter,   re-sourcing
       mimedefang.pl and killing slaves as soon as they are idle.

       WARNING:   If  you use the embedded Perl interpreter, the Perl variable
       "$$" will not be updated with the process ID of each  slave.   Instead,
       it  will  reflect  the process ID of the master multiplexor.  This is a
       limitation of embedded Perl; we have no plans to fix it.

STATISTICS

       With the -t option, mimedefang-multiplexor logs  certain  events  to  a
       file.   This  file can be post-processed to gather statistics about the
       multiplexor.  You can use it to tune the  number  of  slaves  you  run,
       adjust timeouts, and so on.

       Each line of the file looks like this:

            YYYY/MM/DD:HH:MM:SS timestamp event key=val key=val...

       Here,  YYYY/MM/DD:HH:MM:SS  is the local time of day.  Timestamp is the
       number of seconds since January 1, 1970.   Event  is  the  name  of  an
       event.  The valid events are:

       StartSlave
              A slave process has been started.

       KillSlave
              A slave process has been killed.

       ReapSlave
              A  dead slave process has been reaped.  It is possible to have a
              ReapSlave event without a previous KillSlave event if the  slave
              process terminated abnormally.

       StartFilter
              A slave process has begun filtering an e-mail message.

       EndFilter
              A slave process has finished filtering an e-mail message.

       The possible keys in the key=value pairs are:

       slave=n
              The slave involved in the event.  Every slave is identified by a
              small integer.

       nslaves=n
              The total number of running slaves immediately after  the  event
              happened.

       nbusy=n
              The number of busy slaves (slaves which are processing an e-mail
              message) immediately after the event happened.

       reason="string"
              The reason for a StartSlave or KillSlave event.   (Present  only
              for these events.)

       numRequests=n
              The  number of e-mails processed by the slave.  Present only for
              an EndFilter event.

       If you send the mimedefang-multiplexor process a SIGHUP signal (kill -1
       pid), it closes and reopens the statistics file.  This is useful during
       log file rotation.

       If you send the mimedefang-multiplexor process a  SIGINT  signal  (kill
       -INT pid), it terminates all active-but-idle slaves.  Also, any active-
       and-busy slaves terminate as soon as they finish filtering the  current
       message.   This  is  useful  to force a reread of the filter rules file
       without stopping and restarting Sendmail.

       If you send the mimedefang-multiplexor process a SIGTERM  signal  (kill
       pid), it terminates all slaves and exits immediately.

AUTHOR

       mimedefang-mulitplexor     was    written    by    David    F.    Skoll
       <dfs@roaringpenguin.com>.     The    mimedefang    home     page     is
       http://www.mimedefang.org/.

SEE ALSO

       mimedefang.pl(8),   mimedefang-filter(5),   mimedefang(8),  mimedefang-
       protocol(7)