Do a slightly better job at showing default gateways.

This commit is contained in:
Mathieu Trudel-Lapierre 2016-07-06 18:14:13 -04:00
parent 73d73dff94
commit 0205423133
3 changed files with 53 additions and 16 deletions

View File

@ -264,7 +264,8 @@ class NetworkModel(ModelPolicy):
self.prober = prober
self.info = {}
self.devices = {}
self.network = {}
self.network_devices = {}
self.network_routes = {}
self.default_gateway = None
def reset(self):
@ -287,15 +288,20 @@ class NetworkModel(ModelPolicy):
# --- Model Methods ----
def probe_network(self):
log.debug('model calling prober.get_network()')
self.network = self.prober.get_network()
self.network_devices = self.prober.get_network_devices()
self.network_routes = self.prober.get_network_routes()
for iface in [iface for iface in self.network.keys()
for iface in [iface for iface in self.network_devices.keys()
if iface not in NETDEV_IGNORED_IFACES]:
ifinfo = self.prober.get_network_info(iface)
self.info[iface] = ifinfo
log.debug('probing network complete!')
def get_routes(self):
''' get collection of currently configured routes '''
return self.network_routes
def get_interface(self, iface):
'''get iface object given iface name '''
log.debug('get_iface({})'.format(iface))
@ -367,7 +373,7 @@ class NetworkModel(ModelPolicy):
and see if iface is included in a bridge '''
bridges = self.get_bridges()
for bridge in bridges:
brinfo = self.network[bridge].get('bridge', {})
brinfo = self.network_devices[bridge].get('bridge', {})
if brinfo:
if iface in brinfo['interfaces']:
return True
@ -414,7 +420,7 @@ class NetworkModel(ModelPolicy):
raise
def get_bridges(self):
return [iface for iface in self.network.keys()
return [iface for iface in self.network_devices.keys()
if self.iface_is_bridge(iface)]
def get_hw_addr(self, iface):

View File

@ -53,18 +53,26 @@ class Prober():
return data
def get_network(self):
def _probe_network(self):
if 'network' not in self.probe_data:
log.debug('get_network: no network in probe_data, fetching')
network = Network()
results = network.probe()
self.probe_data['network'] = results
self.probe_data['network'] = {}
self.probe_data['network']['devices'] = results
self.probe_data['network']['routes'] = network.get_routes()
return self.probe_data['network']
def get_network_devices(self):
self._probe_network()
return self.probe_data['network']['devices']
def get_network_routes(self):
self._probe_network()
return self.probe_data['network']['routes']
def get_network_info(self, device):
''' Load a NetworkInfo class for specified device '''
return NetworkInfo({device: self.get_network().get(device)})
return NetworkInfo({device: self.get_network_devices().get(device)})
def get_storage(self):
''' Load a StorageInfo class. Probe if it's not present '''

View File

@ -24,6 +24,7 @@ import textwrap
from urwid import (ListBox, Pile, BoxAdapter,
Text, Columns)
import yaml
from netifaces import AF_INET, AF_INET6
from subiquitycore.ui.lists import SimpleList
from subiquitycore.ui.buttons import cancel_btn, menu_btn, done_btn
from subiquitycore.ui.utils import Padding, Color
@ -86,6 +87,7 @@ class NetworkView(ViewPolicy):
'ip': interface.ip,
'method': interface.ip_method,
'provider': interface.ip_provider,
'subnets': interface.subnets,
}
log.debug('ipv4_status: {}'.format(ipv4_status))
ipv4_template = ''
@ -94,8 +96,8 @@ class NetworkView(ViewPolicy):
ipv4_template += '{ip}'.format(**ipv4_status)
if ipv4_status['method']:
ipv4_template += ' ({method}) '.format(**ipv4_status)
#if ipv4_status['provider']:
# ipv4_template += 'from {provider} '.format(**ipv4_status)
if ipv4_status['subnets']:
ipv4_template += 'from {subnets} '.format(**ipv4_status)
col_2.append(Color.info_primary(Text(ipv4_template)))
# TODO: add IPv6 address information retrieval.
col_2.append(Color.info_primary(Text("No IPv6 connection"))) # vert. holder for ipv6
@ -135,13 +137,34 @@ class NetworkView(ViewPolicy):
# Display default route status
if len(ifaces) > 0:
default_route = ("Default route is ")
route_source = ("whatever DHCP provides on any interface")
# FIXME: correctly get default gateway
gateways = self.model.get_routes()
ipv4_gateways = gateways['default'][AF_INET]
ipv6_gateways = gateways['default'][AF_INET6]
route_source = "is unset"
if self.model.default_gateway is not None:
route_source = self.model.default_gateway
route_source = "via " + self.model.default_gateway
elif len(ipv4_gateways):
route_source = ""
if ipv4_gateways[0]:
route_source += "via {}".format(ipv4_gateways[0])
elif ipv4_gateways[1]:
route_source += "through interface {}".format(ipv4_gateways[1])
default_route_w = Color.info_minor(
Text(" " + default_route + route_source))
Text(" IPv4 default route " + route_source + "."))
opts.append(default_route_w)
# FIXME: do ipv6 default gateway
# if ipv6:
# if self.model.default_gateway6 is not None:
route_source = "is unset"
if len(ipv6_gateways):
route_source = ""
if ipv6_gateways[0]:
route_source += "via {}".format(ipv6_gateways[0])
elif ipv6_gateways[1]:
route_source += "through interface {}".format(ipv6_gateways[1])
default_route_w = Color.info_minor(
Text(" IPv6 default route " + route_source + "."))
opts.append(default_route_w)
for opt, sig, _ in self.model.get_menu():