El progtwig no puede resolver el nombre del host si se inició antes de la primera connection a Internet exitosa

Esto está relacionado con una publicación de stackoverflow que publiqué .

Básicamente, tengo un script de Python que estoy ejecutando en un sistema integrado (basado en Buildroot). La secuencia de commands python se ejecuta al inicio, pero no puedo garantizar que la connection a Internet estará activada hasta ese momento (en base a pppd), ya que la unidad podría no estar en un área con señal de teléfono mobile.

Lo que he descubierto es que si el código python se inicia antes de que se establezca una connection a Internet en la máquina, incluso después de que se establezca la connection, el código python aún no puede resolver los nombres. Obtengo un [Errno -3] Temporary failure in name resolution error de [Errno -3] Temporary failure in name resolution cuando el socket intenta conectarse. La única forma en que puedo hacer que funcione es establecer la connection a Internet al less una vez antes de iniciar el código python.

¿Qué cambios se están realizando en el sistema una vez que se establece la connection a Internet al less una vez que el código Python podría estar buscando? ¿Hay algo que pueda configurar en el arranque para que esto no suceda?

La mayoría de los progtwigs leen la configuration DNS del sistema (en /etc/resolv.conf ) solo una vez cuando se inician o cuando hacen su primer acceso a la networking. No vuelven a leer la configuration si cambia.

Parece que en su sistema, la configuration de DNS cambia cuando la networking sube (probablemente cambie de desconfigurado a tener serveres DNS configurados). Esto es muy común e inevitable si el sistema no está siempre conectado a la misma networking.

Una forma de garantizar que los progtwigs no se verán afectados es ejecutar un server local de almacenamiento en caching DNS. De esta forma, la configuration de DNS para las aplicaciones puede ser estática (siempre el nameserver 127.0.0.1 en /etc/resolv.conf ), y solo el server de caching de DNS debe ser informado acerca de los serveres proporcionados por la connection de networking. Dnsmasq es una opción común, especialmente en sistemas integrados (si tiene un enrutador Linux, probablemente ejecute dnsmasq). Si está construyendo su propia image con Buildroot, incluya el package dnsmasq . Si tiene una image pnetworkingiseñada sin dnsmasq, la installation de dnsmasq a través de Builtroot puede ser la mejor opción, pero no estoy familiarizado con Buildroot, así que no puedo explicar cómo hacerlo.

Puede usar los enganches de scripts que proporciona pppd, para llamar a su script una vez que la ip está activa. Por ejemplo (desde la página de manual de pppd)

 /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 

Cuando inicie su script de python desde adentro, debería estar bien.

Para forzar una actualización de la tabla de resolución, puede ejecutar esto (en Linux):

 import ctypes libc = ctypes.cdll.LoadLibrary('libc.so.6') res_init = libc.__res_init res_init()