utils.MainIf: rename 'getip' to 'poll'
+ change mechanism for getting hostname
This commit is contained in:
@ -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())
|
||||
|
||||
|
57
utils.py
57
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')
|
||||
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
|
||||
|
Reference in New Issue
Block a user