A Challenge to Rick: a really weird .forward file.
Ted Potter
tpotter at techmarin.com
Tue Mar 8 05:04:58 UTC 2005
On Mon, 2005-03-07 at 18:41, Rick Stevens wrote:
> Waldher, Travis R wrote:
> > Here's the deal... I have a .forward file as follows:
> >
> > "|IFS=' '&&p=/usr/bin/procmail&&test -f $p&&exec $p -Yf-||exit 75
> > #username"
> >
> > The catch is, this causes sendmail 8.12 to not work (bounces email back
> > as undeliverable), but is required by postfix on other systems to let
> > procmail do it's job.
> >
> > Meaning, I have to have that line (or some form of it) but on the other
> > hand, I can't either. Bad catch 22.
> >
> > My biggest problem, I have NO idea what that line is doing and neither
> > does anyone I work with.
> >
> > Also, can I add an algorithm so that when it's called, can it do nothing
> > if it's a sendmail based system, and execute that line if it's postfix?
> >
> > Thanks in advance
>
> What do I get if I figure it out? Do I get a pony? Do I? Do I? :-)
>
> Just break it down, Travis. The "&&" is a standard shell convention for
> "if this is true, do A, AND if A is true, do B, AND if B is true...".
> In other words, the next part of the pipe (reading left to right) is
> executed ONLY if the previous part returned a "true" (return value of
> 0). Conversely, "||" means "OR": "if A fails, do B"
>
> So, the first bit sets the input field separator (IFS) to a space (see
> "Shell Variables" in "man bash").
>
> If that was successful (and it will be), it sets "p" to the value
> "/usr/bin/procmail". This is simply so the script doesn't have
> "/usr/bin/procmail" all over the place.
>
> If that was successful (again, it should be), then it checks to see if
> "/usr/bin/procmail" is a regular file. I think that's bad. It should
> be "test -x $p", or "if /usr/bin/procmail is executable".
>
> If it is a regular file (or executable with my change), then execute it
> and pass it the arguments "-Yf-" (methinks that should be "-Yf -").
> "-Y" to procmail says "assume traditional mailbox format", the "-f -"
> (note the space between "f" and the second dash) means "update the
> timestamp of the "From " line, if any.
>
> The || means "if any of the preceeding stuff fails, exit with a value of
> 75" (which is "EX_TEMPFAIL" from /usr/include/sysexits.h). Sendmail
> expects any delivery agent (e.g. procmail) to return a value from
> /usr/include/sysexits.h.
>
> The "#username" bit I'm a bit confused on, but I think it's supposed to
> be "$username" (the username the message is meant for).
>
> In pseudo-code:
>
> If setting the input field separator to a space is OK, AND
> If setting "p" to /usr/bin/procmail is OK, AND
> If "/usr/bin/procmail" is a file (executable), THEN
> execute "/usr/bin/procmail -Yf - $username"
> return whatever procmail generates for a result code
> Else
> exit with EX_TEMPFAIL (75)
> Fi
> Else
> exit with EX_TEMPFAIL (75)
> Fi
> Else
> exit with EX_TEMPFAIL (75)
> Fi
>
> Does that make sense to you? Do I get the pony?
> ----------------------------------------------------------------------
> - Rick Stevens, Senior Systems Engineer rstevens at vitalstream.com -
> - VitalStream, Inc. http://www.vitalstream.com -
> - -
> - The problem with being poor is that it takes up all of your time -
> ----------------------------------------------------------------------
for that one you should get the whole ranch!! :-)
--
Ted Potter
tpotter at techmarin.com
www.techmarin.com
More information about the Redhat-install-list
mailing list