# -*- python -*-
from plugins.ipaddress import IPAddress
from plugins.clock import Clock
from common import *
# TODO add IPv6 address
class MyIPAddress(Entry):
def __init__(self, *args, ignore = None, public = True, both = False, **kwargs):
self.ignore = ['lo'] if ignore is None else ignore
self.text = None
self.show_both = both
self.show_public = public
self.show_nic = None
Entry.__init__(self, *args, **kwargs)
def init():
self.refresh()
xasync(lambda : Clock(sync_to = 10 * Clock.MINUTES).continuous_sync(t(self.refresh)), name = 'ipaddress')
xasync(init, name = 'ipaddress')
def action(self, col, button, x, y):
if button == LEFT_BUTTON:
self.show_public = not self.show_public
self.invalidate()
elif button == MIDDLE_BUTTON:
self.show_both = not self.show_both
self.invalidate()
elif button == RIGHT_BUTTON:
xasync(self.refresh, name = 'ipaddress')
elif button in (SCROLL_UP, SCROLL_DOWN):
nic = self.show_nic
if nic is None:
return
nics = list(sorted(self.text[0].keys()))
try:
nic = nics.index(nic)
except:
if len(nics) == 0:
self.show_nic = None
self.invalidate()
else:
self.show_nic = nics[0]
self.invalidate()
nic += +1 if button == SCROLL_UP else -1
if 0 <= nic < len(nics):
self.show_nic = nics[nic]
self.invalidate()
def refresh(self):
text_private, text_public, text_both = {}, {}, {}
ipa = IPAddress(*(self.ignore))
for nic in ipa.nics.keys():
(state, a4, a6, a) = ipa.nics[nic]
if state == IPAddress.DOWN:
label = '31'
elif state == IPAddress.UP:
label = '32'
elif state == IPAddress.UNKNOWN:
label = '33'
else:
label = '39'
label = '\033[%sm%s\033[0m' % (label, nic)
prv = pub = ''
if a4 is not None:
prv += ' ' + a4
if a6 is not None:
prv += ' ' + a6
if a is not None:
pub += ' ' + a
finalise = lambda addrs : '%s:%s' % (label, (addrs if addrs != '' else ' no address'))
text_private[nic] = finalise(prv)
text_public[nic] = finalise(pub)
text_both[nic] = finalise(pub + prv)
self.text = (text_private, text_public, text_both)
self.invalidate()
def function(self):
text = self.text
if text is None:
return '...'
text = text[2 if self.show_both else (1 if self.show_public else 0)]
nic = self.show_nic
if nic is None or nic not in text:
if len(text.keys()) == 0:
self.show_nic = None
return 'No NIC available'
nic = sorted(text.keys())[0]
self.show_nic = nic
return text[nic]