1 from os import system, popen, path as os_path, listdir
2 from re import compile as re_compile
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 system("cat /proc/net/dev")
22 result = fp.readlines()
26 device = devicesPattern.search(line).group()
29 self.getDataForInterface(device, callback)
30 except AttributeError:
34 def regExpMatch(self, pattern, string):
38 return pattern.search(string).group()
39 except AttributeError:
42 # helper function to convert ips from a sring to a list of ints
43 def convertIP(self, ip):
50 def IPaddrFinished(self, result, retval, extra_args):
51 (iface, callback ) = extra_args
52 data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False }
53 globalIPpattern = re_compile("scope global")
54 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
55 ipLinePattern = re_compile('inet ' + ipRegexp +'/')
56 ipPattern = re_compile(ipRegexp)
58 for line in result.splitlines():
59 split = line.strip().split(' ',2)
60 if (split[1] == iface):
61 if re_search(globalIPpattern, split[2]):
62 ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2]))
64 data['ip'] = self.convertIP(ip)
65 if not data.has_key('ip'):
67 data['ip'] = [0, 0, 0, 0]
68 data['netmask'] = [0, 0, 0, 0]
69 data['gateway'] = [0, 0, 0, 0]
71 cmd = "ifconfig " + iface
72 self.Console.ePopen(cmd, self.ifconfigFinished, [iface, data, callback])
74 def getDataForInterface(self, iface,callback):
75 #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
77 self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback])
79 def ifconfigFinished(self, result, retval, extra_args ):
80 (iface, data, callback ) = extra_args
81 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
82 ipLinePattern = re_compile('inet addr:' + ipRegexp)
83 netmaskLinePattern = re_compile('Mask:' + ipRegexp)
84 bcastLinePattern = re_compile('Bcast:' + ipRegexp)
85 ipPattern = re_compile(ipRegexp)
86 upPattern = re_compile('UP ')
87 macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{2}')
89 for line in result.splitlines():
90 #ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, line))
91 netmask = self.regExpMatch(ipPattern, self.regExpMatch(netmaskLinePattern, line))
92 bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, line))
93 up = self.regExpMatch(upPattern, line)
94 mac = self.regExpMatch(macPattern, line)
96 # data['ip'] = self.convertIP(ip)
97 if netmask is not None:
98 data['netmask'] = self.convertIP(netmask)
100 data['bcast'] = self.convertIP(bcast)
103 if iface is not 'lo':
104 self.configuredInterfaces.append(iface)
108 cmd = "route -n | grep " + iface
109 self.Console.ePopen(cmd,self.routeFinished,[iface,data,callback])
111 def routeFinished(self, result, retval, extra_args):
112 (iface, data, callback) = extra_args
113 ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
114 ipPattern = re_compile(ipRegexp)
115 ipLinePattern = re_compile(ipRegexp)
117 for line in result.splitlines():
119 if line[0:7] == "0.0.0.0":
120 gateway = self.regExpMatch(ipPattern, line[16:31])
121 if gateway is not None:
122 data['gateway'] = self.convertIP(gateway)
124 for line in result.splitlines(): #get real netmask in case avahi has overridden ifconfig netmask
125 split = line.strip().split(' ')
126 if re_search(ipPattern, split[0]):
127 foundip = self.convertIP(split[0])
128 if (foundip[0] == data['ip'][0] and foundip[1] == data['ip'][1]):
129 if re_search(ipPattern, split[4]):
130 mask = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[4]))
132 data['netmask'] = self.convertIP(mask)
133 self.ifaces[iface] = data
134 self.loadNetworkConfig(iface,callback)
136 def writeNetworkConfig(self):
137 self.configuredInterfaces = []
138 fp = file('/etc/network/interfaces', 'w')
139 fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
140 fp.write("auto lo\n")
141 fp.write("iface lo inet loopback\n\n")
142 for ifacename, iface in self.ifaces.items():
143 if iface['up'] == True:
144 fp.write("auto " + ifacename + "\n")
145 self.configuredInterfaces.append(ifacename)
146 if iface['dhcp'] == True:
147 fp.write("iface "+ ifacename +" inet dhcp\n")
148 if iface['dhcp'] == False:
149 fp.write("iface "+ ifacename +" inet static\n")
150 if iface.has_key('ip'):
151 print tuple(iface['ip'])
152 fp.write(" address %d.%d.%d.%d\n" % tuple(iface['ip']))
153 fp.write(" netmask %d.%d.%d.%d\n" % tuple(iface['netmask']))
154 if iface.has_key('gateway'):
155 fp.write(" gateway %d.%d.%d.%d\n" % tuple(iface['gateway']))
156 if iface.has_key("configStrings"):
157 fp.write("\n" + iface["configStrings"] + "\n")
158 if iface["preup"] is not False and not iface.has_key("configStrings"):
159 fp.write(iface["preup"])
160 fp.write(iface["postdown"])
163 self.writeNameserverConfig()
165 def writeNameserverConfig(self):
166 fp = file('/etc/resolv.conf', 'w')
167 for nameserver in self.nameservers:
168 fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver))
171 def loadNetworkConfig(self,iface,callback = None):
173 # parse the interfaces-file
175 fp = file('/etc/network/interfaces', 'r')
176 interfaces = fp.readlines()
179 print "[Network.py] interfaces - opening failed"
184 split = i.strip().split(' ')
185 if (split[0] == "iface"):
188 if (len(split) == 4 and split[3] == "dhcp"):
189 ifaces[currif]["dhcp"] = True
191 ifaces[currif]["dhcp"] = False
192 if (currif == iface): #read information only for available interfaces
193 if (split[0] == "address"):
194 ifaces[currif]["address"] = map(int, split[1].split('.'))
195 if self.ifaces[currif].has_key("ip"):
196 if self.ifaces[currif]["ip"] != ifaces[currif]["address"] and ifaces[currif]["dhcp"] == False:
197 self.ifaces[currif]["ip"] = map(int, split[1].split('.'))
198 if (split[0] == "netmask"):
199 ifaces[currif]["netmask"] = map(int, split[1].split('.'))
200 if self.ifaces[currif].has_key("netmask"):
201 if self.ifaces[currif]["netmask"] != ifaces[currif]["netmask"] and ifaces[currif]["dhcp"] == False:
202 self.ifaces[currif]["netmask"] = map(int, split[1].split('.'))
203 if (split[0] == "gateway"):
204 ifaces[currif]["gateway"] = map(int, split[1].split('.'))
205 if self.ifaces[currif].has_key("gateway"):
206 if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False:
207 self.ifaces[currif]["gateway"] = map(int, split[1].split('.'))
208 if (split[0] == "pre-up"):
209 if self.ifaces[currif].has_key("preup"):
210 self.ifaces[currif]["preup"] = i
211 if (split[0] == "post-down"):
212 if self.ifaces[currif].has_key("postdown"):
213 self.ifaces[currif]["postdown"] = i
215 for ifacename, iface in ifaces.items():
216 if self.ifaces.has_key(ifacename):
217 self.ifaces[ifacename]["dhcp"] = iface["dhcp"]
218 if len(self.Console.appContainers) == 0:
220 self.loadNameserverConfig()
221 print "read configured interfac:", ifaces
222 print "self.ifaces after loading:", self.ifaces
223 if callback is not None:
226 def loadNameserverConfig(self):
227 ipRegexp = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
228 nameserverPattern = re_compile("nameserver +" + ipRegexp)
229 ipPattern = re_compile(ipRegexp)
233 fp = file('/etc/resolv.conf', 'r')
234 resolv = fp.readlines()
236 self.nameservers = []
238 print "[Network.py] resolv.conf - opening failed"
241 if self.regExpMatch(nameserverPattern, line) is not None:
242 ip = self.regExpMatch(ipPattern, line)
244 self.nameservers.append(self.convertIP(ip))
246 print "nameservers:", self.nameservers
248 def deactivateNetworkConfig(self):
249 for iface in self.ifaces.keys():
250 system("ip addr flush " + iface)
251 system("/etc/init.d/networking stop")
252 system("killall -9 udhcpc")
253 system("rm /var/run/udhcpc*")
255 def activateNetworkConfig(self):
256 system("/etc/init.d/networking start")
259 def getNumberOfAdapters(self):
260 return len(self.ifaces)
262 def getFriendlyAdapterName(self, x):
263 # maybe this needs to be replaced by an external list.
265 "eth0": _("Integrated Ethernet"),
266 "wlan0": _("Wireless"),
267 "ath0": _("Integrated Wireless")
269 return friendlyNames.get(x, x) # when we have no friendly name, use adapter name
271 def getAdapterName(self, iface):
274 def getAdapterList(self):
275 return self.ifaces.keys()
277 def getAdapterAttribute(self, iface, attribute):
278 if self.ifaces.has_key(iface):
279 if self.ifaces[iface].has_key(attribute):
280 return self.ifaces[iface][attribute]
283 def setAdapterAttribute(self, iface, attribute, value):
284 print "setting for adapter", iface, "attribute", attribute, " to value", value
285 if self.ifaces.has_key(iface):
286 self.ifaces[iface][attribute] = value
288 def removeAdapterAttribute(self, iface, attribute):
289 if self.ifaces.has_key(iface):
290 if self.ifaces[iface].has_key(attribute):
291 del self.ifaces[iface][attribute]
293 def getNameserverList(self):
294 if len(self.nameservers) == 0:
295 return [[0, 0, 0, 0], [0, 0, 0, 0]]
297 return self.nameservers
299 def clearNameservers(self):
300 self.nameservers = []
302 def addNameserver(self, nameserver):
303 if nameserver not in self.nameservers:
304 self.nameservers.append(nameserver)
306 def removeNameserver(self, nameserver):
307 if nameserver in self.nameservers:
308 self.nameservers.remove(nameserver)
310 def changeNameserver(self, oldnameserver, newnameserver):
311 if oldnameserver in self.nameservers:
312 for i in range(len(self.nameservers)):
313 if self.nameservers[i] == oldnameserver:
314 self.nameservers[i] = newnameserver
316 def writeDefaultNetworkConfig(self,mode='lan'):
317 fp = file('/etc/network/interfaces', 'w')
318 fp.write("# automatically generated by enigma 2\n# do NOT change manually!\n\n")
319 fp.write("auto lo\n")
320 fp.write("iface lo inet loopback\n\n")
322 fp.write("auto wlan0\n")
323 fp.write("iface wlan0 inet dhcp\n")
324 if mode == 'wlan-mpci':
325 fp.write("auto ath0\n")
326 fp.write("iface ath0 inet dhcp\n")
328 fp.write("auto eth0\n")
329 fp.write("iface eth0 inet dhcp\n")
333 def resetNetworkConfig(self,mode='lan'):
334 self.deactivateNetworkConfig()
335 self.writeDefaultNetworkConfig(mode)
337 system("ifconfig eth0 down")
338 system("ifconfig ath0 down")
339 system("ifconfig wlan0 up")
340 if mode == 'wlan-mpci':
341 system("ifconfig eth0 down")
342 system("ifconfig wlan0 down")
343 system("ifconfig ath0 up")
345 system("ifconfig eth0 up")
346 system("ifconfig wlan0 down")
347 system("ifconfig ath0 down")
350 def checkNetworkState(self):
351 # www.dream-multimedia-tv.de, www.heise.de, www.google.de
352 return system("ping -c 1 82.149.226.170") == 0 or \
353 system("ping -c 1 193.99.144.85") == 0 or \
354 system("ping -c 1 209.85.135.103") == 0
356 def restartNetwork(self):
357 iNetwork.deactivateNetworkConfig()
358 iNetwork.activateNetworkConfig()
360 def getLinkState(self,iface,callback):
361 self.dataAvail = callback
362 cmd = self.ethtool_bin + " " + iface
363 self.container.appClosed.append(self.cmdFinished)
364 self.container.dataAvail.append(callback)
365 self.container.execute(cmd)
367 def cmdFinished(self,retval):
368 self.container.appClosed.remove(self.cmdFinished)
369 self.container.dataAvail.remove(self.dataAvail)
371 def stopContainer(self):
372 self.container.kill()
374 def ContainerRunning(self):
375 return self.container.running()
377 def checkforInterface(self,iface):
378 if self.getAdapterAttribute(iface, 'up') is True:
381 ret=system("ifconfig " + iface + " up")
382 system("ifconfig " + iface + " down")
388 def checkDNSLookup(self):
389 return system("nslookup www.dream-multimedia-tv.de") == 0 or \
390 system("nslookup www.heise.de") == 0 or \
391 system("nslookup www.google.de")
393 def deactivateInterface(self,iface):
394 system("ifconfig " + iface + " down")
396 def detectWlanModule(self):
397 self.wlanmodule = None
398 rt73_dir = "/sys/bus/usb/drivers/rt73/"
399 zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/"
400 madwifi_dir = "/sys/bus/pci/drivers/ath_pci/"
401 if os_path.exists(madwifi_dir):
402 files = listdir(madwifi_dir)
404 self.wlanmodule = 'madwifi'
405 if os_path.exists(rt73_dir):
406 rtfiles = listdir(rt73_dir)
407 if len(rtfiles) == 2:
408 self.wlanmodule = 'ralink'
409 if os_path.exists(zd1211b_dir):
410 zdfiles = listdir(zd1211b_dir)
411 if len(zdfiles) == 1:
412 self.wlanmodule = 'zydas'
413 return self.wlanmodule