Handle network devices with missing udev hardware data

We've encountered some usb nics which don't have an entry
in the udev database, subsequently the ID_XXX_FROM_DATABASE
isn't present in the output.  Address this by using some
fallback keys, ID_XXX, ID_XXX_ID and an Unknown value if
all fail.

Signed-off-by: Ryan Harper <ryan.harper@canonical.com>
This commit is contained in:
Ryan Harper 2015-06-29 13:57:45 -05:00
parent be7534fb54
commit e1f7e509ea
2 changed files with 44 additions and 4 deletions

View File

@ -19,10 +19,13 @@ Provides network device listings and extended network information
"""
import logging
from subiquity import models
import argparse
from probert import prober
log = logging.getLogger('subiquity.filesystemView')
class NetworkModel(models.Model):
""" Model representing network interfaces
@ -44,12 +47,47 @@ class NetworkModel(models.Model):
def get_interfaces(self):
return [iface for iface in self.network.keys()
if self.network[iface]['type'] == 'eth']
if self.network[iface]['type'] == 'eth' and
not self.network[iface]['hardware']['DEVPATH'].startswith(
'/devices/virtual/net')]
def get_vendor(self, iface):
hwinfo = self.network[iface]['hardware']
vendor_keys = [
'ID_VENDOR_FROM_DATABASE',
'ID_VENDOR',
'ID_VENDOR_ID'
]
for key in vendor_keys:
try:
return hwinfo[key]
except KeyError:
log.warn('Failed to get key '
'{} from interface {}'.format(key, iface))
pass
return 'Unknown Vendor'
def get_model(self, iface):
hwinfo = self.network[iface]['hardware']
model_keys = [
'ID_MODEL_FROM_DATABASE',
'ID_MODEL',
'ID_MODEL_ID'
]
for key in model_keys:
try:
return hwinfo[key]
except KeyError:
log.warn('Failed to get key '
'{} from interface {}'.format(key, iface))
pass
return 'Unknown Model'
def get_iface_info(self, iface):
ipinfo = self.network[iface]['ip']
hwinfo = self.network[iface]['hardware']
return "{}/{} -- {} {}".format(ipinfo['addr'],
ipinfo['netmask'],
hwinfo['ID_VENDOR_FROM_DATABASE'],
hwinfo['ID_MODEL_FROM_DATABASE'])
self.get_vendor(iface),
self.get_model(iface))

View File

@ -46,8 +46,10 @@ class NetworkView(WidgetWrap):
def _build_model_inputs(self):
sl = []
log.info("probing for network devices")
self.model.probe_network()
for iface in self.model.get_interfaces():
log.info("looking at {}".format(iface))
sl.append(Color.button_primary(confirm_btn(label=iface,
on_press=self.confirm),
focus_map='button_primary focus'))