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

View File

@ -45,12 +45,21 @@ def get_config(section=None):
return result return result
def gethostthread(ip, event, result):
try:
result[0] = socket.gethostbyaddr(ip)[0]
except Exception as e:
pass
event.set()
class MainIf: class MainIf:
address = None address = None
ip = None ip = None
gateway = None gateway = None
hostname = None hostname = None
carrier = True carrier = True
prev_ip = None
def __init__(self): def __init__(self):
netcfg = get_config('NETWORK') netcfg = get_config('NETWORK')
@ -61,40 +70,44 @@ class MainIf:
else: else:
# take first one (alphabetically) # take first one (alphabetically)
self.name = sorted(netcfg)[0] 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): def hostname(self):
try: return self.hostnameresult[0]
hostname = socket.gethostbyaddr(ip)[0]
if event == self.event:
self.hostname = hostname
except Exception as e:
pass
event.set()
def getip(self): def poll(self):
with open(f'/sys/class/net/{self.name}/carrier') as f: with open(f'/sys/class/net/{self.name}/carrier') as f:
carrier = f.read().startswith('1') 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: if carrier:
sudo(f'dhclient {self.name}')
else:
sudo(f'dhclient -r {self.name}') sudo(f'dhclient -r {self.name}')
sudo(f'dhclient {self.name}')
self.carrier = carrier self.carrier = carrier
addrinfo = ifaddresses(self.name) addrinfo = ifaddresses(self.name)
self.address = addrinfo.get(AF_LINK, [{}])[0].get('addr') self.address = addrinfo.get(AF_LINK, [{}])[0].get('addr')
if carrier: if carrier:
self.ip = addrinfo.get(AF_INET, [{}])[0].get('addr') 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: else:
self.ip = None self.ip = None
self.gateway = None self.gateway = ()
self.hostname = None
if self.carrier and self.ip and self.gateway: if self.carrier and self.ip and self.gateway:
self.event = event = threading.Event() if self.ip != self.prev_ip:
result = [] self.prev_ip = self.ip
threading.Thread(target=self.gethostthread, args=(self.ip, event), daemon=True).start() self.event = event = threading.Event()
event.wait(0.1) 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: else:
self.event = None # disable changing hostname from pending threads self.prev_ip = None
return self.ip return self.carrier, self.ip, self.hostnameresult[0], self.gateway