X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FComponents%2FNetwork.py;h=c39d1ba74f724f4c534e9122d569f7e68ebbfc52;hp=68f980174f84edc0e0ba0419f77a9b3d6b867386;hb=bd1476c4800f2d3d9025db14fcb8fc168d87006a;hpb=c563ffd07163d5982fa4a3d8e9c2486f480b899a diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index 68f9801..c39d1ba 100755 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -45,11 +45,13 @@ class Network: break return self.remoteRootFS + def isBlacklisted(self, iface): + return iface in ('lo', 'wifi0', 'wmaster0') + def getInterfaces(self, callback = None): self.configuredInterfaces = [] - for device in listdir('/sys/class/net'): - if not device in ('lo','wifi0', 'wmaster0'): - self.getAddrInet(device, callback) + for device in self.getInstalledAdapters(): + self.getAddrInet(device, callback) # helper function def regExpMatch(self, pattern, string): @@ -58,7 +60,7 @@ class Network: try: return pattern.search(string).group() except AttributeError: - None + return None # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): @@ -72,7 +74,7 @@ class Network: def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args - data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : False } + data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : False, 'dns-nameservers' : False } globalIPpattern = re_compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' @@ -128,7 +130,7 @@ class Network: print line[0:7] if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) - if gateway is not None: + if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data @@ -160,10 +162,12 @@ class Network: fp.write(iface["preup"]) if iface["predown"] is not False and not iface.has_key("configStrings"): fp.write(iface["predown"]) + if iface["dns-nameservers"] is not False and len(iface["dns-nameservers"])>0: + fp.write("%s" % (iface["dns-nameservers"])) fp.write("\n") fp.close() self.configuredNetworkAdapters = self.configuredInterfaces - self.writeNameserverConfig() +# self.writeNameserverConfig() def writeNameserverConfig(self): fp = file('/etc/resolv.conf', 'w') @@ -214,6 +218,9 @@ class Network: if (split[0] in ("pre-down","post-down")): if self.ifaces[currif].has_key("predown"): self.ifaces[currif]["predown"] = i + if (split[0] == "dns-nameservers"): + if self.ifaces[currif].has_key("dns-nameservers"): + self.ifaces[currif]["dns-nameservers"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): @@ -248,13 +255,13 @@ class Network: for line in resolv: if self.regExpMatch(nameserverPattern, line) is not None: ip = self.regExpMatch(ipPattern, line) - if ip is not None: + if ip: self.nameservers.append(self.convertIP(ip)) print "nameservers:", self.nameservers def getInstalledAdapters(self): - return [x for x in listdir('/sys/class/net') if not x in ('lo','wifi0', 'wmaster0')] + return [x for x in listdir('/sys/class/net') if not self.isBlacklisted(x)] def getConfiguredAdapters(self): return self.configuredNetworkAdapters @@ -265,32 +272,31 @@ class Network: def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) - else: - self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) - return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name + self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) + return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): - if iface.startswith('eth'): - if iface not in self.lan_interfaces and len(self.lan_interfaces) == 0: - self.lan_interfaces.append(iface) - return _("LAN connection") - elif iface not in self.lan_interfaces and len(self.lan_interfaces) >= 1: - self.lan_interfaces.append(iface) - return _("LAN connection") + " " + str(len(self.lan_interfaces)) + name = None + if self.isWirelessInterface(iface): + if iface not in self.wlan_interfaces: + name = _("WLAN connection") + if len(self.wlan_interfaces): + name += " " + str(len(self.wlan_interfaces)+1) + self.wlan_interfaces.append(iface) else: - if iface not in self.wlan_interfaces and len(self.wlan_interfaces) == 0: - self.wlan_interfaces.append(iface) - return _("WLAN connection") - elif iface not in self.wlan_interfaces and len(self.wlan_interfaces) >= 1: - self.wlan_interfaces.append(iface) - return _("WLAN connection") + " " + str(len(self.wlan_interfaces)) - + if iface not in self.lan_interfaces: + name = _("LAN connection") + if len(self.lan_interfaces): + name += " " + str(len(self.lan_interfaces)+1) + self.lan_interfaces.append(iface) + return name + def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) - if os_path.isdir(moduledir): + if moduledir: name = os_path.basename(os_path.realpath(moduledir)) if name in ('ath_pci','ath5k'): name = 'Atheros' @@ -608,31 +614,45 @@ class Network: return '/sys/class/net/' + iface def isWirelessInterface(self, iface): + if iface in self.wlan_interfaces: + return True + if os_path.isdir(self.sysfsPath(iface) + '/wireless'): return True - else: - ifaces = file('/proc/net/wireless').read().strip() - if iface in ifaces: - return True - else: - return False + + # r871x_usb_drv on kernel 2.6.12 is not identifiable over /sys/class/net/'ifacename'/wireless so look also inside /proc/net/wireless + device = re_compile('[a-z]{2,}[0-9]*:') + ifnames = [] + fp = open('/proc/net/wireless', 'r') + for line in fp: + try: + ifnames.append(device.search(line).group()[:-1]) + except AttributeError: + pass + if iface in ifnames: + return True + + return False def getWlanModuleDir(self, iface = None): devicedir = self.sysfsPath(iface) + '/device' moduledir = devicedir + '/driver/module' - if not os_path.isdir(moduledir): - tmpfiles = listdir(devicedir) - moduledir_found = False - for x in tmpfiles: - if x.startswith("1-"): - moduledir_found = True - moduledir = devicedir + '/' + x + '/driver/module' - if not moduledir_found: - moduledir_found = True - if os_path.isdir(devicedir + '/driver'): - moduledir = devicedir + '/driver' - - return moduledir + if os_path.isdir(moduledir): + return moduledir + + # identification is not possible over default moduledir + for x in listdir(devicedir): + # rt3070 on kernel 2.6.18 registers wireless devices as usb_device (e.g. 1-1.3:1.0) and identification is only possible over /sys/class/net/'ifacename'/device/1-xxx + if x.startswith("1-"): + moduledir = devicedir + '/' + x + '/driver/module' + if os_path.isdir(moduledir): + return moduledir + # rt73, zd1211b, r871x_usb_drv on kernel 2.6.12 can be identified over /sys/class/net/'ifacename'/device/driver, so look also here + moduledir = devicedir + '/driver' + if os_path.isdir(moduledir): + return moduledir + + return None def detectWlanModule(self, iface = None): if not self.isWirelessInterface(iface): @@ -643,7 +663,7 @@ class Network: return 'nl80211' moduledir = self.getWlanModuleDir(iface) - if os_path.isdir(moduledir): + if moduledir: module = os_path.basename(os_path.realpath(moduledir)) if module in ('ath_pci','ath5k'): return 'madwifi' @@ -672,7 +692,19 @@ class Network: if self.config_ready is not None: for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready) - + + def getInterfacesNameserverList(self, iface): + result = [] + nameservers = self.getAdapterAttribute(iface, "dns-nameservers") + if nameservers: + ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' + ipPattern = re_compile(ipRegexp) + for x in nameservers.split()[1:]: + ip = self.regExpMatch(ipPattern, x) + if ip: + result.append( [ int(n) for n in ip.split('.') ] ) + return result + iNetwork = Network() def InitNetwork():