Guía del desarrollador para la creación de paquetes de aplicaciones

Capítulo 5 Casos prácticos de creación de paquetes

Este capítulo ofrece casos prácticos para mostrar situaciones de creación de paquetes como la instalación de objetos de forma condicional, la especificación en el tiempo de ejecución de cuántos archivos se deben crear y la modificación de un archivo de datos durante la instalación y la eliminación de paquetes.

Cada caso práctico comienza por una descripción, seguida de una lista de las técnicas de creación de paquetes utilizadas, una descripción narrativa de la aproximación utilizada a la hora de usar esas técnicas, así como secuencias de comandos y archivos de ejemplo asociados al caso práctico.

A continuación puede ver una lista de los casos prácticos de este capítulo:

Cómo solicitar entrada de información al administrador

El paquete de este caso práctico tiene tres tipos de objetos. El administrador puede elegir cuál de los tres tipos se debe instalar y dónde ubicar los objetos en la máquina de instalación.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Aproximación

Para configurar la instalación selectiva en este caso práctico, debe completar las tareas siguientes:

Archivos de casos prácticos

El archivo pkginfo

PKG=ncmp
NAME=NCMP Utilities
CATEGORY=application, tools
BASEDIR=/
ARCH=SPARC
VERSION=RELEASE 1.0, Issue 1.0
CLASSES=""
NCMPBIN=/bin
NCMPMAN=/usr/man
EMACS=/usr/emacs

El archivo prototype

i pkginfo
i request
x bin $NCMPBIN 0755 root other
f bin $NCMPBIN/dired=/usr/ncmp/bin/dired 0755 root other
f bin $NCMPBIN/less=/usr/ncmp/bin/less 0755 root other
f bin $NCMPBIN/ttype=/usr/ncmp/bin/ttype 0755 root other
f emacs $NCMPBIN/emacs=/usr/ncmp/bin/emacs 0755 root other
x emacs $EMACS 0755 root other
f emacs $EMACS/ansii=/usr/ncmp/lib/emacs/macros/ansii 0644 root other
f emacs $EMACS/box=/usr/ncmp/lib/emacs/macros/box 0644 root other
f emacs $EMACS/crypt=/usr/ncmp/lib/emacs/macros/crypt 0644 root other
f emacs $EMACS/draw=/usr/ncmp/lib/emacs/macros/draw 0644 root other
f emacs $EMACS/mail=/usr/ncmp/lib/emacs/macros/mail 0644 root other
f emacs $NCMPMAN/man1/emacs.1=/usr/ncmp/man/man1/emacs.1 0644 root other
d man $NCMPMAN 0755 root other
d man $NCMPMAN/man1 0755 root other
f man $NCMPMAN/man1/dired.1=/usr/ncmp/man/man1/dired.1 0644 root other
f man $NCMPMAN/man1/ttype.1=/usr/ncmp/man/man1/ttype.1 0644 root other
f man $NCMPMAN/man1/less.1=/usr/ncmp/man/man1/less.1 0644 inixmr other

La secuencia de comandos request

trap 'exit 3' 15
# determine if and where general executables should be placed
ans=`ckyorn -d y \
-p "Should executables included in this package be installed"
` || exit $?
if [ "$ans" = y ]
then
   CLASSES="$CLASSES bin"
   NCMPBIN=`ckpath -d /usr/ncmp/bin -aoy \
   -p "Where should executables be installed"
   ` || exit $?
fi
# determine if emacs editor should be installed, and if it should
# where should the associated macros be placed
ans=`ckyorn -d y \
-p "Should emacs editor included in this package be installed"
` || exit $?
if [ "$ans" = y ]
then
   CLASSES="$CLASSES emacs"
   EMACS=`ckpath -d /usr/ncmp/lib/emacs -aoy \
   -p "Where should emacs macros be installed"
   ` || exit $?
fi

Tenga en cuenta que una secuencia de comandos request puede salir sin dejar archivos en el sistema de archivos. En el caso de instalaciones en versiones de Solaris anteriores a 2.5 y versiones compatibles (donde no se pueda usar una secuencia de comandos checkinstall) la secuencia de comandos request es el lugar correcto para probar el sistema de archivos del modo necesario para asegurar que la instalación será satisfactoria. Cuando la secuencia de comandos request se termina con el código 1, la instalación se cerrará correctamente.

Estos archivos de ejemplo muestran el uso de rutas paramétricas para establecer varios directorios base. Sin embargo, el método preferido implica el uso del parámetro BASEDIR que se administra y se valida mediante el comando pkgadd. Siempre que se usen varios directorios base, tenga un cuidado especial en proporcionarlos para la instalación de varias versiones y arquitecturas de la misma plataforma.

Creación de un archivo durante la instalación y cómo guardarlo durante la eliminación

Este caso práctico crea un archivo de base de datos en el tiempo de la instalación y guarda una copia de la base de datos cuando el paquete se suprime.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Aproximación

Para crear un archivo de base de datos en la instalación y guardar una copia tras la eliminación de este caso práctico, debe completar las tareas siguientes:

Archivos de casos prácticos

El archivo pkginfo

PKG=krazy
NAME=KrAzY Applications
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1
CLASSES=none cfgdata admin

El archivo prototype

i pkginfo
i request
i i.admin
i r.cfgdata
d none bin 555 root sys
f none bin/process1 555 root other
f none bin/process2 555 root other
f none bin/process3 555 root other
f admin bin/config 500 root sys
d admin cfg 555 root sys
f admin cfg/datafile1 444 root sys
f admin cfg/datafile2 444 root sys
f admin cfg/datafile3 444 root sys
f admin cfg/datafile4 444 root sys
d cfgdata data 555 root sys

El archivo space

# extra space required by config data which is
# dynamically loaded onto the system
data 500 1

La secuencia de comandos de acción de clase i.admin

# PKGINST parameter provided by installation service
# BASEDIR parameter provided by installation service
while read src dest
do
   cp $src $dest || exit 2
done
# if this is the last time this script will be executed
# during the installation, do additional processing here.
if [ "$1" = ENDOFCLASS ]
then
# our config process will create a data file based on any changes
# made by installing files in this class; make sure the data file
# is in class `cfgdata' so special rules can apply to it during
# package removal.
   installf -c cfgdata $PKGINST $BASEDIR/data/config.data f 444 root
   sys || exit 2
   $BASEDIR/bin/config > $BASEDIR/data/config.data || exit 2
   installf -f -c cfgdata $PKGINST || exit 2
fi
exit 0

Esto ilustra una instancia poco común en la que installf es adecuado en una secuencia de comandos de acción de clase. Debido a que se ha usado un archivo space para reservar espacio en un sistema de archivos específico, este nuevo archivo se puede agregar de forma segura aunque no se incluya en el archivo pkgmap.

La secuencia de comandos de eliminación r.cfgdata

# the product manager for this package has suggested that
# the configuration data is so valuable that it should be
# backed up to $PKGSAV before it is removed!
while read path
do
# path names appear in reverse lexical order.
   mv $path $PKGSAV || exit 2
   rm -f $path || exit 2
done
exit 0

Definición de dependencias y compatibilidades de paquetes

El paquete de este caso práctico usa archivos de información optativos para definir dependencias y compatibilidades de paquetes, así como para presentar un mensaje de copyright durante la instalación.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Para obtener más información sobre estos archivos, consulte Creación de archivos de información.

Aproximación

Para cumplir los requisitos de la descripción debe:

Archivos de casos prácticos

El archivo pkginfo

PKG=case3
NAME=Case Study #3
CATEGORY=application
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 3.0
CLASSES=none

El archivo copyright

Copyright (c) 1999 company_name
All Rights Reserved.
THIS PACKAGE CONTAINS UNPUBLISHED PROPRIETARY SOURCE CODE OF
company_name.
The copyright notice above does not evidence any
actual or intended publication of such source code

El archivo compver

Version 3.0
Version 2.3
Version 2.2
Version 2.1
Version 2.1.1
Version 2.1.3
Version 1.7

El archivo depend

P acu Advanced C Utilities
Issue 4 Version 1
P cc C Programming Language
Issue 4 Version 1
P dfm Directory and File Management Utilities
P ed Editing Utilities
P esg Extended Software Generation Utilities
Issue 4 Version 1
P graph Graphics Utilities
P rfs Remote File Sharing Utilities
Issue 1 Version 1
P rx Remote Execution Utilities
P sgs Software Generation Utilities
Issue 4 Version 1
P shell Shell Programming Utilities
P sys System Header Files
Release 3.1

Modificación de un archivo mediante secuencias de comandos de acción de clase y clases estándar

Este caso práctico modifica un archivo durante la instalación del paquete mediante secuencias de comandos de acción de clase y clases estándar. Usa uno de los tres métodos de modificación. Los otros dos métodos se describen en Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall y Modificación de un archivo mediante la clase build. El archivo modificado es /etc/inittab .

Técnicas

Este caso práctico muestra cómo usar secuencias de comandos de acción de clase de instalación y eliminación. Para obtener más información, consulte Escritura de secuencias de comandos de acción de clase.

Aproximación

Para modificar /etc/inittab durante la instalación, mediante secuencias de comandos de acción de clase y clases, debe completar las tareas siguientes:

Este caso práctico es más complicado que el siguiente; consulte Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall. En lugar de proporcionar dos archivos se necesitan tres; el archivo /etc/inittab entregado es simplemente un marcador de posición que contiene un fragmento de la entrada que se va a insertar. Ésta se podría haber colocado en el archivo i.inittab, a excepción de que el comando pkgadd debe tener un archivo para pasar al archivo i.inittab. Asimismo, el procedimiento de eliminación debe colocarse en un archivo aparte (r.inittab). Mientras este método funcione bien, es mejor reservarlo para casos que impliquen instalaciones muy complicadas de varios archivos. Consulte Modificación de archivos crontab durante la instalación.

El programa sed usado en Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall admite varias instancias de paquetes, ya que el comentario del final de la entrada inittab se basa en la instancia del paquete. El caso práctico de Modificación de un archivo mediante la clase build muestra una aproximación más simplificada para la modificación de /etc/inittab durante la instalación.

Archivos de casos prácticos

El archivo pkginfo

PKG=case5
NAME=Case Study #5
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=inittab

El archivo prototype

i pkginfo
i i.inittab
i r.inittab
e inittab /etc/inittab ? ? ?

La secuencia de comandos de acción de clase de instalación i.inittab

# PKGINST parameter provided by installation service
while read src dest
do
# remove all entries from the table that
# associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest >
/tmp/$$itab ||
exit 2
sed -e "s/$/#$PKGINST" $src >> /tmp/$$itab ||
exit 2
mv /tmp/$$itab $dest ||
exit 2
done
if [ "$1" = ENDOFCLASS ]
then
/sbin/init q ||
exit 2
fi
exit 0

La secuencia de comandos de acción de clase de eliminación r.inittab

# PKGINST parameter provided by installation service
while read src dest
do
# remove all entries from the table that
# are associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" $dest >
/tmp/$$itab ||
exit 2
mv /tmp/$$itab $dest ||
exit 2
done
/sbin/init q ||
exit 2
exit 0

El archivo inittab

rb:023456:wait:/usr/robot/bin/setup

Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall

Este caso práctico modifica un archivo que existe en la máquina de instalación durante la instalación del paquete. Usa uno de los tres métodos de modificación. Los otros dos métodos se describen en Modificación de un archivo mediante secuencias de comandos de acción de clase y clases estándar y Modificación de un archivo mediante la clase build. El archivo modificado es /etc/inittab.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Aproximación

Para modificar /etc/inittab en el tiempo de la instalación mediante la clase sed, debe completar las tareas siguientes:

Esta aproximación a la modificación de /etc/inittab durante la instalación tiene un inconveniente: debe entregar una secuencia de comandos completa (la secuencia de comandos postinstall) simplemente para ejecutar el comando init q.

Archivos de casos prácticos

El archivo pkginfo

PKG=case4
NAME=Case Study #4
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=sed

El archivo prototype

i pkginfo
i postinstall
e sed /etc/inittab ? ? ?

La secuencia de comandos de acción de clase sed Class Action Script (/etc/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

La secuencia de comandos postinstall

# make init re-read inittab
/sbin/init q ||
exit 2
exit 0

Modificación de un archivo mediante la clase build

Este caso práctico modifica un archivo que existe en la máquina de instalación durante la instalación del paquete. Usa uno de los tres métodos de modificación. Los otros dos métodos se describen en Modificación de un archivo mediante secuencias de comandos de acción de clase y clases estándar y Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall. El archivo modificado es /etc/inittab.

Técnicas

En este caso práctico se muestra cómo usar la clase build. Para obtener más información sobre la clase build, consulte Secuencia de comandos de clase build.

Aproximación

Esta aproximación a la modificación de /etc/inittab usa la clase build. Una secuencia de comandos de clase build se ejecuta como secuencia de comandos de shell y su salida se convierte en la nueva versión del archivo que se está ejecutando. En otras palabras, el archivo de datos /etc/inittab que se entrega con este paquete se ejecutará y la salida de dicha ejecución se convertirá en /etc/inittab.

La secuencia de comandos de clase build se ejecuta durante la instalación y la eliminación del paquete. El argumento install se pasa al archivo si se ejecuta en el tiempo de la instalación. Observe en la secuencia de comandos de clase build de ejemplo que las acciones de instalación se definen mediante la prueba para este argumento.

Para editar /etc/inittab mediante la clase build, debe completar las tareas siguientes:

Esta solución reconduce los inconvenientes descritos en los casos prácticos de Modificación de un archivo mediante secuencias de comandos de acción de clase y clases estándar y Modificación de un archivo mediante la clase sed y una secuencia de comandos postinstall. Sólo se necesita un archivo corto (más allá de los archivos pkginfo y prototype). El archivo funciona con varias instancias de un paquete debido a que se usa el parámetro PKGINST y no se requiere una secuencia de comandos postinstall, ya que el comando init q se puede ejecutar desde la secuencia de comandos de clase build.

Archivos de casos prácticos

El archivo pkginfo

PKG=case6
NAME=Case Study #6
CATEGORY=applications
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1d05
CLASSES=build

El archivo prototype

i pkginfo
e build /etc/inittab ? ? ?

El archivo build

# PKGINST parameter provided by installation service
# remove all entries from the existing table that
# are associated with this PKGINST
sed -e "/^[^:]*:[^:]*:[^:]*:[^#]*#$PKGINST$/d" /etc/inittab ||
exit 2
if [ "$1" = install ]
then
# add the following entry to the table
echo "rb:023456:wait:/usr/robot/bin/setup #$PKGINST" ||
exit 2
fi
/sbin/init q ||
exit 2
exit 0

Modificación de archivos crontab durante la instalación

Este caso práctico modifica los archivos crontab durante la instalación del paquete.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Aproximación

El modo más eficaz de modificar más de un archivo durante la instalación es definir una clase y ofrecer una secuencia de comandos de acción de clase. Si se ha servido de la aproximación a la clase build, debe entregar una secuencia de comandos de clase build para cada archivo crontab modificado. La definición de una clase cron proporciona una aproximación más general. Para editar los archivos crontab con esta aproximación, debe:

Archivos de casos prácticos

Un superusuario ejecuta las secuencias de comandos i.cron y r.cron que se describen a continuación. La modificación del archivo crontab de otro usuario puede tener resultados imprevistos. Si fuera necesario, cambie la entrada siguiente de cada secuencia de comandos:

crontab $user < /tmp/$$crontab ||

hasta

su $user -c "crontab /tmp/$$crontab" ||

El comando pkginfo

PKG=case7
NAME=Case Study #7
CATEGORY=application
BASEDIR=/opt
ARCH=SPARC
VERSION=Version 1.0
CLASSES=cron

El archivo prototype

i pkginfo
i i.cron
i r.cron
e cron /var/spool/cron/crontabs/root ? ? ?
e cron /var/spool/cron/crontabs/sys ? ? ?

La secuencia de comandos de acción de clase de instalación i.cron

# PKGINST parameter provided by installation service
while read src dest
do
user=`basename $dest` ||
exit 2
(crontab -l $user |
sed -e "/#$PKGINST$/d" > /tmp/$$crontab) ||
exit 2
sed -e "s/$/#$PKGINST/" $src >> /tmp/$$crontab ||
exit 2
crontab $user < /tmp/$$crontab ||
exit 2
rm -f /tmp/$$crontab
done
exit 0

La secuencia de comandos de acción de clase de eliminación r.cron

# PKGINST parameter provided by installation service
while read path
do
user=`basename $path` ||
exit 2
(crontab -l $user |
sed -e "/#$PKGINST$/d" > /tmp/$$crontab) ||
exit 2
crontab $user < /tmp/$$crontab ||
exit 2
rm -f /tmp/$$crontab
done
exit 

Archivo crontab n.º 1

41,1,21 * * * * /usr/lib/uucp/uudemon.hour > /dev/null
45 23 * * * ulimit 5000; /usr/bin/su uucp -c
"/usr/lib/uucp/uudemon.cleanup" >
/dev/null 2>&1
11,31,51 * * * * /usr/lib/uucp/uudemon.poll > /dev/null

Archivo crontab n.º 2

0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A

Nota –

Si la modificación de un grupo de archivos aumenta el tamaño total del archivo en más de 10K, proporcione un archivo space para que el comando pkgadd pueda permitir este aumento. Para obtener más información sobre el archivo space, consulte Reserva del espacio adicional en un sistema de destino.


Instalación y eliminación de un controlador con secuencias de comandos de procedimientos

Este paquete instala un controlador.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Para obtener más información sobre estas secuencias de comandos, consulte Escritura de secuencias de comandos de procedimientos.

Aproximación

Archivos de casos prácticos

El archivo pkginfo

PKG=bufdev
NAME=Buffer Device
CATEGORY=system
BASEDIR=/
ARCH=INTEL
VERSION=Software Issue #19
CLASSES=none

El archivo prototype

Para instalar un controlador en el tiempo de la instalación, debe incluir los archivos de configuración y objetos para el controlador en el archivo prototype.

En este ejemplo, el módulo ejecutable del controlador recibe el nombre de buffer; el comando add_drv funciona en este archivo. El núcleo usa el archivo de configuración, buffer.conf, para ayudar a configurar el controlador.

i pkginfo
i request
i postinstall
i preremove
f none $KERNDIR/buffer 444 root root
f none $KERNDIR/buffer.conf 444 root root

Si mira al archivo prototype de este ejemplo, puede observar lo siguiente:

La secuencia de comandos request

trap 'exit 3' 15
# determine where driver object should be placed; location
# must be an absolute path name that is an existing directory
KERNDIR=`ckpath -aoy -d /kernel/drv -p \
“Where do you want the driver object installed”` || exit $?

# make parameters available to installation service, and
# so to any other packaging scripts
cat >$1 <<!

CLASSES='$CLASSES'
KERNDIR='$KERNDIR'
!
exit 0

La secuencia de comandos postinstall

# KERNDIR parameter provided by `request' script
err_code=1                    # an error is considered fatal
# Load the module into the system
cd $KERNDIR
add_drv -m '* 0666 root sys' buffer || exit $err_code
# Create a /dev entry for the character node
installf $PKGINST /dev/buffer0=/devices/eisa/buffer*:0 s
installf -f $PKGINST

La secuencia de comandos preremove

err_code=1                    # an error is considered fatal
# Unload the driver
rem_drv buffer || exit $err_code
# remove /dev file
removef $PKGINST /dev/buffer0 ; rm /dev/buffer0
removef -f $PKGINST

Instalación de un controlador mediante las secuencias de comandos de procedimientos y la clase sed

En este caso práctico se describe cómo instalar un controlador mediante las secuencias de comandos de procedimientos y la clase sed. También es diferente del caso práctico anterior (consulte Instalación y eliminación de un controlador con secuencias de comandos de procedimientos) porque este paquete se compone de objetos absolutos y reubicables.

Técnicas

Este caso práctico muestra las técnicas siguientes:

Aproximación

Archivos de casos prácticos

El archivo pkginfo

PKG=SUNWsst
NAME=Simple SCSI Target Driver
VERSION=1
CATEGORY=system
ARCH=sparc
VENDOR=Sun Microsystems
BASEDIR=/opt
CLASSES=sed

El archivo prototype

Por ejemplo, este caso práctico usa la distribucion jerárquica de los objetos de paquete que se muestran en la figura siguiente.

Figura 5–1 Estructura jerárquica de directorios de paquetes

El contexto describe el gráfico.

Los objetos el paquete se instalan en los mismos lugares que en el directorio pkg superior. Los módulos del controlador (sst y sst.conf) se instalan en /usr/kernel/drv y el archivo de inclusión se instala en /usr/include/sys/scsi/targets. Los archivos sst, sst.conf y sst_def.h son objetos absolutos. El programa de prueba, sstest.c, y su directorio SUNWsst, son reubicables; su ubicación de instalación se configura mediante el parámetro BASEDIR.

Los demás componentes del paquete (todos los archivos de control) se encuentran en el directorio superior del paquete en la máquina de desarrollo, excepto la secuencia de comandos de clase sed. Éste recibe el nombre de devlink.tab después del archivo al que modifica, y se sitúa en etc, el directorio que contiene el archivo devlink.tab real.

En el directorio pkg, ejecute el comando pkgproto del modo siguiente:


find usr SUNWsst -print | pkgproto > prototype

La salida del comando anterior tiene este aspecto:

d none usr 0775 pms mts
d none usr/include 0775 pms mts
d none usr/include/sys 0775 pms mts
d none usr/include/sys/scsi 0775 pms mts
d none usr/include/sys/scsi/targets 0775 pms mts
f none usr/include/sys/scsi/targets/sst_def.h 0444 pms mts
d none usr/kernel 0775 pms mts
d none usr/kernel/drv 0775 pms mts
f none usr/kernel/drv/sst 0664 pms mts
f none usr/kernel/drv/sst.conf 0444 pms mts
d none SUNWsst 0775 pms mts
f none SUNWsst/sstest.c 0664 pms mts

Este archivo prototype aún no está completo. Para completar este archivo, necesita hacer las modificaciones siguientes:

Éste es el archivo prototype final:

i pkginfo
i postinstall
i preremove
i copyright
e sed /etc/devlink.tab ? ? ?
f none /usr/include/sys/scsi/targets/sst_def.h 0644 bin bin
f none /usr/kernel/drv/sst 0755 root sys
f none /usr/kernel/drv/sst.conf 0644 root sys
d none SUNWsst 0775 root sys
f none SUNWsst/sstest.c 0664 root sys

Los signos de interrogación en la entrada para la secuencia de comandos sed indican que los permisos de acceso y la propiedad del archivo existente en la maquina de instalación no se deben cambiar.

La secuencia de comandos de acción de clase sed Class Action Script (/etc/devlink.tab)

En el ejemplo de controlador, se utiliza una secuencia de comandos de clase sed con el fin de agregar una entrada para el controlador en el archivo /etc/devlink.tab. El comando devlinks utiliza este archivo para crear vínculos simbólicos de /dev en /devices. Ésta es la secuencia de comandos sed:

# sed class script to modify /etc/devlink.tab
!install
/name=sst;/d
$i\
type=ddi_pseudo;name=sst;minor=character	rsst\\A1

!remove
/name=sst;/d

El comando pkgrm no ejecuta la parte de eliminación de la secuencia de comandos. Puede que necesite agregar una línea a la secuencia de comandos preremove para ejecutar directamente sed con el fin de suprimir la entrada del archivo /etc/devlink.tab.

La secuencia de comandos de instalación postinstall

En este ejemplo, todo lo que necesita hacer la secuencia de comandos es ejecutar el comando add_drv.

# Postinstallation script for SUNWsst
# This does not apply to a client.
if [$PKG_INSTALL_ROOT = "/" -o -z $PKG_INSTALL_ROOT]; then
   SAVEBASE=$BASEDIR
   BASEDIR=””; export BASEDIR
   /usr/sbin/add_drv sst
   STATUS=$?
   BASEDIR=$SAVEBASE; export BASEDIR
   if [ $STATUS -eq 0 ]
   then
	     exit 20
   else
	     exit 2
   fi
else
   echo "This cannot be installed onto a client."
   exit 2
fi

El comando add_drv usa el parámetro BASEDIR, de forma que la secuencia de comandos debe anular la configuración de BASEDIR antes de ejecutar el comando y restaurarla después.

Una de las acciones del comando add_drv es ejecutar devlinks que usa la entrada situada en /etc/devlink.tab por la secuencia de comandos de clase sed para crear las entradas /dev para el controlador.

El código de salida de la secuencia de comandos postinstall es importante. El código de salida 20 comunica al comando pkgadd que indique al usuario que debe reiniciar el sistema (necesario después de instalar un controlador); el código de salida 2 comunica al comando pkgadd que indique al usuario que la instalación ha fallado de manera parcial.

La secuencia de comandos de eliminación preremove

En el caso de este ejemplo de controlador, suprime los vínculos en /dev y ejecuta el comando rem_drv en el controlador.

# Pre removal script for the sst driver
echo “Removing /dev entries”
/usr/bin/rm -f /dev/rsst*

echo “Deinstalling driver from the kernel”
SAVEBASE=$BASEDIR
BASEDIR=””; export BASEDIR
/usr/sbin/rem_drv sst
BASEDIR=$SAVEBASE; export BASEDIR

exit 

La secuencia de comandos suprime por sí misma las entradas de /dev; el comando rem_drv suprime las entradas /devices.

El archivo copyright

Éste es un archivo ASCII simple que contiene el texto de un aviso de copyright. El aviso se muestra al comienzo de la instalación del paquete, exactamente como aparece en el archivo.


	Copyright (c) 1999 Drivers-R-Us, Inc.
	10 Device Drive, Thebus, IO 80586

All rights reserved. This product and related documentation is
protected by copyright and distributed under licenses 
restricting its use, copying, distribution and decompilation. 
No part of this product or related documentation may be 
reproduced in any form by any means without prior written 
authorization of Drivers-R-Us and its licensors, if any.