This case study modifies a file which exists on the installation machine during package installation. It uses one of three modification methods. The other two methods are described in "Modifying a File Using Standard Classes and Class Action Scripts" and "Modifying a File Using the build Class". The file modified is /sbin/inittab.
This case study demonstrates the following techniques:
Using the sed class
For more information on the sed class, see "The sed Class Script ".
Using a postinstall script
For more information on this script, see "Writing Procedure Scripts".
To modify /sbin/inittab at the time of installation, using the sed class, you must complete the following tasks:
Add the sed class script to the prototype file.
The name of a script must be the name of the file that will be edited. In this case, the file to be edited is /sbin/inittab and so the sed script is named /sbin/inittab. There are no requirements for the mode, owner, and group of a sed script (represented in the sample prototype by question marks). The file type of the sed script must be e (indicating that it is editable).
CLASSES parameter to include the sed class.
As shown in the example file, sed is the only class being installed. However, it could be one of any number of classes.
Create a sed class action script.
Your package cannot deliver a copy of /sbin/inittab that looks the way you need it to, since /sbin/inittab is a dynamic file and you have no way of knowing how it will look at the time of package installation. However, using a sed script allows you to modify the /sbin/inittab file during package installation.
Create a postinstall script.
You need to execute the init q command to inform the system that /sbin/inittab has been modified. The only place you can perform that action in this example is in a postinstall script. Looking at the example postinstall script, you will see that its only purpose is to execute the init q command.
This approach to editing /sbin/inittab during installation has one drawback; you have to deliver a full script (the postinstall script) simply to perform the init q command.
PKG=case4 NAME=Case Study #4 CATEGORY=applications BASEDIR=/opt ARCH=SPARC VERSION=Version 1d05 CLASSES=sed
i pkginfo i postinstall e sed /sbin/inittab ? ? ?
!remove # remove all entries from the table that are associated # with this package, though not necessarily just # with this package instance /^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d !install # remove any previous entry added to the table # for this particular change /^[^:]*:[^:]*:[^:]*:[^#]*#ROBOT$/d # add the needed entry at the end of the table; # sed(1) does not properly interpret the '$a' # construct if you previously deleted the last # line, so the command # $a\ # rb:023456:wait:/usr/robot/bin/setup #ROBOT # will not work here if the file already contained # the modification. Instead, you will settle for # inserting the entry before the last line! $i\ rb:023456:wait:/usr/robot/bin/setup #ROBOT
# make init re-read inittab /sbin/init q || exit 2 exit 0