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:
F
w/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]
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
printer1
bogus
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.