Eu tenho uma caixa sem cabeça baseada no Debian. Destina-se a ser acessado por meio de sua interface de rede. A rede é configurada através do arquivo /etc/network/interfaces
. Estou tentando validar se o arquivo é realmente válido. Minha ideia é verificar se o arquivo tem algum erro e, neste caso, voltar para um arquivo padrão.
Minha dúvida é sobre a primeira parte do problema: detectar um erro no interfaces
arquivo.
Encontrei muitas dúvidas sobre o uso de ifup --no-act
comandos, mas o que vejo na prática é que esse método não é robusto o suficiente para o meu caso. Tome o seguinte exemplo:
root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts /etc/network/if-pre-up.d
ip addr add 1s23.123.123.123/255.255.255.192 broadcast + dev eth0 label eth0
ip link set dev eth0 up
ip route add default via 123.123.123.122 dev eth0
run-parts /etc/network/if-up.d
Observe o endereço IP inválido definido (extra 's' no primeiro octeto). O comando não dá nenhum erro (que eu possa ver, de qualquer maneira) e se eu reiniciar a máquina com o arquivo neste estado, perderei a capacidade de rede. Um válido interfaces
me dá um resultado muito semelhante (exceto para a broadcast +
parte):
root@arm:~# ifup --no-act --interfaces=/etc/network/interfaces eth0
run-parts /etc/network/if-pre-up.d
ip addr add 123.123.123.123/255.255.255.192 broadcast 123.123.123.127 dev eth0 label eth0
ip link set dev eth0 up
ip route add default via 123.123.123.122 dev eth0
run-parts /etc/network/if-up.d
Este é principalmente o problema que estou tentando evitar. Minha pergunta é como posso detectar uma configuração inválida no /etc/network/interfaces
arquivo? O sinal de mais indica que há um erro? O que isso significa? Qual é a melhor abordagem para resolver isso?
Resposta curta: Ligue
ifup --no-act
com a configuração de rede para testar e verificar o código de retorno.Resposta longa: tenho feito algo muito semelhante para um dispositivo incorporado; aqui está a parte relevante do script init que criei para esse fim, que é executado antes
networking
de ser iniciado, para garantir que o sistema tenha uma configuração ethernet funcional.No original
/etc/network/interfaces
, as configurações válidas estão incluídas comAcho que vejo dois problemas/abordagens aqui:
Para o primeiro, fazer toda a configuração por meio de alguma ferramenta inteligente que faça mais verificações de sanidade do que
$EDITOR /etc/foobar
. Nesse caso, ele pode verificar se o endereço IP é válido e se a rota padrão está na mesma rede etc. A ferramenta pode ser algum script ou uma interface de administração gráfica/baseada na Web (como você tem no OpenWRT etc. .)A outra coisa seria fazer com que o usuário verificasse a configuração de rede depois que ela estivesse em vigor, da mesma forma que muitos sistemas fazem com que o usuário verifique as configurações de exibição (resolução, etc.) e volte para a última configuração de trabalho se o usuário não fizer nada.
Então, algo assim:
Quando o usuário quiser aplicar a nova configuração, programe uma reinicialização para ocorrer em aproximadamente 5 minutos (
shutdown -r +5
) e, em seguida, carregue a nova configuração.Agora, faça com que o usuário verifique se ainda acessa o sistema (incluindo a abertura de novas sessões SSH).
Se puderem, eles podem reconhecer a alteração, cancelando a reinicialização e copiando a nova configuração para a configuração de inicialização.
Se eles não puderem acessar o sistema depois que as modificações estiverem em vigor, eles não poderão verificar as alterações e a reinicialização permitirá que eles reiniciem (desde que a configuração de inicialização esteja correta, o que deveria ser, já que o sistema começou anteriormente usando isto.)
A ideia deve ser aplicável a mudanças na configuração da interface de rede, configuração do firewall etc. continha alguma regra importante)
(E, claro, não é absolutamente necessário reiniciar o sistema, apenas redefinir a configuração.)
Nada disso impede que os usuários root dêem um tiro na própria perna, é claro, mas pelo menos você pode fornecer alguma ferramenta com um interruptor de segurança.
Ter acesso de backup através do console/porta serial ou algo semelhante ainda seria melhor.
Nesse caso específico, se seus usuários estiverem acostumados a editar
/etc/network/interfaces
e executarifup
, você terá que ensiná-los a fazer isso, o que pode ser difícil. Ou você pode alterar o sistema para que a configuração real esteja realmente em outro lugar, para que eles não deixem que velhos hábitos causem problemas.