Gerenciando contas de serviço em uma especificação de RPM

14

Recebi uma especificação de RPM parcialmente completa para um serviço que estamos escrevendo. Ele chega ao ponto de fazer os diretórios necessários, copiar arquivos, definir permissões, etc., mas não faz a conta do sistema necessária na qual o serviço será executado. Disseram-me que é melhor para o RPM cuidar disso, então eu adicionei

Requires(pre): /usr/sbin/useradd

%pre
useradd -r -d /path/to/program -s /bin/false myservice

Isso consegue fazer a conta do usuário (e o grupo associado), portanto, mais tarde, quando tentar definir a propriedade / permissões nos arquivos do serviço, também é bem-sucedida.

Meu problema atual é: a) se a conta do usuário já existe, a instalação do RPM falha porque useradd falha (porque o usuário já existe); eb) Eu não sei como ter rpm -e myservice também remover o usuário e grupo associado.

    
por Coderer 27.07.2010 / 21:38

3 respostas

17

Na verdade, resolvi isso de forma independente, observando outras especificações do RPM que faziam coisas semelhantes. Se você quiser apenas adicionar um usuário (condicionalmente), use o link de Ignacio. Eu fiz isso:

Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel

%pre
/usr/bin/getent group myservice || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin myservice

%postun
/usr/sbin/userdel myservice

Isso garante que o RPM "limpe depois de si mesmo", mas ainda fornece a capacidade de instalar, mesmo que a conta já exista.

    
por 27.07.2010 / 22:04
3

A resposta do Coderer é boa, mas o segundo comando pre me dá um erro no Centos 7. O grupo deve ser especificado.

Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel

%pre
/usr/bin/getent group myservice > /dev/null || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice > /dev/null || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin -g myservice myservice

%postun
/usr/sbin/userdel myservice

Eu adicionei também redirecionar para / dev / null para ignorar os ecos indesejados.

    
por 11.11.2016 / 17:27
3

Qualquer uma das duas respostas anteriores está pronta para produção, já que esses métodos excluirão o usuário se o pacote for atualização. Yum instala o novo pacote e então remove o pacote antigo. Isso vai deixar você sem um usuário. Não é legal!

Use este método:

%postun
case "$1" in
   0) # This is a yum remove.
      /usr/sbin/userdel myservice
   ;;
   1) # This is a yum upgrade.
      # do nothing
   ;;
 esac
    
por 28.03.2017 / 20:09