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.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())
|
||||||
|
|
||||||
|
57
utils.py
57
utils.py
@ -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
|
||||||
|
Reference in New Issue
Block a user