network setup rewrite... adds support for multiple devices and an extended setup...
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Mon, 19 Mar 2007 18:06:13 +0000 (18:06 +0000)
committerStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Mon, 19 Mar 2007 18:06:13 +0000 (18:06 +0000)
.cvsignore
configure.ac
data/menu.xml
data/skin_default.xml
lib/python/Components/ConfigList.py
lib/python/Components/Network.py
lib/python/Plugins/Plugin.py
lib/python/Plugins/SystemPlugins/Makefile.am
lib/python/Screens/NetworkSetup.py

index 8de1bd0..c84b6b8 100644 (file)
@@ -1,3 +1,5 @@
+.cvsignore
+configure.ac
 configure
 autom4te.cache
 Makefile.in
 configure
 autom4te.cache
 Makefile.in
index ef22a6b..b911b98 100644 (file)
@@ -76,6 +76,7 @@ lib/python/Plugins/SystemPlugins/ConfigurationBackup/Makefile
 lib/python/Plugins/SystemPlugins/Satfinder/Makefile
 lib/python/Plugins/SystemPlugins/SkinSelector/Makefile
 lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/Makefile
 lib/python/Plugins/SystemPlugins/Satfinder/Makefile
 lib/python/Plugins/SystemPlugins/SkinSelector/Makefile
 lib/python/Plugins/SystemPlugins/SatelliteEquipmentControl/Makefile
+lib/python/Plugins/SystemPlugins/WirelessLan/Makefile
 lib/python/Plugins/DemoPlugins/Makefile
 lib/python/Plugins/DemoPlugins/TestPlugin/Makefile
 lib/python/Plugins/Extensions/Makefile
 lib/python/Plugins/DemoPlugins/Makefile
 lib/python/Plugins/DemoPlugins/TestPlugin/Makefile
 lib/python/Plugins/Extensions/Makefile
index caa33ab..d562ab3 100644 (file)
                                <!--<item text="Keyboard"><setup id="keyboard" /></item>-->
                                <!--<item text="OSD"><setup id="osd" /></item>-->
                                <item><setup id="lcd" /></item>
                                <!--<item text="Keyboard"><setup id="keyboard" /></item>-->
                                <!--<item text="OSD"><setup id="osd" /></item>-->
                                <item><setup id="lcd" /></item>
-                               <item text="Network..."><screen module="NetworkSetup" screen="NetworkSetup" /></item>
+                               <menu text="Network...">
+                                       <id val="network" />
+                                       <item text="Device Setup..."><screen module="NetworkSetup" screen="NetworkAdapterSelection"/></item>
+                                       <item text="Nameserver Setup..."><screen module="NetworkSetup" screen="NameserverSetup"/></item>
+                               </menu>
                        </menu>
                        <item text="Common Interface"><screen module="Ci" screen="CiSelection" /></item>
                        <item text="Parental control"><screen module="ParentalControlSetup" screen="ParentalControlSetup" /></item>
                        </menu>
                        <item text="Common Interface"><screen module="Ci" screen="CiSelection" /></item>
                        <item text="Parental control"><screen module="ParentalControlSetup" screen="ParentalControlSetup" /></item>
index 0813609..4bdc5c1 100644 (file)
                <widget name="cancel" position="240,365" size="100,30" pixmap="cancel.png" />
                <widget name="canceltext" position="240,365" size="100,30" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" />
        </screen>
                <widget name="cancel" position="240,365" size="100,30" pixmap="cancel.png" />
                <widget name="canceltext" position="240,365" size="100,30" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" />
        </screen>
-       <screen name="NetworkSetup" position="130,148" size="460,280" title="Network Setup">
+       <screen name="NetworkSetup" position="100,150" size="540,100" title="Network Setup">
+               <widget name="menu" position="20,10" size="500,75" />
+       </screen>
+       <screen name="AdapterSetup" position="130,148" size="460,280" title="Network Setup">
+               <widget name="iface" position="10,10" size="380,30" zPosition="1" font="Regular;20" />
                <widget name="config" position="10,50" size="420,175" scrollbarMode="showOnDemand" />
                <widget name="introduction" position="10,230" size="400,30" font="Regular;23" />
        </screen>
                <widget name="config" position="10,50" size="420,175" scrollbarMode="showOnDemand" />
                <widget name="introduction" position="10,230" size="400,30" font="Regular;23" />
        </screen>
+       <screen name="NameserverSetup" position="130,148" size="460,280" title="Nameserver Setup">
+               <widget name="red" position="0,0" size="230,40" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
+               <widget name="green" position="230,0" size="230,40" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
+               <widget name="config" position="10,50" size="420,175" scrollbarMode="showOnDemand" />
+       </screen>
+       <screen name="NetworkAdapterSelection" position="100,150" size="540,100" title="Select Network Adapter">
+               <widget name="adapterlist" position="20,10" size="500,75" />
+       </screen>
        <screen name="About" position="180,163" size="360,250" title="About">
                <widget name="text" position="10,30" size="420,20" font="Regular;18"/>
                <widget name="fpVersion" position="10,50" size="420,20" font="Regular;18"/>
        <screen name="About" position="180,163" size="360,250" title="About">
                <widget name="text" position="10,30" size="420,20" font="Regular;18"/>
                <widget name="fpVersion" position="10,50" size="420,20" font="Regular;18"/>
index 8b880fb..534459e 100644 (file)
@@ -45,6 +45,9 @@ class ConfigList(HTMLComponent, GUIComponent, object):
        def getCurrent(self):
                return self.l.getCurrentSelection()
        
        def getCurrent(self):
                return self.l.getCurrentSelection()
        
+       def getCurrentIndex(self):
+               return self.l.getCurrentSelectionIndex()
+       
        def invalidateCurrent(self):
                self.l.invalidateEntry(self.l.getCurrentSelectionIndex())
 
        def invalidateCurrent(self):
                self.l.invalidateEntry(self.l.getCurrentSelectionIndex())
 
index d3c9cc7..884f97c 100644 (file)
 from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigSubsection, ConfigMAC
 
 import os
 from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigSubsection, ConfigMAC
 
 import os
+import re
 from socket import *
 
 class Network:
 from socket import *
 
 class Network:
-       def __init__(self, iface = "eth0"):
-               self.iface = iface
+       def __init__(self):
+               self.ifaces = {}
+               self.nameservers = []
+               self.getInterfaces()
                
                
+       def getInterfaces(self):
+               devicesPattern = re.compile('[a-z]+[0-9]+')
+               
+               fp = file('/proc/net/dev', 'r')
+               result = fp.readlines()
+               fp.close()
+               for line in result:
+                       try:
+                               device = devicesPattern.search(line).group()
+                               self.ifaces[device] = self.getDataForInterface(device)
+                       except AttributeError:
+                               pass
+               
+               print "self.ifaces:", self.ifaces
+               self.loadNetworkConfig()
+               #self.writeNetworkConfig()
+               #print ord(' ')
+               #for line in result:
+#                      print ord(line[0])
+
+       # helper function
+       def regExpMatch(self, pattern, string):
+               if string is None:
+                       return None
+               try:
+                       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('.')
+               ip = []
+               for x in strIP:
+                       ip.append(int(x))
+               return ip
+
+       def getDataForInterface(self, iface):
+               #ipRegexp = '[0-9]{1,2,3}\.[0-9]{1,2,3}\.[0-9]{1,2,3}\.[0-9]{1,2,3}'
+               ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
+               ipLinePattern = re.compile('inet addr:' + ipRegexp)
+               netmaskLinePattern = re.compile('Mask:' + ipRegexp)
+               bcastLinePattern = re.compile('Bcast:' + ipRegexp)
+               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()
+               data = { 'up': False, 'dhcp': False }
+               for line in result:
+                       ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line))
+                       netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line))
+                       bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line))
+                       up = self.regExpMatch(upPattern, line)
+                       mac = self.regExpMatch(macPattern, line)
+                       if ip is not None:
+                               data['ip'] = self.convertIP(ip)
+                       if netmask is not None:
+                               data['netmask'] = self.convertIP(netmask)
+                       if bcast is not None:
+                               data['bcast'] = self.convertIP(bcast)
+                       if up is not None:
+                               data['up'] = True
+                       if mac is not None:
+                               data['mac'] = mac
+               if not data.has_key('ip'):
+                       data['dhcp'] = True
+                       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()                              
+               for line in result:
+                       print line[0:7]
+                       if line[0:7] == "0.0.0.0":
+                               gateway = self.regExpMatch(ipPattern, line[16:31])
+                               if gateway is not None:
+                                       data['gateway'] = self.convertIP(gateway)
+               return data
+
        def writeNetworkConfig(self):
        def writeNetworkConfig(self):
-               # fixme restarting and updating the network too often. possible fix: check current config and execute only if changed :/
-               # fixme using interfaces.tmp instead of interfaces for now
-               fp = file('/etc/network/interfaces', 'w')
+               fp = file('/etc/network/interfaces.tmp', '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")
                fp.write("auto lo\n")
                fp.write("iface lo inet loopback\n\n")
-               fp.write("auto "+self.iface+"\n")
-               if config.network.dhcp.value:
-                       fp.write("iface "+self.iface+" inet dhcp\n")
-               else:
-                       fp.write("iface "+self.iface+" inet static\n")
-                       fp.write("      address %d.%d.%d.%d\n" % tuple(config.network.ip.value))
-                       fp.write("      netmask %d.%d.%d.%d\n" % tuple(config.network.netmask.value))
-                       fp.write("      gateway %d.%d.%d.%d\n" % tuple(config.network.gateway.value))
-                       fp2 = file('/etc/resolv.conf', 'w')
-                       fp2.write("nameserver %d.%d.%d.%d\n" % tuple(config.network.dns.value))
-                       fp2.close()
+               
+               for ifacename, iface in self.ifaces.items():
+                       if iface['up'] == True:
+                               fp.write("auto " + ifacename + "\n")
+                       if iface['dhcp'] == True:
+                               fp.write("iface "+ ifacename +" inet dhcp\n")
+                       else:
+                               fp.write("iface "+ ifacename +" inet static\n")
+                               if iface.has_key('ip'):
+                                       print tuple(iface['ip'])
+                                       fp.write("      address %d.%d.%d.%d\n" % tuple(iface['ip']))
+                                       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']))
+                       fp.write("\n")
                fp.close()
                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):
 
        def loadNetworkConfig(self):
+               self.loadNameserverConfig()
+               
+               interfaces = []
+               # parse the interfaces-file
                try:
                try:
-                       # parse the interfaces-file
-                       fp = file('/etc/network/interfaces', 'r')
+                       fp = file('/etc/network/interfaces.tmp', 'r')
                        interfaces = fp.readlines()
                        fp.close()
                        interfaces = fp.readlines()
                        fp.close()
+               except:
+                       print "[Network.py] interfaces - opening failed"
                        
                        
-                       ifaces = {}
-                       currif = ""
-                       for i in interfaces:
-                               split = i.strip().split(' ')
-                               if (split[0] == "iface"):
-                                       currif = split[1]
-                                       ifaces[currif] = {}
-                                       if (len(split) == 4 and split[3] == "dhcp"):
-                                               ifaces[currif]["dhcp"] = "yes"
-                                       else:
-                                               ifaces[currif]["dhcp"] = "no"
-                               if (currif != ""):
-                                       if (split[0] == "address"):
-                                               ifaces[currif]["address"] = map(int, split[1].split('.'))
-                                       if (split[0] == "netmask"):
-                                               ifaces[currif]["netmask"] = map(int, split[1].split('.'))
-                                       if (split[0] == "gateway"):
-                                               ifaces[currif]["gateway"] = map(int, split[1].split('.'))                                                                       
-                       
-                       # parse the resolv.conf-file
+               ifaces = {}
+               currif = ""
+               for i in interfaces:
+                       split = i.strip().split(' ')
+                       if (split[0] == "iface"):
+                               currif = split[1]
+                               ifaces[currif] = {}
+                               if (len(split) == 4 and split[3] == "dhcp"):
+                                       ifaces[currif]["dhcp"] = True
+                               else:
+                                       ifaces[currif]["dhcp"] = False
+                       if (currif != ""):
+                               if (split[0] == "address"):
+                                       ifaces[currif]["address"] = map(int, split[1].split('.'))
+                               if (split[0] == "netmask"):
+                                       ifaces[currif]["netmask"] = map(int, split[1].split('.'))
+                               if (split[0] == "gateway"):
+                                       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')
                        resolv = fp.readlines()
                        fp.close()
                        fp = file('/etc/resolv.conf', 'r')
                        resolv = fp.readlines()
                        fp.close()
+                       self.nameservers = []
                except:
                except:
-                       print "[Network.py] loading network files failed"
-                       
-               try:
-                       for i in resolv:
-                               split = i.strip().split(' ')
-                               if (split[0] == "nameserver"):
-                                       config.network.dns.value = map(int, split[1].split('.'))
-               except:
-                       print "[Network.py] resolv.conf parsing failed"
+                       print "[Network.py] resolv.conf - opening failed"
                
                
-               try:
-                       # set this config
-                       if (ifaces.has_key(self.iface)):
-                               if (ifaces[self.iface]["dhcp"] == "yes"):
-                                       config.network.dhcp.value = 1
-                               else:
-                                       config.network.dhcp.value = 0
-                               if (ifaces[self.iface].has_key("address")): config.network.ip.value = ifaces[self.iface]["address"]
-                               if (ifaces[self.iface].has_key("netmask")): config.network.netmask.value = ifaces[self.iface]["netmask"]
-                               if (ifaces[self.iface].has_key("gateway")): config.network.gateway.value = ifaces[self.iface]["gateway"]
-               except:
-                       print "[Network.py] parsing network 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          
 
        def deactivateNetworkConfig(self):
 
        def deactivateNetworkConfig(self):
-               import os
-               os.system("ip addr flush"+self.iface)
+               for iface in self.ifaces.keys():
+                       os.system("ip addr flush" + iface)
                os.system("/etc/init.d/networking stop")
                os.system("killall -9 udhcpc")
                os.system("rm /var/run/udhcpc*")
 
        def activateNetworkConfig(self):
                os.system("/etc/init.d/networking stop")
                os.system("killall -9 udhcpc")
                os.system("rm /var/run/udhcpc*")
 
        def activateNetworkConfig(self):
-               import os
                os.system("/etc/init.d/networking start")
                os.system("/etc/init.d/networking start")
-               config.network.ip.value = self.getCurrentIP()
-               config.network.ip.save()
                
                
-       def setDHCP(self, useDHCP):
-               if (useDHCP):
-                       print "Using DHCP"
-                       config.network.ip.enabled = False
-                       config.network.netmask.enabled = False
-                       config.network.gateway.enabled = False
-                       config.network.dns.enabled = False
-               else:
-                       print "NOT using DHCP"
-                       config.network.ip.enabled = True
-                       config.network.netmask.enabled = True
-                       config.network.gateway.enabled = True
-                       config.network.dns.enabled = True
-                                       
-       def setIPNameserver(self, ip):
-               return
-               resolvconf = file('/etc/resolv.conf', 'w')
-               resolvconf.write("nameserver %d.%d.%d.%d" % tuple(ip))
-               resolvconf.close()
-               
-       def setMACAddress(self, mac):
-               #os.system("echo ifconfig eth0 ether %02x:%02x:%02x:%02x:%02x:%02x" % tuple(mac))
-               pass
-               
-       def setIPAddress(self, ip):
-               pass
-               #os.system("echo ifconfig eth0 %d.%d.%d.%d" % tuple(ip))
-               #self.writeNetworkConfig()
-
-       def setGateway(self, ip):
-               pass
-               #os.system("echo route add default gw %d.%d.%d.%d" % tuple(ip))
-               #self.writeNetworkConfig()
+       def getNumberOfAdapters(self):
+               return len(self.ifaces)
+       
+       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):
+               if self.ifaces.has_key(iface):
+                       self.ifaces[iface][attribute] = value
+
+       def removeAdapterAttribute(self, iface, attribute):
+               if self.ifaces.has_key(iface):
+                       if self.ifaces[iface].has_key(attribute):
+                               del self.ifaces[iface][attribute]
+                               
+       def getNameserverList(self):
+               return self.nameservers
+       
+       def clearNameservers(self):
+               self.nameservers = []
+       
+       def addNameserver(self, nameserver):
+               if nameserver not in self.nameservers:
+                       self.nameservers.append(nameserver)
                
                
-       def setNetmask(self, ip):
-               pass
-               #os.system("echo ifconfig eth0 netmask %d.%d.%d.%d" % tuple(ip))                
-               #self.writeNetworkConfig()              
-
-       def getCurrentIP(self):
-               ipstr = [0,0,0,0]
-               for x in os.popen("ifconfig "+self.iface+" | grep 'inet addr:'", "r").readline().split(' '):
-                       if x.split(':')[0] == "addr":
-                               ipstr = x.split(':')[1].split('.')
-               ip = []
-               for x in ipstr:
-                       ip.append(int(x))
-               print "[Network.py] got ip " + str(ip)
-               return ip
+       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
 
 iNetwork = Network()
 
 def InitNetwork():
 
 iNetwork = Network()
 
 def InitNetwork():
-       config.network = ConfigSubsection()
-       config.network.dhcp = NoSave(ConfigYesNo(default=True))
-       config.network.ip = NoSave(ConfigIP(default=iNetwork.getCurrentIP()))
-       config.network.netmask = NoSave(ConfigIP(default=[255,255,255,0]))
-       config.network.gateway = NoSave(ConfigIP(default=[192,168,1,3]))
-       config.network.dns = NoSave(ConfigIP(default=[192,168,1,3]))
-       config.network.mac = NoSave(ConfigMAC(default=[00,11,22,33,44,55]))
-
-       iNetwork.loadNetworkConfig()
-       
-       def writeNetworkConfig(configElement):
-               iNetwork.writeNetworkConfig()
-               
-       def setIPAddress(configElement):
-               iNetwork.setIPAddress(configElement.value)
-
-       def setGateway(configElement):
-               iNetwork.setGateway(configElement.value)
-
-       def setNetmask(configElement):
-               iNetwork.setNetmask(configElement.value)                
-
-       def setDHCP(configElement):
-               iNetwork.setDHCP(configElement.value)
-
-       def setIPNameserver(configElement):
-               iNetwork.setIPNameserver(configElement.value)
-
-       def setMACAddress(configElement):
-               iNetwork.setMACAddress(configElement.value)
-
-
-       # this will call the "setup-val" initial
-       config.network.dhcp.addNotifier(setDHCP)
-       config.network.ip.addNotifier(setIPAddress)
-       config.network.netmask.addNotifier(setNetmask)  
-       config.network.gateway.addNotifier(setGateway)
-       config.network.dns.addNotifier(setIPNameserver)
-       config.network.mac.addNotifier(setMACAddress)
+       pass
index c792446..b80dcad 100644 (file)
@@ -41,6 +41,10 @@ class PluginDescriptor:
        # file-scanner, fnc must return a list of Scanners
        WHERE_FILESCAN = 9
        
        # file-scanner, fnc must return a list of Scanners
        WHERE_FILESCAN = 9
        
+       # fnc must take an interface name as parameter and return None if the plugin supports an extended setup
+       # or return a function which is called with session and the interface name for extended setup of this interface
+       WHERE_NETWORKSETUP = 10
+       
        def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None):
                self.name = name
                if type(where) is list:
        def __init__(self, name = "Plugin", where = [ ], description = "", icon = None, fnc = None):
                self.name = name
                if type(where) is list:
index 80d8101..c9e2782 100644 (file)
@@ -1 +1 @@
-SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl
+SUBDIRS = SoftwareUpdate FrontprocessorUpgrade PositionerSetup ConfigurationBackup Satfinder SkinSelector SatelliteEquipmentControl WirelessLan
index 278c660..640da61 100644 (file)
@@ -4,11 +4,114 @@ from Components.ConfigList import ConfigList, ConfigListScreen
 from Components.config import config, getConfigListEntry
 from Components.Network import iNetwork
 from Components.Label import Label
 from Components.config import config, getConfigListEntry
 from Components.Network import iNetwork
 from Components.Label import Label
+from Components.MenuList import MenuList
+from Components.config import config, ConfigYesNo, ConfigIP, NoSave, ConfigSubsection, ConfigNothing
+from Components.PluginComponent import plugins
+from Plugins.Plugin import PluginDescriptor
 
 
-class NetworkSetup(Screen, ConfigListScreen):
+
+class NetworkAdapterSelection(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
        def __init__(self, session):
                Screen.__init__(self, session)
+               
+               self["adapterlist"] = MenuList(iNetwork.getAdapterList())
+               
+               self["actions"] = ActionMap(["OkCancelActions"],
+               {
+                       "ok": self.okbuttonClick ,
+                       "cancel": self.close
+               })
+
+       def okbuttonClick(self):
+               selection = self["adapterlist"].getCurrent()
+               print "selection:", selection
+               if selection is not None:
+                       self.session.open(AdapterSetup, selection)
+                       
+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.createConfig()
+               
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
+               {
+                       "ok": self.ok,
+                       "cancel": self.cancel,
+                       "green": self.add,
+                       "red": self.remove
+               }, -2)
+
+               self.list = []
+               ConfigListScreen.__init__(self, self.list)
+               self.createSetup()
+               
+       def createConfig(self):
+               self.nameservers = iNetwork.getNameserverList()
+               self.nameserverEntries = []
+               
+               for nameserver in self.nameservers:
+                       self.nameserverEntries.append(NoSave(ConfigIP(default=nameserver)))
+                       
+       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]))
+               
+               self["config"].list = self.list
+               self["config"].l.setList(self.list)
+
+       def ok(self):
+               iNetwork.clearNameservers()
+               for nameserver in self.nameserverEntries:
+                       iNetwork.addNameserver(nameserver.value)
+               iNetwork.writeNameserverConfig()
+               self.close()
+       
+       def cancel(self):
+               iNetwork.clearNameservers()
+               print "backup-list:", self.backupNameserverList
+               for nameserver in self.backupNameserverList:
+                       iNetwork.addNameserver(nameserver)
+               self.close()
+       
+       def add(self):
+               iNetwork.addNameserver([0,0,0,0])
+               self.createConfig()
+               self.createSetup()
+       
+       def remove(self):
+               print "currentIndex:", self["config"].getCurrentIndex()
+               
+               index = self["config"].getCurrentIndex()
+               if index < len(self.nameservers):
+                       iNetwork.removeNameserver(self.nameservers[index])
+                       self.createConfig()
+                       self.createSetup()
+
+               
+class AdapterSetup(Screen, ConfigListScreen):
+       def __init__(self, session, iface):
+               Screen.__init__(self, session)
+               
+               self.iface = iface
+
+               print iNetwork.getAdapterAttribute(self.iface, "dhcp")
+               self.dhcpConfigEntry = NoSave(ConfigYesNo(default=iNetwork.getAdapterAttribute(self.iface, "dhcp")))
+               self.hasGatewayConfigEntry = NoSave(ConfigYesNo(default=True))
+               self.ipConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "ip")))
+               self.netmaskConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "netmask")))
+               self.gatewayConfigEntry = NoSave(ConfigIP(default=iNetwork.getAdapterAttribute(self.iface, "gateway")))
         
         
+               self["iface"] = Label(iNetwork.getAdapterName(self.iface))
+                       
                self["actions"] = ActionMap(["SetupActions"],
                {
                        "ok": self.ok,
                self["actions"] = ActionMap(["SetupActions"],
                {
                        "ok": self.ok,
@@ -24,13 +127,22 @@ class NetworkSetup(Screen, ConfigListScreen):
        def createSetup(self):
                self.list = []
 
        def createSetup(self):
                self.list = []
 
-               self.dhcpEntry = getConfigListEntry(_("Use DHCP"), config.network.dhcp)
+               self.dhcpEntry = getConfigListEntry(_("Use DHCP"), self.dhcpConfigEntry)
                self.list.append(self.dhcpEntry)
                self.list.append(self.dhcpEntry)
-               self.list.append(getConfigListEntry(_('IP Address'), config.network.ip))
-               if not config.network.dhcp.value:
-                       self.list.append(getConfigListEntry(_('Netmask'), config.network.netmask))
-                       self.list.append(getConfigListEntry(_('Gateway'), config.network.gateway))
-                       self.list.append(getConfigListEntry(_('Nameserver'), config.network.dns))
+               if not self.dhcpConfigEntry.value:
+                       self.list.append(getConfigListEntry(_('IP Address'), self.ipConfigEntry))
+                       self.list.append(getConfigListEntry(_('Netmask'), self.netmaskConfigEntry))
+                       self.list.append(getConfigListEntry(_('Use a gateway'), self.hasGatewayConfigEntry))
+                       if self.hasGatewayConfigEntry.value:
+                               self.list.append(getConfigListEntry(_('Gateway'), self.gatewayConfigEntry))
+               
+               self.extended = None
+               for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKSETUP):
+                       callFnc = p.__call__(self.iface)
+                       if callFnc is not None:
+                               self.extended = callFnc
+                               self.extendedSetup = getConfigListEntry(_('Extended Setup...'), NoSave(ConfigNothing()))
+                               self.list.append(self.extendedSetup)
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
 
                self["config"].list = self.list
                self["config"].l.setList(self.list)
@@ -49,16 +161,24 @@ class NetworkSetup(Screen, ConfigListScreen):
                self.createSetup()
 
        def ok(self):
                self.createSetup()
 
        def ok(self):
-               #for x in self["config"].list:
-                       #x[1].save()
-               
-               iNetwork.deactivateNetworkConfig()
-               iNetwork.writeNetworkConfig()    
-               iNetwork.activateNetworkConfig()
-               self.close()
+               selection = self["config"].getCurrent()
+               if selection == self.extendedSetup:
+                       self.extended(self.session, self.iface)
+               else:
+                       iNetwork.setAdapterAttribute(self.iface, "dhcp", self.dhcpConfigEntry.value)
+                       iNetwork.setAdapterAttribute(self.iface, "ip", self.ipConfigEntry.value)
+                       iNetwork.setAdapterAttribute(self.iface, "netmask", self.netmaskConfigEntry.value)
+                       if self.hasGatewayConfigEntry.value:
+                               iNetwork.setAdapterAttribute(self.iface, "gateway", self.gatewayConfigEntry.value)
+                       else:
+                               iNetwork.removeAdapterAttribute(self.iface, "gateway")
+                                       
+                                       
+                       iNetwork.deactivateNetworkConfig()
+                       iNetwork.writeNetworkConfig()    
+                       iNetwork.activateNetworkConfig()
+                       self.close()
 
        def cancel(self):
 
        def cancel(self):
-               for x in self["config"].list:
-                       x[1].cancel()
-               iNetwork.loadNetworkConfig()
+               iNetwork.getInterfaces()
                self.close()
                self.close()