Some system files require special configuration operations beyond the simple
installation of system files. For example, after updating the printcap
file one should restart the lpd
daemon. Another special case is the
crontab
configuration: there is no crontab file as such, the current
configuration is obtained by executing the command crontab -l
. The output
of the command must thus be stored into a temporary file to perform the
sysf
operation.
To achieve this, it is possible to force sysf
to execute an auxiliary
command. The command's name is the config name and the executable file,
usually a script file, must be in the BIN
sub-directory of the config
directory. The auxiliary command is executed only if a special flag is set in
the sysf.conf
file (except for the -uninstall
command).
The auxiliary commands make it possible for an administrator to get sysf
to execute some configuration commands. An administrator can write his own
auxiliary commands and get it to do anything that is required.
The command executed is always the command named after the config name and
located in the BIN
sub-directory of the config dir.
The auxiliary command is always called with 5 arguments:
AUX_COM ACTION COM SYSTEM_FILE CONFIG_FILE ECHO_ON
The sysf
flags listed in the sysf.conf
govern when the
auxiliary command is executed by sysf
and which argument are passed
to the command.
C
: the auxiliary command is called with the ACTION
set
to -CreateSysFile
before the sysf
command is executed, with the
ACTION
set to -CreateSysFile
. The auxiliary command is also
called with the ACTION
set to -UpdateSysFile
after any
sysf
installation command (install
, first_install
and
OS_install
).I
: the auxiliary command is called with the ACTION
set
to -PreInstall
before any sysf
installation command.
the auxiliary command is also called with the ACTION
set
to -PostInstall
after any sysf
installation command.
The argument passed to the auxiliary command correspond to the following:
Argument 1 : ACTION
The first argument corresponds to the action to be performed. The valid
names are listed below and the letter between brackets is the flag that must
be set in the sysf.conf
file for the auxiliary command to be executed.
-CreateSysFile
(C
) : used before the sysf
command is
performed, this will normally create a temporary system file with the name
given by the 3rd argument: SYSFILE_NAME
. For instance, the command for
the crontab file will be something like crontab -l >! $SYSFILE_NAME
.
-UpdateSysFile
(C
) : this command is called after
install
, first_install
or OS_install
to update the system
file. For example, the command for the crontab file will be something like
crontab $SYSFILE_NAME
.
-PreInstall
(I
) : this command is called just before the
install
, first_install
or OS_install
command is executed.
This can be used to prepare the way before an installation is performed or
to create a backup of the system file.
-PostInstall
(I
) : this command is called just after the
install
, first-install
or OS_install
command is executed.
This is typically used to complete the installation process like restarting
a daemon, updating the NIS database on the NIS master server ...
-Remove
: this is called only when the uninstall
command is executed. This is actually the only thing that uninstall
does. A typical example is to remove the symbolic link in
/etc/rc.d/rcN.d
(where N
is usually 3) to disable a startup
script file. The same symbolic link would normally be created either
with -PostInstall
or the -UpdateSysFile
ACTION
.
Argument 2 : COM
: the sysf
command name. This can be tested to
tailor some operations for some sysf
commands. For example the
-CreateSysFile
can be used to display extra information
(like the existence of some symbolic links in /etc/rc.d/rcN.d
)
when the info
command is executed.
Argument 3 : SYSFILE_NAME
: the full path name of the system file.
When the system file does not really exist (like the crontab
file)
this is the file that must be created so that sysf
can compare the
config file and the system file.
Argument 4 : CONFIG_FILE
: the full config file path name. This can be used
to create the system file (as for crontab
file).
Argument 5 : ECHO_ON
: this is set to either "on" or "off" to specify
if echo is on or not. One should check this and display some information
about what is being done when echo is on.
Notice also that the config name can be extracted from the command name
variable as the last name of the path (using $0:t
under the csh
shell).
Here follow some examples of auxiliary command files.
rc
files.
On some versions of Unix/Linux (like Red Hat) the rc
files need to be
treated separately as the startup script files are symbolic links to files
stored in a different directory. For example the xdm
daemon can be
started by the script file /etc/rc.d/rc3.d/S91xdm
which is a
symbolic link to the file /etc/rc.d/init.d/xdm
. The system file
will thus be /etc/rc.d/init.d/xdm
and the xdm
auxiliary command will create the symbolic link.
In the following example, the -UpdateSysFile
action creates the symbolic
links if they do not exist. The -CreateSysFile
action reveals if the
symbolic link exists or not when the info
command is executed.
The -Remove
action removes the symbolic links when the uninstall
command is executed.
The BIN/xdm
script file:
#!/bin/csh set ACTION = $1 set COM = $2 set SYSFILE_NAME = $3 set CONFIG_FILE = $4 set ECHO_ON = $5 set INITD_PATH = "/etc/rc.d/init.d" set RC2_PATH = "/etc/rc.d/rc2.d" set RC3_PATH = "/etc/rc.d/rc3.d" set RC_LIST = "$RC3_PATH" set NAME = "xdm" set S_NAME = "S91xdm" set K_NAME = "K91xdm" switch( $ACTION ) case "-CreateSysFile" : # if command is info : check that the symbolic link exists if ( "$COM" == "info" ) then foreach p ( $RC_LIST) if ( -f $p/$S_NAME ) then echo " xdm is on in $p" else echo " xdm is off in $p" endif end endif breaksw; case "-UpdateSysFile" : # create the symbolic link to the init.d command foreach p ( $RC_LIST) if ( ! -f $p/$S_NAME ) then if ( "$ECHO_ON" == "on" ) then echo "Creating $p/$S_NAME" endif ln -s $INITD_PATH/$NAME $p/$S_NAME endif end breaksw; case "-PreInstall" : breaksw; case "-PostInstall" : breaksw; case "-Remove" : # remove the symbolic link from the RC directories foreach p ( $RC_LIST) if ( -f $p/$S_NAME ) then if ( "$ECHO_ON" == "on" ) then echo "Removing $p/$S_NAME" endif rm -f $p/$S_NAME endif end breaksw; default : echo "Unknown ACTION $ACTION" breaksw; endsw
NIS
files.
Despite the fact that NIS provides a similar functionality to sysf
it is worth creating sysf
entry for all the NIS files, if only to
have a backup copy of the files.
There is nothing special about the NIS files except that when the sysf
install
, first_install
or OS_install
commands are executed on
the master NIS server, the NIS maps must be updated by running make
in
the /var/yp
directory. This will be done by the auxiliary command
when the action is -UpdateSysFile
.
The sysf.conf
entries will look like this:
aliases = nis /etc/mail/alias alias C; bootparams = nis /etc/bootparams bootparams C; ethers = nis /etc/ethers ethers C; group = nis /etc/group group C; hosts = nis /etc/hosts hosts C; netgroup = nis /etc/netgroup netgroup C; netmasks = nis /etc/netmasks netmasks C; networks = nis /etc/networks networks C; protocols = nis /etc/protocols protocols C; publickey = nis /etc/publickey publickey C; rpc = nis /etc/rpc rpc C; services = nis /etc/services services C; timezone = nis /etc/timezone timezone C; ypservers = nis /var/yp/ypservers ypservers C;
The same script file can be used for every NIS file, so we will create the file
NIS
in the BIN
directory and create symbolic links to it named
after every NIS files.
The BIN/NIS
script file:
#!/bin/csh set ACTION = $1 set COM = $2 set SYSFILE_NAME = $3 set CONFIG_FILE = $4 set ECHO_ON = $5 set NIS_SERVER = my_serv switch( $ACTION ) case "-CreateSysFile" : breaksw; case "-UpdateSysFile" : breaksw; case "-PreInstall" : breaksw; case "-PostInstall" : if (`uname -n` == $NIS_SERVER) then (cd /var/yp; make) endif breaksw; case "-Remove" : breaksw; default : echo "Unknown ACTION " $1 breaksw; endsw
crontab
file.
As there is no crontab system file as such, one must create a temporary one
using crontab -l
. The entry in the sysf.conf
file will look like this
crontab = cron /tmp/crontab.list crontab C;and the
crontab
auxiliary command will create the temporary
system file when called with the action -CreateSysFile
and will update
the crontab entry when called with the action -UpdateSysFile
.
The BIN/crontab
script file:
#!/bin/csh set ACTION = $1 set COM = $2 set SYSFILE_NAME = $3 set CONFIG_FILE = $4 set ECHO_ON = $5 switch( $ACTION ) case "-CreateSysFile" : crontab -l >! $SYSFILE_NAME breaksw; case "-UpdateSysFile" : crontab $SYSFILE_NAME breaksw; case "-PreInstall" : breaksw; case "-PostInstall" : breaksw; case "-Remove" : breaksw; default : echo "Unknown ACTION " $1 breaksw; endsw
printcap
file.
After modifying the printcap
file, one must restart the lpd
daemon.
This can be done by setting the flag I
in the printcap
entry in
the sysf.conf
file and using the lpd startup script file in the
auxiliary command when the action is -PostInstall
.
The BIN/printcap
script file:
#!/bin/csh set ACTION = $1 set COM = $2 set SYSFILE_NAME = $3 set CONFIG_FILE = $4 set ECHO_ON = $5 set LPD = /etc/rc.d/init.d/lpd switch( $ACTION ) case "-CreateSysFile" : breaksw; case "-UpdateSysFile" : breaksw; case "-PreInstall" : breaksw; case "-PostInstall" : # restart the lpd daemon $LPD restart breaksw; case "-Remove" : breaksw; default : echo "Unknown ACTION " $1 breaksw; endsw
rpm
file.
Red Hat and other versions of Linux use packages to install software. The list
of installed software is stored in the rpm database and it can be extracted
using the rpm command. To be able to check if new packages have been installed
or compare different hosts, one can define the following sysf entry in
sysf.conf
:
rpm.list = extra /tmp/rpm.list rpm.list C;As such there is no system file for
rpm.list
so we create it as the
temporary file /tmp/rpm.list
using the -CreateSysFile
action in the auxiliary config command. Sysf
can be used to check if new
packages have been added on a system or compare the package lists on
different hosts. Notice that the sysf -install
command does not do
anything useful in this case.
The following script file creates the file /tmp/rpm.list
when
required.
The BIN/rpm.list
script file:
#!/bin/csh set ACTION = $1 set COM = $2 set SYSFILE_NAME = $3 set CONFIG_FILE = $4 set ECHO_ON = $5 switch( $ACTION ) case "-CreateSysFile" : if ( $ECHO_ON == "on" ) then echo "Creating $SYSFILE_NAME" endif /bin/rpm -q -a >! $SYSFILE_NAME breaksw; case "-UpdateSysFile" : breaksw; case "-PreInstall" : breaksw; case "-PostInstall" : breaksw; case "-Remove" : breaksw; default : echo "Unknown ACTION " $1 breaksw; endsw