1 from os import system, popen, path as os_path, listdir
2 from re import compile as re_compile, search as re_search
4 from enigma import eConsoleAppContainer
5 from Components.Console import Console
10 self.configuredInterfaces = []
12 self.ethtool_bin = "/usr/sbin/ethtool"
13 self.container = eConsoleAppContainer()
14 self.Console = Console()
17 def getInterfaces(self, callback = None):
18 devicesPattern = re_compile('[a-z]+[0-9]+')
19 self.configuredInterfaces = []
20 fp = file('/proc/net/dev', 'r')
21 result = fp.readlines()
25 device = devicesPattern.search(line).group()
28 self.getDataForInterface(device, callback)
29 except AttributeError:
33 def regExpMatch(self, pattern, string):
37 return pattern.search(string).group()
38 except AttributeError:
41 # helper function to convert ips from a sring to a list of ints
42 def convertIP(self, ip):
49 def IPaddrFinished(self, result, retval, extra_args):
50 (iface, callback ) = extra_args
51 data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
52 globalIPpattern = re_compile("scope global")
53 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
54 ipLinePattern = re_compile('inet ' + ipRegexp +'/')
55 ipPattern = re_compile(ipRegexp)
57 for line in result.splitlines():
58 split = line.strip().split(' ',2)
59 if (split[1] == iface):
60 if re_search(globalIPpattern, split[2]):
61 ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2]))
63 data['ip'] = self.convertIP(ip)
64 if not data.has_key('ip'):
66 data['ip'] = [0, 0, 0, 0]
67 data['netmask'] = [0, 0, 0, 0]
68 data['gateway'] = [0, 0, 0, 0]
70 cmd = "ifconfig " + iface
71 self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback])
73 def getDataForInterface(self, iface,callback):
74 #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
76 self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
78 def ifconfigFinished(self, result, retval, extra_args ):
79 (iface, data, callback ) = extra_args
80 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
81 ipLinePattern = re_compile('inet addr:' + ipRegexp)
82 netmaskLinePattern = re_compile('Mask:' + ipRegexp)
83 bcastLinePattern = re_compile('Bcast:' + ipRegexp)
84 ipPattern = re_compile(ipRegexp)
85 upPattern = re_compile('UP ')
86 macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}')
88 for line in result.splitlines():
89 #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line))
90 netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line))
91 bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line))
92 up = self.regExpMatch(upPattern, line)
93 mac = self.regExpMatch(macPattern, line)
95 # data['ip'] = self.convertIP(ip)
96 if netmask is not None:
97 data['netmask'] = self.convertIP(netmask)
99 data['bcast'] = self.convertIP(bcast)
102 if iface is not 'lo':
103 self.configuredInterfaces.append(iface)
107 cmd = "route -n | grep " + iface
108 self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback])
110 def routeFinished(self, result, retval, extra_args):
111 (iface, data, callback) = extra_args
112 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
113 ipPattern = re_compile(ipRegexp)
114 ipLinePattern = re_compile(ipRegexp)
116 for line in result.splitlines():
118 if line[0:7] == "0.0.0.0":
119 gateway = self.regExpMatch(ipPattern, line[16:31])
120 if gateway is not None:
121 data['gateway'] = self.convertIP(gateway)
123 for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask
124 split = line.strip().split(' ')
125 if re_search(ipPattern, split[0]):
126 foundip = self.convertIP(split[0])
127 if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]):
128 if re_search(ipPattern, split[4]):
129 mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4]))
131 data['netmask'] = self.convertIP(mask)
132 self.ifaces[iface] = data
133 self.loadNetworkConfig(iface,callback)
135 def writeNetworkConfig(self):
136 self.configuredInterfaces = []
137 fp = file('/etc/network/interfaces', 'w')
138 fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
139 fp.write("auto lo\n")
140 fp.write("iface lo inet loopback\n\n")
141 for ifacename, iface in self.ifaces.items():
142 if iface['up'] == True:
143 fp.write("auto " + ifacename + "\n")
144 self.configuredInterfaces.append(ifacename)
145 if iface['dhcp'] == True:
146 fp.write("iface "+ ifacename +" inet dhcp\n")
147 if iface['dhcp'] == False:
148 fp.write("iface "+ ifacename +" inet static\n")
149 if iface.has_key('ip'):
150 print tuple(iface['ip'])
151 fp.write(" address %d.%d.%d.%d\n" % tuple(iface['ip']))
152 fp.write(" netmask %d.%d.%d.%d\n" % tuple(iface['netmask']))
153 if iface.has_key('gateway'):
154 fp.write(" gateway %d.%d.%d.%d\n" % tuple(iface['gateway']))
155 if iface.has_key("configStrings"):
156 fp.write("\n" + iface["configStrings"] + "\n")
157 if iface["preup"] is not False and not iface.has_key("configStrings"):
158 fp.write(iface["preup"])
159 fp.write(iface["postdown"])
162 self.writeNameserverConfig()
164 def writeNameserverConfig(self):
165 fp = file('/etc/resolv.conf', 'w')
166 for nameserver in self.nameservers:
167 fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver))
170 def loadNetworkConfig(self,iface,callback = None):
172 # parse the interfaces-file
174 fp = file('/etc/network/interfaces', 'r')
175 interfaces = fp.readlines()
178 print "[Network.py] interfaces - opening failed"
183 split = i.strip().split(' ')
184 if (split[0] == "iface"):
187 if (len(split) == 4 and split[3] == "dhcp"):
188 ifaces[currif]["dhcp"] = True
190 ifaces[currif]["dhcp"] = False
191 if (currif == iface): #read information only for available interfaces
192 if (split[0] == "address"):
193 ifaces[currif]["address"] = map(int, split[1].split('.'))
194 if self.ifaces[currif].has_key("ip"):
195 if self.ifaces[currif]["ip"] != ifaces[currif]["address"] and ifaces[currif]["dhcp"] == False:
196 self.ifaces[currif]["ip"] = map(int, split[1].split('.'))
197 if (split[0] == "netmask"):
198 ifaces[currif]["netmask"] = map(int, split[1].split('.'))
199 if self.ifaces[currif].has_key("netmask"):
200 if self.ifaces[currif]["netmask"] != ifaces[currif]["netmask"] and ifaces[currif]["dhcp"] == False:
201 self.ifaces[currif]["netmask"] = map(int, split[1].split('.'))
202 if (split[0] == "gateway"):
203 ifaces[currif]["gateway"] = map(int, split[1].split('.'))
204 if self.ifaces[currif].has_key("gateway"):
205 if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False:
206 self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))
207 if (split[0] == "pre-up"):
208 if self.ifaces[currif].has_key("preup"):
209 self.ifaces[currif]["preup"] = i
210 if (split[0] == "post-down"):
211 if self.ifaces[currif].has_key("postdown"):
212 self.ifaces[currif]["postdown"] = i
214 for ifacename, iface in ifaces.items():
215 if self.ifaces.has_key(ifacename):
216 self.ifaces[ifacename]["dhcp"] = iface["dhcp"]
217 if len(self.Console.appContainers) == 0:
219 self.loadNameserverConfig()
220 print "read configured interfac:", ifaces
221 print "self.ifaces after loading:", self.ifaces
222 if callback is not None:
225 def loadNameserverConfig(self):
226 ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
227 nameserverPattern = re_compile("nameserver +" + ipRegexp)
228 ipPattern = re_compile(ipRegexp)
232 fp = file('/etc/resolv.conf', 'r')
233 resolv = fp.readlines()
235 self.nameservers = []
237 print "[Network.py] resolv.conf - opening failed"
240 if self.regExpMatch(nameserverPattern, line) is not None:
241 ip = self.regExpMatch(ipPattern, line)
243 self.nameservers.append(self.convertIP(ip))
245 print "nameservers:", self.nameservers
247 def deactivateNetworkConfig(self):
248 for iface in self.ifaces.keys():
249 system("ip addr flush " + iface)
250 system("/etc/init.d/networking stop")
251 system("killall -9 udhcpc")
252 system("rm /var/run/udhcpc*")
254 def activateNetworkConfig(self):
255 system("/etc/init.d/networking start")
258 def getNumberOfAdapters(self):
259 return len(self.ifaces)
261 def getFriendlyAdapterName(self, x):
262 # maybe this needs to be replaced by an external list.
264 "eth0": _("Integrated Ethernet"),
265 "wlan0": _("Wireless"),
266 "ath0": _("Integrated Wireless")
268 return friendlyNames.get(x, x) # when we have no friendly name, use adapter name
270 def getAdapterName(self, iface):
273 def getAdapterList(self):
274 return self.ifaces.keys()
276 def getAdapterAttribute(self, iface, attribute):
277 if self.ifaces.has_key(iface):
278 if self.ifaces[iface].has_key(attribute):
279 return self.ifaces[iface][attribute]
282 def setAdapterAttribute(self, iface, attribute, value):
283 print "setting for adapter", iface, "attribute", attribute, " to value", value
284 if self.ifaces.has_key(iface):
285 self.ifaces[iface][attribute] = value
287 def removeAdapterAttribute(self, iface, attribute):
288 if self.ifaces.has_key(iface):
289 if self.ifaces[iface].has_key(attribute):
290 del self.ifaces[iface][attribute]
292 def getNameserverList(self):
293 if len(self.nameservers) == 0:
294 return [[0, 0, 0, 0], [0, 0, 0, 0]]
296 return self.nameservers
298 def clearNameservers(self):
299 self.nameservers = []
301 def addNameserver(self, nameserver):
302 if nameserver not in self.nameservers:
303 self.nameservers.append(nameserver)
305 def removeNameserver(self, nameserver):
306 if nameserver in self.nameservers:
307 self.nameservers.remove(nameserver)
309 def changeNameserver(self, oldnameserver, newnameserver):
310 if oldnameserver in self.nameservers:
311 for i in range(len(self.nameservers)):
312 if self.nameservers[i] == oldnameserver:
313 self.nameservers[i] = newnameserver
315 def writeDefaultNetworkConfig(self,mode='lan'):
316 fp = file('/etc/network/interfaces', 'w')
317 fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
318 fp.write("auto lo\n")
319 fp.write("iface lo inet loopback\n\n")
321 fp.write("auto wlan0\n")
322 fp.write("iface wlan0 inet dhcp\n")
323 if mode == 'wlan-mpci':
324 fp.write("auto ath0\n")
325 fp.write("iface ath0 inet dhcp\n")
327 fp.write("auto eth0\n")
328 fp.write("iface eth0 inet dhcp\n")
332 def resetNetworkConfig(self,mode='lan'):
333 self.deactivateNetworkConfig()
334 self.writeDefaultNetworkConfig(mode)
336 system("ifconfig eth0 down")
337 system("ifconfig ath0 down")
338 system("ifconfig wlan0 up")
339 if mode == 'wlan-mpci':
340 system("ifconfig eth0 down")
341 system("ifconfig wlan0 down")
342 system("ifconfig ath0 up")
344 system("ifconfig eth0 up")
345 system("ifconfig wlan0 down")
346 system("ifconfig ath0 down")
349 def checkNetworkState(self):
350 # www.dream-multimedia-tv.de, www.heise.de, www.google.de
351 return system("ping -c 1 82.149.226.170") == 0 or \
352 system("ping -c 1 193.99.144.85") == 0 or \
353 system("ping -c 1 209.85.135.103") == 0
355 def restartNetwork(self):
356 iNetwork.deactivateNetworkConfig()
357 iNetwork.activateNetworkConfig()
359 def getLinkState(self,iface,callback):
360 self.dataAvail = callback
361 cmd = self.ethtool_bin + " " + iface
362 self.container.appClosed.append(self.cmdFinished)
363 self.container.dataAvail.append(callback)
364 self.container.execute(cmd)
366 def cmdFinished(self,retval):
367 self.container.appClosed.remove(self.cmdFinished)
368 self.container.dataAvail.remove(self.dataAvail)
370 def stopContainer(self):
371 self.container.kill()
373 def ContainerRunning(self):
374 return self.container.running()
376 def checkforInterface(self,iface):
377 if self.getAdapterAttribute(iface, 'up') is True:
380 ret=system("ifconfig " + iface + " up")
381 system("ifconfig " + iface + " down")
387 def checkDNSLookup(self):
388 return system("nslookup www.dream-multimedia-tv.de") == 0 or \
389 system("nslookup www.heise.de") == 0 or \
390 system("nslookup www.google.de")
392 def deactivateInterface(self,iface):
393 system("ifconfig " + iface + " down")
395 def detectWlanModule(self):
396 self.wlanmodule = None
397 rt73_dir = "/sys/bus/usb/drivers/rt73/"
398 zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/"
399 madwifi_dir = "/sys/bus/pci/drivers/ath_pci/"
400 if os_path.exists(madwifi_dir):
401 files = listdir(madwifi_dir)
403 self.wlanmodule = 'madwifi'
404 if os_path.exists(rt73_dir):
405 rtfiles = listdir(rt73_dir)
406 if len(rtfiles) == 2:
407 self.wlanmodule = 'ralink'
408 if os_path.exists(zd1211b_dir):
409 zdfiles = listdir(zd1211b_dir)
410 if len(zdfiles) == 1:
411 self.wlanmodule = 'zydas'
412 return self.wlanmodule