From d6e68aef7de1927e1ce31091cfab449f798be85b Mon Sep 17 00:00:00 2001 From: l_samenv Date: Wed, 6 Mar 2024 15:22:25 +0100 Subject: [PATCH] utils.MainIf: rename 'getip' to 'poll' + change mechanism for getting hostname --- display.py | 4 ++-- utils.py | 61 +++++++++++++++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/display.py b/display.py index 821e2e3..ce0ce41 100644 --- a/display.py +++ b/display.py @@ -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()) diff --git a/utils.py b/utils.py index d0d61b9..55200eb 100644 --- a/utils.py +++ b/utils.py @@ -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') + 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.ip = addrinfo.get(AF_INET, [{}])[0].get('addr') + 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