from enigma import eConsoleAppContainer
from Components.Console import Console
from Components.PluginComponent import plugins
+from Components.About import about
from Plugins.Plugin import PluginDescriptor
class Network:
self.NetworkState = 0
self.DnsState = 0
self.nameservers = []
- self.ethtool_bin = "/usr/sbin/ethtool"
+ self.ethtool_bin = "ethtool"
self.container = eConsoleAppContainer()
self.Console = Console()
self.LinkConsole = Console()
self.restartConsole = Console()
- self.deactivateConsole = Console()
self.deactivateInterfaceConsole = Console()
- self.activateConsole = Console()
+ self.activateInterfaceConsole = Console()
self.resetNetworkConsole = Console()
self.DnsConsole = Console()
+ self.PingConsole = Console()
self.config_ready = None
+ self.friendlyNames = {}
+ self.lan_interfaces = []
+ self.wlan_interfaces = []
+ self.remoteRootFS = None
self.getInterfaces()
+ def onRemoteRootFS(self):
+ if self.remoteRootFS == None:
+ fp = file('/proc/mounts', 'r')
+ mounts = fp.readlines()
+ fp.close()
+ self.remoteRootFS = False
+ for line in mounts:
+ parts = line.strip().split()
+ if parts[1] == '/' and parts[2] == 'nfs':
+ self.remoteRootFS = True
+ break
+ return self.remoteRootFS
+
def getInterfaces(self, callback = None):
- devicesPattern = re_compile('[a-z]+[0-9]+')
self.configuredInterfaces = []
- fp = file('/proc/net/dev', 'r')
- result = fp.readlines()
- fp.close()
- for line in result:
- try:
- device = devicesPattern.search(line).group()
- if device == 'wifi0':
- continue
- self.getDataForInterface(device, callback)
- except AttributeError:
- pass
- #print "self.ifaces:", self.ifaces
- #self.writeNetworkConfig()
- #print ord(' ')
- #for line in result:
- # print ord(line[0])
+ for device in listdir('/sys/class/net'):
+ if not device in ('lo','wifi0', 'wmaster0'):
+ self.getAddrInet(device, callback)
# helper function
def regExpMatch(self, pattern, string):
# helper function to convert ips from a sring to a list of ints
def convertIP(self, ip):
- strIP = ip.split('.')
- ip = []
- for x in strIP:
- ip.append(int(x))
- return ip
-
- def getDataForInterface(self, iface,callback):
- #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
+ return [ int(n) for n in ip.split('.') ]
+
+ def getAddrInet(self, iface, callback):
if not self.Console:
self.Console = Console()
- cmd = "ip -o addr"
+ cmd = "ip -o addr show dev " + iface
self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
def IPaddrFinished(self, result, retval, extra_args):
(iface, callback ) = extra_args
- data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
+ data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : 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}'
- macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}'
+ macRegexp = '[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}'
ipLinePattern = re_compile('inet ' + ipRegexp + '/')
ipPattern = re_compile(ipRegexp)
netmaskLinePattern = re_compile('/' + netRegexp)
netmaskPattern = re_compile(netRegexp)
bcastLinePattern = re_compile(' brd ' + ipRegexp)
upPattern = re_compile('UP')
- macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}')
+ macPattern = re_compile(macRegexp)
macLinePattern = re_compile('link/ether ' + macRegexp)
for line in result.splitlines():
if iface.has_key('gateway'):
fp.write(" gateway %d.%d.%d.%d\n" % tuple(iface['gateway']))
if iface.has_key("configStrings"):
- fp.write("\n" + iface["configStrings"] + "\n")
+ fp.write(iface["configStrings"])
if iface["preup"] is not False and not iface.has_key("configStrings"):
fp.write(iface["preup"])
- fp.write(iface["postdown"])
+ if iface["predown"] is not False and not iface.has_key("configStrings"):
+ fp.write(iface["predown"])
fp.write("\n")
fp.close()
+ self.configuredNetworkAdapters = self.configuredInterfaces
self.writeNameserverConfig()
def writeNameserverConfig(self):
ifaces[currif]["gateway"] = map(int, split[1].split('.'))
if self.ifaces[currif].has_key("gateway"):
if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False:
- self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))
+ self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))
if (split[0] == "pre-up"):
if self.ifaces[currif].has_key("preup"):
self.ifaces[currif]["preup"] = i
- if (split[0] == "post-down"):
- if self.ifaces[currif].has_key("postdown"):
- self.ifaces[currif]["postdown"] = i
+ if (split[0] in ("pre-down","post-down")):
+ if self.ifaces[currif].has_key("predown"):
+ self.ifaces[currif]["predown"] = i
for ifacename, iface in ifaces.items():
if self.ifaces.has_key(ifacename):
self.configuredNetworkAdapters = self.configuredInterfaces
# load ns only once
self.loadNameserverConfig()
- print "read configured interfac:", ifaces
+ print "read configured interface:", ifaces
print "self.ifaces after loading:", self.ifaces
self.config_ready = True
self.msgPlugins()
print "nameservers:", self.nameservers
- def deactivateNetworkConfig(self, callback = None):
- self.deactivateConsole = Console()
- self.commands = []
- self.commands.append("/etc/init.d/avahi-daemon stop")
- for iface in self.ifaces.keys():
- cmd = "ip addr flush " + iface
- self.commands.append(cmd)
- self.commands.append("/etc/init.d/networking stop")
- self.commands.append("killall -9 udhcpc")
- self.commands.append("rm /var/run/udhcpc*")
- self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True)
-
- def deactivateNetworkFinished(self,extra_args):
- callback = extra_args
- if len(self.deactivateConsole.appContainers) == 0:
- if callback is not None:
- callback(True)
-
- def activateNetworkConfig(self, callback = None):
- self.activateConsole = Console()
- self.commands = []
- self.commands.append("/etc/init.d/networking start")
- self.commands.append("/etc/init.d/avahi-daemon start")
- self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True)
-
- def activateNetworkFinished(self,extra_args):
- callback = extra_args
- if len(self.activateConsole.appContainers) == 0:
- if callback is not None:
- callback(True)
+ def getInstalledAdapters(self):
+ return [x for x in listdir('/sys/class/net') if not x in ('lo','wifi0', 'wmaster0')]
def getConfiguredAdapters(self):
return self.configuredNetworkAdapters
return len(self.ifaces)
def getFriendlyAdapterName(self, x):
- # maybe this needs to be replaced by an external list.
- friendlyNames = {
- "eth0": _("Integrated Ethernet"),
- "wlan0": _("Wireless"),
- "ath0": _("Integrated Wireless")
- }
- return friendlyNames.get(x, x) # when we have no friendly name, use adapter name
+ 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
+
+ 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))
+ 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))
+
+ def getFriendlyAdapterDescription(self, iface):
+ if not self.isWirelessInterface(iface):
+ return _('Ethernet network interface')
+
+ moduledir = self.getWlanModuleDir(iface)
+ if os_path.isdir(moduledir):
+ name = os_path.basename(os_path.realpath(moduledir))
+ if name in ('ath_pci','ath5k'):
+ name = 'Atheros'
+ elif name in ('rt73','rt73usb','rt3070sta'):
+ name = 'Ralink'
+ elif name == 'zd1211b':
+ name = 'Zydas'
+ elif name == 'r871x_usb_drv':
+ name = 'Realtek'
+ else:
+ name = _('Unknown')
+
+ return name + ' ' + _('wireless network interface')
def getAdapterName(self, iface):
return iface
self.commands = []
self.commands.append("/etc/init.d/avahi-daemon stop")
for iface in self.ifaces.keys():
- cmd = "ip addr flush " + iface
- self.commands.append(cmd)
+ if iface != 'eth0' or not self.onRemoteRootFS():
+ self.commands.append("ip addr flush dev " + iface)
self.commands.append("/etc/init.d/networking stop")
self.commands.append("killall -9 udhcpc")
self.commands.append("rm /var/run/udhcpc*")
def checkNetworkState(self,statecallback):
# www.dream-multimedia-tv.de, www.heise.de, www.google.de
+ self.NetworkState = 0
cmd1 = "ping -c 1 82.149.226.170"
cmd2 = "ping -c 1 193.99.144.85"
cmd3 = "ping -c 1 209.85.135.103"
self.commands = []
self.commands.append("/etc/init.d/avahi-daemon stop")
for iface in self.ifaces.keys():
- cmd = "ip addr flush " + iface
- self.commands.append(cmd)
+ if iface != 'eth0' or not self.onRemoteRootFS():
+ self.commands.append("ifdown " + iface)
+ self.commands.append("ip addr flush dev " + iface)
self.commands.append("/etc/init.d/networking stop")
self.commands.append("killall -9 udhcpc")
self.commands.append("rm /var/run/udhcpc*")
def getLinkStateFinished(self, result, retval,extra_args):
(callback) = extra_args
+
if self.LinkConsole is not None:
if len(self.LinkConsole.appContainers) == 0:
callback(result)
+ def stopPingConsole(self):
+ if self.PingConsole is not None:
+ if len(self.PingConsole.appContainers):
+ for name in self.PingConsole.appContainers.keys():
+ self.PingConsole.kill(name)
+
def stopLinkStateConsole(self):
if self.LinkConsole is not None:
if len(self.LinkConsole.appContainers):
def stopDeactivateInterfaceConsole(self):
if self.deactivateInterfaceConsole is not None:
- if len(self.deactivateInterfaceConsole.appContainers):
- for name in self.deactivateInterfaceConsole.appContainers.keys():
- self.deactivateInterfaceConsole.kill(name)
+ self.deactivateInterfaceConsole.killAll()
+ self.deactivateInterfaceConsole = None
+
+ def stopActivateInterfaceConsole(self):
+ if self.activateInterfaceConsole is not None:
+ self.activateInterfaceConsole.killAll()
+ self.activateInterfaceConsole = None
def checkforInterface(self,iface):
if self.getAdapterAttribute(iface, 'up') is True:
if len(self.DnsConsole.appContainers) == 0:
statecallback(self.DnsState)
- def deactivateInterface(self,iface,callback = None):
- self.deactivateInterfaceConsole = Console()
- self.commands = []
- cmd1 = "ip addr flush " + iface
- cmd2 = "ifconfig " + iface + " down"
- self.commands.append(cmd1)
- self.commands.append(cmd2)
- self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, callback, debug=True)
+ def deactivateInterface(self,ifaces,callback = None):
+ self.config_ready = False
+ self.msgPlugins()
+ commands = []
+ def buildCommands(iface):
+ commands.append("ifdown " + iface)
+ commands.append("ip addr flush dev " + iface)
+ # HACK: wpa_supplicant sometimes doesn't quit properly on SIGTERM
+ if os_path.exists('/var/run/wpa_supplicant/'+ iface):
+ commands.append("wpa_cli -i" + iface + " terminate")
+
+ if not self.deactivateInterfaceConsole:
+ self.deactivateInterfaceConsole = Console()
+
+ if isinstance(ifaces, (list, tuple)):
+ for iface in ifaces:
+ if iface != 'eth0' or not self.onRemoteRootFS():
+ buildCommands(iface)
+ else:
+ if ifaces == 'eth0' and self.onRemoteRootFS():
+ if callback is not None:
+ callback(True)
+ return
+ buildCommands(ifaces)
+ self.deactivateInterfaceConsole.eBatch(commands, self.deactivateInterfaceFinished, callback, debug=True)
def deactivateInterfaceFinished(self,extra_args):
callback = extra_args
if callback is not None:
callback(True)
- def detectWlanModule(self):
- self.wlanmodule = None
- rt73_dir = "/sys/bus/usb/drivers/rt73/"
- zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/"
- madwifi_dir = "/sys/bus/pci/drivers/ath_pci/"
- if os_path.exists(madwifi_dir):
- files = listdir(madwifi_dir)
- if len(files) >= 1:
- self.wlanmodule = 'madwifi'
- if os_path.exists(rt73_dir):
- rtfiles = listdir(rt73_dir)
- if len(rtfiles) == 2:
- self.wlanmodule = 'ralink'
- if os_path.exists(zd1211b_dir):
- zdfiles = listdir(zd1211b_dir)
- if len(zdfiles) == 1:
- self.wlanmodule = 'zydas'
- return self.wlanmodule
+ def activateInterface(self,iface,callback = None):
+ if iface == 'eth0' and self.onRemoteRootFS():
+ if callback is not None:
+ callback(True)
+ return
+ if not self.activateInterfaceConsole:
+ self.activateInterfaceConsole = Console()
+ commands = []
+ commands.append("ifup " + iface)
+ self.deactivateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True)
+
+ def activateInterfaceFinished(self,extra_args):
+ callback = extra_args
+ if self.activateInterfaceConsole:
+ if len(self.activateInterfaceConsole.appContainers) == 0:
+ if callback is not None:
+ callback(True)
+
+ def sysfsPath(self, iface):
+ return '/sys/class/net/' + iface
+
+ def isWirelessInterface(self, iface):
+ 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
+
+ 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
+
+ def detectWlanModule(self, iface = None):
+ if not self.isWirelessInterface(iface):
+ return None
+
+ devicedir = self.sysfsPath(iface) + '/device'
+ if os_path.isdir(devicedir + '/ieee80211'):
+ return 'nl80211'
+
+ moduledir = self.getWlanModuleDir(iface)
+ if os_path.isdir(moduledir):
+ module = os_path.basename(os_path.realpath(moduledir))
+ if module in ('ath_pci','ath5k'):
+ return 'madwifi'
+ if module in ('rt73','rt73'):
+ return 'ralink'
+ if module == 'zd1211b':
+ return 'zydas'
+ return 'wext'
def calc_netmask(self,nmask):
from struct import pack, unpack