Guia do Desenvolvedor de Empacotamento de Aplicativos

Escrevendo scripts de ação de classe

Definindo classes de objeto

As classes de objeto possibilitam uma série de ações a serem realizadas em grupo de objetos de pacote na instalação ou remoção. Você atribui objetos a uma classe no arquivo prototype. A todos os objetos de pacote deve ser fornecida uma classe, embora a classe none seja usada por padrão em objetos que não requerem nenhuma ação especial.

O parâmetro de instalação CLASSES, definido no arquivo pkginfo, é uma lista de classes a ser instalada (incluindo a classe none).


Observação –

Os objetos definidos no arquivo pkgmap que pertencem a uma classe não listada neste parâmetro do arquivo pkginfo não serão instalados.


A lista de CLASSES determina a ordem de instalação. A classe none é sempre instalada primeiro, se estiver presente, e é removida por último. Visto que os diretórios são a estrutura de suporte fundamental de todos os outros objetos do sistema de arquivos, todos eles devem ser atribuídos à classe none. Pode haver exceções, mas, como regra geral, a classe none é a mais segura. Esta estratégia garante que os diretórios sejam criados antes dos objetos que irão conter. Além disso, nenhuma tentativa de excluir um diretório é feita antes que este esteja vazio.

Como as classes são processadas durante a instalação do pacote

Abaixo estão descritas as ações de sistema que ocorrem quando uma classe é instalada. As ações são repetidas uma vez para cada volume de um pacote, conforme tal volume está sendo instalado.

  1. O comando pkgadd cria uma lista de nomes de caminho.

    O comando pkgadd cria uma lista de nomes de caminho sobre a qual o script de ação opera. Cada linha desta lista contém os nomes de caminho de origem e de destino, separados por um espaço. O nome de caminho de origem indica onde o objeto a ser instalado se localiza no volume de instalação. O nome de caminho de destino indica o local no sistema de destino onde o objeto deve ser instalado. O conteúdo da lista está limitado pelos seguintes critérios:

    • A lista contém somente nomes de caminho que pertencem à classe associada.

    • Se a tentativa de criar o objeto de pacote falhar, então os diretórios, os pipes nomeados, os dispositivos de caractere, os dispositivos de bloco e os links simbólicos são incluídos na lista com o nome de caminho de origem definido como /dev/null. Normalmente, estes itens são criados automaticamente pelo comando pkgadd (se ainda não existirem) e a eles são dados atributos apropriados (modo, proprietário, grupo) conforme definido no arquivo pkgmap.

    • Os arquivos vinculados em que o tipo de arquivo for l não são incluídos na lista sob nenhuma circunstância. Os links de disco rígido de uma determinada classe são criados no item 4.

  2. Se nenhum script de ação de classe for fornecido para a instalação de uma determinada classe, os nomes de caminho da lista gerada são copiados do volume no local de destino apropriado.

  3. Se houver um script de ação de classe, este é executado.

    O script de ação de classe é chamado com a entrada padrão que contém a lista gerada no item 1. Se este volume for o último volume do pacote, ou se não houver mais objetos nesta classe, o script é executado com o único argumento ENDOFCLASS.


    Observação –

    Mesmo se não houver nenhum arquivo regular desta classe no pacote, o script de ação de classe é chamado pelo menos uma vez com uma lista vazia e o argumento ENDOFCLASS.


  4. O comando pkgadd realiza uma auditoria de conteúdo e atributo, e cria links de disco rígido.

    Após a execução bem-sucedida dos itens 2 ou 3, o comando pkgadd realiza a auditoria das informações de conteúdo e de atributo da lista de nomes de caminho. O comando pkgadd cria automaticamente os links associados à classe. As incoerências de atributo detectadas são corrigidas em todos os nomes de caminho da lista gerada.

Como as classes são processadas durante a remoção do pacote

Os objetos são removidos classe por classe. As classes que existem em um pacote, mas que não estão listadas no parâmetro CLASSES, são removidas primeiro (por exemplo, um objeto instalado com o comando installf). As classes listadas no parâmetro CLASSES são removidas na ordem inversa. A classe none é removida sempre por último. Abaixo estão descritas as ações de sistema que ocorrem quando uma classe é removida:

  1. O comando pkgrm cria uma lista de nomes de caminho.

    O comando pkgrm cria uma lista de nomes de caminho instalados que pertencem à classe indicada. Os nomes de caminho com referência de outro pacote são excluídos da lista, a menos que o tipo de arquivo deles seja e. O tipo de arquivo e significa que o arquivo deve ser editado na instalação ou na remoção.

    Se o pacote que estiver sendo removido tiver modificado algum arquivo de tipo e durante a instalação, ele deve remover apenas as linhas que foram adicionadas. Não exclua um arquivo editável que não estiver vazio. Remova as linhas que o pacote adicionou.

  2. Se não houver nenhum script de ação de classe, os nomes de caminho são excluídos.

    Se o seu pacote não tiver nenhum script de ação de classe na classe, todos os nomes de caminho da lista gerada pelo comando pkgrm são excluídos.


    Observação –

    Os arquivos com um tipo de arquivo e (editável) não são atribuídos a uma classe nem a um script de ação de classe associado. Estes arquivos são removidos neste ponto, mesmo se o nome de caminho for compartilhado com outros pacotes.


  3. Se houver um script de ação de classe, o script é executado.

    O comando pkgrm chama o script de ação de classe com a entrada padrão do script que contém a lista gerada no item 1.

  4. O comando pkgrm realiza uma auditoria.

    Após a execução bem-sucedida do script de ação de classe, o comando pkgrm remove as referências aos nomes de caminho do banco de dados do pacote, a menos que outro pacote faça referência a um nome de caminho.

O script de ação de classe

O script de ação de classe define um conjunto de ações a serem executadas durante a instalação e a remoção de um pacote. As ações são realizadas em um grupo de nomes de caminho com base na definição de classe. Consulte Capítulo 5Estudos de caso de criação de pacote para obter exemplos de scripts de ação de classe.

O nome de um script de ação de classe é baseado na classe na qual ele deve operar e se tais operações devem ocorrer durante a instalação ou remoção do pacote. Os dois formatos de nome são mostrados na tabela seguinte:

Formato de nome 

Descrição 

i.class

Opera em nomes de caminho na classe indicada durante a instalação do pacote. 

r.class

Opera em nomes de caminho na classe indicada durante a remoção do pacote.  

Por exemplo, o nome do script de instalação de uma classe denominada manpage seria i.manpage. O script de remoção seria denominado r.manpage.


Observação –

Este formato de nome de arquivo não é usado em arquivos que pertencem às classes de sistema sed, awk ou build. Para obter mais informações sobre estas classes especiais, consulte As classes de sistema especiais.


Comportamentos do script de ação de classe

Regras de criação para sripts de ação de classe

As classes de sistema especiais

O sistema fornece quatro classes especiais:

Se vários arquivos de um pacote precisarem de processamento especial que possa ser definido completamente através dos comandos sed, awk ou sh, a instalação é mais rápida usando as classes de sistema em vez de usar várias classes e os scripts de ação de classes correspondentes .

O script de classe sed

A classe sed oferece um método para modificar um objeto existente em um sistema de destino. O script de ação de classe sed é executado automaticamente na instalação se houver um arquivo que pertença à classe sed. O nome do script de ação de classe sed deve ser igual ao nome do arquivo no qual as instruções são executadas.

Um script de ação de classe sed entrega as instruções de sed no formato seguinte:

Dois comandos indicam quando as instruções devem ser executadas. As instruções de sed que vêm depois do comando !install são executadas durante a instalação do pacote. As instruções de sed que vêm depois do comando !remove são executadas durante a remoção do pacote. Não importa a ordem na qual estes comandos sejam usados no arquivo.

Para obter mais informações sobre as instruções de sed consulte a página do manual sed(1) Para obter exemplos dos scripts de ação de classe sed, consulte o Capítulo 5Estudos de caso de criação de pacote.

O script de classe awk

A classe awk oferece um método para modificar um objeto existente em um sistema de destino. As modificações são entregues como instruções awk em um script de ação de classe awk.

O script de ação de classe awk é executado automaticamente na instalação se houver um arquivo que pertença à classe awk. Tal arquivo contém instruções para o script de classe awk no seguinte formato:

Dois comandos indicam quando as instruções devem ser executadas. As instruções de awk que vêm depois do comando !install são executadas durante a instalação do pacote. As instruções que vêm após o comando !remove são executadas durante a remoção do pacote. Estes comandos podem ser usados em qualquer ordem.

O nome do script de ação de classe awk deve ser igual ao nome do arquivo no qual as instruções são executadas.

O arquivo que será modificado é usado como entrada no comando awk e a saída do script substitui o objeto original. As variáveis de ambiente talvez não sejam passadas para o comando awk com esta sintaxe.

Para obter mais informações sobre as instruções de awk consulte a página do manual awk(1).

O script de classe build

A classe build cria ou modifica um arquivo de objeto de pacote executando as instruções do shell Bourne. Estas instruções são entregues como o objeto de pacote. As instruções são executadas automaticamente na instalação se houver um arquivo que pertença á classe build.

O nome do script de ação de classe build deve ser igual ao nome do arquivo no qual as instruções são executadas. O nome também deve ser executável pelo comando sh. A saída do script se torna a nova versão do arquivo à medida que ele é construído e modificado. Se o script não produzir saída, o arquivo não é criado nem modificado. Portanto, o script pode modificar ou criar o arquivo por si mesmo.

Por exemplo, se um pacote entrega um arquivo padrão, /etc/randomtable, e se o arquivo ainda não existir no sistema de destino, a entrada do arquivo prototype pode ser a seguinte:


e build /etc/randomtable ? ? ?

O objeto de pacote, /etc/randomtable, pode ser semelhante ao seguinte:


!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 o Capítulo 5Estudos de caso de criação de pacote para obter outros exemplos que usem a classe build.

O script de classe preserve

A classe preserve preserva um arquivo de objeto do pacote ao determinar se um arquivo existente deve ou não ser substituído quando o pacote é instalado. Duas situações possíveis que podem ocorrer ao usar um script de classe preserve são:

Ambos os resultados das situações são considerados satisfatórios pelo script preserve. Ocorre uma falha somente na segunda situação quando o arquivo não pode ser copiado no diretório de destino.

A partir do Solaris 7, o script i.preserve e uma cópia deste script, i.CONFIG.prsv, podem ser encontrados no diretório /usr/sadm/install/scripts com outros scripts de ação de classe.

Modifique o script para incluir o nome ou os nomes de arquivo que você gostaria de conservar.

O script de classe manifest

A classe manifest instala e desinstala automaticamente os serviços SMF (Service Management Facility) associados a um manifest SMF.. Se não estiver familiarizado com o SMF, consulte o Capítulo 17, Managing Services (Overview), no System Administration Guide: Basic Administration para obter informações sobre como usar o SMF para gerenciar os serviços.

Todos os manifests de serviço dentro dos pacotes devem ser identificados com a classe manifest. Os scripts de ação de classe que instalam e removem os manifests de serviço estão incluídos no subsistema de empacotamento. Quando pkgadd(1M) é chamado, o manifest de serviço é importado. Quando o pkgrm(1M) é chamado, as instâncias desativadas do manifest de serviço são excluídas. Os serviços no manifest que não têm instâncias restantes também são excluídos. Se a opção -R é fornecida a pkgadd(1M) ou pkgrm(1M), essas ações do manifest de serviço serão realizadas na próxima vez que os sistema for reinicializado com tal caminho de raiz alternativa.

A seguinte parte de código do arquivo de informações de um pacote mostra o uso da classe 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