utils.MainIf: rename 'getip' to 'poll'

+ change mechanism for getting hostname
This commit is contained in:
2024-03-06 15:22:25 +01:00
parent 947a15e3fa
commit d6e68aef7d
2 changed files with 39 additions and 26 deletions

View File

@ -234,7 +234,7 @@ class Display:
self.send(SET_COLOR, 0, 0, 0, 11 + self.blink) # yellow / blue
self.text('.', 0, dotpos, dotpos+1)
self.color()
self.text(mainif.hostname or self.hostname, 1)
self.text(mainif.hostname() or self.hostname, 1)
# self.event.set()
self.blink = not self.blink
else:
@ -242,7 +242,7 @@ class Display:
self.show('(cancel)(reboot)(shdown)')
def refresh(self):
mainif.getip()
mainif.poll()
func = self.menu or self.net_display
func(self.gettouch())

View File

@ -45,12 +45,21 @@ def get_config(section=None):
return result
def gethostthread(ip, event, result):
try:
result[0] = socket.gethostbyaddr(ip)[0]
except Exception as e:
pass
event.set()
class MainIf:
address = None
ip = None
gateway = None
hostname = None
carrier = True
prev_ip = None
def __init__(self):
netcfg = get_config('NETWORK')
@ -61,40 +70,44 @@ class MainIf:
else:
# take first one (alphabetically)
self.name = sorted(netcfg)[0]
self.getip()
self.hostnameresult = [None]
with open(f'/sys/class/net/{self.name}/carrier_changes') as f:
self.carrier_changes = f.read()
self.poll()
def gethostthread(self, ip, event):
try:
hostname = socket.gethostbyaddr(ip)[0]
if event == self.event:
self.hostname = hostname
except Exception as e:
pass
event.set()
def hostname(self):
return self.hostnameresult[0]
def getip(self):
def poll(self):
with open(f'/sys/class/net/{self.name}/carrier') as f:
carrier = f.read().startswith('1')
if carrier != self.carrier:
with open(f'/sys/class/net/{self.name}/carrier_changes') as f:
carrier_changes = f.read()
if carrier_changes != self.carrier_changes:
self.hostnameresult = [None] # new instance for result
self.carrier_changes = carrier_changes
if carrier:
sudo(f'dhclient {self.name}')
else:
sudo(f'dhclient -r {self.name}')
sudo(f'dhclient {self.name}')
self.carrier = carrier
addrinfo = ifaddresses(self.name)
self.address = addrinfo.get(AF_LINK, [{}])[0].get('addr')
if carrier:
self.ip = addrinfo.get(AF_INET, [{}])[0].get('addr')
self.gateway = gateways().get('default', {}).get(AF_INET) if self.ip else None
self.gateway = [g for g, n, _ in gateways().get(AF_INET, ()) if n == self.name]
else:
self.ip = None
self.gateway = None
self.hostname = None
self.gateway = ()
if self.carrier and self.ip and self.gateway:
self.event = event = threading.Event()
result = []
threading.Thread(target=self.gethostthread, args=(self.ip, event), daemon=True).start()
event.wait(0.1)
if self.ip != self.prev_ip:
self.prev_ip = self.ip
self.event = event = threading.Event()
self.hostnameresult = list(self.hostnameresult) # new instance for result
threading.Thread(target=gethostthread,
args=(self.ip, event, self.hostnameresult), daemon=True).start()
event.wait(0.1)
# in case of timeout, the thread may change self.hostnameresult later,
# but only until carrier or ip changes
else:
self.event = None # disable changing hostname from pending threads
return self.ip
self.prev_ip = None
return self.carrier, self.ip, self.hostnameresult[0], self.gateway