O programa não pode resolver o nome do host se ele for iniciado antes da primeira conexão com a Internet bem-sucedida

1

Isso está relacionado a post de stackoverflow que publiquei .

Basicamente eu tenho um script Python que estou executando em um sistema embarcado (baseado em Buildroot). O script python é executado na inicialização, mas não posso garantir que a conexão com a Internet esteja ativa (com base no pppd), porque a unidade pode não estar em uma área com sinal de celular.

O que eu descobri é que, se o código python começa antes de uma conexão com a Internet ter sido estabelecida na máquina, mesmo depois que a conexão é estabelecida, o código python ainda não consegue resolver os nomes. Eu recebo um erro [Errno -3] Temporary failure in name resolution quando o soquete tenta se conectar. A única maneira de fazer isso funcionar é estabelecer a conexão com a internet pelo menos uma vez antes de iniciar o código python.

Quais mudanças estão sendo feitas no sistema depois que a conexão com a Internet é estabelecida pelo menos uma vez que o código Python poderia estar procurando? Existe algo que eu possa configurar na inicialização para que isso não aconteça?

    
por Amr Bekhit 25.02.2016 / 17:51

3 respostas

2

A maioria dos programas lê a configuração do DNS do sistema (em /etc/resolv.conf ) apenas uma vez quando eles são inicializados ou quando eles fazem o primeiro acesso à rede. Eles não relêem a configuração se ela mudar.

Parece que no seu sistema, a configuração do DNS muda quando a rede sobe (provavelmente muda de não configurado para ter servidores DNS configurados). Isso é muito comum e inevitável se o sistema nem sempre estiver conectado à mesma rede.

Uma forma de garantir que os programas não sejam afetados é executar um servidor de cache DNS local. Dessa forma, a configuração do DNS para aplicativos pode ser estática (sempre nameserver 127.0.0.1 in /etc/resolv.conf ) e somente o servidor de cache DNS precisa ser informado sobre os servidores fornecidos pela conexão de rede. O Dnsmasq é uma escolha comum, especialmente em sistemas embarcados (se você tiver um roteador Linux, ele provavelmente rodará o dnsmasq). Se você está construindo sua própria imagem com o Buildroot, inclua o pacote dnsmasq . Se você tem uma imagem pré-construída sem o dnsmasq, instalar o dnsmasq via Builtroot ainda pode ser a melhor aposta, mas eu não estou familiarizado com o Buildroot, então não posso explicar como fazer isso.

    
por 26.02.2016 / 00:02
3

Você pode usar os ganchos de script que o pppd fornece para chamar seu script depois que o ip estiver ativo. Por exemplo (do pppd manpage)

/etc/ppp/ip-up
A program or script which is executed when the link is available for 
sending and receiving IP packets (that is, IPCP has come up). It is 
executed with the parameters 

interface-name tty-device speed local-IP-address remote-IP-address ipparam

Quando você inicia seu script python por dentro, você deve estar bem.

    
por 25.02.2016 / 18:00
2

Para forçar uma atualização da tabela de resolução, você pode executar isso (no linux):

import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
res_init = libc.__res_init
res_init()
    
por 23.05.2016 / 23:37