It is not always possible or convenient to list the values for a class directly in the configuration file. Sometimes it might be better to store values in files. Examples of this might be the following:
The names of hosts that are connected to the local machine via UUCP. At some sites, such connections are created and removed often, and it is undesirable to be constantly changing the configuration file.
The names of hosts that are being moved from one location to another. During a move, it is better to modify an external file while each hostname is changed and then to modify the configuration file after all the moves have been done.
The alternative names for a machine may vary from machine to machine, yet a single configuration file may be shared among them. When such a boilerplate configuration file is centrally maintained (and distributed with rdist(1), for example), names that indicate the specialty roles of a machine should be external to that file.
The client.cf file lists two additional names for
the local host in the class w
:
Cw localhost printer1 # My other names.
To make this configuration file more general,
it would be better to store the host-specific name
(printer1
) in a separate file.
To externalize words for a class list, you use the
F
configuration command. That command looks like this:
Fw/path
The F
must begin a line. This tells sendmail that
this is a class definition, just like the C
command that we
just illustrated. The name of the class (here w
) must
immediately follow the F
with no intervening space.
If the class name is multicharacter, it must be enclosed in
curly braces.
Optional space may separate the class name from the /path
.
With the C
command, a list of words follows the name
on the same line, but with the F
command, the name of a file
follows.
/path
is the full pathname of a file.
For demonstration purposes we will name that file /etc/sendmail.cw.
[1]
[1] This is the path recommended by V8.7 and above sendmail.
Edit the client.cf file and make two changes. Delete the
name printer1
from the C
line and add a new
F
line:
remove printer1 Cw localhost # My other names.Fw/etc/sendmail.cw # A file of other names
new
The first class definition starts with the letter C
and
tells sendmail to add the name localhost
to
the list of words in the class w
. The second line tells
sendmail to read the file named /etc/sendmail.cw
and to add the words in that file to the class w
.
Note that the name w
is the same for each line. The C
and F
commands differ only in where the words are taken from.
Now run sendmail and notice what happens when the file /etc/sendmail.cw doesn't exist:
%./sendmail -Cclient.cf -bt
client.cf: line 7: fileclass: cannot open /etc/sendmail.cw: No such file or directory ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >
As you would expect, sendmail prints an error message when it fails to find the file. But as you might not expect, sendmail prints the error warning and continues to run.
Because we are developing a generic configuration file, one that
can be shared among many machines, we would prefer not to have an error
printed if the file doesn't exist. We can suppress the error message
by adding a -o
(for optional) switch
to the F
configuration command:
Fw -o /etc/sendmail.cw # A file of other names new
Now run sendmail again and notice that the error message is gone:
%./sendmail -Cclient.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >
But we still want the name printer1
to be recognized as local. To do that, we need to either put
it back into the C
line that we just removed it from or
put it into the file that doesn't exist yet, the /etc/sendmail.cw
file.
Create and edit the file /etc/sendmail.cw. If you lack write permission, create a file that you are permitted to write to (such as /usr/tmp/sendmail.cw) and use it in the following examples and in the client.cf file. Put this hostname into that file:
printer1
The next time you run sendmail, it reads this file
and adds each word it sees to the class w
.
Run sendmail in rule-testing mode again and verify that
for yourself:
%./sendmail -Cclient.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >$=w
here.us.edu localhost here [123.45.67.8] printer1
Success! Now add some more names to the sendmail.cw file. We will use bogus names just for demonstration purposes:
add printer1bogus
fake
add
Run sendmail again and notice that the name bogus
is missing:
%./sendmail -Cclient.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >$=w
here.us.edu fake localhost here [123.45.67.8] printer1
Why is bogus
missing? To answer this question,
leap ahead to Section 32.1, "Class Configuration Commands". But for now, just assume
that there may be only one word per line.