Condicionalmente habilitando arquivos systemd através do pacote Debian

8

Eu criei um pacote deb que instala um serviço.

Nos nossos dispositivos incorporados, quero que este pacote ative automaticamente o serviço. Em nossas estações de trabalho de desenvolvedor, eu quero que os desenvolvedores usem systemctl start foo manualmente (é um serviço pesado e, portanto, consome recursos apenas se executado o tempo todo em um ambiente de desktop).

Como posso solicitar ao usuário sua decisão durante a etapa apt-get ? Essa é a melhor solução?

Observação: criei o pacote usando dh_make e debhelper e o habilitei com:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service
    
por Stewart 12.11.2018 / 10:49

2 respostas

11

Você pode usar predefinições do sistema para afetar se um serviço do systemd será padronizado ativado ou desativado no momento da instalação.

O padrão de predefinições do Debian é ativar todos os serviços quando eles são instalados, portanto, você só precisa enviar uma predefinição para as estações de trabalho de desenvolvimento (o comportamento padrão corresponde ao que você quer que aconteça na produção), enviando um arquivo como /etc/systemd/system-preset/80-foo.preset contendo uma linha que diz

disable foo.service

Se você gerenciar suas estações de trabalho de desenvolvedor usando um sistema como Puppet, Chef, Ansible, etc., você poderá usá-las para enviar uma configuração predefinida do systemd, que facilitará a aplicação da política somente a estações de trabalho do desenvolvedor e não máquinas de produção.

Seu pacote .deb deve usar o comando systemctl preset para ativar o serviço, já que esse comando respeitará a configuração predefinida.

Como @JdeBP e @ sourcejedi apontam, as macros do Debian em deb-helpers (como dh_systemd_enable ) já fazem isso, elas invocam deb-systemd-helper que usará systemctl preset por padrão (com uma pequena advertência que se você remover (mas não purgar) o pacote e depois reinstalá-lo, ele não ativará o serviço, mesmo se você remover o arquivo predefinido.) Consulte este comentário em deb-systemd-helper ' enable operation :

    # We use 'systemctl preset' on the initial installation only.
    # On upgrade, we manually add the missing symlinks only if the
    # service already has some links installed. Using 'systemctl
    # preset' allows administrators and downstreams to alter the
    # enable policy using systemd-native tools.

Para obter mais informações sobre o recurso systemd de predefinições, consulte a página do manual de predefinições do systemd e do comando systemctl preset que implementa.

    
por 12.11.2018 / 12:24
5

Se você quiser avisar o usuário durante a instalação, você deve usar debconf . Isso tem várias vantagens, mesmo que você não esteja em um contexto em que a Política Debian seja relevante: ela fornece uma experiência consistente para o usuário final, com suporte a vários front-ends; suporta diferentes “níveis”; suporta pré-semeadura. Pré-semeadura significa que o pacote pode ser pré-configurado e, nesse caso, não solicitará nada. Os diferentes níveis significam que um prompt pode ser configurado para mostrar apenas em certas circunstâncias; você poderia então ter o pacote instalado sem avisar por padrão (para seus destinos incorporados) e instruir seus desenvolvedores a configurar seu frontend apropriadamente ao instalar o pacote para que eles vejam o prompt.

No entanto, acho que é melhor evitar a solicitação quando possível. Isso é especialmente verdadeiro para serviços que têm outras maneiras de lidar com as preferências do usuário final e onde lidar com as preferências do usuário complica os scripts do mantenedor (consulte os scripts gerados em seu pacote, eles já lidam com vários problemas sutis, usando deb-systemd-helper - você teria que replicar tudo isso, com sua preferência no topo).

Se seus desenvolvedores nunca precisarem executar o serviço, eles poderão mascará-lo antes de instalar o pacote, e o serviço nunca será ativado:

sudo systemctl mask foo

Se seus desenvolvedores às vezes precisarem executar o serviço, usando a unidade systemd, eles poderão desativá-lo depois de instalar o pacote pela primeira vez, e as instalações subsequentes lembrarão disso:

sudo apt install foo
sudo systemctl disable --now foo

O padrão seria ativar o serviço.

    
por 12.11.2018 / 11:57

Tags