ucf - Atualizar Arquivo de Configuração: preservar as alterações do usuário em arquivos de configuração
SINTAXE
ucf [opções] <Novo Arquivo> <Destino>
ucf [opções] --purge <Destino>
DESCRIÇÃO
Este utilitário fornece um meio de perguntar ao usuário se ele deseja ou não aceitar novas versões de arquivos de configuração fornecidos pelo mantenedor do pacote, com vários mecanismos de heurística projetados para minimizar o tempo de interação. Ele usa o debconf para interagir com o usuário, conforme a política Debian. Na SINTAXE acima, Novo arquivo é o arquivo de configuração fornecido pelo pacote (seja incluído no pacote ou gerado pelos scripts do mantenedor), e Destino é o local (geralmente em /etc) onde o arquivo de configuração real reside e pode ter sido modificado pelo usuário final. Como os arquivos editados seriam arquivos reais e não links simbólicos, o ucf segue e resolve os links simbólicos antes de agir. Na medida do possível, o ucf tenta preservar a propriedade e a permissão do Novo arquivo ao copiá-lo para o novo local.
Este script tenta fornecer um tratamento semelhante ao conffile para arquivos instalados em /etc que não são enviados em um pacote Debian, mas são gerenciados pelo script postinst. A política Debian estabelece que os arquivos em /etc que são arquivos de configuração devem preservar as alterações do usuário, e isso se aplica também aos arquivos gerenciados pelos scripts do mantenedor. Usando o ucf, você pode enviar um conjunto de arquivos de configuração padrão em algum lugar em /usr (/usr/share/<pkg> é um bom local) e manter arquivos em /etc, preservando as alterações do usuário e, em geral, oferecendo as mesmas funcionalidades durante as atualizações que o dpkg normalmente fornece para "conffiles".
Além disso, este script fornece recursos para fazer a transição de um arquivo que não tinha proteção semelhante ao conffile para que ele se enquadre neste esquema, e tenta minimizar as perguntas feitas durante a instalação. De fato, o recurso de transição é melhor do que o oferecido pelo dpkg ao fazer a transição de um arquivo do status não-conffile para o status conffile. A segunda forma na SINTAXE acima é para remover informações sobre o arquivo de configuração quando o pacote é removido; e é crucial para permitir reinstalações suaves.
Durante o curso das operações, ao trabalhar com arquivos de configuração, o ucf cria opcionalmente cópias das versões do arquivo de configuração em questão. Por exemplo, um arquivo com o sufixo ucf-old contém a versão antiga de um arquivo de configuração substituído pelo ucf. Além disso, cópias do arquivo de configuração com os sufixos ucf-new e ucf-dist podem ser criadas; e os scripts de manutenção devem considerar a remoção de cópias do arquivo de configuração com essas extensões durante a remoção.
OPÇÕES
-h, --help
Exibe uma mensagem de uso resumida.
-n, --no-action
Execução simulada. Exibe as ações que seriam executadas se o script fosse invocado, mas não executa nenhuma ação.
-d[n], --debug=[n]
Define o nível de depuração para o nível n (opcional; n tem o valor padrão de 1). Observe que não deve haver espaços antes do dígito opcional n. Isso ativa informações de depuração detalhadas.
-p, --purge
Remove todos os vestígios do arquivo do arquivo de hash de estado. Isso é necessário para permitir que um pacote seja reinstalado após ser removido; caso contrário, o arquivo de configuração real é removido, mas ele permanece no arquivo de hash; e na reinstalação, nenhuma ação é executada, pois o md5sum do novo arquivo corresponde ao do arquivo de hash. Em resumo, lembre-se de usar esta opção no pós-rm para cada arquivo de configuração gerenciado pelo ucf quando o pacote estiver sendo removido (assumindo que o próprio ucf exista). Observe: o ucf não altera o arquivo no disco nesta operação, portanto, qualquer remoção de arquivo ainda é de responsabilidade do pacote que o chama.
-v, --verbose
Faz com que o script seja muito detalhado ao definir variáveis internas.
-P foo, --package foo
Não segue as desvios do dpkg-divert do pacote foo ao atualizar os arquivos de configuração.
-s foo, --src-dir foo
Define o diretório de origem (os md5sums históricos devem estar em arquivos e subdiretórios deste diretório) para foo. Por padrão, assume-se que o diretório onde o novo_file está localizado é o diretório de origem. Definir esta opção substitui as configurações na variável de ambiente UCF_SOURCE_DIR e na variável de arquivo de configuração conf_source_dir.
--sum-file foo
Força a leitura dos md5sums históricos a partir deste arquivo, em vez de usar o padrão, que é armazená-los no diretório de origem. Definir esta opção substitui as configurações na variável de ambiente UCF_OLD_MDSUM_FILE e na variável de arquivo de configuração conf_old_mdsum_file.
--three-way
Isso ativa a opção, durante a instalação, para que o usuário tenha a chance de ver uma mesclagem das alterações entre a versão antiga do mantenedor e a nova versão do mantenedor na cópia local do arquivo de configuração. Se o usuário gostar do que vê, ele pode solicitar que essas alterações sejam mescladas. Isso permite que você obtenha novas alterações upstream mescladas, mesmo mantendo as modificações locais no arquivo de configuração. Isso é feito armazenando o arquivo de configuração em uma área de cache durante o registro e usando o diff3 durante a instalação (o nome do arquivo armazenado é uma versão modificada do caminho completo do arquivo de configuração para evitar conflitos de espaço de nomes).
--debconf-ok
Indica que é aceitável que o ucf use uma instância debconf já em execução para solicitar informações (sempre foi aceitável usar o ucf quando o debconf não está em execução – ele o invocará conforme necessário).
--debconf-template foo
Instrui o ucf a usar o modelo debconf multiseleção especificado em vez do modelo debconf padrão fornecido pelo ucf. O chamador é responsável por garantir que o modelo especificado exista e tenha uma lista de opções correspondentes às opções do modelo padrão do ucf, e deve definir `Choices-C: ${CHOICES}` para garantir que os valores retornados correspondam aos do modelo padrão. Observe que as opções devem ser diferentes dependendo se a opção `--three-way` também estiver definida.
--state-dir /path/to/dir
Define o diretório de estado para /path/to/dir em vez do padrão /var/lib/ucf. Usado principalmente para testes.
-Z
Define o contexto de segurança SELinux do arquivo de destino para o tipo padrão.
USO
O caso de uso mais comum é bastante simples: uma única linha de invocação no script postinst durante a configuração, e outra única linha no script postrm para dizer ao ucf para esquecer o arquivo de configuração durante a remoção completa (usando a opção --purge) é tudo o que é necessário (assumindo que o ucf ainda esteja no sistema).
É recomendado que você também registre qualquer arquivo gerenciado pelo ucf no registro ucf; isso associa o arquivo de configuração ao pacote ao qual ele pertence. Isso é feito com uma simples chamada para o ucfr. Os usuários podem então consultar a associação entre um arquivo de configuração e o pacote usando a ferramenta ucfq. Consulte as páginas de manual apropriadas para obter detalhes.
Pacotes que usam o debhelper podem simplificar a criação dos fragmentos de script de manutenção necessários usando o auxiliar dh_ucf.
Se um arquivo mantido por scripts de manutenção estiver sendo transferido de um status não protegido para a proteção fornecida pelo script, o mantenedor pode ajudar a facilitar a transição, reduzindo as perguntas que podem ser feitas durante a instalação. Especificamente, as perguntas não devem ser feitas se o arquivo em questão for uma versão não modificada que foi enviada em uma versão anterior deste pacote; e o mantenedor pode ajudar, informando ao script sobre os md5sums históricos que as versões publicadas deste arquivo continham.
A maneira de fazer isso é criar um arquivo chamado <Novo arquivo>.md5sum, com um md5sum em cada linha (os nomes dos arquivos que você usa são ignorados, exceto para a entrada chamada default), ou criar um diretório, chamado <Novo arquivo>.md5sum.d, que deve conter qualquer número de arquivos, cada um contendo uma única linha, ou seja, o md5sum de uma versão anterior de <Novo arquivo>. Os nomes desses arquivos não são importantes, com uma exceção: o arquivo chamado default é tratado de forma especial. Por exemplo, o autor pessoalmente usa números de versão do pacote ou nomes de código de lançamento, como 7.6.3 ou potato. Se nenhum dos md5sums históricos corresponder, quase certamente ou o registro histórico de md5sums não está completo, ou o usuário modificou o arquivo de configuração.
O md5sum histórico padrão
A exceção à regra sobre nomes mencionada anteriormente é que, se nenhum dos md5sums corresponder, e se o arquivo <Novo arquivo>.md5sum.d/default existir, ou se houver uma linha correspondente a um arquivo padrão em <Novo arquivo>.md5sum, ele será usado como o md5sum padrão da versão anterior do pacote que se presume ter sido instalado nesta máquina. Como você pode ver, a menos que haja um número limitado de pacotes lançados anteriormente (como apenas um), o mantenedor também está fazendo um palpite informado, mas a opção é fornecida ao mantenedor.
Se o arquivo <Novo arquivo>.md5sum ou o diretório <Novo arquivo>.md5sum.d não existir, ou se nenhum dos md5sums corresponder, testamos o arquivo <Destino> instalado para verificar se é o mesmo que o <Novo arquivo>. Se não for, perguntamos ao usuário se ele deseja que substituamos o arquivo.
Uma facilidade adicional também é oferecida: opcionalmente, o ucf pode armazenar uma versão antiga da cópia do arquivo de configuração do mantenedor e, durante a atualização, calcular as alterações feitas na versão do arquivo de configuração do mantenedor e aplicar esse patch à versão local do arquivo (mediante solicitação do usuário, é claro). Há também uma facilidade de visualização, onde o usuário pode inspecionar os resultados de tal mesclagem antes de solicitar que a ação seja tomada.
VARIÁVEIS DE AMBIENTE
A variável UCF_FORCE_CONFFNEW, se definida, força que o novo arquivo sempre substitua o arquivo <Destino> instalado, enquanto a variável UCF_FORCE_CONFFOLD, se definida, mantém silenciosamente o arquivo instalado. UCF_FORCE_CONFFMISS só é aplicável quando o arquivo <Destino> instalado não existir (talvez devido à remoção pelo usuário) e força o ucf a recriar o arquivo ausente (o comportamento padrão é respeitar os desejos do usuário e não recriar o arquivo excluído localmente). Além disso, quando o ucf cria um shell inferior, ele preenche as variáveis UCF_CONFFILE_NEW e UCF_CONFFILE_OLD, que são úteis para inspecionar as alterações.
Os sinalizadores confmiss, confnew, confold, confdef e confask da variável DPKG_FORCE também são suportados. Consulte dpkg(1) para obter mais informações.
ARQUIVOS
Este script cria o arquivo new_file.md5sum e pode copiar o arquivo (presumivelmente enviado com o pacote) <Novo arquivo> para o seu destino, <Destino>.
/var/lib/ucf/hashfile e /var/lib/ucf/hashfile.X, onde X é um pequeno inteiro, onde versões anteriores do arquivo hash são armazenadas.
/etc/ucf.conf
EXEMPLOS
Se o pacote foo deseja usar o ucf para lidar com a interação do usuário para o arquivo de configuração foo.conf, cuja versão é fornecida no pacote como /usr/share/foo/configuration, uma invocação simples do ucf no arquivo post inst é tudo o que é necessário:
ucf /usr/share/foo/configuration /etc/foo.conf
Na desinstalação, você deve dizer ao ucf para esquecer o arquivo (veja exemplos detalhados em /usr/share/doc/ucf/examples):
ucf --purge /etc/foo.conf
Observe que purge também pode ser usado para fazer com que o ucf esqueça o estado anterior dos arquivos, e quando o pacote for instalado ou atualizado novamente, o ucf perguntará ao usuário se ele deseja substituir o arquivo de configuração atual. Faça isso se quiser alterar sua decisão de não atualizar para uma versão fornecida pelo mantenedor do arquivo de configuração.
A motivação para este script foi fornecer um tratamento semelhante ao de arquivos de configuração para arquivos de inicialização de pacotes Emacs Lisp (por exemplo, /etc/emacs21/site-start.d/50psgml-init.el). Esses arquivos de inicialização não são enviados com o pacote; em vez disso, eles são instalados durante a fase de configuração pós-instalação pelo script /usr/lib/emacsen-common/emacs-package-install $package_name.
Este script deve ser invocado pelos scripts de instalação dos pacotes em /usr/lib/emacsen-common/packages/install/$package_name para cada versão instalada do Emacs, chamando-o com os valores corretos para o novo arquivo (/usr/share/emacs/site-lisp/<pkg>/<pkg-init.el) e o arquivo de destino (/etc/emacs21/site-start.d/50<pkg-init.el), e ele deve fazer o resto.
VEJA TAMBÉM
ucf.conf(5), ucfr(1), ucfq(1), dpkg(1), dh_ucf(1), diff3(1).
A política Debian Emacs, enviada com o pacote emacsen-common.
AUTOR
Esta página de manual foi escrita por Manoj Srivastava <_>, para o sistema Debian GNU/Linux.