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

Escritura de secuencias de comandos de acción de clase

Definición de clases de objetos

Las clases de objetos permiten una serie de acciones que se deben ejecutar en un grupo de objetos de paquetes en la instalación o la eliminación. Asigne objetos a una clase en el archivo prototype. A todos los objetos del paquete se les debe proporcionar una clase, aunque la clase none se utiliza de forma predeterminada para objetos que no requieran una acción especial.

El parámetro de instalación CLASSES, definido en el archivo pkginfo, es una lista de clases que se deben instalar (incluida la clase none).


Nota –

Los objetos definidos en el archivo pkgmap que pertenecen a una clase que no aparece en este parámetro del archivo pkginfo no se instalarán.


La lista CLASSES determina el orden de instalación. La clase none siempre se instala en primer lugar, en el caso de que exista, y se suprime en último lugar. Puesto que los directorios son la estructura de apoyo fundamental para los demás objetos del sistema de archivos, deben asignarse todos a la clase none. Se pueden hacer excepciones, pero como norma general, la clase none es la más segura. Esta estrategia asegura que los directorios se crean antes de los objetos que incluirán. Asimismo, no se efectúa ningún intento de suprimir un directorio antes de que se haya vaciado.

Cómo se procesan las clases durante la instalación de los paquetes

A continuación se describen las acciones del sistema que tienen lugar cuando se instala una clase. Las acciones se repiten una vez para cada volumen de un paquete, durante la instalación de ese volumen.

  1. El comando pkgadd crea una lista de nombre de ruta.

    El comando pkgadd crea una lista de nombres de ruta sobre la que opera la secuencia de comandos de la acción. Cada línea de la lista contiene nombres de ruta de origen y de destino, separados por un espacio. El nombre de ruta de origen indica dónde reside el objeto que se debe instalar en el volumen de instalación. El nombre de ruta de destino indica la ubicación del sistema de destino donde el objeto se debe instalar. El contenido de la lista se restringe mediante los criterios siguientes:

    • La lista sólo contiene nombres de ruta que pertenecen a la clase asociada.

    • Si falla el intento de crear el objeto del paquete, los directorios, las conducciones con nombres, los dispositivos de caracteres, los dispositivos de bloques y los vínculos simbólicos se incluyen en la lista con el nombre de ruta de origen establecido en /dev/null. Normalmente, el comando pkgadd crea automáticamente estos elementos (en el caso de que no existieran) y se les otorga los atributos pertinentes (modo, propietario, grupo), tal como se define en el archivo pkgmap.

    • Los archivos vinculados donde el tipo de archivo es l no se incluyen en la lista bajo ninguna circunstancia. Los vínculos físicos de la clase proporcionada se crean en el elemento 4.

  2. Si no se proporciona una secuencia de comandos de acción de clase para la instalación de una clase determinada, los nombres de rutas de la lista generada se copian del volumen a la ubicación de destino pertinente.

  3. Se ejecutará una secuencia de comandos de acción de clase en el caso de que exista.

    La secuencia de comandos de acción de clase se ejecuta con la entrada estándar que contiene la lista que se genera en el elemento 1. Este volumen es el último, o en esta clase no hay más objetos, la secuencia de comandos se ejecuta con el único argumento de ENDOFCLASS.


    Nota –

    Incluso si no existen archivos regulares de esta clase en el paquete, se llama a la secuencia de comandos de acción de clase al menos una vez con una lista vacía y el argumento ENDOFCLASS.


  4. El comando pkgadd lleva a cabo una auditoría de atributos y contenido, además de crear vínculos físicos.

    Después de ejecutar correctamente los elementos 2 o 3, el comando pkgadd efectúa una auditoría de la información de atributos y contenido para la lista de nombres de ruta. El comando pkgadd crea los vínculos asociados con la clase automáticamente. Las incoherencias de atributos detectadas se corrigen en todos los nombres de ruta de la lista generada.

Cómo se procesan las clases durante la eliminación de los paquetes

Los objetos se suprimen clase a clase. Las clases que existen para un paquete pero que no aparecen en el parámetro CLASSES se suprimen en primer lugar (por ejemplo, un objeto instalado con el comando installf). Las clases que aparecen en el parámetro CLASSES se suprimen en el orden inverso. La clase none siempre se suprime en último lugar. A continuación se describen las acciones del sistema que se producen cuando se suprime una clase:

  1. El comando pkgrm crea una lista de nombres de ruta.

    El comando pkgrm crea una lista de nombres de rutas instaladas que pertenecen a la clase indicada. Los nombres de rutas a los que hace referencia otro paquete se excluyen de la lista, a menos que el tipo de archivo sea e. Un tipo de archivo e significa que el archivo se debe editar tras la instalación o la supresión.

    Si el paquete que se suprime había modificado archivos del tipo e durante la instalación, sólo debe suprimir las líneas que agregó. No suprima un archivo modificable que no esté vacío. Suprima las líneas que agregó el paquete.

  2. Si no existe una secuencia de comandos de acción de clase, las nombres de rutas se suprimen.

    Si el paquete no tiene una secuencia de comandos de acción de clase de eliminación para la clase, se suprimen todos los nombres de rutas de la lista generados por el comando pkgrm.


    Nota –

    Los archivos del tipo e (modificable) no se asignan a una clase ni a una secuencia de comandos de acción de clase asociada. Estos archivos se suprimen en este momento, incluso si el nombre de ruta se comparte con otros paquetes.


  3. Si existe una secuencia de comandos de acción de clase, se ejecutará.

    El comando pkgrm invoca la secuencia de comandos de acción de clase con entrada estándar para la secuencia de comandos que contiene la lista generada en el elemento 1.

  4. El comando pkgrm lleva a cabo una auditoría.

    Después de ejecutar correctamente la secuencia de comandos de acción de clase, el comando pkgrm suprime las referencias a los nombres de ruta de la base de datos de paquetes a menos que otro paquete haga referencia a un nombre de ruta.

Secuencia de comandos de acción de clase

La secuencia de comandos de acción de clase define un conjunto de acciones que se ejecutarán durante la instalación o eliminación de un paquete. Las acciones se llevarán cabo en un grupo de nombres de ruta basados en su definición de clase. Consulte el Capítulo 5Casos prácticos de creación de paquetes, si desea ver ejemplos de secuencias de comandos de acción de clase.

El nombre de una secuencia de comandos de acción de clase se basa en la clase en la que debe funcionar y si dichas operaciones deben producirse durante la instalación o la eliminación de paquetes. Los dos formatos de nombres aparecen en la tabla siguiente:

Formato de nombre 

Descripción 

i.clase

Realiza operacinoes en nombres de ruta en la clase indicada durante la instalación de paquetes 

r.clase

Realiza operaciones en nombres de ruta en la clase indicada durante la eliminación de paquetes  

Por ejemplo, el nombre de la secuencia de comandos de instalación de una clase llamada manpage sería i.manpage. La secuencia de comandos de eliminación se llamaría r.manpage.


Nota –

Este formato de nombre de archivos no se utiliza con los archivos que pertenecen a las clases de sistema sed, awk o build. Para obtener más información sobre estas clases especiales, consulte Clases de sistema especiales.


Comportamientos de las secuencias de comandos de acción de clase

Normativa de diseño para secuencias de comandos de acción de clase

Clases de sistema especiales

El sistema ofrece cuatro clases especiales:

Si varios archivos de un paquete requieren un procesamiento especial que se puede definir completamente a través de los comandos sed, awk o sh, la instalación es más rápida si se usan clases de sistemas en lugar de varias clases y sus secuencias de comandos de acción de clase correspondientes.

Secuencia de comandos de clase sed

La clase sed ofrece un método para modificar un objeto del sistema de destino. La secuencia de comandos de acción de clase sed se ejecuta automáticamente en la instalación si existe un archivo que pertenece a la clase sed. El nombre de la secuencia de comandos de acción de clase sed debe ser el mismo que el del archivo donde se ejecutan las instrucciones.

Una secuencia de comandos de acción de clase sed entrega instrucciones sed en el formato siguiente:

Dos comandos indican cuándo se deben ejecutar las instrucciones. Se ejecutan las instrucciones sed que siguen al comando !install durante la instalación del paquete. Se ejecutan las instrucciones sed que siguen al comando !remove durante la eliminación de paquetes. No importa el orden en el que estos comandos se usan en el archivo.

Para obtener más información sobre las instrucciones sed consulte la página de comando man sed(1) Si desea ver ejemplos de las secuencias de comandos de acción de clase sed, consulte el Capítulo 5Casos prácticos de creación de paquetes.

Secuencia de comandos de clase awk

La clase awk ofrece un método para modificar un objeto del sistema de destino. Las modificaciones se entregan como instrucciones awk en una secuencia de comandos de acción de clase awk.

La secuencia de comandos de acción de clase awk se ejecuta automáticamente en la instalación si existe un archivo que pertenece a la clase awk. Dicho archivo contiene instrucciones para la secuencia de comandos de clase awk con el formato siguiente:

Dos comandos indican cuándo se deben ejecutar las instrucciones. Se ejecutan las instrucciones awk que siguen al comando !install durante la instalación del paquete. Durante la eliminación del paquete se ejecutan las instrucciones que siguen al comando !remove. Estos comandos se pueden usar en cualquier orden.

El nombre de la secuencia de comandos de acción de clase awk debe ser el mismo que el del archivo donde se ejecutan las instrucciones.

El archivo que se debe modificar se utiliza como entrada al comando awk y la salida de la secuencia de comandos sustituye por último al objeto original. Es posible que las variables de entorno no pasen al comando awk con esta sintaxis.

Para obtener más información sobre las instrucciones awk, consulte la página de comando man awk(1).

Secuencia de comandos de clase build

La clase build crea o modifica un archivo de objeto de paquete mediante la ejecución de las instrucciones del shell Bourne. Estas instrucciones se entregan como objeto del paquete. Las instrucciones se ejecutan automáticamente en la instalación si el objeto del paquete pertenece a la clase build.

El nombre de la secuencia de comandos de acción de clase build debe ser el mismo que el del archivo donde se ejecutan las instrucciones. El nombre también debe ser ejecutable por parte del comando sh. La salida de la secuencia de comandos se convierte en la nueva versión del archivo al construirse o modificarse. Si la secuencia de comandos no produce salida alguna, el archivo no se crea ni se modifica. Por ello, la secuencia de comandos puede modificar o crear el archivo por sí mismo.

Por ejemplo, si un paquete entrega un archivo predeterminado, /etc/randomtable, y si éste no existe ya en el sistema de destino, la entrada del archivo prototype puede ser como la siguiente:


e build /etc/randomtable ? ? ?

El objeto del paquete, /etc/randomtable, puede tener el aspecto siguiente:


!install
# randomtable builder
if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then
		echo "/etc/randomtable is already in place.";
	    else
		echo "# /etc/randomtable" > $PKG_INSTALL_ROOT/etc/randomtable
		echo "1121554	# first random number" >> $PKG_INSTALL_ROOT/etc/randomtable
fi
 
!remove
# randomtable deconstructor
if [ -f $PKG_INSTALL_ROOT/etc/randomtable ]; then
		# the file can be removed if it's unchanged
		if [ egrep "first random number" $PKG_INSTALL_ROOT/etc/randomtable ]; then
			rm $PKG_INSTALL_ROOT/etc/randomtable;
		fi
fi
 

Consulte el Capítulo 5Casos prácticos de creación de paquetes, si desea ver otro ejemplo mediante la clase build.

Secuencia de comandos de clase preserve

La clase preserve conserva un archivo de objeto del paquete al decidir si un archivo existente debe sobrescribirse cuando se instale el paquete. Al usar una secuencia de comandos de clase preserve puede haber dos situaciones:

El resultado de ambas situaciones se considera correcto por parte de la secuencia de comandos preserve. Sólo se produce un error en la segunda situación si el archivo no puede copiarse en el directorio de destino.

Desde Solaris 7 puede encontrarse la secuencia de comandos i.preserve y una copia suya, i.CONFIG.prsv, en el directorio /usr/sadm/install/scripts con las demás secuencias de comandos de acción de clase.

Modifique la secuencia de comandos para que incluya los nombres de archivos que desee conservar.

La secuencia de comandos de clase manifest

La clase manifest instala y desinstala automáticamente los servicios SMF (Utilidad de gestión de servicios) asociados a un manifiesto SMF. Si no está familiarizado con SMF, consulte el Capítulo 17, Managing Services (Overview) de System Administration Guide: Basic Administration para obtener información sobre cómo utilizar SMF para gestionar servicios.

Todos los manifiestos de servicios de los paquetes se deben identificar con la clase manifest. Las secuencias de comandos de acción de clase que instalan y suprimen manifiestos de servicios se incluyen en el subsistema de empaquetado. Cuando se invoca pkgadd(1M), se importa el manifiesto de servicios. Cuando se invoca pkgrm(1M), se suprimen las instancias del manifiesto de servicios que están inhabilitadas. Los servicios del manifiesto que no tienen instancias restantes también se suprimen. Si se suministra la opción -R a pkgadd(1M) o pkgrm(1M), estas acciones de manifiesto de servicios se efectuarán cuando el sistema se reinicie la próxima vez con esa ruta root alternativa.

La porción siguiente de código de un archivo de información del paquete muestra el uso de la clase manifest.

# packaging files
i pkginfo
i copyright
i depend
i preinstall
i postinstall
i i.manifest
i r.manifest
#
# source locations relative to the prototype file
#
d none var 0755 root sys
d none var/svc 0755 root sys
d none var/svc/manifest 0755 root sys
d none var/svc/manifest/network 0755 root sys
d none var/svc/manifest/network/rpc 0755 root sys
f manifest var/svc/manifest/network/rpc/smserver.xml 0444 root sys