.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "smtpdcheck 1" .TH smtpdcheck 1 "2018-10-09" "Mail Avenger 0.8.5" "Mail Avenger 0.8.5" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" smtpdcheck \- check SMTP servers .SH "SYNOPSIS" .IX Header "SYNOPSIS" smtpdcheck [\-\-stop {\fIip-addr\fR|\fIname\fR}] [\-\-timeout \fIseconds\fR] [\fIprio\fR:]\fIserver\fR [[\fIprio\fR:]\fIserver\fR] .SH "DESCRIPTION" .IX Header "DESCRIPTION" smtpdcheck checks to see if \s-1SMTP\s0 servers are available. The intent is for use on secondary mail servers, which have no reason to accept mail when the primary server is available. .PP The argument consists of a list of server names, each of which may optionally be prefixed by a numeric \s-1MX\s0 priority and a colon. (This is exactly the format for \s-1MX\s0 records returned by the \fIavenger\fR \fIdns\fR command.) smtpdcheck will attempt to connect to each server in succession. .PP If one of the servers specified on the command line is available, smtpdcheck will print its name to standard output and exit with status 1. If smtpdcheck cannot connect to any of the servers, it will exit with status 0. If a system error occurs, smtpdcheck will exit with status 2. .SS "\s-1OPTIONS\s0" .IX Subsection "OPTIONS" .IP "\fB\-\-stop\fR {\fIip-addr\fR|\fIname\fR}" 4 .IX Item "--stop {ip-addr|name}" Tells smtpdcheck to stop before checking a server with \s-1IP\s0 address \&\fIip-addr\fR or hostname \fIname\fR. If such a host is encountered in the list of servers and \fIprio\fR is specified, then smtpdcheck will consider it acceptable for other servers with the same priority to be available, even if those servers were first in the list. In other words, given the following arguments: .Sp .Vb 3 \& smtpdcheck \-\-stop s2.domain.com \e \& 10:s1.domain.com 10:s2.domain.com \e \& 20:s3.domain.com .Ve .Sp This command will always succeed, regardless of whether \&\f(CW\*(C`s1.domain.com\*(C'\fR is up, because \f(CW\*(C`s2.domain.com\*(C'\fR has the same priority. On the other hand, the following command will fail and output \f(CW\*(C`s1.domain.com\*(C'\fR if \f(CW\*(C`s1.domain.com\*(C'\fR is up: .Sp .Vb 3 \& smtpdcheck \-\-stop s2.domain.com \e \& 10:s1.domain.com 20:s2.domain.com \e \& 30:s3.domain.com .Ve .Sp If a \fIgethostbyname\fR lookup for the argument \fIname\fR fails, smtpdcheck will exit immediately with status 2. .IP "\fB\-\-timeout\fR {\fIseconds\fR]" 4 .IX Item "--timeout {seconds]" By default, smtpdcheck spends 10 seconds probing each server. This includes the time to do a \s-1DNS\s0 lookup, to establish a \s-1TCP\s0 connection to port 25 of the server, and to read the \*(L"220\*(R" \s-1SMTP\s0 code from the server's \s-1SMTP\s0 greeting message. To use a different value, specify it with the \fB\-\-timeout\fR option. The value 0 disables the timeout completely, which is dangerous since smtpdcheck might then end up waiting forever to read the \*(L"220\*(R" string. .SH "EXAMPLES" .IX Header "EXAMPLES" To refuse to relay mail at a secondary \s-1MX\s0 server when the primary server is not down, you might place the following in \&\fI/etc/avenger/secondary\fR (assuming \fBMxLocalRcpt\fR is 1): .PP .Vb 4 \& dns RECIP_MXES mx "$RECIPIENT_HOST" \& setvars \& server=\`smtpdcheck \-\-stop $MYIP $RECIP_MXES\` \& test \-n "$server" && defer "Please use server $server" .Ve .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBavenger\fR\|(1) \&\fBdbutil\fR\|(1) \&\fBasmtpd.conf\fR\|(5), .PP The Mail Avenger home page: . .SH "BUGS" .IX Header "BUGS" smtpdcheck could achieve much lower latency by probing all the servers simultaneously. It should also include some kind of caching, to avoid repeatedly trying to contact an unavailable server. Finally, hosts with multiple \s-1IP\s0 addresses could be handled more cleanly, though what smtpdcheck does should probably work in most cases. .SH "AUTHOR" .IX Header "AUTHOR" David Mazie\*`res