From bdff3888c78c55929c058c0509408e1f9e4f9449 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Thu, 29 May 2008 12:08:26 +0000 Subject: [PATCH 1/1] add new network config --- data/menu.xml | 5 +- data/skin_default.xml | 115 ++++- data/skin_default/border_info.png | Bin 0 -> 5011 bytes data/skin_default/border_menu.png | Bin 0 -> 4424 bytes data/skin_default/bottombar.png | Bin 0 -> 13805 bytes data/skin_default/buttons/blue_pressed.png | Bin 0 -> 4614 bytes data/skin_default/icons/lock_error.png | Bin 0 -> 3763 bytes lib/python/Components/Network.py | 115 +++-- lib/python/Screens/NetworkSetup.py | 713 +++++++++++++++++++++++++++-- 9 files changed, 868 insertions(+), 80 deletions(-) create mode 100755 data/skin_default/border_info.png create mode 100755 data/skin_default/border_menu.png create mode 100755 data/skin_default/bottombar.png create mode 100755 data/skin_default/buttons/blue_pressed.png create mode 100755 data/skin_default/icons/lock_error.png diff --git a/data/menu.xml b/data/menu.xml index 2ff3a23..93455b2 100644 --- a/data/menu.xml +++ b/data/menu.xml @@ -64,11 +64,12 @@ - + + diff --git a/data/skin_default.xml b/data/skin_default.xml index 679e2f9..f4f140f 100644 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -17,17 +17,44 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -490,17 +517,71 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/skin_default/border_info.png b/data/skin_default/border_info.png new file mode 100755 index 0000000000000000000000000000000000000000..8393a9e5904d9125608effac6a2fa1b9147a89f0 GIT binary patch literal 5011 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 M%Bsnfg3SZ|4^dK?)&Kwi literal 0 HcmV?d00001 diff --git a/data/skin_default/border_menu.png b/data/skin_default/border_menu.png new file mode 100755 index 0000000000000000000000000000000000000000..e7f9ede41b1f709228b6b10867cdeacbdab9b26b GIT binary patch literal 4424 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 literal 0 HcmV?d00001 diff --git a/data/skin_default/bottombar.png b/data/skin_default/bottombar.png new file mode 100755 index 0000000000000000000000000000000000000000..7bb023c9feca938ab24d97ee792496f660167340 GIT binary patch literal 13805 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 Ge*S+O$+kuS literal 0 HcmV?d00001 diff --git a/data/skin_default/buttons/blue_pressed.png b/data/skin_default/buttons/blue_pressed.png new file mode 100755 index 0000000000000000000000000000000000000000..aac592e3818aa27bb03f48c09b25bd501f636e59 GIT binary patch literal 4614 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 literal 0 HcmV?d00001 diff --git a/data/skin_default/icons/lock_error.png b/data/skin_default/icons/lock_error.png new file mode 100755 index 0000000000000000000000000000000000000000..d4d8e6d49dc931763cbbb6a361c68c37b6e956f6 GIT binary patch literal 3763 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 X)ei*+h#P~@Kg%)DG1abuIY#^kSv#}U literal 0 HcmV?d00001 diff --git a/lib/python/Components/Network.py b/lib/python/Components/Network.py index d10163f..3d114c1 100644 --- a/lib/python/Components/Network.py +++ b/lib/python/Components/Network.py @@ -1,16 +1,19 @@ import os import re from socket import * +from enigma import eTimer, eConsoleAppContainer class Network: def __init__(self): self.ifaces = {} self.nameservers = [] self.getInterfaces() - + self.ethtool_bin = "/usr/sbin/ethtool" + self.container = eConsoleAppContainer() + def getInterfaces(self): devicesPattern = re.compile('[a-z]+[0-9]+') - + fp = file('/proc/net/dev', 'r') result = fp.readlines() fp.close() @@ -18,15 +21,18 @@ class Network: try: device = devicesPattern.search(line).group() self.ifaces[device] = self.getDataForInterface(device) + # Show only UP Interfaces in E2 + if self.getAdapterAttribute(device, 'up') is False: + del self.ifaces[device] except AttributeError: pass - + print "self.ifaces:", self.ifaces self.loadNetworkConfig() #self.writeNetworkConfig() #print ord(' ') #for line in result: -# print ord(line[0]) + # print ord(line[0]) # helper function def regExpMatch(self, pattern, string): @@ -36,7 +42,7 @@ class Network: return pattern.search(string).group() except AttributeError: None - + # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): strIP = ip.split('.') @@ -54,7 +60,7 @@ class Network: ipPattern = re.compile(ipRegexp) upPattern = re.compile('UP ') macPattern = re.compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}') - + fp = os.popen("ifconfig " + iface) result = fp.readlines() fp.close() @@ -80,10 +86,10 @@ class Network: data['ip'] = [192, 168, 1, 2] data['netmask'] = [255, 255, 255, 0] data['gateway'] = [192, 168, 1, 1] - + fp = os.popen("route -n | grep " + iface) result = fp.readlines() - fp.close() + fp.close() for line in result: print line[0:7] if line[0:7] == "0.0.0.0": @@ -97,7 +103,7 @@ class Network: fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n") fp.write("auto lo\n") fp.write("iface lo inet loopback\n\n") - + for ifacename, iface in self.ifaces.items(): if iface['up'] == True: fp.write("auto " + ifacename + "\n") @@ -111,24 +117,21 @@ class Network: fp.write(" netmask %d.%d.%d.%d\n" % tuple(iface['netmask'])) 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("\n") fp.close() self.writeNameserverConfig() - def writeNameserverConfig(self): fp = file('/etc/resolv.conf', 'w') for nameserver in self.nameservers: fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver)) fp.close() - def loadNetworkConfig(self): self.loadNameserverConfig() - interfaces = [] # parse the interfaces-file try: @@ -137,7 +140,7 @@ class Network: fp.close() except: print "[Network.py] interfaces - opening failed" - + ifaces = {} currif = "" for i in interfaces: @@ -155,20 +158,20 @@ class Network: if (split[0] == "netmask"): ifaces[currif]["netmask"] = map(int, split[1].split('.')) if (split[0] == "gateway"): - ifaces[currif]["gateway"] = map(int, split[1].split('.')) - + ifaces[currif]["gateway"] = map(int, split[1].split('.')) + print "read interfaces:", ifaces for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] - + print "self.ifaces after loading:", self.ifaces def loadNameserverConfig(self): ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" nameserverPattern = re.compile("nameserver +" + ipRegexp) ipPattern = re.compile(ipRegexp) - + resolv = [] try: fp = file('/etc/resolv.conf', 'r') @@ -177,14 +180,14 @@ class Network: self.nameservers = [] except: print "[Network.py] resolv.conf - opening failed" - + for line in resolv: if self.regExpMatch(nameserverPattern, line) is not None: ip = self.regExpMatch(ipPattern, line) if ip is not None: self.nameservers.append(self.convertIP(ip)) - - print "nameservers:", self.nameservers + + print "nameservers:", self.nameservers def deactivateNetworkConfig(self): for iface in self.ifaces.keys(): @@ -195,7 +198,8 @@ class Network: def activateNetworkConfig(self): os.system("/etc/init.d/networking start") - + self.getInterfaces() + def getNumberOfAdapters(self): return len(self.ifaces) @@ -209,16 +213,16 @@ class Network: def getAdapterName(self, iface): return iface - + def getAdapterList(self): return self.ifaces.keys() - + def getAdapterAttribute(self, iface, attribute): if self.ifaces.has_key(iface): if self.ifaces[iface].has_key(attribute): return self.ifaces[iface][attribute] return None - + def setAdapterAttribute(self, iface, attribute, value): print "setting for adapter", iface, "attribute", attribute, " to value", value if self.ifaces.has_key(iface): @@ -228,27 +232,76 @@ class Network: if self.ifaces.has_key(iface): if self.ifaces[iface].has_key(attribute): del self.ifaces[iface][attribute] - + def getNameserverList(self): - return self.nameservers - + if len(self.nameservers) == 0: + return [[0, 0, 0, 0], [0, 0, 0, 0]] + else: + return self.nameservers + def clearNameservers(self): self.nameservers = [] - + def addNameserver(self, nameserver): if nameserver not in self.nameservers: self.nameservers.append(nameserver) - + def removeNameserver(self, nameserver): if nameserver in self.nameservers: self.nameservers.remove(nameserver) - + def changeNameserver(self, oldnameserver, newnameserver): if oldnameserver in self.nameservers: for i in range(len(self.nameservers)): if self.nameservers[i] == oldnameserver: self.nameservers[i] = newnameserver + def writeDefaultNetworkConfig(self,mode='lan'): + fp = file('/etc/network/interfaces', 'w') + fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n") + fp.write("auto lo\n") + fp.write("iface lo inet loopback\n\n") + if mode == 'wlan': + fp.write("auto wlan0\n") + fp.write("iface wlan0 inet dhcp\n") + else: + fp.write("auto eth0\n") + fp.write("iface eth0 inet dhcp\n") + fp.write("\n") + fp.close() + + def resetNetworkConfig(self,mode='lan'): + self.deactivateNetworkConfig() + self.writeDefaultNetworkConfig(mode) + if mode == 'wlan': + os.system("ifconfig eth0 down") + os.system("ifconfig wlan0 up") + else: + os.system("ifconfig eth0 up") + os.system("ifconfig wlan0 down") + + def checkNetworkState(self): + ret=os.system("ping -c 1 www.dream-multimedia-tv.de") + if ret == 0: + return True + else: + return False + + def restartNetwork(self): + iNetwork.deactivateNetworkConfig() + iNetwork.activateNetworkConfig() + + def getLinkState(self,iface,callback): + self.dataAvail = callback + cmd = self.ethtool_bin + " " + iface + self.container.appClosed.get().append(self.cmdFinished) + self.container.dataAvail.get().append(callback) + self.container.execute(cmd) + + def cmdFinished(self,retval): + self.container.appClosed.get().remove(self.cmdFinished) + self.container.dataAvail.get().remove(self.dataAvail) + iNetwork = Network() def InitNetwork(): diff --git a/lib/python/Screens/NetworkSetup.py b/lib/python/Screens/NetworkSetup.py index cf03f11..a4a355a 100644 --- a/lib/python/Screens/NetworkSetup.py +++ b/lib/python/Screens/NetworkSetup.py @@ -1,20 +1,42 @@ from Screen import Screen -from Components.ActionMap import ActionMap +from Components.ActionMap import ActionMap,NumberActionMap +from Screens.MessageBox import MessageBox +from Screens.Standby import * from Components.ConfigList import ConfigListScreen from Components.config import config, getConfigListEntry from Components.Network import iNetwork +from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE from Components.Label import Label +from Components.Pixmap import Pixmap +from Tools.LoadPixmap import LoadPixmap from Components.MenuList import MenuList -from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigNothing +from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigNothing, ConfigSubsection, ConfigText, ConfigSelection, getConfigListEntry from Components.PluginComponent import plugins from Plugins.Plugin import PluginDescriptor +#from Plugins.SystemPlugins.WirelessLan.plugin import * +#from Plugins.SystemPlugins.WirelessLan.Wlan import * +from enigma import eTimer, eConsoleAppContainer,gRGB +import time, os, re + + +Black = "#000000" +Grey = "#8c8c93" +Green = "1cff1c" +nextstep = None +activebutton = None + +def getColor(str): + return gRGB(int(str[1:], 0x10)) class NetworkAdapterSelection(Screen): def __init__(self, session): Screen.__init__(self, session) self.adapters = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()] - + if len(self.adapters) == 0: + #Reset Network to defaults if network broken + iNetwork.resetNetworkConfig('lan') + self["adapterlist"] = MenuList(self.adapters) self["actions"] = ActionMap(["OkCancelActions"], { @@ -28,29 +50,30 @@ class NetworkAdapterSelection(Screen): def okbuttonClick(self): selection = self["adapterlist"].getCurrent() if selection is not None: - self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetup, selection[1]) - + self.session.openWithCallback(self.AdapterSetupClosed, AdapterSetupConfiguration, selection[1]) def AdapterSetupClosed(self, *ret): if len(self.adapters) == 1: # just one network adapter.. close selection self.close() class NameserverSetup(Screen, ConfigListScreen): + def __init__(self, session): Screen.__init__(self, session) self.backupNameserverList = iNetwork.getNameserverList()[:] print "backup-list:", self.backupNameserverList - self["red"] = Label(_("Delete")) - self["green"] = Label(_("Add")) - + self["ButtonGreentext"] = Label(_("Add")) + self["ButtonYellowtext"] = Label(_("Delete")) + self["ButtonRedtext"] = Label(_("Close")) self.createConfig() self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.ok, "cancel": self.cancel, + "red": self.cancel, "green": self.add, - "red": self.remove + "yellow": self.remove }, -2) self.list = [] @@ -67,7 +90,6 @@ class NameserverSetup(Screen, ConfigListScreen): def createSetup(self): self.list = [] - #self.nameserverConfigEntries = [] for i in range(len(self.nameserverEntries)): self.list.append(getConfigListEntry(_("Nameserver %d") % (i + 1), self.nameserverEntries[i])) @@ -102,42 +124,87 @@ class NameserverSetup(Screen, ConfigListScreen): self.createConfig() self.createSetup() + class AdapterSetup(Screen, ConfigListScreen): def __init__(self, session, iface): Screen.__init__(self, session) + self.session = session + ## FIXME , workaround against current wizzard not able to send arguments + if iface == 0: + self.iface = "eth0" + elif iface == 1: + self.iface = "wlan0" + else: + self.iface = iface + + if self.iface == 'wlan0': + from Plugins.SystemPlugins.WirelessLan.Wlan import wpaSupplicant + self.ws = wpaSupplicant() + list = [] + list.append(_("WEP")) + list.append(_("WPA")) + list.append(_("WPA2")) + + config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False)) + config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = False)) + config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = _("WPA"))) + config.plugins.wlan.encryption.psk = NoSave(ConfigText(default = "mysecurewlan", fixed_size = False)) + self.ws.loadConfig() - self.iface = iface - - print iNetwork.getAdapterAttribute(self.iface, "dhcp") self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp") or False)) self.hasGatewayConfigEntry = NoSave(ConfigYesNo(default=True)) self.ipConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "ip")) or [0,0,0,0]) self.netmaskConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "netmask") or [255,0,0,0])) self.gatewayConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "gateway") or [0,0,0,0])) - - self["iface"] = Label(iNetwork.getFriendlyAdapterName(self.iface)) + nameserver = (iNetwork.getNameserverList() + [[0,0,0,0]] * 2)[0:2] + self.primaryDNS = NoSave(ConfigIP(default=nameserver[0])) + self.secondaryDNS = NoSave(ConfigIP(default=nameserver[1])) - self["actions"] = ActionMap(["SetupActions"], + self["actions"] = ActionMap(["SetupActions","ShortcutActions"], { "ok": self.ok, "cancel": self.cancel, + "red": self.cancel, + "blue": self.KeyBlue, }, -2) self.list = [] ConfigListScreen.__init__(self, self.list) self.createSetup() - - self["introduction"] = Label(_("Press OK to activate the settings.")) - self["introduction2"] = Label(_("Current settings:")) + self.onLayoutFinish.append(self.layoutFinished) + + self["DNS1text"] = Label(_("Primary DNS")) + self["DNS2text"] = Label(_("Secondary DNS")) + self["DNS1"] = Label() + self["DNS2"] = Label() + + self["introduction"] = Label(_("Current settings:")) self["IPtext"] = Label(_("IP Address")) self["Netmasktext"] = Label(_("Netmask")) self["Gatewaytext"] = Label(_("Gateway")) - self["IP"] = Label(self.ipConfigEntry.getText()) - self["Mask"] = Label(self.netmaskConfigEntry.getText()) - self["Gateway"] = Label(self.gatewayConfigEntry.getText()) - + self["IP"] = Label() + self["Mask"] = Label() + self["Gateway"] = Label() + + self["BottomBG"] = Pixmap() + self["Adaptertext"] = Label(_("Network:")) + self["Adapter"] = Label() + self["introduction2"] = Label(_("Press OK to activate the settings.")) + self["ButtonRed"] = Pixmap() + self["ButtonRedtext"] = Label(_("Close")) + self["ButtonBlue"] = Pixmap() + self["ButtonBluetext"] = Label(_("Edit DNS")) + + def layoutFinished(self): + self["DNS1"].setText(self.primaryDNS.getText()) + self["DNS2"].setText(self.secondaryDNS.getText()) + self["IP"].setText(self.ipConfigEntry.getText()) + self["Mask"].setText(self.netmaskConfigEntry.getText()) + self["Gateway"].setText(self.gatewayConfigEntry.getText()) + self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface)) + def createSetup(self): self.list = [] @@ -162,16 +229,21 @@ class AdapterSetup(Screen, ConfigListScreen): else: self.configStrings = None - if p.__call__.has_key("menuEntryName"): - menuEntryName = p.__call__["menuEntryName"](self.iface) - else: - menuEntryName = _('Extended Setup...') - self.extendedSetup = getConfigListEntry(menuEntryName, NoSave(ConfigNothing())) - self.list.append(self.extendedSetup) + self.list.append(getConfigListEntry(_("Network SSID"), config.plugins.wlan.essid)) + self.encryptionEnabled = getConfigListEntry(_("Encryption"), config.plugins.wlan.encryption.enabled) + self.list.append(self.encryptionEnabled) + + if config.plugins.wlan.encryption.enabled.value: + self.list.append(getConfigListEntry(_("Encryption Type"), config.plugins.wlan.encryption.type)) + self.list.append(getConfigListEntry(_("Encryption Key"), config.plugins.wlan.encryption.psk)) + self["config"].list = self.list self["config"].l.setList(self.list) + def KeyBlue(self): + self.session.open(NameserverSetup) + def newConfig(self): print self["config"].getCurrent() if self["config"].getCurrent() == self.dhcpEntry: @@ -200,12 +272,593 @@ class AdapterSetup(Screen, ConfigListScreen): if self.extended is not None and self.configStrings is not None: iNetwork.setAdapterAttribute(self.iface, "configStrings", self.configStrings(self.iface)) - + self.ws.writeConfig() + iNetwork.deactivateNetworkConfig() iNetwork.writeNetworkConfig() iNetwork.activateNetworkConfig() + #if self.iface == 'wlan0': + # iNetwork.restartNetwork() self.close() def cancel(self): iNetwork.getInterfaces() self.close() + + def run(self): + self.ok() + + +class AdapterSetupConfiguration(Screen): + + def __init__(self, session,iface): + Screen.__init__(self, session) + self.iface = iface + self.session = session + #self.ethtool_bin = "/usr/sbin/ethtool" + #self.output = None + #self.container = eConsoleAppContainer() + self.mainmenu = self.genMainMenu() + self["menulist"] = MenuList(self.mainmenu) + self["description"] = Label() + self["IFtext"] = Label() + self["IF"] = Label() + self["BottomBG"] = Label() + self["Statustext"] = Label() + self["statuspic_active"] = Pixmap() + self["statuspic_active"].hide() + self["statuspic_inactive"] = Pixmap() + self["statuspic_inactive"].hide() + self["BottomBG"] = Pixmap() + self["ButtonRed"] = Pixmap() + self["ButtonRedtext"] = Label(_("Close")) + + self.oktext = _("Press OK on your remote control to continue.") + self.reboottext = _("Your Dreambox will restart after pressing OK on your remote control.") + + self["actions"] = NumberActionMap(["WizardActions","ShortcutActions"], + { + "ok": self.ok, + "back": self.close, + "up": self.up, + "down": self.down, + "red": self.close, + }, -2) + + iNetwork.loadNetworkConfig() + self.onLayoutFinish.append(self.layoutFinished) + self.updateStatusbar() + + def ok(self): + if self["menulist"].getCurrent()[1] == 'edit': + self.session.open(AdapterSetup,self.iface) + if self["menulist"].getCurrent()[1] == 'test': + self.session.open(NetworkAdapterTest,self.iface) + if self["menulist"].getCurrent()[1] == 'dns': + self.session.open(NameserverSetup) + if self["menulist"].getCurrent()[1] == 'scanwlan': + from Plugins.SystemPlugins.WirelessLan.plugin import WlanScan + self.session.open(WlanScan,self.iface) + if self["menulist"].getCurrent()[1] == 'wlanstatus': + from Plugins.SystemPlugins.WirelessLan.plugin import WlanStatus + self.session.open(WlanStatus,self.iface) + if self["menulist"].getCurrent()[1] == 'lanrestart': + self.session.openWithCallback(self.restartLan, MessageBox, (_("Are you sure you want to restart your network interfaces?\n\n") + self.oktext ) ) + if self["menulist"].getCurrent()[1] == 'enablewlan': + self.session.openWithCallback(self.enablewlan, MessageBox, (_("Are you sure you want to enable WLAN support?\nConnect your Wlan USB Stick to your Dreambox and press OK.\n\n") + self.reboottext ) ) + if self["menulist"].getCurrent()[1] == 'resetconfig': + self.session.openWithCallback(self.resetconfig, MessageBox, (_("Are you sure you want to reset \nyour network configuration to defaults?\n\n") + self.reboottext ) ) + + def up(self): + self["menulist"].up() + self.loadDescription() + + def down(self): + self["menulist"].down() + self.loadDescription() + + def layoutFinished(self): + idx = 0 + self["menulist"].moveToIndex(idx) + self.loadDescription() + + def loadDescription(self): + if self["menulist"].getCurrent()[1] == 'edit': + self["description"].setText(_("Edit the network configuration of your Dreambox.\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'test': + self["description"].setText(_("Test the network configuration of your Dreambox.\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'resetconfig': + self["description"].setText(_("Reset the network configuration of your Dreambox.\n\n" ) + self.reboottext ) + if self["menulist"].getCurrent()[1] == 'dns': + self["description"].setText(_("Edit the Nameserver configuration of your Dreambox.\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'scanwlan': + self["description"].setText(_("Scan your network for wireless Access Points and connect to them using your WLAN USB Stick\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'wlanstatus': + self["description"].setText(_("Shows the state of your wireless LAN connection.\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'lanrestart': + self["description"].setText(_("Restart your network connection and interfaces.\n" ) + self.oktext ) + if self["menulist"].getCurrent()[1] == 'enablewlan': + self["description"].setText(_("Pressing OK enables the built in wireless LAN support of your Dreambox.\nWlan USB Sticks with Zydas ZD1211B and RAlink RT73 Chipset are supported.\nConnect your Wlan USB Stick to your Dreambox before pressing OK.\n\n" ) + self.reboottext ) + + + def updateStatusbar(self): + self["IFtext"].setText(_("Network:")) + self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface)) + self["Statustext"].setText(_("Link:")) + + if self.iface == 'wlan0': + from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan, WlanList, wpaSupplicant + w = Wlan(self.iface) + stats = w.getStatus() + if stats['BSSID'] == "00:00:00:00:00:00": + self["statuspic_active"].hide() + self["statuspic_inactive"].show() + else: + self["statuspic_active"].show() + self["statuspic_inactive"].hide() + else: + self.getLinkState(self.iface) + + def doNothing(self): + pass + + def genMainMenu(self): + menu = [] + menu.append((_("Adapter settings"), "edit")); + menu.append((_("Nameserver settings"), "dns")); + menu.append((_("Network test"), "test")); + menu.append((_("Restart network"), "lanrestart")); + menu.append((_("Reset configuration"), "resetconfig")); + + self.extended = None + self.extendedSetup = None + for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKSETUP): + callFnc = p.__call__["ifaceSupported"](self.iface) + if callFnc is not None: + menu.append((_("Scan Wireless Networks"), "scanwlan")); + menu.append((_("Show WLAN Status"), "wlanstatus")); + if callFnc is None and iNetwork.ifaces.has_key('wlan0') is False: + menu.append((_("Enable WLAN Support"), "enablewlan")); + return menu + + + def enablewlan(self, ret = False): + if (ret == True): + iNetwork.resetNetworkConfig('wlan') + TryQuitMainloop(self.session,2) + + def resetconfig(self, ret = False): + if (ret == True): + iNetwork.resetNetworkConfig('lan') + TryQuitMainloop(self.session,2) + + def restartLan(self, ret = False): + if (ret == True): + iNetwork.restartNetwork() + + def getLinkState(self,iface): + iNetwork.getLinkState(iface,self.dataAvail) + + def dataAvail(self,data): + self.output = data.strip() + result = self.output.split('\n') + pattern = re.compile("Link detected: yes") + for item in result: + if re.search(pattern, item): + self["statuspic_active"].show() + self["statuspic_inactive"].hide() + else: + self["statuspic_active"].hide() + self["statuspic_inactive"].show() + + +class NetworkAdapterTest(Screen): + + def __init__(self, session,iface): + Screen.__init__(self, session) + self.iface = iface + + self.setLabels() + + self["updown_actions"] = NumberActionMap(["WizardActions"], + { + "ok": self.KeyOK, + "up": lambda: self.updownhandler('up'), + "down": lambda: self.updownhandler('down'), + + }, -2) + + self["shortcuts"] = ActionMap(["ShortcutActions","WizardActions"], + { + "red": self.close, + "back": self.close, + }, -2) + self["infoshortcuts"] = ActionMap(["ShortcutActions","WizardActions"], + { + "red": self.closeInfo, + "back": self.closeInfo, + }, -2) + self["shortcutsgreen"] = ActionMap(["ShortcutActions"], + { + "green": self.KeyGreen, + }, -2) + self["shortcutsgreen_restart"] = ActionMap(["ShortcutActions"], + { + "green": self.KeyGreenRestart, + }, -2) + self["shortcutsyellow"] = ActionMap(["ShortcutActions"], + { + "yellow": self.KeyYellow, + }, -2) + + self["shortcutsgreen_restart"].setEnabled(False) + self["updown_actions"].setEnabled(False) + self["infoshortcuts"].setEnabled(False) + self.onClose.append(self.delTimer) + self.onLayoutFinish.append(self.layoutFinished) + self.steptimer = False + global nextstep + nextstep = 0 + global activebutton + activebutton = 0 + self.nextStepTimer = eTimer() + self.nextStepTimer.callback.append(self.nextStepTimerFire) + + def closeInfo(self): + self["shortcuts"].setEnabled(True) + self["infoshortcuts"].setEnabled(False) + self["InfoText"].hide() + self["InfoTextBorder"].hide() + self["ButtonRedtext"].setText(_("Close")) + + def delTimer(self): + del self.steptimer + del self.nextStepTimer + + def nextStepTimerFire(self): + global nextstep + self.nextstep= nextstep + self.nextStepTimer.stop() + self.steptimer = False + self.runTest(self.nextstep) + + def updownhandler(self,direction): + global activebutton + if direction == 'up': + if activebutton >=2: + activebutton = activebutton -1 + self.setActiveButton(activebutton) + if direction == 'down': + if activebutton <=5: + activebutton = activebutton +1 + self.setActiveButton(activebutton) + + def setActiveButton(self,button): + if button == 1: + self["NetworkInfo"].show() + self["NetworkInfo_selected"].hide() + self["AdapterInfo"].hide() + self["AdapterInfo_selected"].show() + if button == 2: + self["AdapterInfo"].show() + self["AdapterInfo_selected"].hide() + self["DhcpInfo"].show() + self["DhcpInfo_selected"].hide() + self["NetworkInfo"].hide() + self["NetworkInfo_selected"].show() + if button == 3: + self["NetworkInfo"].show() + self["NetworkInfo_selected"].hide() + self["IPInfo"].show() + self["IPInfo_selected"].hide() + self["DhcpInfo"].hide() + self["DhcpInfo_selected"].show() + if button == 4: + self["DhcpInfo"].show() + self["DhcpInfo_selected"].hide() + self["DNSInfo"].show() + self["DNSInfo_selected"].hide() + self["IPInfo"].hide() + self["IPInfo_selected"].show() + if button == 5: + self["IPInfo"].show() + self["IPInfo_selected"].hide() + self["EditSettingsButton"].show() + self["EditSettingsButton_selected"].hide() + self["DNSInfo"].hide() + self["DNSInfo_selected"].show() + if button == 6: + self["DNSInfo"].show() + self["DNSInfo_selected"].hide() + self["EditSettingsButton"].hide() + self["EditSettingsButton_selected"].show() + + def runTest(self,next): + global nextstep + if next == 0: + nextstep = next + 1 + self.doStep1() + if next == 1: + nextstep = next + 1 + self.doStep2() + if next == 2: + nextstep = next + 1 + self.doStep3() + if next == 3: + nextstep = next + 1 + self.doStep4() + if next == 4: + nextstep = next + 1 + self.doStep5() + if next == 5: + nextstep = next + 1 + self.doStep6() + + def doStep1(self): + self.steptimer = True + self.nextStepTimer.start(3000) + + def doStep2(self): + self["Adapter"].setText(iNetwork.getFriendlyAdapterName(self.iface)) + self["Adapter"].instance.setForegroundColor(getColor(Green)) + self["AdapterInfo_Text"].instance.setForegroundColor(getColor(Black)) + self["AdapterInfo_OK"].show() + self.steptimer = True + self.nextStepTimer.start(3000) + + def doStep3(self): + self.getLinkState(self.iface) + self["NetworkInfo_Text"].instance.setForegroundColor(getColor(Black)) + self.steptimer = True + self.nextStepTimer.start(3000) + + def doStep4(self): + if iNetwork.getAdapterAttribute(self.iface, 'dhcp') is True: + self["Dhcp"].instance.setForegroundColor(getColor(Green)) + self["Dhcp"].setText(_("enabled")) + self["DhcpInfo_OK"].show() + self["DhcpInfo_NOK"].hide() + else: + self["Dhcp"].instance.setForegroundColor(getColor(Grey)) + self["Dhcp"].setText(_("disabled")) + self["DhcpInfo_NOK"].show() + self["DhcpInfo_OK"].hide() + self["DhcpInfo_Text"].instance.setForegroundColor(getColor(Black)) + self.steptimer = True + self.nextStepTimer.start(3000) + + def doStep5(self): + if len(iNetwork.getAdapterAttribute(self.iface,'ip')) != 0: + self["IP"].instance.setForegroundColor(getColor(Green)) + self["IP"].setText(_("confirmed")) + self["IPInfo_OK"].show() + self["IPInfo_NOK"].hide() + else: + self["IP"].instance.setForegroundColor(getColor(Grey)) + self["IP"].setText(_("unconfirmed")) + self["IPInfo_NOK"].show() + self["IPInfo_OK"].hide() + self["IPInfo_Text"].instance.setForegroundColor(getColor(Black)) + self.steptimer = True + self.nextStepTimer.start(3000) + + def doStep6(self): + self.steptimer = False + self.nextStepTimer.stop() + if len (iNetwork.getNameserverList()) != 0: + self["DNS"].instance.setForegroundColor(getColor(Green)) + self["DNS"].setText(_("confirmed")) + self["DNSInfo_OK"].show() + self["DNSInfo_NOK"].hide() + else: + self["DNS"].instance.setForegroundColor(getColor(Grey)) + self["DNS"].setText(_("unconfirmed")) + self["DNSInfo_NOK"].show() + self["DNSInfo_OK"].hide() + + self["DNSInfo_Text"].instance.setForegroundColor(getColor(Black)) + self["EditSettings_Text"].show() + self["EditSettingsButton_selected"].show() + self["ButtonYellow_off"].show() + self["ButtonYellow"].hide() + self["ButtonGreentext"].setText(_("Restart test")) + self["ButtonGreen"].show() + self["ButtonGreen_off"].hide() + self["shortcutsgreen"].setEnabled(False) + self["shortcutsgreen_restart"].setEnabled(True) + self["shortcutsyellow"].setEnabled(False) + self["updown_actions"].setEnabled(True) + global activebutton + activebutton = 6 + + def KeyGreen(self): + self["shortcutsgreen"].setEnabled(False) + self["shortcutsyellow"].setEnabled(True) + self["updown_actions"].setEnabled(False) + self["ButtonYellow_off"].hide() + self["ButtonYellow"].show() + self["ButtonGreen"].hide() + self["ButtonGreen_off"].show() + self.steptimer = True + self.nextStepTimer.start(1000) + + def KeyGreenRestart(self): + global nextstep + nextstep = 0 + self.layoutFinished() + self["Adapter"].setText(("")) + self["Network"].setText(("")) + self["Dhcp"].setText(("")) + self["IP"].setText(("")) + self["DNS"].setText(("")) + self["AdapterInfo_Text"].instance.setForegroundColor(getColor(Grey)) + self["NetworkInfo_Text"].instance.setForegroundColor(getColor(Grey)) + self["DhcpInfo_Text"].instance.setForegroundColor(getColor(Grey)) + self["IPInfo_Text"].instance.setForegroundColor(getColor(Grey)) + self["DNSInfo_Text"].instance.setForegroundColor(getColor(Grey)) + self["shortcutsgreen_restart"].setEnabled(False) + self["shortcutsgreen"].setEnabled(False) + self["shortcutsyellow"].setEnabled(True) + self["updown_actions"].setEnabled(False) + self["ButtonYellow_off"].hide() + self["ButtonYellow"].show() + self["ButtonGreen"].hide() + self["ButtonGreen_off"].show() + self.steptimer = True + self.nextStepTimer.start(1000) + + def KeyOK(self): + global activebutton + self["infoshortcuts"].setEnabled(True) + self["shortcuts"].setEnabled(False) + if activebutton == 1: # Adapter Check + self["InfoText"].setText(_("This test detects your configured LAN-Adapter.")) + self["InfoTextBorder"].show() + self["InfoText"].show() + self["ButtonRedtext"].setText(_("Back")) + if activebutton == 2: #LAN Check + self["InfoText"].setText(_("This test checks whether a network cable is connected to your LAN-Adapter.\nIf you get a \"disconnected\" message:\n- verify that a network cable is attached\n- verify that the cable is not broken")) + self["InfoTextBorder"].show() + self["InfoText"].show() + self["ButtonRedtext"].setText(_("Back")) + if activebutton == 3: #DHCP Check + self["InfoText"].setText(_("This test checks whether your LAN Adapter is set up for automatic IP Address configuration with DHCP.\nIf you get a \"disabled\" message:\n - then your LAN Adapter is configured for manual IP Setup\n- verify thay you have entered correct IP informations in the AdapterSetup dialog.\nIf you get an \"enabeld\" message:\n-verify that you have a configured and working DHCP Server in your network.")) + self["InfoTextBorder"].show() + self["InfoText"].show() + self["ButtonRedtext"].setText(_("Back")) + if activebutton == 4: # IP Check + self["InfoText"].setText(_("This test checks whether a valid IP Address is found for your LAN Adapter.\nIf you get a \"unconfirmed\" message:\n- no valid IP Address was found\n- please check your DHCP, cabling and adapter setup")) + self["InfoTextBorder"].show() + self["InfoText"].show() + self["ButtonRedtext"].setText(_("Back")) + if activebutton == 5: # DNS Check + self["InfoText"].setText(_("This test checks for configured Nameservers.\nIf you get a \"unconfirmed\" message:\n- please check your DHCP, cabling and Adapter setup\n- if you configured your Nameservers manually please verify your entries in the \"Nameserver\" Configuration")) + self["InfoTextBorder"].show() + self["InfoText"].show() + self["ButtonRedtext"].setText(_("Back")) + if activebutton == 6: # Edit Settings + self.session.open(AdapterSetup,self.iface) + + def KeyYellow(self): + global nextstep + nextstep = 0 + self["shortcutsgreen_restart"].setEnabled(True) + self["shortcutsgreen"].setEnabled(False) + self["shortcutsyellow"].setEnabled(False) + self["ButtonGreentext"].setText(_("Restart test")) + self["ButtonYellow_off"].show() + self["ButtonYellow"].hide() + self["ButtonGreen"].show() + self["ButtonGreen_off"].hide() + self.steptimer = False + self.nextStepTimer.stop() + + def layoutFinished(self): + self["shortcutsyellow"].setEnabled(False) + self["AdapterInfo_selected"].hide() + self["AdapterInfo_OK"].hide() + + self["NetworkInfo_selected"].hide() + self["NetworkInfo_OK"].hide() + self["NetworkInfo_NOK"].hide() + + self["DhcpInfo_selected"].hide() + self["DhcpInfo_OK"].hide() + self["DhcpInfo_NOK"].hide() + + self["IPInfo_selected"].hide() + self["IPInfo_OK"].hide() + self["IPInfo_NOK"].hide() + + self["DNSInfo_selected"].hide() + self["DNSInfo_OK"].hide() + self["DNSInfo_NOK"].hide() + + self["EditSettings_Text"].hide() + self["EditSettingsButton"].hide() + self["EditSettingsButton_selected"].hide() + self["ButtonYellow"].hide() + self["ButtonGreen_off"].hide() + self["InfoText"].hide() + self["InfoTextBorder"].hide() + + def setLabels(self): + self["Adaptertext"] = Label(_("LAN Adapter")) + self["Adapter"] = Label() + self["AdapterInfo"] = Pixmap() + self["AdapterInfo_selected"] = Pixmap() + self["AdapterInfo_Text"] = Label(_("Show Info")) + self["AdapterInfo_OK"] = Pixmap() + + if self.iface == 'wlan0': + self["Networktext"] = Label(_("Wireless Network")) + else: + self["Networktext"] = Label(_("Local Network")) + + self["Network"] = Label() + self["NetworkInfo"] = Pixmap() + self["NetworkInfo_selected"] = Pixmap() + self["NetworkInfo_Text"] = Label(_("Show Info")) + self["NetworkInfo_OK"] = Pixmap() + self["NetworkInfo_NOK"] = Pixmap() + + self["Dhcptext"] = Label(_("DHCP")) + self["Dhcp"] = Label() + self["DhcpInfo"] = Pixmap() + self["DhcpInfo_selected"] = Pixmap() + self["DhcpInfo_Text"] = Label(_("Show Info")) + self["DhcpInfo_OK"] = Pixmap() + self["DhcpInfo_NOK"] = Pixmap() + + self["IPtext"] = Label(_("IP Address")) + self["IP"] = Label() + self["IPInfo"] = Pixmap() + self["IPInfo_selected"] = Pixmap() + self["IPInfo_Text"] = Label(_("Show Info")) + self["IPInfo_OK"] = Pixmap() + self["IPInfo_NOK"] = Pixmap() + + self["DNStext"] = Label(_("Nameserver")) + self["DNS"] = Label() + self["DNSInfo"] = Pixmap() + self["DNSInfo_selected"] = Pixmap() + self["DNSInfo_Text"] = Label(_("Show Info")) + self["DNSInfo_OK"] = Pixmap() + self["DNSInfo_NOK"] = Pixmap() + + self["EditSettings_Text"] = Label(_("Edit settings")) + self["EditSettingsButton"] = Pixmap() + self["EditSettingsButton_selected"] = Pixmap() + + self["ButtonRedtext"] = Label(_("Close")) + self["ButtonRed"] = Pixmap() + self["ButtonGreentext"] = Label(_("Start test")) + self["ButtonGreen"] = Pixmap() + self["ButtonGreen_off"] = Pixmap() + self["ButtonYellowtext"] = Label(_("Stop test")) + self["ButtonYellow"] = Pixmap() + self["ButtonYellow_off"] = Pixmap() + + self["InfoTextBorder"] = Pixmap() + self["InfoText"] = Label() + + def getLinkState(self,iface): + iNetwork.getLinkState(iface,self.dataAvail) + + def dataAvail(self,data): + self.output = data.strip() + result = self.output.split('\n') + pattern = re.compile("Link detected: yes") + for item in result: + if re.search(pattern, item): + self["Network"].instance.setForegroundColor(getColor(Green)) + self["Network"].setText(_("connected")) + self["NetworkInfo_OK"].show() + self["NetworkInfo_NOK"].hide() + else: + self["Network"].instance.setForegroundColor(getColor(Grey)) + self["Network"].setText(_("disconnected")) + self["NetworkInfo_OK"].hide() + self["NetworkInfo_NOK"].show() + + -- 2.7.4