class Network: def __init__(self): self.ifaces = {} self.onlyWoWifaces = {} self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "ethtool" self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateInterfaceConsole = Console() self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): if self.remoteRootFS is None: from Components.Harddisk import getProcMounts for parts in getProcMounts(): if parts[1] == '/' and parts[2] == 'nfs': self.remoteRootFS = True break else: self.remoteRootFS = False return self.remoteRootFS def isBlacklisted(self, iface): return iface in ('lo', 'wifi0', 'wmaster0', 'sit0', 'tun0', 'tap0', 'sys0', 'p2p0', 'tunl0') def getInterfaces(self, callback=None): self.configuredInterfaces = [] for device in self.getInstalledAdapters(): self.getAddrInet(device, callback) # helper function def regExpMatch(self, pattern, string): if string is None: return None try: return pattern.search(string).group() except AttributeError: return None # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): return [int(n) for n in ip.split('.')] def getAddrInet(self, iface, callback): data = {'up': False, 'dhcp': False, 'preup': False, 'predown': False} try: data['up'] = int( open('/sys/class/net/%s/flags' % iface).read().strip(), 16) & 1 == 1 if data['up']: self.configuredInterfaces.append(iface) nit = ni.ifaddresses(iface) data['ip'] = self.convertIP(nit[ni.AF_INET][0]['addr']) # ipv4 data['netmask'] = self.convertIP(nit[ni.AF_INET][0]['netmask']) data['bcast'] = self.convertIP(nit[ni.AF_INET][0]['broadcast']) data['mac'] = nit[ni.AF_LINK][0]['addr'] # mac data['gateway'] = self.convertIP( ni.gateways()['default'][ni.AF_INET][0]) # default gw except: data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] self.ifaces[iface] = data self.loadNetworkConfig(iface, callback) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) ipLinePattern = re.compile(ipRegexp) for line in result.splitlines(): print(line[0:7]) if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data self.loadNetworkConfig(iface, callback) def writeNetworkConfig(self): self.configuredInterfaces = [] fp = open('/etc/network/interfaces', 'w') fp.write( "# automatically generated by enigma2\n# do NOT change manually!\n\n" ) fp.write("auto lo\n") fp.write("iface lo inet loopback\n\n") for ifacename, iface in list(self.ifaces.items()): if 'dns-nameservers' in iface and iface['dns-nameservers']: dns = [] for s in iface['dns-nameservers'].split()[1:]: dns.append((self.convertIP(s))) if dns: self.nameservers = dns WoW = False if ifacename in self.onlyWoWifaces: WoW = self.onlyWoWifaces[ifacename] if WoW == False and iface['up'] == True: fp.write("auto " + ifacename + "\n") self.configuredInterfaces.append(ifacename) self.onlyWoWifaces[ifacename] = False elif WoW == True: self.onlyWoWifaces[ifacename] = True fp.write("#only WakeOnWiFi " + ifacename + "\n") if iface['dhcp']: fp.write("iface " + ifacename + " inet dhcp\n") if not iface['dhcp']: fp.write("iface " + ifacename + " inet static\n") fp.write(" hostname $(hostname)\n") if 'ip' in iface: # 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 'gateway' in iface: fp.write(" gateway %d.%d.%d.%d\n" % tuple(iface['gateway'])) if "configStrings" in iface: fp.write(iface["configStrings"]) if iface["preup"] is not False and "configStrings" not in iface: fp.write(iface["preup"]) if iface["predown"] is not False and "configStrings" not in iface: fp.write(iface["predown"]) fp.write("\n") fp.close() self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): try: os.system('rm -rf /etc/resolv.conf') fp = open('/etc/resolv.conf', 'w') for nameserver in self.nameservers: fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver)) fp.close() except: print("[Network.py] interfaces - resolv.conf write failed") def loadNetworkConfig(self, iface, callback=None): interfaces = [] # parse the interfaces-file try: fp = open('/etc/network/interfaces', 'r') 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" and split[2] != "inet6": currif = split[1] ifaces[currif] = {} if len(split) == 4 and split[3] == "dhcp": ifaces[currif]["dhcp"] = True else: ifaces[currif]["dhcp"] = False if currif == iface: #read information only for available interfaces if split[0] == "address": ifaces[currif]["address"] = list( map(int, split[1].split('.'))) if "ip" in self.ifaces[currif]: if self.ifaces[currif]["ip"] != ifaces[currif][ "address"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["ip"] = list( map(int, split[1].split('.'))) if split[0] == "netmask": ifaces[currif]["netmask"] = map(int, split[1].split('.')) if "netmask" in self.ifaces[currif]: if self.ifaces[currif]["netmask"] != ifaces[currif][ "netmask"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["netmask"] = list( map(int, split[1].split('.'))) if split[0] == "gateway": ifaces[currif]["gateway"] = map(int, split[1].split('.')) if "gateway" in self.ifaces[currif]: if self.ifaces[currif]["gateway"] != ifaces[currif][ "gateway"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["gateway"] = list( map(int, split[1].split('.'))) if split[0] == "pre-up": if "preup" in self.ifaces[currif]: self.ifaces[currif]["preup"] = i if split[0] in ("pre-down", "post-down"): if "predown" in self.ifaces[currif]: self.ifaces[currif]["predown"] = i for ifacename, iface in list(ifaces.items()): if ifacename in self.ifaces: self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if self.Console: if len(self.Console.appContainers) == 0: # save configured interfacelist self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() # print "read configured interface:", ifaces # print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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 = open('/etc/resolv.conf', 'r') resolv = fp.readlines() fp.close() 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: self.nameservers.append(self.convertIP(ip)) # print "nameservers:", self.nameservers def getInstalledAdapters(self): return [ x for x in os.listdir('/sys/class/net') if not self.isBlacklisted(x) ] def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in list(self.friendlyNames.keys()): return self.friendlyNames.get(x, x) self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get( x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): name = None if self.isWirelessInterface(iface): if iface not in self.wlan_interfaces: name = _("WLAN connection") if len(self.wlan_interfaces): name += " " + str(len(self.wlan_interfaces) + 1) self.wlan_interfaces.append(iface) else: if iface not in self.lan_interfaces: if getBoxType() == "et10000" and iface == "eth1": name = _("VLAN connection") else: name = _("LAN connection") if len( self.lan_interfaces ) and not getBoxType() == "et10000" and not iface == "eth1": name += " " + str(len(self.lan_interfaces) + 1) self.lan_interfaces.append(iface) return name def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) if moduledir: name = os.path.basename(os.path.realpath(moduledir)) if name in ('ath_pci', 'ath5k', 'ar6k_wlan'): name = 'Atheros' elif name in ('rt73', 'rt73usb', 'rt3070sta'): name = 'Ralink' elif name == 'zd1211b': name = 'Zydas' elif name == 'r871x_usb_drv': name = 'Realtek' elif name == 'brcm-systemport': name = 'Broadcom' elif name == 'wlan': name = name.upper() else: name = _('Unknown') return name + ' ' + _('wireless network interface') def getAdapterName(self, iface): return iface def getAdapterList(self): return list(self.ifaces.keys()) def getAdapterAttribute(self, iface, attribute): if iface in self.ifaces: if attribute in self.ifaces[iface]: return self.ifaces[iface][attribute] return None def setAdapterAttribute(self, iface, attribute, value): # print "setting for adapter", iface, "attribute", attribute, " to value", value if iface in self.ifaces: self.ifaces[iface][attribute] = value def removeAdapterAttribute(self, iface, attribute): if iface in self.ifaces: if attribute in self.ifaces[iface]: del self.ifaces[iface][attribute] def getNameserverList(self): 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 list(range(len(self.nameservers))): if self.nameservers[i] == oldnameserver: self.nameservers[i] = newnameserver def resetNetworkConfig(self, mode='lan', callback=None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in list(self.ifaces.keys()): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ip addr flush dev " + iface + " scope global") self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self, mode='lan', callback=None): fp = open('/etc/network/interfaces', 'w') fp.write( "# automatically generated by enigma2\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") if mode == 'wlan-mpci': fp.write("auto ath0\n") fp.write("iface ath0 inet dhcp\n") if mode == 'lan': fp.write("auto eth0\n") fp.write("iface eth0 inet dhcp\n") fp.write("\n") fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig ath0 down") self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 up") if mode == 'lan': self.commands.append("ifconfig eth0 up") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 down") self.commands.append("/etc/init.d/avahi-daemon start") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode, callback], debug=True) def resetNetworkFinished(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True, mode) def checkNetworkState(self, statecallback): self.NetworkState = 0 cmd1 = "ping -c 1 www.openpli.org" cmd2 = "ping -c 1 www.google.nl" cmd3 = "ping -c 1 www.google.com" self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished, statecallback) def checkNetworkStateFinished(self, result, retval, extra_args): (statecallback) = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self, callback=None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in list(self.ifaces.keys()): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ifdown " + iface) self.commands.append("ip addr flush dev " + iface + " scope global") self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self, extra_args): (callback) = extra_args if callback is not None: try: callback(True) except: pass def getLinkState(self, iface, callback): cmd = self.ethtool_bin + " " + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished, callback) def getLinkStateFinished(self, result, retval, extra_args): (callback) = extra_args result = six.ensure_str(result) if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in list(self.PingConsole.appContainers.keys()): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in list(self.LinkConsole.appContainers.keys()): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in list(self.DnsConsole.appContainers.keys()): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in list(self.restartConsole.appContainers.keys()): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in list(self.Console.appContainers.keys()): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: self.deactivateInterfaceConsole.killAll() self.deactivateInterfaceConsole = None def stopActivateInterfaceConsole(self): if self.activateInterfaceConsole is not None: self.activateInterfaceConsole.killAll() self.activateInterfaceConsole = None def checkforInterface(self, iface): if self.getAdapterAttribute(iface, 'up') is True: return True else: ret = os.system("ifconfig " + iface + " up") os.system("ifconfig " + iface + " down") if ret == 0: return True else: return False def checkDNSLookup(self, statecallback): cmd1 = "nslookup www.cloudflare.com" cmd2 = "nslookup www.google.com" cmd3 = "nslookup www.microsoft.com" self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished, statecallback) def checkDNSLookupFinished(self, result, retval, extra_args): (statecallback) = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self, ifaces, callback=None): self.config_ready = False self.msgPlugins() commands = [] def buildCommands(iface): commands.append("ifdown " + iface) commands.append("ip addr flush dev " + iface + " scope global") #wpa_supplicant sometimes doesn't quit properly on SIGTERM if os.path.exists('/var/run/wpa_supplicant/' + iface): commands.append("wpa_cli -i" + iface + " terminate") if not self.deactivateInterfaceConsole: self.deactivateInterfaceConsole = Console() if isinstance(ifaces, (list, tuple)): for iface in ifaces: if iface != 'eth0' or not self.onRemoteRootFS(): buildCommands(iface) else: if ifaces == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return buildCommands(ifaces) self.deactivateInterfaceConsole.eBatch( commands, self.deactivateInterfaceFinished, [ifaces, callback], debug=True) def deactivateInterfaceFinished(self, extra_args): (ifaces, callback) = extra_args def checkCommandResult(iface): if self.deactivateInterfaceConsole and "ifdown " + iface in self.deactivateInterfaceConsole.appResults: result = str( self.deactivateInterfaceConsole.appResults.get( "ifdown " + iface)).strip("\n") if result == "ifdown: interface " + iface + " not configured": return False else: return True #ifdown sometimes can't get the interface down. if isinstance(ifaces, (list, tuple)): for iface in ifaces: if checkCommandResult(iface) is False: Console().ePopen(("ifconfig " + iface + " down")) else: if checkCommandResult(ifaces) is False: Console().ePopen(("ifconfig " + ifaces + " down")) if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def activateInterface(self, iface, callback=None): if self.config_ready: self.config_ready = False self.msgPlugins() if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return if not self.activateInterfaceConsole: self.activateInterfaceConsole = Console() commands = ["ifup " + iface] self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) def activateInterfaceFinished(self, extra_args): callback = extra_args if self.activateInterfaceConsole: if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: try: callback(True) except: pass def sysfsPath(self, iface): return '/sys/class/net/' + iface def isWirelessInterface(self, iface): if iface in self.wlan_interfaces: return True if os.path.isdir(self.sysfsPath(iface) + '/wireless'): return True # r871x_usb_drv on kernel 2.6.12 is not identifiable over /sys/class/net/'ifacename'/wireless so look also inside /proc/net/wireless device = re.compile('[a-z]{2,}[0-9]*:') ifnames = [] fp = open('/proc/net/wireless', 'r') for line in fp: try: ifnames.append(device.search(line).group()[:-1]) except AttributeError: pass fp.close() if iface in ifnames: return True return False def canWakeOnWiFi(self, iface): if self.sysfsPath(iface) == "/sys/class/net/wlan3" and os.path.exists( "/tmp/bcm/%s" % iface): return True def getWlanModuleDir(self, iface=None): if self.sysfsPath(iface) == "/sys/class/net/wlan3" and os.path.exists( "/tmp/bcm/%s" % iface): devicedir = self.sysfsPath("sys0") + '/device' else: devicedir = self.sysfsPath(iface) + '/device' moduledir = devicedir + '/driver/module' if os.path.isdir(moduledir): return moduledir # identification is not possible over default moduledir try: for x in os.listdir(devicedir): # rt3070 on kernel 2.6.18 registers wireless devices as usb_device (e.g. 1-1.3:1.0) and identification is only possible over /sys/class/net/'ifacename'/device/1-xxx if x.startswith("1-"): moduledir = devicedir + '/' + x + '/driver/module' if os.path.isdir(moduledir): return moduledir # rt73, zd1211b, r871x_usb_drv on kernel 2.6.12 can be identified over /sys/class/net/'ifacename'/device/driver, so look also here moduledir = devicedir + '/driver' if os.path.isdir(moduledir): return moduledir except: pass return None def detectWlanModule(self, iface=None): if not self.isWirelessInterface(iface): return None devicedir = self.sysfsPath(iface) + '/device' if os.path.isdir(devicedir + '/ieee80211'): return 'nl80211' moduledir = self.getWlanModuleDir(iface) if moduledir: module = os.path.basename(os.path.realpath(moduledir)) if module in ('brcm-systemport', ): return 'brcm-wl' if module in ('ath_pci', 'ath5k'): return 'madwifi' if module in ('rt73', 'rt73'): return 'ralink' if module == 'zd1211b': return 'zydas' return 'wext' def calc_netmask(self, nmask): from struct import pack from socket import inet_ntoa mask = 1 << 31 xnet = (1 << 32) - 1 cidr_range = range(0, 32) cidr = int(nmask) if cidr not in list(cidr_range): print('cidr invalid: %d' % cidr) return None else: nm = ((1 << cidr) - 1) << (32 - cidr) netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins( PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready) def hotplug(self, event): interface = event['INTERFACE'] if self.isBlacklisted(interface): return action = event['ACTION'] if action == "add": print("[Network] Add new interface:", interface) self.getAddrInet(interface, None) elif action == "remove": print("[Network] Removed interface:", interface) try: del self.ifaces[interface] except KeyError: pass def getInterfacesNameserverList(self, iface): result = [] nameservers = self.getAdapterAttribute(iface, "dns-nameservers") if nameservers: ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) for x in nameservers.split()[1:]: ip = self.regExpMatch(ipPattern, x) if ip: result.append([int(n) for n in ip.split('.')]) if len( self.nameservers ) and not result: # use also global nameserver if we got no one from interface result.extend(self.nameservers) return result
class Jopkg(Screen): skin = """ <screen name="Jopkg" position="center,center" size="700,500" title="Jopkg" > <widget name="key_yellow" position="10,450" zPosition="2" size="400,22" valign="center" halign="left" font="Regular;20" transparent="1" foregroundColor="yellow" /> <widget name="key_red" position="10,473" zPosition="2" size="130,22" valign="center" halign="left" font="Regular;20" transparent="1" foregroundColor="red" /> <widget name="key_blue" position="520,450" zPosition="2" size="170,22" valign="center" halign="right" font="Regular;20" transparent="1" foregroundColor="blue" /> <widget name="key_green" position="260,473" zPosition="2" size="430,22" valign="center" halign="right" font="Regular;20" transparent="1" foregroundColor="green" /> <widget source="list" render="Listbox" position="5,5" size="690,440" scrollbarMode="showOnDemand"> <convert type="TemplatedMultiContent"> {"template": [ MultiContentEntryText(pos = (55, 2), size = (600, 24), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 2 is the description MultiContentEntryText(pos = (55, 26), size = (600, 16), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 0 is the name MultiContentEntryText(pos = (55, 42), size = (600, 16), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 2 is the description MultiContentEntryPixmapAlphaTest(pos = (5, 2), size = (48, 48), png = 4), # index 4 is the status pixmap MultiContentEntryPixmapAlphaTest(pos = (55, 59), size = (652, 2), png = 5), # index 4 is the div pixmap ], "fonts": [gFont("Regular", 22),gFont("Regular", 14)], "itemHeight": 61 } </convert> </widget> <widget name="whatUPDATED" position="5,75" size="690,330" font="Regular;18" transparent="1"/> </screen>""" def __init__(self, session, args=None): Screen.__init__(self, session) self.session = session self.list = [] self.SelectedIndex = None self.prev_running_service = None self.packages = [] self.installedpackages = [] self.upgradeablepackages = [] self.ActiveFilterID = 0 self.ActiveFilter = "" self.LocalFileName = "" #self.changeList = [] self.maxSize = 8000000 self.maxPackages = 15 if self.getFreeSpace('/var/cache') > self.maxSize * 3: self.CacheDir = "/var/cache" elif self.getFreeSpace('/media/data') > self.maxSize * 4: self.CacheDir = "/media/data" elif self.getFreeSpace('/hdd') > self.maxSize * 4: self.CacheDir = "/hdd" else: self.CacheDir = "/var/cache" if fileExists('/hdd/epg.dat'): os_remove('/hdd/epg.dat') self.firstRun = True self.MainMenu = True self.pushUpgrade = True self.BlockedInstall = False #self.IPTVfullInstalled = False self.BlockedInput = True self.packages2upgrade = 0 self.keyGreenAction = "" self.keyBlueAction = "" self.actionInfo = "" self.SkinSelectorInstalled = 0 self.changed = False #zmiana na True kiedy cokolwiek zainstalujemy self.Console = ComConsole() self.divpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_SKIN_IMAGE, 'skin_default/div-h.png')) self.goinstalledpng = LoadPixmap(cached=True, path=PluginPath + 'icons/install.png') self.goremovepng = LoadPixmap(cached=True, path=PluginPath + 'icons/remove.png') self.gousbpng = LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_local.png') self.installedpng = LoadPixmap(cached=True, path=PluginPath + 'icons/installed.png') self.upgradeablepng = LoadPixmap(cached=True, path=PluginPath + 'icons/upgradeable.png') self["list"] = List(self.list) self["key_red"] = Label(_("Refresh list")) self["key_green"] = Label() self["key_blue"] = Label() self["key_yellow"] = Label() self["whatUPDATED"] = ScrollLabel() self["actions"] = ActionMap( ["OkCancelActions", "ColorActions", "DirectionActions"], { "cancel": self.keyCancel, "ok": self.doAction, "red": self.keyRed, "green": self.doAction, "yellow": self.keyYellow, "blue": self.keyBlue, "pageUp": self["whatUPDATED"].pageUp, "pageDown": self["whatUPDATED"].pageDown }, -2) self.onLayoutFinish.append(self.layoutFinished) self.onShown.append(self.checkFreeSpace) if self.selectionChanged not in self['list'].onSelectionChanged: self['list'].onSelectionChanged.append(self.selectionChanged) def runCmd(self, cmd): printDEBUG("runCmd", cmd) self.cmd.appClosed.append(self.cmdFinished) self.cmd.dataAvail.append(self.cmdData) if self.cmd.execute(self.ipkg + " " + cmd): self.cmdFinished(-1) def cmdData(self, data): printDEBUG("cmdData", data) if self.cache is None: self.cache = data else: self.cache += data if '\n' in data: splitcache = self.cache.split('\n') if self.cache[-1] == '\n': iteration = splitcache self.cache = None else: iteration = splitcache[:-1] self.cache = splitcache[-1] for mydata in iteration: if mydata != '': self.parseLine(mydata) def cmdFinished(self, retval): self.callCallbacks(10) self.cmd.appClosed.remove(self.cmdFinished) self.cmd.dataAvail.remove(self.cmdData) def layoutFinished(self, ret=0): printDEBUG("layoutFinished", "") self.setTitle(_("OPKG manager")) self.refreshLists() if self.firstRun == True: self['key_green'].setText(_('Select option')) #self.firstRun = False def upgradeAll(self, ret): if ret is True: self.changed = True self.session.openWithCallback( self.refreshLists, Jconsole, title=_("Upgrading all packages...."), cmdlist=[self.keyGreenAction]) return def doManualInstall(self, localIPKfile): if localIPKfile: self.LocalFileName = localIPKfile print self.LocalFileName self.BlockedInput = False self.keyGreenAction = 'opkg install "%s"' % localIPKfile self.doAction() else: self.LocalFileName = '' self.keyGreenAction = '' def InfoBoxReturn(self, ret=0): #from doAction printDEBUG("InfoBoxReturn", "self.keyGreenAction == %s" % self.keyGreenAction) self.keyGreenAction = '' return def doAction(self): self.SelectedIndex = self["list"].getIndex() printDEBUG("doAction", "self.keyGreenAction = '%s'" % self.keyGreenAction) if self.BlockedInput == True and self.keyGreenAction != 'LocalPackage': printDEBUG("doAction", "self.BlockedInput == True") return with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") if self.keyGreenAction == 'LocalPackage': printDEBUG("doAction", "self.keyGreenAction == 'LocalPackage':") from filebrowserwidget import DirectorySelectorWidget self.session.openWithCallback(self.doManualInstall, DirectorySelectorWidget, currDir='/', title=_("Select package"), selectFiles=True) return elif self.MainMenu == True and self.LocalFileName == "" and not self.keyGreenAction.endswith( 'UpgradeAll'): printDEBUG( "doAction", "self.MainMenu == True and self.LocalFileName == " " not self.keyGreenAction.endswith('UpgradeAll')") #self.ActiveFilter = "" self.MainMenu = False self.refreshLists() return elif self.keyGreenAction != '': printDEBUG("doAction", "self.keyGreenAction = '%s'" % self.keyGreenAction) current = self['list'].getCurrent() if current[0] == '': printDEBUG("doAction", "current[0] = ''") return #>>>>> Usuwanie pakietów... if self.keyGreenAction.find("remove") > 0: tekst = _( "Are you sure, you want delete % package?") % current[0] #>>>>> przy za malej ilosci pamieci pozwalamy jedynie na remove... elif self.BlockedInstall == True: free_flash_space = self.getFreeSpace('/') human_free_space = free_flash_space / 1048576 msg = _( 'Only %d MB left!!!\nAt least 8MB is required to safely install and upgrade packages.' ) % human_free_space self.session.openWithCallback(self.InfoBoxReturn, MessageBox, msg, type=MessageBox.TYPE_INFO, timeout=10) return #>>>>> upgrade wszystkiego... elif self.keyGreenAction == ('UpgradeAll'): if self.packages2upgrade > self.maxPackages and self.getFreeSpace( self.CacheDir ) < self.maxSize * 3: #ze jest wolnego 8MB to juz wiemy self.session.openWithCallback( self.close, MessageBox, _("Too many packages and too small free space for upgrade!!!" ), type=MessageBox.TYPE_INFO, timeout=10) return else: self.session.openWithCallback( self.doActionFullUpdate, MessageBox, _("Do you want to upgrade all packages?"), type=MessageBox.TYPE_YESNO) return #>>>>> upgrade konkretnego pakietu... elif self.keyGreenAction.startswith('opkg upgrade'): tekst = _("Do you want to upgrade %s package?") % current[0] #>>>>> wszystkie inne przypadki else: #sprawdzmy, czy mamy odpowiednio wolną przestrzeń try: result = os_popen( "opkg info %s | grep -m 1 '^Size:' | cut -d ' ' -f2" % current[0]) except: result = 'ERROR' sizetxt = "unknown" if result != 'ERROR': for x in result.readlines(): print "OPKG manager, packet size: %s" % x x = x.strip() if x.isdigit(): size = int(x) sizetxt = "%dKB" % int(size / 1024) if self.keyGreenAction.find("install") > 0: if self.LocalFileName != "": tekst = _("Are you sure to install %s package?" ) % self.LocalFileName else: tekst = _( "Are you sure to install %s package with %s size?" ) % (current[0], sizetxt) else: tekst = _("Do you want to run '%s'? (package size %s)") % ( self.keyGreenAction, sizetxt) if self.SkinSelectorInstalled == 0 and self.keyGreenAction.find( "enigma2-skin-") > 0: # dodajemy skinSelektor self.keyGreenAction += " enigma2-plugin-skinselector" #finalnie wykonujemy akcje if None != tekst: self.session.openWithCallback(self.doActionAfterYESNO, MessageBox, tekst, type=MessageBox.TYPE_YESNO) def doActionAfterYESNO(self, ret=True): if self.keyGreenAction != '' and ret is True: printDEBUG( "doActionAfterYESNO", "self.keyGreenAction = '%s' and ret is True" % self.keyGreenAction) self.changed = True self.session.openWithCallback(self.post_doAction_check_TMPUPDsh, Jconsole, title="%s" % self.keyGreenAction, cmdlist=[self.keyGreenAction]) return def doActionFullUpdate(self, ret): if ret is True: self.prev_running_service = self.session.nav.getCurrentlyPlayingServiceReference( ) self.session.nav.stopService() runlist = [] runlist.append('sync') runlist.append('opkg --cache %s upgrade' % self.CacheDir) runlist.append('rm -f %s/*.ipk' % self.CacheDir) runlist.append('sync') #runlist.append('rm -f /var/opkg/FullUpdate') self.session.openWithCallback(self.post_doAction_check_TMPUPDsh, Jconsole, title=_("Upgrading all packages..."), cmdlist=runlist) self.keyGreenAction = '' self.changed = True return def post_doAction_check_TMPUPDsh(self): if self.prev_running_service: self.session.nav.playService(self.prev_running_service) if pathExists("/tmp/upd.sh"): printDEBUG("post_doAction_check_TMPUPDsh", "pathExists('/tmp/upd.sh')") self.session.openWithCallback(self.refreshLists, Jconsole, title=_("Post upgrade cleanup..."), cmdlist=["/tmp/upd.sh"]) else: self.refreshLists() def keyRed(self): if self.BlockedInput == True: return printDEBUG("keyRed", "calling self.refreshLists()") self.pushUpgrade = False self.firstRun = False self.refreshLists() return def keyBlue(self): if self.BlockedInput == True: return printDEBUG("keyBlue", self.keyBlueAction) if self.keyBlueAction != '': self.session.openWithCallback(self.refreshLists, Jconsole, title="%s" % self.keyBlueAction, cmdlist=[self.keyBlueAction]) return def keyYellow(self): printDEBUG("keyYellow", "non Graterlia MenuOPKGsettings TBD") def keyYellowEnd(self, ret=0): return def keyCancel(self, ret=0): if self.Console is not None: printDEBUG("keyCancel", "self.Console is not None") if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): printDEBUG("keyCancel", "killing %s" % name) self.Console.kill(name) if self.MainMenu == False: printDEBUG("keyCancel", "self.MainMenu == False") self.MainMenu = True self.refreshLists() return elif self.changed == True: printDEBUG("keyCancel", "self.changed == True") self.session.openWithCallback( self.keyCancelEnd, MessageBox, _("After changes in opkg, tuner has to be restarted.\n Restart now?" ), type=MessageBox.TYPE_YESNO) else: self.close() def keyCancelEnd(self, ret): #some cleaning just in case with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.LocalFileName = None self.list = None self['list'].setList([]) self["list"].setIndex(0) self["whatUPDATED"].setText("") self.SelectedIndex = None self.packages = None self.installedpackages = None self.upgradeablepackages = None self.Console = None self.divpng = None self.goinstalledpng = None self.goremovepng = None self.gousbpng = None self.installedpng = None self.upgradeablepng = None if ret == True: from Components.config import config try: # this is for openPLI to NOT put tuner into sleep mode config.misc.RestartUI.value = True config.misc.RestartUI.save() except: pass from enigma import quitMainloop quitMainloop(2) else: self.close() def getFreeSpace(self, mountpoint): if fileExists(mountpoint): stat_info = statvfs(mountpoint) free_flash_space = stat_info.f_bfree * stat_info.f_bsize return free_flash_space else: return 0 def checkFreeSpace(self): printDEBUG("checkFreeSpace", "") self.onShown.remove(self.checkFreeSpace) free_flash_space = self.getFreeSpace('/') if free_flash_space < self.maxSize: self.BlockedInstall = True human_free_space = free_flash_space / 1048576 msg = _( 'Only %d MB left!!!\nAt least 8MB is required to safely install and upgrade packages.' ) % human_free_space msg += _('Remove some packages, or upgade from console!') self.session.openWithCallback(self.checkFreeSpaceEnd, MessageBox, msg, MessageBox.TYPE_INFO, timeout=5) def checkFreeSpaceEnd(self, ret=0): return #>>>>>>>>>>>>>>>>>>>>>>>>> refreshLists main entry def refreshLists(self): def errorMENU(errorID=992): printDEBUG("refreshLists_errorMENU", "no network connection") if len(self.list) >= 1: printDEBUG("refreshLists", "len(self.list) >=1") self.list.pop(-1) if errorID == 991: self.list.append( (_('ERROR connecting to the internet'), '', _('OPKG server does not response on pings :('), '', self.goremovepng, self.divpng)) if errorID == 992: self.list.append( (_('ERROR connecting to OPKG'), '', _('Neigther internet nor service is working :('), '', self.goremovepng, self.divpng)) else: self.list.append( (_('ERROR updating OPKG'), '', _("'opkg update' command returned an error %i :(") % errorID, '', self.goremovepng, self.divpng)) self.list.append( (_("Install local packet"), " ", _("You will be later prompted for file selection."), 'InstallLocal', self.gousbpng, self.divpng)) self['list'].setList(self.list) self['key_red'].hide() self['key_green'].hide() self['key_yellow'].hide() self['key_blue'].hide() def refreshLists_opkg_update(result=None, retval=992, extra_args=None): printDEBUG("refreshLists_opkg_update", "retval:%i" % retval) if retval != 0: errorMENU(retval) else: self.firstRun = False self.refreshListsmain() def refreshLists_firstRun_doWeHaveNetwork(result, retval, extra_args=None): printDEBUG("refreshLists_firstRun_doWeHaveNetwork", "retval:%i" % retval) if retval != 0: errorMENU(991) else: if pathExists('/var/lib/opkg/lock'): os_system( 'killall -9 opkg 2>/dev/null;killall -9 wget 2>/dev/null;sleep 1' ) self.Console.ePopen('opkg update', refreshLists_opkg_update) printDEBUG("refreshLists", "main entry") if pathExists("/tmp/upd.sh"): os_remove("/tmp/upd.sh") with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.LocalFileName = '' self.list = [] self['list'].setList(self.list) self["whatUPDATED"].setText("") if self.firstRun == True: printDEBUG("refreshLists", "self.firstRun = True") self.list.append( (_('Package list update'), '', _('Trying to download a new packetlist. Please wait...'), '', self.goinstalledpng, self.divpng)) self['list'].setList(self.list) self.Console.ePopen( 'wget --spider -q http://j00zek.one.pl/opkg-j00zka', refreshLists_firstRun_doWeHaveNetwork) else: self.refreshListsmain() def setCurrentIndex(self): if self.SelectedIndex is not None and len( self["list"].list) > self.SelectedIndex: self["list"].setIndex(self.SelectedIndex) else: self["list"].setIndex(0) #>>>>> refreshListsmain run when all above tests went correctly def refreshListsmain(self): printDEBUG("refreshListsmain", "enter") self.BlockedInput = True if len(self.list) >= 1: self.list.pop(-1) if self.MainMenu == True: self.refreshLists_MainMenu() else: #printDEBUG( "refreshListsmain" , "enter" ) #with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.Console.ePopen('opkg list-upgradable', self.refreshLists_Packages_Got_upgadable) def refreshLists_MainMenu(self): printDEBUG("refreshLists_MainMenu", "enter") with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.Console.ePopen('opkg list-upgradable', self.refreshLists_MainMenu_upgradeablepackages) def refreshLists_MainMenu_upgradeablepackages(self, result, retval, extra_args=None): def build_MainMenu(): printDEBUG("build_MainMenu", "self.list.appends...") if self.packages2upgrade > 0: self.list.append( (_("Upgrade packages"), '', _("Recommended update installed packages"), 'UpgradeAll', self.upgradeablepng, self.divpng)) self.list.append( (_("Show system plugins only"), '', '', '-systemplugins-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append( (_("Show extension plugins only"), '', '', '-extensions-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append( (_("Show j00zek's plugins only"), '', '', '-j00zeks-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append( (_("Show openPLI skins only"), '', '', '-skin', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_skin.png'), self.divpng)) self.list.append( (_("show fonts only"), '', '', 'font', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_fonts.png'), self.divpng)) self.list.append( (_("show picons only"), '', '', '-picon', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_picon.png'), self.divpng)) self.list.append( (_("show oscam packages only"), '', '', 'oscam', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_softcam.png'), self.divpng)) self.list.append( (_("show Python modules only"), '', '', 'python-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_python.png'), self.divpng)) self.list.append( (_("Show DVB USB modules only"), '', '', 'dvb-usb', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_dvbt.png'), self.divpng)) self.list.append( (_("Show all packages"), '', '', '', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_all.png'), self.divpng)) self.list.append( (_("Install local packet"), " ", _("You will be later prompted for file selection."), 'InstallLocal', self.gousbpng, self.divpng)) self['list'].setList(self.list) self.setCurrentIndex() self.BlockedInput = False def build_UpgradeMenu(result, retval, extra_args=None): printDEBUG("build_UpgradeMenu", "...") self.list.append((_('Upgrade packages'), '', _('Recommended update installed packages'), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.BlockedInput = False isRelease = False self["whatUPDATED"].setText(result) self.keyGreenAction = 'UpgradeAll' #print result self.list = [] #printDEBUG( "refreshLists_MainMenu_upgradeablepackages" , "extra_args:'%s' , result:%s , retval:%i" % (extra_args,result, retval) ) self.upgradeablepackages = self.getOPKGlist(SameNazwy=True, lista=result) self.packages2upgrade = len(self.upgradeablepackages) if self.packages2upgrade > 0 and self.pushUpgrade == True: printDEBUG("build_UpgradeMenu", "list of non-Graterlia packages") tmptxt = '' for x in result.splitlines(): if not x.startswith('Not selecting'): tmptxt += x[:x.find(' - ')] + '\n' self["whatUPDATED"].setText(tmptxt) self.list.append((_('Upgrade packages'), '', _('Recommended update installed packages'), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.keyGreenAction = 'UpgradeAll' self.BlockedInput = False else: build_MainMenu() # def refreshLists_Packages(self): def refreshLists_Packages_Got_upgadable(self, result='', retval=0, extra_args=None): printDEBUG("refreshLists_Packages_Got_upgadable", "enter") self.upgradeablepackages = self.getOPKGlist(SameNazwy=True, lista=result) self.packages2upgrade = len(self.upgradeablepackages) if self.packages2upgrade > 0: printDEBUG("refreshLists", "self.packages2upgrade > 0") self.list.append((_('Upgrade packages'), '', _('Recommended update installed packages'), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.keyGreenAction = 'UpgradeAll' self.BlockedInput = False if self.pushUpgrade == True: return elif (self.packages2upgrade == 0 and self.firstRun == True) or self.pushUpgrade == False: printDEBUG("refreshLists", "self.packages2upgrade == 0 and self.firstRun == True") self.firstRun = False self.Console.ePopen('opkg list', self.refreshLists_Packages_Got_list) def refreshLists_Packages_Got_list(self, result='', retval=0, extra_args=None): self.packages = self.getOPKGlist(SameNazwy=False, lista=result) self.Console.ePopen('opkg list-installed', self.refreshLists_Packages_Got_installedpackages) def refreshLists_Packages_Got_installedpackages(self, result='', retval=0, extra_args=None): self.installedpackages = self.getOPKGlist(SameNazwy=True, lista=result) self.SkinSelectorInstalled = 0 for package in self.packages: #łączymy duplikaty razem - duplikat to ta sama nazwa i ten sam opis, moze się różnić jedynie wersją if len(self.list) > 0 and package[0].strip( ) == self.list[-1][0] and package[2].strip() == self.list[-1][2]: package[1] = self.list[-1][1] + " > " + package[1].strip() self.list.pop(-1) #if self.filters[self.ActiveFilterID][0] == "" or package[0].strip().startswith(self.filters[self.ActiveFilterID][0]): if self.ActiveFilter == "" or package[0].strip().find( self.ActiveFilter) > -1: if package[0].strip() in self.upgradeablepackages: self.list.append( self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'upgradeable')) elif package[0].strip( ) in self.installedpackages and self.firstRun == False: self.list.append( self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'installed')) if package[0].strip() == "enigma2-plugin-skinselector": self.SkinSelectorInstalled = 1 elif self.firstRun == False: #if self.IPTVfullInstalled == True and package[0].strip().startswith("enigma2-plugin-iptvplayer-host-"): # printDEBUG( "refreshLists" , "Removing = %s" % package[0].strip() ) #else: self.list.append( self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'installable')) printDEBUG("refreshLists", "calling final self['list'].setList(self.list)") self['list'].setList(self.list) self.setCurrentIndex() self.BlockedInput = False def getOPKGlist(self, SameNazwy=False, lista=''): printDEBUG("getOPKGlist", "SameNazwy = %s" % SameNazwy) myList = [] if lista != '': self.packetlist = [] for x in lista.splitlines(): if x.startswith('Not selecting'): continue parts = x.split(' - ') if len(parts) >= 2: if SameNazwy == True: myList.append(parts[0].strip()) else: if len(parts) == 2: myList.append( [parts[0].strip(), parts[1].strip(), ""]) elif len(parts) >= 3: myList.append([ parts[0].strip(), parts[1].strip(), parts[2].strip() ]) return myList def buildEntryComponent(self, name, version, description, state): #printDEBUG( "buildEntryComponent" , state ) if state == 'installable': return (name, version, description, state, self.goinstalledpng, self.divpng) if state == 'installed': return (name, version, description, state, self.installedpng, self.divpng) if state == 'upgradeable': return (name, version, description, state, self.upgradeablepng, self.divpng) if state == 'goremove': return [ name, version, description, state, self.goremovepng, self.divpng ] if state == 'gousb': return [ name, version, description, state, self.gousbpng, self.divpng ] def selectionChanged(self): current = self['list'].getCurrent() self.keyBlueAction = '' self['key_blue'].setText('') if current: #printDEBUG( "selectionChanged" , "selectionChanged.current = %s" % current[3] ) #print current if current[3] == 'installed': self['key_green'].setText(_("Delete")) self.actionInfo = _("delete %s") % current[0] self.keyGreenAction = 'opkg remove --autoremove %s' % current[0] self['key_blue'].setText(_("Reinstall")) self.keyBlueAction = 'opkg install --force-reinstall %s' % current[ 0] elif current[3] == 'installable': self['key_green'].setText(_("Install")) self.actionInfo = _("install %s") % current[0] self.keyGreenAction = 'opkg install %s' % current[0] elif current[3] == 'upgradeable': self['key_green'].setText(_("Upgrade")) self.actionInfo = _("upgrade %s") % current[0] self.keyGreenAction = 'opkg upgrade %s' % current[0] elif current[3] == 'UpgradeAll': self['key_green'].setText(_("Upgrade packages")) self.actionInfo = _("upgrade packages") self.keyGreenAction = 'UpgradeAll' elif self.MainMenu == True: if current[3] == 'InstallLocal': self['key_green'].setText(_("Install Local package")) self['key_green'].show() self.keyGreenAction = 'LocalPackage' else: self['key_green'].setText(_("Select option")) self.keyGreenAction = '' self.actionInfo = "" self.ActiveFilter = current[3] #print "[jopkg] selectionChanged>self.ActiveFilter = %s" % self.ActiveFilter else: self['key_green'].setText('') self.keyGreenAction = '' self.actionInfo = ""
class Network: def __init__(self): self.ifaces = {} self.configuredInterfaces = [] self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "ethtool" self.container = eConsoleAppContainer() self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateConsole = Console() self.deactivateInterfaceConsole = Console() self.activateConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.getInterfaces() def onRemoteRootFS(self): fp = file('/proc/mounts', 'r') mounts = fp.readlines() fp.close() for line in mounts: parts = line.strip().split(' ') if parts[1] == '/' and (parts[2] == 'nfs' or parts[2] == 'smbfs'): return True return False def getInterfaces(self, callback=None): devicesPattern = re_compile('[a-z]+[0-9]+') self.configuredInterfaces = [] fp = file('/proc/net/dev', 'r') result = fp.readlines() fp.close() for line in result: try: device = devicesPattern.search(line).group() if device in ('wifi0', 'wmaster0'): continue self.getDataForInterface(device, callback) except AttributeError: pass #print "self.ifaces:", self.ifaces #self.writeNetworkConfig() #print ord(' ') #for line in result: # print ord(line[0]) # 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, callback): #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. if not self.Console: self.Console = Console() cmd = "ip -o addr" self.Console.ePopen(cmd, self.IPaddrFinished, [iface, callback]) def IPaddrFinished(self, result, retval, extra_args): (iface, callback) = extra_args data = {'up': False, 'dhcp': False, 'preup': False, 'postdown': False} globalIPpattern = re_compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) netmaskLinePattern = re_compile('/' + netRegexp) netmaskPattern = re_compile(netRegexp) bcastLinePattern = re_compile(' brd ' + ipRegexp) upPattern = re_compile('UP') macPattern = re_compile( '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' ) macLinePattern = re_compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ', 2) if (split[1][:-1] == iface): up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch( macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if (split[1] == iface): if re_search(globalIPpattern, split[2]): ip = self.regExpMatch( ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask( self.regExpMatch( netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch( ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = "route -n | grep " + iface self.Console.ePopen(cmd, self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re_compile(ipRegexp) ipLinePattern = re_compile(ipRegexp) for line in result.splitlines(): 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) self.ifaces[iface] = data self.loadNetworkConfig(iface, callback) def writeNetworkConfig(self): self.configuredInterfaces = [] 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") for ifacename, iface in self.ifaces.items(): if iface['up'] == True: fp.write("auto " + ifacename + "\n") self.configuredInterfaces.append(ifacename) if iface['dhcp'] == True: fp.write("iface " + ifacename + " inet dhcp\n") if iface['dhcp'] == False: 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'])) if iface.has_key("configStrings"): fp.write("\n" + iface["configStrings"] + "\n") if iface["preup"] is not False and not iface.has_key( "configStrings"): fp.write(iface["preup"]) fp.write(iface["postdown"]) 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, iface, callback=None): interfaces = [] # parse the interfaces-file try: fp = file('/etc/network/interfaces', 'r') 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"] = True else: ifaces[currif]["dhcp"] = False if (currif == iface ): #read information only for available interfaces if (split[0] == "address"): ifaces[currif]["address"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("ip"): if self.ifaces[currif]["ip"] != ifaces[currif][ "address"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["ip"] = map( int, split[1].split('.')) if (split[0] == "netmask"): ifaces[currif]["netmask"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("netmask"): if self.ifaces[currif]["netmask"] != ifaces[currif][ "netmask"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["netmask"] = map( int, split[1].split('.')) if (split[0] == "gateway"): ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif][ "gateway"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["gateway"] = map( int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i if (split[0] == "post-down"): if self.ifaces[currif].has_key("postdown"): self.ifaces[currif]["postdown"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if self.Console: if len(self.Console.appContainers) == 0: # save configured interfacelist self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() print "read configured interface:", ifaces print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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 def deactivateNetworkConfig(self, callback=None): if self.onRemoteRootFS(): if callback is not None: callback(True) return self.deactivateConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True) def deactivateNetworkFinished(self, extra_args): callback = extra_args if len(self.deactivateConsole.appContainers) == 0: if callback is not None: callback(True) def activateNetworkConfig(self, callback=None): if self.onRemoteRootFS(): if callback is not None: callback(True) return self.activateConsole = Console() self.commands = [] self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True) def activateNetworkFinished(self, extra_args): callback = extra_args if len(self.activateConsole.appContainers) == 0: if callback is not None: callback(True) def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) else: self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get( x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): if iface.startswith('eth'): if iface not in self.lan_interfaces and len( self.lan_interfaces) == 0: self.lan_interfaces.append(iface) return _("LAN connection") elif iface not in self.lan_interfaces and len( self.lan_interfaces) >= 1: self.lan_interfaces.append(iface) return _("LAN connection") + " " + str(len( self.lan_interfaces)) else: if iface not in self.lan_interfaces and len( self.lan_interfaces) == 0: self.lan_interfaces.append(iface) return _("WLAN connection") elif iface not in self.lan_interfaces and len( self.lan_interfaces) >= 1: self.lan_interfaces.append(iface) return _("WLAN connection") + " " + str( len(self.lan_interfaces)) def getFriendlyAdapterDescription(self, iface): if iface == 'eth0': return _("Internal LAN adapter.") else: classdir = "/sys/class/net/" driverdir = "/sys/class/net/" + iface if os_path.exists(classdir): files = listdir(classdir) if iface in files: if os_path.realpath(driverdir).endswith('ath_pci'): return _("Atheros") + " " + str( os_path.basename(os_path.realpath( driverdir))) + " " + _("WLAN adapter.") elif os_path.realpath(driverdir).endswith('zd1211b'): return _("Zydas") + " " + str( os_path.basename(os_path.realpath( driverdir))) + " " + _("WLAN adapter.") elif os_path.realpath(driverdir).endswith('ra0'): return _("Ralink") + "-3070 " + " " + _( "WLAN adapter.") elif os_path.realpath(driverdir).endswith('wlan0'): return _("Ralink") + "-2870 " + " " + _( "WLAN adapter.") else: return str( os_path.basename(os_path.realpath( driverdir))) + " " + _("WLAN adapter.") else: return _("Unknown network adapter.") 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): 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): 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 resetNetworkConfig(self, mode='lan', callback=None): if self.onRemoteRootFS(): if callback is not None: callback(True) return self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self, mode='lan', callback=None): 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") if mode == 'wlan-mpci': fp.write("auto ath0\n") fp.write("iface ath0 inet dhcp\n") if mode == 'lan': fp.write("auto eth0\n") fp.write("iface eth0 inet dhcp\n") fp.write("\n") fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig ath0 down") self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 up") if mode == 'lan': self.commands.append("ifconfig eth0 up") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 down") self.commands.append("/etc/init.d/avahi-daemon start") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode, callback], debug=True) def resetNetworkFinished(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True, mode) def checkNetworkState(self, statecallback): # www.dream-multimedia-tv.de, www.heise.de, www.google.de self.NetworkState = 0 cmd1 = "ping -c 1 82.149.226.170" cmd2 = "ping -c 1 193.99.144.85" cmd3 = "ping -c 1 209.85.135.103" self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished, statecallback) def checkNetworkStateFinished(self, result, retval, extra_args): (statecallback) = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self, callback=None): if self.onRemoteRootFS(): if callback is not None: callback(True) return self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self, extra_args): (callback) = extra_args if callback is not None: callback(True) def getLinkState(self, iface, callback): cmd = self.ethtool_bin + " " + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished, callback) def getLinkStateFinished(self, result, retval, extra_args): (callback) = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in self.PingConsole.appContainers.keys(): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: if len(self.deactivateInterfaceConsole.appContainers): for name in self.deactivateInterfaceConsole.appContainers.keys( ): self.deactivateInterfaceConsole.kill(name) def checkforInterface(self, iface): if self.getAdapterAttribute(iface, 'up') is True: return True else: ret = system("ifconfig " + iface + " up") system("ifconfig " + iface + " down") if ret == 0: return True else: return False def checkDNSLookup(self, statecallback): cmd1 = "nslookup www.dream-multimedia-tv.de" cmd2 = "nslookup www.heise.de" cmd3 = "nslookup www.google.de" self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished, statecallback) def checkDNSLookupFinished(self, result, retval, extra_args): (statecallback) = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self, iface, callback=None): if self.onRemoteRootFS(): if callback is not None: callback(True) return self.deactivateInterfaceConsole = Console() self.commands = [] cmd1 = "ip addr flush " + iface cmd2 = "ifconfig " + iface + " down" self.commands.append(cmd1) self.commands.append(cmd2) self.deactivateInterfaceConsole.eBatch( self.commands, self.deactivateInterfaceFinished, callback, debug=True) def deactivateInterfaceFinished(self, extra_args): callback = extra_args if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def detectWlanModule(self, iface=None): self.wlanmodule = None classdir = "/sys/class/net/" + iface + "/device/" driverdir = "/sys/class/net/" + iface + "/device/driver/" if os_path.exists(classdir): classfiles = listdir(classdir) driver_found = False nl80211_found = False for x in classfiles: if x == 'driver': driver_found = True if x.startswith('ieee80211:'): nl80211_found = True if driver_found and nl80211_found: #print about.getKernelVersionString() self.wlanmodule = "nl80211" else: if driver_found and not nl80211_found: driverfiles = listdir(driverdir) if os_path.realpath(driverdir).endswith('ath_pci'): if len(driverfiles) >= 1: self.wlanmodule = 'madwifi' if os_path.realpath(driverdir).endswith('rt73'): if len(driverfiles) == 2 or len(driverfiles) == 5: self.wlanmodule = 'ralink' if os_path.realpath(driverdir).endswith('zd1211b'): if len(driverfiles) == 1 or len(driverfiles) == 5: self.wlanmodule = 'zydas' if self.wlanmodule is None: self.wlanmodule = "wext" print 'Using "%s" as wpa-supplicant driver' % (self.wlanmodule) return self.wlanmodule def calc_netmask(self, nmask): from struct import pack, unpack from socket import inet_ntoa, inet_aton mask = 1L << 31 xnet = (1L << 32) - 1 cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = ((1L << cidr) - 1) << (32 - cidr) netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins( PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready)
class SoftwareTools(DreamInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} upgradable_packages = {} upgradeAvailable = False def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.UpgradeConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev') self.reboot_required_packages = ('dreambox-dvb-modules', 'kernel-') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback = None): if callback is not None: self.NotifierCallback = callback if eNetworkManager.getInstance().online(): self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback = None): if self.lastDownloadDate is None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: self.NetworkConnectionAvailable = False self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() #print event, "-", param pass def startIpkgListAvailable(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list | grep -e '^[a-z][a-z0-9+.-]'" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append([name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval = None, extra_args = None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list-installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args = None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.listUpgradable() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def listUpgradable(self, callback = None): self.list_updating = True if not self.UpgradeConsole: self.UpgradeConsole = Console() cmd = "opkg list-upgradable" self.UpgradeConsole.ePopen(cmd, self.listUpgradableCB, callback) def listUpgradableCB(self, result, retval, extra_args = None): (callback) = extra_args self.upgradable_packages = {} self.available_updates = 0 self.available_updatelist = [] if result: for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 2 and tokens[2].strip() or "" self.upgradable_packages[name] = version for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates +=1 self.available_updatelist.append([packagename]) self.list_updating = False if self.upgradable_packages: self.upgradeAvailable = True if self.UpgradeConsole: if len(self.UpgradeConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) if self.UpgradeConsole is not None: if len(self.UpgradeConsole.appContainers): for name in self.UpgradeConsole.appContainers.keys(): self.UpgradeConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class Network: def __init__(self): self.ifaces = {} self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "ethtool" self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateInterfaceConsole = Console() self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): if self.remoteRootFS is None: import Harddisk for parts in Harddisk.getProcMounts(): if parts[1] == '/' and parts[2] == 'nfs': self.remoteRootFS = True break else: self.remoteRootFS = False return self.remoteRootFS def isBlacklisted(self, iface): return iface in ('lo', 'wifi0', 'wmaster0', 'sit0', 'tun0', 'sys0') def getInterfaces(self, callback = None): self.configuredInterfaces = [] for device in self.getInstalledAdapters(): self.getAddrInet(device, callback) # helper function def regExpMatch(self, pattern, string): if string is None: return None try: return pattern.search(string).group() except AttributeError: return None # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): return [ int(n) for n in ip.split('.') ] def getAddrInet(self, iface, callback): if not self.Console: self.Console = Console() cmd = "ip -o addr show dev " + iface self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : False } globalIPpattern = re.compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}' ipLinePattern = re.compile('inet ' + ipRegexp + '/') ipPattern = re.compile(ipRegexp) netmaskLinePattern = re.compile('/' + netRegexp) netmaskPattern = re.compile(netRegexp) bcastLinePattern = re.compile(' brd ' + ipRegexp) upPattern = re.compile('UP') macPattern = re.compile(macRegexp) macLinePattern = re.compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ',2) if (split[1][:-1] == iface) or (split[1][:-1] == (iface + '@sys0')): up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if (split[1] == iface): if re.search(globalIPpattern, split[2]): ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = "route -n | grep " + iface self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) ipLinePattern = re.compile(ipRegexp) for line in result.splitlines(): print line[0:7] if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data self.loadNetworkConfig(iface,callback) def writeNetworkConfig(self): self.configuredInterfaces = [] fp = file('/etc/network/interfaces', 'w') fp.write("# automatically generated by enigma2\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") self.configuredInterfaces.append(ifacename) if iface['dhcp'] == True: fp.write("iface "+ ifacename +" inet dhcp\n") if iface['dhcp'] == False: 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'])) if iface.has_key("configStrings"): fp.write(iface["configStrings"]) if iface["preup"] is not False and not iface.has_key("configStrings"): fp.write(iface["preup"]) if iface["predown"] is not False and not iface.has_key("configStrings"): fp.write(iface["predown"]) fp.write("\n") fp.close() self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): 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,iface,callback = None): interfaces = [] # parse the interfaces-file try: fp = file('/etc/network/interfaces', 'r') 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"] = True else: ifaces[currif]["dhcp"] = False if (currif == iface): #read information only for available interfaces if (split[0] == "address"): ifaces[currif]["address"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("ip"): if self.ifaces[currif]["ip"] != ifaces[currif]["address"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["ip"] = map(int, split[1].split('.')) if (split[0] == "netmask"): ifaces[currif]["netmask"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("netmask"): if self.ifaces[currif]["netmask"] != ifaces[currif]["netmask"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["netmask"] = map(int, split[1].split('.')) if (split[0] == "gateway"): ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i if (split[0] in ("pre-down","post-down")): if self.ifaces[currif].has_key("predown"): self.ifaces[currif]["predown"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if self.Console: if len(self.Console.appContainers) == 0: # save configured interfacelist self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() print "read configured interface:", ifaces print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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: self.nameservers.append(self.convertIP(ip)) print "nameservers:", self.nameservers def getInstalledAdapters(self): return [x for x in os.listdir('/sys/class/net') if not self.isBlacklisted(x)] def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): name = None if self.isWirelessInterface(iface): if iface not in self.wlan_interfaces: name = _("WLAN connection") if len(self.wlan_interfaces): name += " " + str(len(self.wlan_interfaces)+1) self.wlan_interfaces.append(iface) else: if iface not in self.lan_interfaces: if iface == "eth1": name = _("VLAN connection") else: name = _("LAN connection") if len(self.lan_interfaces) and not iface == "eth1": name += " " + str(len(self.lan_interfaces)+1) self.lan_interfaces.append(iface) return name def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) if moduledir: name = os.path.basename(os.path.realpath(moduledir)) if name.startswith('ath') or name.startswith('carl'): name = 'Atheros' elif name.startswith('rt2') or name.startswith('rt3') or name.startswith('rt5') or name.startswith('rt6') or name.startswith('rt7'): name = 'Ralink' elif name.startswith('zd'): name = 'Zydas' elif name.startswith('rtl') or name.startswith('r8'): name = 'Realtek' elif name.startswith('smsc'): name = 'SMSC' elif name.startswith('peg'): name = 'Pegasus' elif name.startswith('rn'): name = 'RNDIS' elif name.startswith('mw') or name.startswith('libertas'): name = 'Marvel' elif name.startswith('p5'): name = 'Prism' elif name.startswith('as') or name.startswith('ax'): name = 'ASIX' elif name.startswith('dm'): name = 'Davicom' elif name.startswith('mcs'): name = 'MosChip' elif name.startswith('at'): name = 'Atmel' elif name.startswith('iwm'): name = 'Intel' else: name = _('Unknown') return name + ' ' + _('wireless network interface') def getAdapterName(self, iface): return iface def getAdapterList(self): return self.ifaces.keys() def getAdapterAttribute(self, iface, attribute): return self.ifaces.get(iface, {}).get(attribute) def setAdapterAttribute(self, iface, attribute, value): print "setting for adapter", iface, "attribute", attribute, " to value", 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): 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 resetNetworkConfig(self, mode='lan', callback = None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ip addr flush dev " + iface) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self,mode='lan', callback = None): fp = file('/etc/network/interfaces', 'w') fp.write("# automatically generated by enigma2\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") if mode == 'wlan-mpci': fp.write("auto ath0\n") fp.write("iface ath0 inet dhcp\n") if mode == 'lan': fp.write("auto eth0\n") fp.write("iface eth0 inet dhcp\n") fp.write("\n") fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig ath0 down") self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 up") if mode == 'lan': self.commands.append("ifconfig eth0 up") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 down") self.commands.append("/etc/init.d/avahi-daemon start") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True) def resetNetworkFinished(self,extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True,mode) def checkNetworkState(self,statecallback): self.NetworkState = 0 cmd1 = "ping -c 1 www.openpli.org" cmd2 = "ping -c 1 www.google.nl" cmd3 = "ping -c 1 www.google.com" self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback) def checkNetworkStateFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self,callback = None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ifdown " + iface) self.commands.append("ip addr flush dev " + iface) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self,extra_args): ( callback ) = extra_args if callback is not None: callback(True) def getLinkState(self,iface,callback): cmd = self.ethtool_bin + " " + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback) def getLinkStateFinished(self, result, retval,extra_args): (callback) = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in self.PingConsole.appContainers.keys(): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: self.deactivateInterfaceConsole.killAll() self.deactivateInterfaceConsole = None def stopActivateInterfaceConsole(self): if self.activateInterfaceConsole is not None: self.activateInterfaceConsole.killAll() self.activateInterfaceConsole = None def checkforInterface(self, iface): return self.getAdapterAttribute(iface, 'up') def checkDNSLookup(self,statecallback): cmd1 = "nslookup www.dream-multimedia-tv.de" cmd2 = "nslookup www.heise.de" cmd3 = "nslookup www.google.de" self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback) def checkDNSLookupFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self,ifaces,callback = None): self.config_ready = False self.msgPlugins() commands = [] def buildCommands(iface): commands.append("ifdown " + iface) commands.append("ip addr flush dev " + iface) #wpa_supplicant sometimes doesn't quit properly on SIGTERM if os.path.exists('/var/run/wpa_supplicant/'+ iface): commands.append("wpa_cli -i" + iface + " terminate") if not self.deactivateInterfaceConsole: self.deactivateInterfaceConsole = Console() if isinstance(ifaces, (list, tuple)): for iface in ifaces: if iface != 'eth0' or not self.onRemoteRootFS(): buildCommands(iface) else: if ifaces == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return buildCommands(ifaces) self.deactivateInterfaceConsole.eBatch(commands, self.deactivateInterfaceFinished, [ifaces,callback], debug=True) def deactivateInterfaceFinished(self,extra_args): (ifaces, callback) = extra_args def checkCommandResult(iface): if self.deactivateInterfaceConsole and self.deactivateInterfaceConsole.appResults.has_key("ifdown " + iface): result = str(self.deactivateInterfaceConsole.appResults.get("ifdown " + iface)).strip("\n") if result == "ifdown: interface " + iface + " not configured": return False else: return True #ifdown sometimes can't get the interface down. if isinstance(ifaces, (list, tuple)): for iface in ifaces: if checkCommandResult(iface) is False: Console().ePopen(("ifconfig " + iface + " down" )) else: if checkCommandResult(ifaces) is False: Console().ePopen(("ifconfig " + ifaces + " down" )) if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def activateInterface(self,iface,callback = None): if self.config_ready: self.config_ready = False self.msgPlugins() if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return if not self.activateInterfaceConsole: self.activateInterfaceConsole = Console() commands = [] commands.append("ifup " + iface) self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) def activateInterfaceFinished(self,extra_args): callback = extra_args if self.activateInterfaceConsole: if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def sysfsPath(self, iface): return '/sys/class/net/' + iface def isWirelessInterface(self, iface): if iface in self.wlan_interfaces: return True if os.path.isdir(self.sysfsPath(iface) + '/wireless'): return True # r871x_usb_drv on kernel 2.6.12 is not identifiable over /sys/class/net/'ifacename'/wireless so look also inside /proc/net/wireless device = re.compile('[a-z]{2,}[0-9]*:') ifnames = [] fp = open('/proc/net/wireless', 'r') for line in fp: try: ifnames.append(device.search(line).group()[:-1]) except AttributeError: pass if iface in ifnames: return True return False def getWlanModuleDir(self, iface = None): devicedir = self.sysfsPath(iface) + '/device' if not os.path.isdir(devicedir): return None moduledir = devicedir + '/driver/module' if os.path.isdir(moduledir): return moduledir # identification is not possible over default moduledir for x in os.listdir(devicedir): # rt3070 on kernel 2.6.18 registers wireless devices as usb_device (e.g. 1-1.3:1.0) and identification is only possible over /sys/class/net/'ifacename'/device/1-xxx if x.startswith("1-"): moduledir = devicedir + '/' + x + '/driver/module' if os.path.isdir(moduledir): return moduledir # rt73, zd1211b, r871x_usb_drv on kernel 2.6.12 can be identified over /sys/class/net/'ifacename'/device/driver, so look also here moduledir = devicedir + '/driver' if os.path.isdir(moduledir): return moduledir return None def detectWlanModule(self, iface = None): if not self.isWirelessInterface(iface): return None devicedir = self.sysfsPath(iface) + '/device' if os.path.isdir(devicedir + '/ieee80211'): return 'nl80211' moduledir = self.getWlanModuleDir(iface) if moduledir: module = os.path.basename(os.path.realpath(moduledir)) if module in ('ath_pci','ath5k'): return 'madwifi' if module in ('rt73','rt73'): return 'ralink' if module == 'zd1211b': return 'zydas' return 'wext' def calc_netmask(self,nmask): from struct import pack, unpack from socket import inet_ntoa, inet_aton mask = 1L<<31 xnet = (1L<<32)-1 cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = ((1L<<cidr)-1)<<(32-cidr) netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready) def hotplug(self, event): interface = event['INTERFACE'] if self.isBlacklisted(interface): return action = event['ACTION'] if action == "add": print "[Network] Add new interface:", interface self.getAddrInet(interface, None) elif action == "remove": print "[Network] Removed interface:", interface try: del self.ifaces[interface] except KeyError: pass
class DriverManagerDownload(Screen): def __init__(self, session, plugin_path, args=0): Screen.__init__(self, session) self.skin_path = plugin_path self.session = session self.title = _('VTI DriverManager') try: self['title'] = StaticText(self.title) except: print 'self["title"] was not found in skin' self.list = [] self.list.append( (None, _('Please wait ...'), _(' downloading available drivers information'), LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'] = List(self.list) self['key_red'] = StaticText(_('Exit')) self['key_green'] = StaticText(_('Download')) self['shortcuts'] = ActionMap( ['SetupActions', 'ColorActions', 'DirectionActions'], { 'ok': self.keyOk, 'cancel': self.keyCancel, 'red': self.keyCancel, 'green': self.keyOk, 'yellow': self.keyEasteregg }, -2) self.Console = ComConsole() self.vudevice = getDeviceName() self.downloaddir = '/tmp/' self.htmlfile = 'driver.txt' self.location = 'http://archive.vuplus.com/download/drivers/' self.eastereggbutton = False self.onLayoutFinish.append(self.getDriver) def keyEasteregg(self): if self.eastereggbutton == True: print 'remove oops :-)' self.eastereggbutton == False self.list = [] self.list.append( (None, _('Please wait ...'), _(' downloading available drivers information'), LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) if self.location == 'http://archive.vuplus.com/download/drivers/beta/': self.location = 'http://archive.vuplus.com/download/drivers/' else: self.location = 'http://archive.vuplus.com/download/drivers/beta/' self.getDriver() else: print 'oops' self.eastereggbutton = True self.eastereggTimer = eTimer() self.eastereggTimer.timeout.get().append(self.endEasteregg) self.eastereggTimer.start(500) def endEasteregg(self): self.eastereggbutton = False def getDriver(self): cmd = 'wget %s -O %s%s' % (self.location, self.downloaddir, self.htmlfile) self.Console.ePopen(cmd, self.createDownloadMenu) def createDownloadMenu(self, result, retval, extra_args=None): if retval == 0: self.list = [] if fileExists(self.downloaddir + self.htmlfile): readfile = open(self.downloaddir + self.htmlfile, 'r') text = readfile.read() readfile.close() cmd = 'rm %s%s' % (self.downloaddir, self.htmlfile) system(cmd) else: text = '' result = re.findall( 'vuplus-dvb-modules-' + self.vudevice + '-' + kernel_version + '-\\w+.tar.gz', text) result = list(set(result)) result.sort(reverse=True) for driver in result: driverfilename = driver driver = driver.split('.tar.gz') driver = driver[0].split(kernel_version + '-') if len(driver[1]) > 8: driverappendix = driver[1][8:10] driverappendix = driverappendix.replace('_', '') driverappendix = ' ver. ' + driverappendix else: driverappendix = '' driverday = driver[1][6:8] drivermonth = driver[1][4:6] driveryear = driver[1][0:4] drivertext = driverday + '.' + drivermonth + '.' + driveryear + driverappendix self.list.append( (driverfilename, _('Driver : %s') % drivertext, _('choose this drivers for download'), LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png')), None)) self['downloadmenu'].setList(self.list) else: self.downloadError() def keyOk(self): self.driverselected = self['downloadmenu'].getCurrent() if self.driverselected: self.driverselected = self['downloadmenu'].getCurrent()[0] else: self.driverselected = None if not self.driverselected == None: self.driverselection = self.driverselected self.list = [] self.list.append( (None, _('Please wait, downloading drivers: '), self.driverselection, LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) cmd = 'wget %s%s -O %s%s' % (self.location, self.driverselection, self.downloaddir, self.driverselection) self.Console.ePopen(cmd, self.downloadFinished) def downloadFinished(self, result, retval, extra_args=None): if retval == 0: fulldriverpath = self.downloaddir + self.driverselection self.close(fulldriverpath) else: self.downloadError() def downloadError(self): msg = self.session.open( MessageBox, _('Download failed !\nPlease check your internet connection'), MessageBox.TYPE_ERROR) msg.setTitle(_('VTI DriverManager')) self.close(None) def keyCancel(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) self.close(None)
class Jopkg(Screen): skin = """ <screen name="Jopkg" position="center,center" size="700,500" title="Jopkg" > <widget name="key_yellow" position="10,450" zPosition="2" size="400,22" valign="center" halign="left" font="Regular;20" transparent="1" foregroundColor="yellow" /> <widget name="key_red" position="10,473" zPosition="2" size="130,22" valign="center" halign="left" font="Regular;20" transparent="1" foregroundColor="red" /> <widget name="key_blue" position="520,450" zPosition="2" size="170,22" valign="center" halign="right" font="Regular;20" transparent="1" foregroundColor="blue" /> <widget name="key_green" position="260,473" zPosition="2" size="430,22" valign="center" halign="right" font="Regular;20" transparent="1" foregroundColor="green" /> <widget source="list" render="Listbox" position="5,5" size="690,440" scrollbarMode="showOnDemand"> <convert type="TemplatedMultiContent"> {"template": [ MultiContentEntryText(pos = (55, 2), size = (600, 24), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 2 is the description MultiContentEntryText(pos = (55, 26), size = (600, 16), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 0 is the name MultiContentEntryText(pos = (55, 42), size = (600, 16), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 2 is the description MultiContentEntryPixmapAlphaTest(pos = (5, 2), size = (48, 48), png = 4), # index 4 is the status pixmap MultiContentEntryPixmapAlphaTest(pos = (55, 59), size = (652, 2), png = 5), # index 4 is the div pixmap ], "fonts": [gFont("Regular", 22),gFont("Regular", 14)], "itemHeight": 61 } </convert> </widget> <widget name="whatUPDATED" position="5,60" size="690,400" font="Regular;18" transparent="1"/> </screen>""" def __init__(self, session, args=None): Screen.__init__(self, session) self.session = session self.list = [] self.SelectedIndex = None self.prev_running_service = None self.packages = [] self.installedpackages = [] self.upgradeablepackages = [] self.ActiveFilterID = 0 self.ActiveFilter = "" self.LocalFileName = "" #self.changeList = [] self.maxSize = 8000000 self.maxPackages = 15 if self.getFreeSpace('/var/cache') > self.maxSize * 3: self.CacheDir = "/var/cache" elif self.getFreeSpace('/media/data') > self.maxSize * 4: self.CacheDir = "/media/data" elif self.getFreeSpace('/hdd') > self.maxSize * 4: self.CacheDir = "/hdd" else: self.CacheDir = "/var/cache" if fileExists('/hdd/epg.dat'): os_remove('/hdd/epg.dat') self.firstRun = True self.MainMenu = True self.pushUpgrade = True self.BlockedInstall = False #self.IPTVfullInstalled = False self.BlockedInput = True self.packages2upgrade = 0 self.keyGreenAction = "" self.keyBlueAction = "" self.actionInfo = "" self.SkinSelectorInstalled = 0 self.changed = False #zmiana na True kiedy cokolwiek zainstalujemy self.Console = ComConsole() self.divpng = LoadPixmap(cached = True, path = resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/div-h.png')) self.goinstalledpng = LoadPixmap(cached = True, path = PluginPath + 'icons/install.png') self.goremovepng = LoadPixmap(cached = True, path = PluginPath + 'icons/remove.png') self.gousbpng = LoadPixmap(cached = True, path = PluginPath + 'icons/opkg_local.png') self.installedpng = LoadPixmap(cached = True, path = PluginPath + 'icons/installed.png') self.upgradeablepng = LoadPixmap(cached = True, path = PluginPath + 'icons/upgradeable.png') self["list"] = List(self.list) self["key_red"] = Label(_("Refresh list")) self["key_green"] = Label() self["key_blue"] = Label() self["key_yellow"] = Label() self["whatUPDATED"] = ScrollLabel() self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"], { "cancel": self.keyCancel, "ok": self.doAction, "red": self.keyRed, "green": self.doAction, "yellow": self.keyYellow, "blue": self.keyBlue, "pageUp": self["whatUPDATED"].pageUp, "pageDown": self["whatUPDATED"].pageDown }, -2) self.onLayoutFinish.append(self.layoutFinished) self.onShown.append(self.checkFreeSpace) if self.selectionChanged not in self['list'].onSelectionChanged: self['list'].onSelectionChanged.append(self.selectionChanged) def runCmd(self, cmd): printDEBUG( "runCmd" , cmd ) self.cmd.appClosed.append(self.cmdFinished) self.cmd.dataAvail.append(self.cmdData) if self.cmd.execute(self.ipkg + " " + cmd): self.cmdFinished(-1) def cmdData(self, data): printDEBUG( "cmdData" , data ) if self.cache is None: self.cache = data else: self.cache += data if '\n' in data: splitcache = self.cache.split('\n') if self.cache[-1] == '\n': iteration = splitcache self.cache = None else: iteration = splitcache[:-1] self.cache = splitcache[-1] for mydata in iteration: if mydata != '': self.parseLine(mydata) def cmdFinished(self, retval): self.callCallbacks(10) self.cmd.appClosed.remove(self.cmdFinished) self.cmd.dataAvail.remove(self.cmdData) def layoutFinished(self, ret = 0): printDEBUG( "layoutFinished" , "" ) self.setTitle(_("OPKG manager")) self.refreshLists() if self.firstRun == True: self['key_green'].setText(_('Select option')) #self.firstRun = False def upgradeAll(self, ret): if ret is True: self.changed = True self.session.openWithCallback(self.refreshLists ,Jconsole, title = _("Upgrading all packages...." ), cmdlist = [ self.keyGreenAction ]) return def doManualInstall(self, localIPKfile ): if localIPKfile: self.LocalFileName = localIPKfile print self.LocalFileName self.BlockedInput = False self.keyGreenAction = 'opkg install "%s"' % localIPKfile self.doAction() else: self.LocalFileName = '' self.keyGreenAction = '' def InfoBoxReturn(self, ret=0): #from doAction printDEBUG( "InfoBoxReturn" , "self.keyGreenAction == %s" % self.keyGreenAction ) self.keyGreenAction = '' return def doAction(self): self.SelectedIndex = self["list"].getIndex() printDEBUG( "doAction" , "self.keyGreenAction = '%s'" % self.keyGreenAction ) if self.BlockedInput == True and self.keyGreenAction != 'LocalPackage': printDEBUG( "doAction" , "self.BlockedInput == True" ) return with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") if self.keyGreenAction == 'LocalPackage': printDEBUG( "doAction" , "self.keyGreenAction == 'LocalPackage':" ) from filebrowserwidget import DirectorySelectorWidget self.session.openWithCallback(self.doManualInstall, DirectorySelectorWidget, currDir='/', title=_("Select package") , selectFiles = True ) return elif self.MainMenu == True and self.LocalFileName == "" and not self.keyGreenAction.endswith('UpgradeAll'): printDEBUG( "doAction" , "self.MainMenu == True and self.LocalFileName == "" not self.keyGreenAction.endswith('UpgradeAll')" ) #self.ActiveFilter = "" self.MainMenu = False self.refreshLists() return elif self.keyGreenAction != '': printDEBUG( "doAction" , "self.keyGreenAction = '%s'" % self.keyGreenAction ) current = self['list'].getCurrent() if current[0] == '': printDEBUG( "doAction" , "current[0] = ''" ) return #>>>>> Usuwanie pakietów... if self.keyGreenAction.find("remove") > 0: tekst=_("Are you sure, you want delete % package?") % current[0] #>>>>> przy za malej ilosci pamieci pozwalamy jedynie na remove... elif self.BlockedInstall == True: free_flash_space = self.getFreeSpace('/') human_free_space = free_flash_space / 1048576 msg = _('Only %d MB left!!!\nAt least 8MB is required to safely install and upgrade packages.') % human_free_space self.session.openWithCallback(self.InfoBoxReturn, MessageBox,msg, type = MessageBox.TYPE_INFO, timeout = 10) return #>>>>> upgrade wszystkiego... elif self.keyGreenAction == ('UpgradeAll'): if self.packages2upgrade > self.maxPackages and self.getFreeSpace(self.CacheDir) < self.maxSize * 3: #ze jest wolnego 8MB to juz wiemy self.session.openWithCallback(self.close, MessageBox,_("Too many packages and too small free space for upgrade!!!" ), type = MessageBox.TYPE_INFO, timeout = 10) return else: self.session.openWithCallback(self.doActionFullUpdate, MessageBox,_("Do you want to upgrade all packages?"), type = MessageBox.TYPE_YESNO) return #>>>>> upgrade konkretnego pakietu... elif self.keyGreenAction.startswith('opkg upgrade'): tekst=_("Do you want to upgrade %s package?") % current[0] #>>>>> wszystkie inne przypadki else: #sprawdzmy, czy mamy odpowiednio wolną przestrzeń try: result = os_popen("opkg info %s | grep -m 1 '^Size:' | cut -d ' ' -f2" % current[0]) except: result = 'ERROR' sizetxt="unknown" if result != 'ERROR': for x in result.readlines(): print "OPKG manager, packet size: %s" % x x = x.strip() if x.isdigit(): size = int(x) sizetxt="%dKB" % int(size/1024) if self.keyGreenAction.find("install") > 0: if self.LocalFileName != "": tekst=_("Are you sure to install %s package?") % self.LocalFileName else: tekst=_("Are you sure to install %s package with %s size?") % (current[0],sizetxt) else: tekst=_("Do you want to run '%s'? (package size %s)") % (self.keyGreenAction,sizetxt) if self.SkinSelectorInstalled == 0 and self.keyGreenAction.find("enigma2-skin-") > 0: # dodajemy skinSelektor self.keyGreenAction += " enigma2-plugin-skinselector" #finalnie wykonujemy akcje if None != tekst: self.session.openWithCallback(self.doActionAfterYESNO, MessageBox, tekst, type = MessageBox.TYPE_YESNO) def doActionAfterYESNO(self, ret = True ): if self.keyGreenAction != '' and ret is True: printDEBUG( "doActionAfterYESNO" , "self.keyGreenAction = '%s' and ret is True" % self.keyGreenAction) self.changed = True self.session.openWithCallback(self.post_doAction_check_TMPUPDsh ,Jconsole, title = "%s" % self.keyGreenAction, cmdlist = [ self.keyGreenAction ]) return def doActionFullUpdate(self, ret): if ret is True: self.prev_running_service = self.session.nav.getCurrentlyPlayingServiceReference() self.session.nav.stopService() runlist = [] runlist.append('sync') runlist.append('opkg --cache %s upgrade' % self.CacheDir) runlist.append('rm -f %s/*.ipk' % self.CacheDir) runlist.append('sync') #runlist.append('rm -f /var/opkg/FullUpdate') self.session.openWithCallback(self.post_doAction_check_TMPUPDsh ,Jconsole, title = _("Upgrading all packages..."), cmdlist = runlist) self.keyGreenAction = '' self.changed = True return def post_doAction_check_TMPUPDsh(self): if self.prev_running_service: self.session.nav.playService(self.prev_running_service) if pathExists("/tmp/upd.sh"): printDEBUG( "post_doAction_check_TMPUPDsh" , "pathExists('/tmp/upd.sh')" ) self.session.openWithCallback(self.refreshLists ,Jconsole, title = _("Post upgrade cleanup..."), cmdlist = [ "/tmp/upd.sh" ]) else: self.refreshLists() def keyRed(self): if self.BlockedInput == True: return printDEBUG( "keyRed" , "calling self.refreshLists()" ) self.pushUpgrade = False self.firstRun = False self.refreshLists() return def keyBlue(self): if self.BlockedInput == True: return printDEBUG( "keyBlue" , self.keyBlueAction ) if self.keyBlueAction != '': self.session.openWithCallback(self.refreshLists ,Jconsole, title = "%s" % self.keyBlueAction, cmdlist = [ self.keyBlueAction ]) return def keyYellow(self): printDEBUG( "keyYellow" , "non Graterlia MenuOPKGsettings TBD" ) def keyYellowEnd(self, ret = 0): return def keyCancel(self, ret = 0): if self.Console is not None: printDEBUG( "keyCancel" , "self.Console is not None" ) if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): printDEBUG( "keyCancel" , "killing %s" % name ) self.Console.kill(name) if self.MainMenu == False: printDEBUG( "keyCancel" , "self.MainMenu == False" ) self.MainMenu = True self.refreshLists() return elif self.changed == True: printDEBUG( "keyCancel" , "self.changed == True" ) self.session.openWithCallback(self.keyCancelEnd, MessageBox,_("After changes in opkg, tuner has to be restarted.\n Restart now?"), type = MessageBox.TYPE_YESNO) else: self.close() def keyCancelEnd(self, ret): #some cleaning just in case with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.LocalFileName = None self.list = None self['list'].setList([]) self["list"].setIndex(0) self["whatUPDATED"].setText("") self.SelectedIndex=None self.packages = None self.installedpackages = None self.upgradeablepackages = None self.Console = None self.divpng = None self.goinstalledpng = None self.goremovepng = None self.gousbpng = None self.installedpng = None self.upgradeablepng = None if ret == True: from Components.config import config try: # this is for openPLI to NOT put tuner into sleep mode config.misc.RestartUI.value = True config.misc.RestartUI.save() except: pass from enigma import quitMainloop quitMainloop(2) else: self.close() def getFreeSpace(self, mountpoint): if fileExists(mountpoint): stat_info = statvfs(mountpoint) free_flash_space = stat_info.f_bfree * stat_info.f_bsize return free_flash_space else: return 0 def checkFreeSpace(self): printDEBUG( "checkFreeSpace" , "" ) self.onShown.remove(self.checkFreeSpace) free_flash_space = self.getFreeSpace('/') if free_flash_space < self.maxSize: self.BlockedInstall = True human_free_space = free_flash_space / 1048576 msg = _('Only %d MB left!!!\nAt least 8MB is required to safely install and upgrade packages.') % human_free_space msg += _('Remove some packages, or upgade from console!') self.session.openWithCallback(self.checkFreeSpaceEnd, MessageBox, msg, MessageBox.TYPE_INFO, timeout = 5) def checkFreeSpaceEnd(self, ret = 0): return #>>>>>>>>>>>>>>>>>>>>>>>>> refreshLists main entry def refreshLists(self): def errorMENU(errorID=992): printDEBUG( "refreshLists_errorMENU" , "no network connection" ) if len(self.list) >=1: printDEBUG( "refreshLists" , "len(self.list) >=1" ) self.list.pop(-1) if errorID == 991: self.list.append((_('ERROR connecting to the internet'), '', _('OPKG server does not response on pings :('), '', self.goremovepng, self.divpng)) if errorID == 992: self.list.append((_('ERROR connecting to OPKG'), '', _('Neigther internet nor service is working :('), '', self.goremovepng, self.divpng)) else: self.list.append((_('ERROR updating OPKG'), '', _("'opkg update' command returned an error %i :(") % errorID, '', self.goremovepng, self.divpng)) self.list.append((_("Install local packet") , " ", _("You will be later prompted for file selection."), 'InstallLocal', self.gousbpng, self.divpng)) self['list'].setList(self.list) self['key_red'].hide() self['key_green'].hide() self['key_yellow'].hide() self['key_blue'].hide() def refreshLists_opkg_update( result = None, retval = 992, extra_args = None): printDEBUG( "refreshLists_opkg_update" , "retval:%i" % retval ) if retval != 0: errorMENU(retval) else: self.firstRun = False self.refreshListsmain() def refreshLists_firstRun_doWeHaveNetwork( result, retval, extra_args = None): printDEBUG( "refreshLists_firstRun_doWeHaveNetwork" , "retval:%i" % retval ) if retval != 0: errorMENU(991) else: if pathExists('/var/lib/opkg/lock'): os_system('killall -9 opkg 2>/dev/null;killall -9 wget 2>/dev/null;sleep 1') self.Console.ePopen('opkg update', refreshLists_opkg_update ) printDEBUG( "refreshLists" , "main entry" ) if pathExists("/tmp/upd.sh"): os_remove("/tmp/upd.sh") with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.LocalFileName = '' self.list = [] self['list'].setList(self.list) self["whatUPDATED"].setText("") if self.firstRun == True: printDEBUG( "refreshLists" , "self.firstRun = True" ) self.list.append((_('Package list update'), '', _('Trying to download a new packetlist. Please wait...'), '', self.goinstalledpng, self.divpng)) self['list'].setList(self.list) self.Console.ePopen('wget --spider -q http://j00zek.one.pl/opkg-j00zka', refreshLists_firstRun_doWeHaveNetwork ) else: self.refreshListsmain() def setCurrentIndex(self): if self.SelectedIndex is not None and len(self["list"].list) > self.SelectedIndex: self["list"].setIndex(self.SelectedIndex) else: self["list"].setIndex(0) #>>>>> refreshListsmain run when all above tests went correctly def refreshListsmain(self): printDEBUG( "refreshListsmain" , "enter" ) self.BlockedInput = True if len(self.list) >=1: self.list.pop(-1) if self.MainMenu == True: self.refreshLists_MainMenu() else: #printDEBUG( "refreshListsmain" , "enter" ) #with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.Console.ePopen('opkg list-upgradable', self.refreshLists_Packages_Got_upgadable ) def refreshLists_MainMenu(self): printDEBUG( "refreshLists_MainMenu" , "enter" ) with open("/proc/sys/vm/drop_caches", "w") as f: f.write("1\n") self.Console.ePopen('opkg list-upgradable', self.refreshLists_MainMenu_upgradeablepackages ) def refreshLists_MainMenu_upgradeablepackages(self, result, retval, extra_args = None): def build_MainMenu(): printDEBUG( "build_MainMenu" , "self.list.appends..." ) if self.packages2upgrade > 0: self.list.append((_("Upgrade packages" ), '', _("Recommended update installed packages"), 'UpgradeAll', self.upgradeablepng, self.divpng)) self.list.append((_("Show system plugins only") , '' , '', '-systemplugins-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append((_("Show extension plugins only") , '' , '', '-extensions-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append((_("Show j00zek's plugins only") , '' , '', '-j00zeks-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_plugin.png'), self.divpng)) self.list.append((_("Show openPLI skins only" ) , '' , '', '-skin', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_skin.png'), self.divpng)) self.list.append((_("show fonts only" ) , '' , '', 'font', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_fonts.png'), self.divpng)) self.list.append((_("show picons only" ) , '' , '', '-picon', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_picon.png'), self.divpng)) self.list.append((_("show oscam packages only" ) , '' , '', 'oscam', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_softcam.png'), self.divpng)) self.list.append((_("show Python modules only" ) , '' , '', 'python-', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_python.png'), self.divpng)) self.list.append((_("Show DVB USB modules only" ) , '' , '', 'dvb-usb', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_dvbt.png'), self.divpng)) self.list.append((_("Show all packages" ) , '' , '', '', LoadPixmap(cached=True, path=PluginPath + 'icons/opkg_all.png'), self.divpng)) self.list.append((_("Install local packet" ) , " ", _("You will be later prompted for file selection." ), 'InstallLocal', self.gousbpng, self.divpng)) self['list'].setList(self.list) self.setCurrentIndex() self.BlockedInput = False def build_UpgradeMenu( result, retval, extra_args = None): printDEBUG( "build_UpgradeMenu" , "..." ) self.list.append((_('Upgrade packages' ), '', _('Recommended update installed packages' ), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.BlockedInput = False isRelease=False self["whatUPDATED"].setText(result) self.keyGreenAction = 'UpgradeAll' #print result self.list = [] #printDEBUG( "refreshLists_MainMenu_upgradeablepackages" , "extra_args:'%s' , result:%s , retval:%i" % (extra_args,result, retval) ) self.upgradeablepackages = self.getOPKGlist( SameNazwy = True, lista = result ) self.packages2upgrade = len(self.upgradeablepackages) if self.packages2upgrade > 0 and self.pushUpgrade == True: printDEBUG( "build_UpgradeMenu" , "list of non-Graterlia packages" ) tmptxt='' for x in result.splitlines(): if not x.startswith('Not selecting'): tmptxt += x[:x.find(' - ')] + '\n' self["whatUPDATED"].setText(tmptxt) self.list.append((_('Upgrade packages' ), '', _('Recommended update installed packages' ), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.keyGreenAction = 'UpgradeAll' self.BlockedInput = False else: build_MainMenu() # def refreshLists_Packages(self): def refreshLists_Packages_Got_upgadable(self, result = '', retval=0, extra_args = None): printDEBUG( "refreshLists_Packages_Got_upgadable" , "enter" ) self.upgradeablepackages = self.getOPKGlist( SameNazwy = True, lista = result ) self.packages2upgrade = len(self.upgradeablepackages) if self.packages2upgrade > 0: printDEBUG( "refreshLists" , "self.packages2upgrade > 0" ) self.list.append((_('Upgrade packages' ), '', _('Recommended update installed packages' ), 'UpgradeAll', self.upgradeablepng, self.divpng)) self['list'].setList(self.list) self.keyGreenAction = 'UpgradeAll' self.BlockedInput = False if self.pushUpgrade == True: return elif (self.packages2upgrade == 0 and self.firstRun == True) or self.pushUpgrade == False: printDEBUG( "refreshLists" , "self.packages2upgrade == 0 and self.firstRun == True" ) self.firstRun = False self.Console.ePopen('opkg list', self.refreshLists_Packages_Got_list ) def refreshLists_Packages_Got_list(self, result = '', retval=0, extra_args = None): self.packages = self.getOPKGlist(SameNazwy = False, lista = result) self.Console.ePopen('opkg list-installed', self.refreshLists_Packages_Got_installedpackages ) def refreshLists_Packages_Got_installedpackages(self, result = '', retval=0, extra_args = None): self.installedpackages = self.getOPKGlist(SameNazwy = True, lista = result) self.SkinSelectorInstalled = 0 for package in self.packages: #łączymy duplikaty razem - duplikat to ta sama nazwa i ten sam opis, moze się różnić jedynie wersją if len(self.list) > 0 and package[0].strip() == self.list[-1][0] and package[2].strip() == self.list[-1][2]: package[1] = self.list[-1][1] + " > " + package[1].strip() self.list.pop(-1) #if self.filters[self.ActiveFilterID][0] == "" or package[0].strip().startswith(self.filters[self.ActiveFilterID][0]): if self.ActiveFilter == "" or package[0].strip().find(self.ActiveFilter) > -1: if package[0].strip() in self.upgradeablepackages: self.list.append(self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'upgradeable')) elif package[0].strip() in self.installedpackages and self.firstRun == False: self.list.append(self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'installed')) if package[0].strip() == "enigma2-plugin-skinselector": self.SkinSelectorInstalled = 1 elif self.firstRun == False: #if self.IPTVfullInstalled == True and package[0].strip().startswith("enigma2-plugin-iptvplayer-host-"): # printDEBUG( "refreshLists" , "Removing = %s" % package[0].strip() ) #else: self.list.append(self.buildEntryComponent(package[0].strip(), package[1].strip(), package[2].strip(), 'installable')) printDEBUG( "refreshLists" , "calling final self['list'].setList(self.list)" ) self['list'].setList(self.list) self.setCurrentIndex() self.BlockedInput = False def getOPKGlist(self, SameNazwy = False , lista = '' ): printDEBUG( "getOPKGlist" , "SameNazwy = %s" % SameNazwy ) myList = [] if lista != '': self.packetlist = [] for x in lista.splitlines(): if x.startswith('Not selecting'): continue parts = x.split(' - ') if len(parts) >=2: if SameNazwy == True: myList.append( parts[0].strip() ) else: if len(parts) == 2: myList.append([ parts[0].strip(), parts[1].strip(), ""]) elif len(parts) >=3: myList.append([ parts[0].strip(), parts[1].strip(), parts[2].strip()]) return myList def buildEntryComponent(self, name, version, description, state): #printDEBUG( "buildEntryComponent" , state ) if state == 'installable': return (name, version, description, state, self.goinstalledpng, self.divpng) if state == 'installed': return (name, version, description, state, self.installedpng, self.divpng) if state == 'upgradeable': return (name, version, description, state, self.upgradeablepng, self.divpng) if state == 'goremove': return [name, version, description, state, self.goremovepng, self.divpng] if state == 'gousb': return [name, version, description, state, self.gousbpng, self.divpng] def selectionChanged(self): current = self['list'].getCurrent() self.keyBlueAction ='' self['key_blue'].setText('') if current: #printDEBUG( "selectionChanged" , "selectionChanged.current = %s" % current[3] ) #print current if current[3] == 'installed': self['key_green'].setText(_("Delete")) self.actionInfo = _("delete %s" ) % current[0] self.keyGreenAction = 'opkg remove --autoremove %s' % current[0] self['key_blue'].setText(_("Reinstall")) self.keyBlueAction ='opkg install --force-reinstall %s' % current[0] elif current[3] == 'installable': self['key_green'].setText(_("Install")) self.actionInfo = _("install %s" ) % current[0] self.keyGreenAction = 'opkg install %s' % current[0] elif current[3] == 'upgradeable': self['key_green'].setText(_("Upgrade")) self.actionInfo = _("upgrade %s") % current[0] self.keyGreenAction = 'opkg upgrade %s' % current[0] elif current[3] == 'UpgradeAll': self['key_green'].setText(_("Upgrade packages" )) self.actionInfo = _("upgrade packages" ) self.keyGreenAction = 'UpgradeAll' elif self.MainMenu == True: if current[3] == 'InstallLocal': self['key_green'].setText(_("Install Local package" )) self['key_green'].show() self.keyGreenAction = 'LocalPackage' else: self['key_green'].setText(_("Select option")) self.keyGreenAction = '' self.actionInfo = "" self.ActiveFilter = current[3] #print "[jopkg] selectionChanged>self.ActiveFilter = %s" % self.ActiveFilter else: self['key_green'].setText('') self.keyGreenAction = '' self.actionInfo = ""
class SoftwareTools(PackageInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} def __init__(self): aboutInfo = getImageVersion() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage( )[:2] # getLanguage returns e.g. "fi_FI" for "language_country" PackageInfoHandler.__init__(self, self.statusCallback, blocking=False, neededTag='ALL_TAGS', neededFlag=self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev', '-src') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback=None): if callback is not None: self.NotifierCallback = callback iNetwork.checkNetworkState(self.checkNetworkCB) def checkNetworkCB(self, data): if data is not None: if data <= 2: self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback=None): if self.lastDownloadDate is None: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() pass def startIpkgListAvailable(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any( name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append( [name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval=None, extra_args=None): (callback) = extra_args or None if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list_installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.countUpdates() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def countUpdates(self, callback=None): self.available_updates = 0 self.available_updatelist = [] for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates += 1 self.available_updatelist.append([packagename]) self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def startIpkgUpdate(self, callback=None): if not self.Console: self.Console = Console() cmd = self.ipkg.ipkg + " update" self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) def IpkgUpdateCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: if self.Console: if len(self.Console.appContainers) == 0: if callback is not None: callback(True) callback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class Network(): def __init__(self): self.ifaces = {} self.onlyWoWifaces = {} self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = 'ethtool' self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateInterfaceConsole = Console() self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): if self.remoteRootFS is None: import Harddisk for parts in Harddisk.getProcMounts(): if parts[1] == '/' and parts[2] == 'nfs': self.remoteRootFS = True break else: self.remoteRootFS = False return self.remoteRootFS def isBlacklisted(self, iface): return iface in ('lo', 'wifi0', 'wmaster0', 'sit0', 'tun0', 'tap0', 'sys0', 'p2p0', 'tunl0') def getInterfaces(self, callback=None): self.configuredInterfaces = [] for device in self.getInstalledAdapters(): self.getAddrInet(device, callback) def regExpMatch(self, pattern, string): if string is None: return try: return pattern.search(string).group() except AttributeError: return def convertIP(self, ip): return [int(n) for n in ip.split('.')] def getAddrInet(self, iface, callback): if not self.Console: self.Console = Console() cmd = 'busybox ip -o addr show dev ' + iface + ' | grep -v inet6' self.Console.ePopen(cmd, self.IPaddrFinished, [iface, callback]) def IPaddrFinished(self, result, retval, extra_args): iface, callback = extra_args data = {'up': False, 'dhcp': False, 'preup': False, 'predown': False} globalIPpattern = re.compile('scope global') ipRegexp = '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}' ipLinePattern = re.compile('inet ' + ipRegexp + '/') ipPattern = re.compile(ipRegexp) netmaskLinePattern = re.compile('/' + netRegexp) netmaskPattern = re.compile(netRegexp) bcastLinePattern = re.compile(' brd ' + ipRegexp) upPattern = re.compile('UP') macPattern = re.compile(macRegexp) macLinePattern = re.compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ', 2) if split[1][:-1] == iface or split[1][:-1] == iface + '@sys0': up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch( macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if split[1] == iface: if re.search(globalIPpattern, split[2]): ip = self.regExpMatch( ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask( self.regExpMatch( netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch( ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = 'route -n | grep ' + iface self.Console.ePopen(cmd, self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): iface, data, callback = extra_args ipRegexp = '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) ipLinePattern = re.compile(ipRegexp) for line in result.splitlines(): print line[0:7] if line[0:7] == '0.0.0.0': gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data self.loadNetworkConfig(iface, callback) def writeNetworkConfig(self): self.configuredInterfaces = [] fp = file('/etc/network/interfaces', 'w') fp.write( '# automatically generated by enigma2\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.has_key('dns-nameservers') and iface['dns-nameservers']: dns = [] for s in iface['dns-nameservers'].split()[1:]: dns.append(self.convertIP(s)) if dns: self.nameservers = dns WoW = False if self.onlyWoWifaces.has_key(ifacename): WoW = self.onlyWoWifaces[ifacename] if WoW == False and iface['up'] == True: fp.write('auto ' + ifacename + '\n') self.configuredInterfaces.append(ifacename) self.onlyWoWifaces[ifacename] = False elif WoW == True: self.onlyWoWifaces[ifacename] = True fp.write('#only WakeOnWiFi ' + ifacename + '\n') if iface['dhcp']: fp.write('iface ' + ifacename + ' inet dhcp\n') if not iface['dhcp']: fp.write('iface ' + ifacename + ' inet static\n') fp.write(' hostname $(hostname)\n') if iface.has_key('ip'): fp.write('\taddress %d.%d.%d.%d\n' % tuple(iface['ip'])) fp.write('\tnetmask %d.%d.%d.%d\n' % tuple(iface['netmask'])) if iface.has_key('gateway'): fp.write('\tgateway %d.%d.%d.%d\n' % tuple(iface['gateway'])) if iface.has_key('configStrings'): fp.write(iface['configStrings']) if iface['preup'] is not False and not iface.has_key( 'configStrings'): fp.write(iface['preup']) if iface['predown'] is not False and not iface.has_key( 'configStrings'): fp.write(iface['predown']) fp.write('\n') fp.close() self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): try: os.system('rm -rf /etc/resolv.conf') fp = file('/etc/resolv.conf', 'w') for nameserver in self.nameservers: fp.write('nameserver %d.%d.%d.%d\n' % tuple(nameserver)) fp.close() except: print '[Network] interfaces - resolv.conf write failed' def loadNetworkConfig(self, iface, callback=None): interfaces = [] try: fp = file('/etc/network/interfaces', 'r') interfaces = fp.readlines() fp.close() except: print '[Network] interfaces - opening failed' ifaces = {} currif = '' for i in interfaces: split = i.strip().split(' ') if split[0] == 'iface' and split[2] != 'inet6': currif = split[1] ifaces[currif] = {} if len(split) == 4 and split[3] == 'dhcp': ifaces[currif]['dhcp'] = True else: ifaces[currif]['dhcp'] = False if currif == iface: if split[0] == 'address': ifaces[currif]['address'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('ip'): if self.ifaces[currif]['ip'] != ifaces[currif][ 'address'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['ip'] = map( int, split[1].split('.')) if split[0] == 'netmask': ifaces[currif]['netmask'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('netmask'): if self.ifaces[currif]['netmask'] != ifaces[currif][ 'netmask'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['netmask'] = map( int, split[1].split('.')) if split[0] == 'gateway': ifaces[currif]['gateway'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('gateway'): if self.ifaces[currif]['gateway'] != ifaces[currif][ 'gateway'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['gateway'] = map( int, split[1].split('.')) if split[0] == 'pre-up': if self.ifaces[currif].has_key('preup'): self.ifaces[currif]['preup'] = i if split[0] in ('pre-down', 'post-down'): if self.ifaces[currif].has_key('predown'): self.ifaces[currif]['predown'] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]['dhcp'] = iface['dhcp'] if self.Console: if len(self.Console.appContainers) == 0: self.configuredNetworkAdapters = self.configuredInterfaces self.loadNameserverConfig() self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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: self.nameservers.append(self.convertIP(ip)) def getInstalledAdapters(self): return [ x for x in os.listdir('/sys/class/net') if not self.isBlacklisted(x) ] def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get(x, x) def getFriendlyAdapterNaming(self, iface): name = None if self.isWirelessInterface(iface): if iface not in self.wlan_interfaces: name = _('WLAN connection') if len(self.wlan_interfaces): name += ' ' + str(len(self.wlan_interfaces) + 1) self.wlan_interfaces.append(iface) elif iface not in self.lan_interfaces: if getBoxType() == 'et10000' and iface == 'eth1': name = _('VLAN connection') else: name = _('LAN connection') if len(self.lan_interfaces ) and not getBoxType() == 'et10000' and not iface == 'eth1': name += ' ' + str(len(self.lan_interfaces) + 1) self.lan_interfaces.append(iface) return name def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) if moduledir: name = os.path.basename(os.path.realpath(moduledir)) if name.startswith('ath') or name.startswith('carl'): name = 'Atheros' elif name.startswith('rt2') or name.startswith( 'rt3') or name.startswith('rt5') or name.startswith( 'rt6') or name.startswith('rt7'): name = 'Ralink' elif name.startswith('zd'): name = 'Zydas' elif name.startswith('rtl') or name.startswith('r8'): name = 'Realtek' elif name.startswith('smsc'): name = 'SMSC' elif name.startswith('peg'): name = 'Pegasus' elif name.startswith('rn'): name = 'RNDIS' elif name.startswith('mw') or name.startswith('libertas'): name = 'Marvel' elif name.startswith('p5'): name = 'Prism' elif name.startswith('as') or name.startswith('ax'): name = 'ASIX' elif name.startswith('dm'): name = 'Davicom' elif name.startswith('mcs'): name = 'MosChip' elif name.startswith('at'): name = 'Atmel' elif name.startswith('iwm'): name = 'Intel' elif name.startswith('brcm') or name.startswith('bcm'): name = 'Broadcom' elif name == 'wlan': name = name.upper() else: name = _('Unknown') return name + ' ' + _('wireless network interface') 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] 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): 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 resetNetworkConfig(self, mode='lan', callback=None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append('/etc/init.d/avahi-daemon stop') for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append('ip addr flush dev ' + iface + ' scope global') self.commands.append('/etc/init.d/networking stop') self.commands.append('killall -9 udhcpc') self.commands.append('rm /var/run/udhcpc*') self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): mode, callback = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self, mode='lan', callback=None): fp = file('/etc/network/interfaces', 'w') fp.write( '# automatically generated by enigma2\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') if mode == 'wlan-mpci': fp.write('auto ath0\n') fp.write('iface ath0 inet dhcp\n') if mode == 'lan': fp.write('auto eth0\n') fp.write('iface eth0 inet dhcp\n') fp.write('\n') fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append('ifconfig eth0 down') self.commands.append('ifconfig ath0 down') self.commands.append('ifconfig wlan0 up') if mode == 'wlan-mpci': self.commands.append('ifconfig eth0 down') self.commands.append('ifconfig wlan0 down') self.commands.append('ifconfig ath0 up') if mode == 'lan': self.commands.append('ifconfig eth0 up') self.commands.append('ifconfig wlan0 down') self.commands.append('ifconfig ath0 down') self.commands.append('/etc/init.d/avahi-daemon start') self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode, callback], debug=True) def resetNetworkFinished(self, extra_args): mode, callback = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True, mode) def checkNetworkState(self, statecallback): self.NetworkState = 0 cmd1 = 'ping -c 1 openspa.info' cmd2 = 'ping -c 1 duckduckgo.com' cmd3 = 'ping -c 1 www.linuxfoundation.org' self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished, statecallback) def checkNetworkStateFinished(self, result, retval, extra_args): statecallback = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self, callback=None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append('/etc/init.d/avahi-daemon stop') for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append('ifdown ' + iface) self.commands.append('ip addr flush dev ' + iface + ' scope global') self.commands.append('/etc/init.d/networking stop') self.commands.append('killall -9 udhcpc') self.commands.append('rm /var/run/udhcpc*') self.commands.append('/etc/init.d/networking start') self.commands.append('/etc/init.d/avahi-daemon start') self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self, extra_args): callback = extra_args if callback is not None: try: callback(True) except: pass def getLinkState(self, iface, callback): cmd = self.ethtool_bin + ' ' + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished, callback) def getLinkStateFinished(self, result, retval, extra_args): callback = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in self.PingConsole.appContainers.keys(): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: self.deactivateInterfaceConsole.killAll() self.deactivateInterfaceConsole = None def stopActivateInterfaceConsole(self): if self.activateInterfaceConsole is not None: self.activateInterfaceConsole.killAll() self.activateInterfaceConsole = None def checkforInterface(self, iface): if self.getAdapterAttribute(iface, 'up') is True: return True ret = os.system('ifconfig ' + iface + ' up') os.system('ifconfig ' + iface + ' down') if ret == 0: return True else: return False def checkDNSLookup(self, statecallback): cmd1 = 'nslookup openspa.info' cmd2 = 'nslookup duckduckgo.com' cmd3 = 'nslookup www.linuxfoundation.org' self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished, statecallback) def checkDNSLookupFinished(self, result, retval, extra_args): statecallback = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self, ifaces, callback=None): self.config_ready = False self.msgPlugins() commands = [] def buildCommands(iface): commands.append('ifdown ' + iface) commands.append('ip addr flush dev ' + iface + ' scope global') if os.path.exists('/var/run/wpa_supplicant/' + iface): commands.append('wpa_cli -i' + iface + ' terminate') if not self.deactivateInterfaceConsole: self.deactivateInterfaceConsole = Console() if isinstance(ifaces, (list, tuple)): for iface in ifaces: if iface != 'eth0' or not self.onRemoteRootFS(): buildCommands(iface) else: if ifaces == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return buildCommands(ifaces) self.deactivateInterfaceConsole.eBatch( commands, self.deactivateInterfaceFinished, [ifaces, callback], debug=True) def deactivateInterfaceFinished(self, extra_args): ifaces, callback = extra_args def checkCommandResult(iface): if self.deactivateInterfaceConsole and self.deactivateInterfaceConsole.appResults.has_key( 'ifdown ' + iface): result = str( self.deactivateInterfaceConsole.appResults.get( 'ifdown ' + iface)).strip('\n') if result == 'ifdown: interface ' + iface + ' not configured': return False else: return True if isinstance(ifaces, (list, tuple)): for iface in ifaces: if checkCommandResult(iface) is False: Console().ePopen('ifconfig ' + iface + ' down') elif checkCommandResult(ifaces) is False: Console().ePopen('ifconfig ' + ifaces + ' down') if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def activateInterface(self, iface, callback=None): if self.config_ready: self.config_ready = False self.msgPlugins() if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return if not self.activateInterfaceConsole: self.activateInterfaceConsole = Console() commands = ['ifup ' + iface] self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) def activateInterfaceFinished(self, extra_args): callback = extra_args if self.activateInterfaceConsole: if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: try: callback(True) except: pass def sysfsPath(self, iface): return '/sys/class/net/' + iface def isWirelessInterface(self, iface): if iface in self.wlan_interfaces: return True if os.path.isdir(self.sysfsPath(iface) + '/wireless'): return True device = re.compile('[a-z]{2,}[0-9]*:') ifnames = [] fp = open('/proc/net/wireless', 'r') for line in fp: try: ifnames.append(device.search(line).group()[:-1]) except AttributeError: pass fp.close() if iface in ifnames: return True return False def canWakeOnWiFi(self, iface): if self.sysfsPath(iface) == '/sys/class/net/wlan3' and os.path.exists( '/tmp/bcm/%s' % iface): return True def getWlanModuleDir(self, iface=None): if self.sysfsPath(iface) == '/sys/class/net/wlan3' and os.path.exists( '/tmp/bcm/%s' % iface): devicedir = self.sysfsPath('sys0') + '/device' else: devicedir = self.sysfsPath(iface) + '/device' moduledir = devicedir + '/driver/module' if os.path.isdir(moduledir): return moduledir try: for x in os.listdir(devicedir): if x.startswith('1-'): moduledir = devicedir + '/' + x + '/driver/module' if os.path.isdir(moduledir): return moduledir moduledir = devicedir + '/driver' if os.path.isdir(moduledir): return moduledir except: pass def detectWlanModule(self, iface=None): if not self.isWirelessInterface(iface): return None devicedir = self.sysfsPath(iface) + '/device' if os.path.isdir(devicedir + '/ieee80211'): return 'nl80211' moduledir = self.getWlanModuleDir(iface) if moduledir: module = os.path.basename(os.path.realpath(moduledir)) if module in ('brcm-systemport', ): return 'brcm-wl' if module in ('ath_pci', 'ath5k'): return 'madwifi' if module in ('rt73', 'rt73'): return 'ralink' if module == 'zd1211b': return 'zydas' return 'wext' def calc_netmask(self, nmask): from struct import pack from socket import inet_ntoa mask = 2147483648L xnet = 4294967295L cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = (1L << cidr) - 1 << 32 - cidr netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins( PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready) def hotplug(self, event): interface = event['INTERFACE'] if self.isBlacklisted(interface): return action = event['ACTION'] if action == 'add': print '[Network] Add new interface:', interface self.getAddrInet(interface, None) elif action == 'remove': print '[Network] Removed interface:', interface try: del self.ifaces[interface] except KeyError: pass def getInterfacesNameserverList(self, iface): result = [] nameservers = self.getAdapterAttribute(iface, 'dns-nameservers') if nameservers: ipRegexp = '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) for x in nameservers.split()[1:]: ip = self.regExpMatch(ipPattern, x) if ip: result.append([int(n) for n in ip.split('.')]) if len(self.nameservers) and not result: result.extend(self.nameservers) return result
class ImageDownload(Screen): def __init__(self, session, plugin_path): Screen.__init__(self, session) self.skinName = ['ImageDownload', 'DriverManagerDownload'] self.skin_path = plugin_path self.session = session self.title = _('VTI Image Flash Tool') try: self['title'] = StaticText(self.title) except: print 'self["title"] was not found in skin' self.list = [] self.list.append( (None, _('Please wait ...'), _(' downloading available image information'), LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'] = List(self.list) self['key_red'] = StaticText(_('Exit')) self['key_green'] = StaticText(_('Ok')) self['shortcuts'] = ActionMap( ['SetupActions', 'ColorActions', 'DirectionActions'], { 'ok': self.keyOk, 'cancel': self.keyCancel, 'red': self.keyCancel, 'green': self.keyOk }, -2) self.Console = ComConsole() self.vudevice = getDeviceName() self.onLayoutFinish.append(self.init_vars) def init_vars(self): self.messagebox_title = 'VTi Image Flash Tool' self.is_file_list = False self.file_name = None self.image_url = None self.image_name = None self.path = None self.is_menu_blocked = None self.getImageList() def getImageList(self): self.list = [] result, images = parse_download_file() self.list.append( ('file_selection', _('Flash extracted image from storage device'), '', LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png')), None)) if result == 0: for image in images: if image[0] == self.vudevice: self.list.append(( image[2], _('Image: %s') % image[1], _('Download image from vuplus-support.org and flash it' ), LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png') ), image[1])) elif result == 2: self.list.append(( None, _('Sorry ...'), _('It seems that your Internet connection is not ok, please check it' ), LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) elif result == 3: self.list.append(( None, _('Sorry ...'), _('The image list can not be loaded, please be patient and try again later' ), LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) def keyOk(self): image = self['downloadmenu'].getCurrent() if image and image[0] == 'file_selection': msg_txt = _( 'This will flash the selected image without further questions.\nYour current software installation will be deleted and overwritten\nReally continue ?' ) msg = self.session.openWithCallback(self.info_confirmed, MessageBox, msg_txt, MessageBox.TYPE_YESNO, default=False) msg.setTitle(self.messagebox_title) else: self.info_confirmed(True) def info_confirmed(self, res): if res: if self.is_menu_blocked: return no_access_dirs = [] no_access_dirs.append('/media/net/autofs') if os_path.exists('/media/net/autofs'): for dir in listdir('/media/net/autofs'): autofs_dir = '/media/net/autofs/' + dir if os_path.exists(autofs_dir): try: listdir(autofs_dir) except OSError: no_access_dirs.append(autofs_dir) mounts = open('/proc/mounts').readlines() locations = [] for mp in mounts: mp = mp.split(' ') if len(mp) >= 2: if mp[1].startswith('/media/') and mp[ 1] != '/media/net' and mp[1] not in no_access_dirs: locations.append((mp[1], mp[1], None)) if len(locations): msg = self.session.openWithCallback( self.got_download_device, ChoiceBox, title=_('Please select medium to use as image location'), list=locations) msg.setTitle(self.messagebox_title) def got_download_device(self, res): if res: path = res[0] error_msg = _( 'Error at creating download destination !\nPlease select another device.' ) base_path = check_download_dir(path) if base_path: if base_path == 'size': msg = self.session.open( MessageBox, _('There is to low free memory at choosen device\nPlease select another device.' ), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) elif base_path == 'error': msg = self.session.open(MessageBox, error_msg, MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) else: image = self['downloadmenu'].getCurrent() if image: image_url = image[0] image_name = image[4] if image_name: image_name = image_name.lower() image_name = image_name.replace(' ', '_') path = base_path + '/' + image_name if not fileExists(path): try: os.makedirs(path) except OSError: pass if not fileExists(path, mode='w'): msg = self.session.open(MessageBox, error_msg, MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) elif image_url == 'file_selection': if check_flash_files(path): path = path elif fileExists(path + '/vti-image-download'): path = path + '/vti-image-download' else: path = path if not path.endswith('/'): path = path + '/' self.session.openWithCallback( self.image_selected, ImageFileSelector, path, self.skin_path) else: self.start_download(path) def image_selected(self, path=None): if path: if path.endswith('/'): path = path[:-1] self.path = path self.unzip_finished(result=None, retval=0, extra_args=None) else: self.init_vars() def start_download(self, path): image = self['downloadmenu'].getCurrent() if image: self.image_url = self['downloadmenu'].getCurrent()[0] self.image_name = self['downloadmenu'].getCurrent()[4] self.path = path self.file_name = os.path.join(self.path + '/', os.path.basename(self.image_url)) if fileExists(self.file_name) and self.verify_download(): self.download_finished(True) else: job_name = _('Download %s') % self.image_name job_manager.AddJob( downloadJob(self.image_url, self.file_name, job_name)) tasklist = [] for job in job_manager.getPendingJobs(): if job.name == job_name: tasklist.append( (job, job.name, job.getStatustext(), int(100 * job.progress / float(job.end)), str(100 * job.progress / float(job.end)) + '%')) break if len(tasklist): self.session.openWithCallback(self.download_finished, DownloadTaskScreen, self.skin_path, tasklist, job_name) def download_finished(self, res): if res: if self.verify_download(): self.list = [ (None, _('Extracting image ...'), _('Please wait ...'), LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None) ] self['downloadmenu'].setList(self.list) cmd = '/usr/bin/unzip -o %s -d %s' % (self.file_name, self.path) self.Console.ePopen(cmd, self.unzip_finished) else: msg = self.session.open( MessageBox, _('Sorry, download verification failed\nPlease try again.' ), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) self.init_vars() else: self.init_vars() def verify_download(self): self.is_menu_blocked = True self.list = [ (None, _('Verifying download ...'), _('Please wait ...'), LoadPixmap(cached=True, path=resolveFilename( SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None) ] self['downloadmenu'].setList(self.list) md5sum_online = parse_md5sum_file(self.image_url + '.md5') md5sum_file = get_md5_hash(self.file_name) if md5sum_file and md5sum_online and md5sum_file == md5sum_online: return True return False def unzip_finished(self, result, retval, extra_args=None): if retval == 0: if check_flash_files(self.path): msg_txt = _( 'This will flash the downloaded image.\nYour current software installation will be deleted and overwritten\nIf you cancel here the downloaded image will be stored and you flash it later\nReally continue ?' ) msg = self.session.openWithCallback(self.flash_confirmed, MessageBox, msg_txt, MessageBox.TYPE_YESNO, default=False) msg.setTitle(self.messagebox_title) else: self.init_vars() msg = self.session.open( MessageBox, _('Sorry, necessary files are missing\nPlease try again.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) else: msg = self.session.open( MessageBox, _('Sorry, extracting of image failed\nPlease try again.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) self.init_vars() def flash_confirmed(self, res): if res: self.session.open(BackupRestoreScreen, title=_('VTi Image Flash Process'), restorepath=self.path, image_flash=True) else: self.init_vars() def keyCancel(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) self.close(None)
class ImageDownload(Screen): def __init__(self, session, plugin_path): Screen.__init__(self, session) self.skinName = ['ImageDownload', 'DriverManagerDownload'] self.skin_path = plugin_path self.session = session self.title = _('VTI Image Flash Tool') try: self['title'] = StaticText(self.title) except: print 'self["title"] was not found in skin' self.list = [] self.list.append((None, _('Please wait ...'), _(' downloading available image information'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'] = List(self.list) self['key_red'] = StaticText(_('Exit')) self['key_green'] = StaticText(_('Ok')) self['shortcuts'] = ActionMap(['SetupActions', 'ColorActions', 'DirectionActions'], {'ok': self.keyOk, 'cancel': self.keyCancel, 'red': self.keyCancel, 'green': self.keyOk}, -2) self.Console = ComConsole() self.vudevice = getDeviceName() self.onLayoutFinish.append(self.init_vars) def init_vars(self): self.messagebox_title = 'VTi Image Flash Tool' self.is_file_list = False self.file_name = None self.image_url = None self.image_name = None self.path = None self.is_menu_blocked = None self.getImageList() def getImageList(self): self.list = [] result, images = parse_download_file() self.list.append(('file_selection', _('Flash extracted image from storage device'), '', LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png')), None)) if result == 0: for image in images: if image[0] == self.vudevice: self.list.append((image[2], _('Image: %s') % image[1], _('Download image from vuplus-support.org and flash it'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png')), image[1])) elif result == 2: self.list.append((None, _('Sorry ...'), _('It seems that your Internet connection is not ok, please check it'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) elif result == 3: self.list.append((None, _('Sorry ...'), _('The image list can not be loaded, please be patient and try again later'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) def keyOk(self): image = self['downloadmenu'].getCurrent() if image and image[0] == 'file_selection': msg_txt = _('This will flash the selected image without further questions.\nYour current software installation will be deleted and overwritten\nReally continue ?') msg = self.session.openWithCallback(self.info_confirmed, MessageBox, msg_txt, MessageBox.TYPE_YESNO, default=False) msg.setTitle(self.messagebox_title) else: self.info_confirmed(True) def info_confirmed(self, res): if res: if self.is_menu_blocked: return no_access_dirs = [] no_access_dirs.append('/media/net/autofs') if os_path.exists('/media/net/autofs'): for dir in listdir('/media/net/autofs'): autofs_dir = '/media/net/autofs/' + dir if os_path.exists(autofs_dir): try: listdir(autofs_dir) except OSError: no_access_dirs.append(autofs_dir) mounts = open('/proc/mounts').readlines() locations = [] for mp in mounts: mp = mp.split(' ') if len(mp) >= 2: if mp[1].startswith('/media/') and mp[1] != '/media/net' and mp[1] not in no_access_dirs: locations.append((mp[1], mp[1], None)) if len(locations): msg = self.session.openWithCallback(self.got_download_device, ChoiceBox, title=_('Please select medium to use as image location'), list=locations) msg.setTitle(self.messagebox_title) def got_download_device(self, res): if res: path = res[0] error_msg = _('Error at creating download destination !\nPlease select another device.') base_path = check_download_dir(path) if base_path: if base_path == 'size': msg = self.session.open(MessageBox, _('There is to low free memory at choosen device\nPlease select another device.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) elif base_path == 'error': msg = self.session.open(MessageBox, error_msg, MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) else: image = self['downloadmenu'].getCurrent() if image: image_url = image[0] image_name = image[4] if image_name: image_name = image_name.lower() image_name = image_name.replace(' ', '_') path = base_path + '/' + image_name if not fileExists(path): try: os.makedirs(path) except OSError: pass if not fileExists(path, mode='w'): msg = self.session.open(MessageBox, error_msg, MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) elif image_url == 'file_selection': if check_flash_files(path): path = path elif fileExists(path + '/vti-image-download'): path = path + '/vti-image-download' else: path = path if not path.endswith('/'): path = path + '/' self.session.openWithCallback(self.image_selected, ImageFileSelector, path, self.skin_path) else: self.start_download(path) def image_selected(self, path = None): if path: if path.endswith('/'): path = path[:-1] self.path = path self.unzip_finished(result=None, retval=0, extra_args=None) else: self.init_vars() def start_download(self, path): image = self['downloadmenu'].getCurrent() if image: self.image_url = self['downloadmenu'].getCurrent()[0] self.image_name = self['downloadmenu'].getCurrent()[4] self.path = path self.file_name = os.path.join(self.path + '/', os.path.basename(self.image_url)) if fileExists(self.file_name) and self.verify_download(): self.download_finished(True) else: job_name = _('Download %s') % self.image_name job_manager.AddJob(downloadJob(self.image_url, self.file_name, job_name)) tasklist = [] for job in job_manager.getPendingJobs(): if job.name == job_name: tasklist.append((job, job.name, job.getStatustext(), int(100 * job.progress / float(job.end)), str(100 * job.progress / float(job.end)) + '%')) break if len(tasklist): self.session.openWithCallback(self.download_finished, DownloadTaskScreen, self.skin_path, tasklist, job_name) def download_finished(self, res): if res: if self.verify_download(): self.list = [(None, _('Extracting image ...'), _('Please wait ...'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)] self['downloadmenu'].setList(self.list) cmd = '/usr/bin/unzip -o %s -d %s' % (self.file_name, self.path) self.Console.ePopen(cmd, self.unzip_finished) else: msg = self.session.open(MessageBox, _('Sorry, download verification failed\nPlease try again.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) self.init_vars() else: self.init_vars() def verify_download(self): self.is_menu_blocked = True self.list = [(None, _('Verifying download ...'), _('Please wait ...'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)] self['downloadmenu'].setList(self.list) md5sum_online = parse_md5sum_file(self.image_url + '.md5') md5sum_file = get_md5_hash(self.file_name) if md5sum_file and md5sum_online and md5sum_file == md5sum_online: return True return False def unzip_finished(self, result, retval, extra_args = None): if retval == 0: if check_flash_files(self.path): msg_txt = _('This will flash the downloaded image.\nYour current software installation will be deleted and overwritten\nIf you cancel here the downloaded image will be stored and you flash it later\nReally continue ?') msg = self.session.openWithCallback(self.flash_confirmed, MessageBox, msg_txt, MessageBox.TYPE_YESNO, default=False) msg.setTitle(self.messagebox_title) else: self.init_vars() msg = self.session.open(MessageBox, _('Sorry, necessary files are missing\nPlease try again.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) else: msg = self.session.open(MessageBox, _('Sorry, extracting of image failed\nPlease try again.'), MessageBox.TYPE_ERROR) msg.setTitle(self.messagebox_title) self.init_vars() def flash_confirmed(self, res): if res: self.session.open(BackupRestoreScreen, title=_('VTi Image Flash Process'), restorepath=self.path, image_flash=True) else: self.init_vars() def keyCancel(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) self.close(None)
class wlanStatus: def __init__(self): self.getStatusConsole = Console() self.essid_pattern = re.compile('ESSID:".+" ') self.frequency_pattern = re.compile('Frequency:[.0-9]+ [a-zA-Z]{2,3} ') self.channel_pattern = re.compile('Channel:\d+ ') self.accesspoint_pattren = re.compile('Access Point: .+') self.bitrate_pattern = re.compile( "Bit Rate[=:][\d.]{1,5} [GMgmb/s]{1,5}") self.link_quality_pattern = re.compile('Link Quality=\d+/\d+') self.signal_level_pattern = re.compile('Signal level=\d+/\d+') self.noise_level_pattern = re.compile('Noise level=\d+/\d+') self.signal_level_dbm_pattern = re.compile('Signal level=.+ dBm ') self.noise_level_dbm_pattern = re.compile('Noise level=.+ dBm') self.inet_addr_pattern = re.compile( 'inet addr:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}') def stopWlanConsole(self): if self.getStatusConsole is not None: if len(self.getStatusConsole.appContainers): for x in self.getStatusConsole.appContainers.keys(): self.getStatusConsole.kill(x) def getDataForInterface(self, iface, callback=None): cmd = "iwconfig " + iface self.getStatusConsole.ePopen(cmd, self.getStatusFinished, (callback, iface)) def getStatusFinished(self, result, retval, extra_args): (callback, iface) = extra_args if self.getStatusConsole is not None: self.handleStatusData(result, retval, callback, iface) def handleStatusData(self, result, retval, callback, iface): essid = "off" frequency = "" channel = "" accesspoint = False bitrate = "" link_quality = "0" signal_level = "0" noise_level = "0" retval = retval == 0 if retval and result: for x in result.split('\n'): essid = search_pattern(x, self.essid_pattern, 'ESSID:').strip('"') or essid frequency = search_pattern(x, self.frequency_pattern, 'Frequency:') or frequency channel = search_pattern(x, self.channel_pattern, 'Channel:') or channel accesspoint = search_pattern(x, self.accesspoint_pattren, 'Access Point: ') or accesspoint bitrate = search_pattern(x, self.bitrate_pattern, ['Bit Rate:', 'Bit Rate=']) or bitrate link_quality = search_pattern(x, self.link_quality_pattern, 'Link Quality=') or link_quality signal_level = search_pattern(x, self.signal_level_pattern, 'Signal level=') or signal_level noise_level = search_pattern(x, self.noise_level_pattern, 'Noise level=') or noise_level signal_level = search_pattern(x, self.signal_level_dbm_pattern, 'Signal level=') or signal_level noise_level = search_pattern(x, self.noise_level_dbm_pattern, 'Noise level=') or noise_level data = {} data[iface] = {} data[iface]["essid"] = essid data[iface]["frequency"] = frequency data[iface]["channel"] = channel data[iface]["accesspoint"] = accesspoint data[iface]["bitrate"] = bitrate data[iface]["link_quality"] = link_quality data[iface]["signal_level"] = signal_level data[iface]["noise_level"] = noise_level self.getIfconfigData(iface, data, callback) #if callback: # callback(retval, data) def getIfconfigData(self, iface, data, callback): cmd = "ifconfig " + iface self.getStatusConsole.ePopen(cmd, self.getIfconfigDataFinished, (iface, data, callback)) def getIfconfigDataFinished(self, result, retval, extra_args): if self.getStatusConsole is not None: self.handleIfconfigData(result, retval, extra_args) def handleIfconfigData(self, result, retval, extra_args): (iface, data, callback) = extra_args ipaddr = "" retval = retval == 0 if retval and result: for x in result.split('\n'): ipaddr = search_pattern(x, self.inet_addr_pattern, 'inet addr:') or ipaddr data[iface]["ip_addr"] = ipaddr if callback: callback(retval, data)
class BackupRestoreScreen(Screen): global skin_1 global skin_2 try: sz_w = getDesktop(0).size().width() except: sz_w = 720 if sz_w > 720: skin_1 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="1280,720" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="1280,360" font="Regular;24" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="progress" position="50,360" zPosition="1" borderWidth="1" size="1180,20" backgroundColor="#111111" transparent="0" />\n\t\t\t\t<widget name="task_one" position="50,390" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_one_state" position="950,390" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two" position="50,420" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two_state" position="950,420" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three" position="50,450" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three_state" position="950,450" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four" position="50,480" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four_state" position="950,480" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' skin_2 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="1280,720" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="1280,720" font="Regular;30" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' else: skin_1 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="720,576" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="720,288" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="progress" position="50,290" zPosition="1" borderWidth="1" size="620,20" backgroundColor="#111111" transparent="0" />\n\t\t\t\t<widget name="task_one" position="50,320" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_one_state" position="490,320" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two" position="50,350" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two_state" position="490,350" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three" position="50,380" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three_state" position="490,380" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four" position="50,410" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four_state" position="490,410" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' skin_2 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="720,576" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="720,576" font="Regular;30" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' def __init__(self, session, title = 'Restore/Backup VTimage', restorepath = None, backuppath = None, image_flash = False): Screen.__init__(self, session) self.restorepath = restorepath self.backuppath = backuppath self.image_flash = image_flash self.run = True self.error = False self.finished = False self.device = HardwareInfoVu().get_device_name() self.vtiversion = getVTiVersionString() if self.restorepath: skin = skin_2 elif self.backuppath: skin = skin_1 self['task_one'] = Label() self['task_two'] = Label() self['task_three'] = Label() self['task_four'] = Label() self['task_one_state'] = Label() self['task_two_state'] = Label() self['task_three_state'] = Label() self['task_four_state'] = Label() self['progress'] = ProgressBar() self.skin = skin self['actions'] = ActionMap(['OkCancelActions'], {'ok': self.keyOk, 'cancel': self.keyCancel}) self['description'] = Label() self.text_done = _('[ ok ]') self.logfile = '/tmp/vti-backup.log' self.text_logfile_hint = _('\n\nPlease take a look at\n%s\nfor more details') % self.logfile self.mount = '/bin/mount' self.umount = '/bin/umount' self.rm = '/bin/rm' self.touch = '/bin/touch' self.mk_ubifs = '/usr/sbin/mkfs.ubifs' self.mk_jffs2 = '/usr/sbin/mkfs.jffs2' self.nanddump = '/usr/sbin/nanddump' self.ubinize = '/usr/sbin/ubinize' self.flash_erase = '/usr/sbin/flash_erase' self.nand_write = '/usr/sbin/nandwrite' self.ubi_image2nand = '/usr/sbin/ubi-image2nand' self.onLayoutFinish.append(self.layoutFinished) def layoutFinished(self): self.cmdlist = [] self.task = 0 self.container = eConsoleAppContainer() self.container.appClosed.append(self.cmd_run_finished) self.Console = ComConsole() if path.exists(self.logfile): remove(self.logfile) if self.restorepath: text = _('Restore of selected image is in progress.\nYour Vu+ STB will be rebooted after write process\nDo not power off !!!\n\nPlease wait ...') if self.image_flash: text = _('Flash process of selected image is in progress.\nYour Vu+ STB will be rebooted after write process\nDo not power off !!!\n\nPlease wait ...') self['description'].setText(text) self.setVariablesRestore() else: self['progress'].setValue(0) text = _('Backup of your running image is in progress.\nThe backup can take a few minutes\nPlease wait ...') self['description'].setText(text) self.setVariablesBackup() def do_log(self, result): with open(self.logfile, 'a') as file: file.write(result) def getRootSize(self): from os import statvfs stat_info = statvfs('/') free = stat_info.f_bfree * stat_info.f_bsize total = stat_info.f_blocks * stat_info.f_bsize used = total - free return used def checkBinaries(self): if self.restorepath: bins = (self.flash_erase, self.nand_write, self.ubi_image2nand, self.mount) for binary in bins: if not path.exists(binary): return False break elif self.backuppath: bins = (self.touch, self.mk_ubifs, self.mk_jffs2, self.nanddump, self.ubinize, self.mount, self.umount, self.rm) for binary in bins: if not path.exists(binary): return False break return True def cleanupBackup(self): self.cmdlist = [] self.cmdlist.append('%s /tmp/bi/root' % self.umount) self.cmdlist.append('%s %s' % (self.rm, self.ubicfgfile)) self.cmdlist.append('%s %s/vti.rootfs.ubifs' % (self.rm, self.backuppath)) self.cmdlist.append('if [ ! -d /tmp/bi/root/dev ] ; then %s -rf /tmp/bi; fi' % self.rm) if self.error: self.backuppath = self.backuppath.replace('/vuplus/%s' % self.device, '') self.cmdlist.append('%s -rf %s' % (self.rm, self.backuppath)) else: self.cmdlist.append('%s -f %s' % (self.rm, self.logfile)) self.cmd_run() def createFolder(self): if not path.exists(self.backuppath): try: makedirs(self.backuppath) except: return 1 if not path.exists('/tmp/bi/root'): try: makedirs('/tmp/bi/root') except: return 1 return 0 def setVariablesBackup(self): if self.device == 'solo2': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'zero': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'solose': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'duo2': self.ubifsargs = '-m 2048 -e 126976 -c 8192' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'duo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'solo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'uno': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'ultimo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 3894 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' text = _('preparing backup of image') self['task_one'].setText(text) self.rootsize = self.getRootSize() self.boot_options = None self.ubicfgfile = '/tmp/ubinize.cfg' system('%s %s' % (self.touch, self.ubicfgfile)) now = systime() now = datetime.fromtimestamp(now) now = now.strftime('%Y-%m-%d_%H-%M-%S') self.backuppath = self.backuppath + '/vti_' + self.vtiversion + '_backup-image_' + self.device + '_' + now + '/vuplus/' + self.device if self.createFolder(): errmsg = _('Error at creating backup directories\nPlease try another backup location') + self.text_logfile_hint self.errorBox(errmsg) return if self.checkBinaries(): self.startMount() else: errmsg = _('The system is missing some necessary files !') self.errorBox(errmsg) def startMount(self): cmd = '%s -t ubifs ubi0:rootfs /tmp/bi/root' % self.mount self.Console.ePopen(cmd, self.rootmounted) def rootmounted(self, result, retval, extra_args = None): self.do_log(result) if retval == 0: self.backuproot() else: errmsg = _('Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def backuproot(self): content_ubifile = '[ubifs]\nmode=ubi\nimage=%s/vti.rootfs.ubifs\nvol_id=0\nvol_type=dynamic\nvol_name=rootfs\nvol_flags=autoresize\n\n' % self.backuppath f = open(self.ubicfgfile, 'w') f.write(content_ubifile) f.close() self.vti_root_ubifs = '%s/vti.rootfs.ubifs' % self.backuppath system('%s %s' % (self.touch, self.vti_root_ubifs)) if path.exists(self.vti_root_ubifs): chmod(self.vti_root_ubifs, 511) self['task_one_state'].setText(self.text_done) self['progress'].setValue(10) self.startProgressTimer() text = _('backup root filesystem') self['task_two'].setText(text) cmd = '%s -r /tmp/bi/root -o %s %s' % (self.mk_ubifs, self.vti_root_ubifs, self.ubifsargs) self.Console.ePopen(cmd, self.ubinizeroot) else: errmsg = _('Error at preparing system for backup') + self.text_logfile_hint self.errorBox(errmsg) def ubinizeroot(self, result, retval, extra_args = None): self.do_log(result) try: self.progressTimer.stop() except: pass if retval == 0 and path.exists(self.vti_root_ubifs): self['progress'].setValue(85) self['task_two_state'].setText(self.text_done) text = _('create flashable file of root filesystem') self['task_three'].setText(text) cmd = '%s -o %s/%s %s %s' % (self.ubinize, self.backuppath, self.rootfsname, self.ubinizeargs, self.ubicfgfile) self.Console.ePopen(cmd, self.kerneldump) else: errmsg = _('Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def kerneldump(self, result, retval, extra_args = None): self.do_log(result) if retval == 0: text = _('backup of running kernel') self['task_four'].setText(text) self['progress'].setValue(90) self['task_three_state'].setText(self.text_done) cmd = '%s --bb=skipbad --omitoob --quiet /dev/mtd%s > %s/kernel_cfe_auto.bin' % (self.nanddump, self.mtdkernel, self.backuppath) self.Console.ePopen(cmd, self.backup_finished) else: errmsg = _('Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def backup_finished(self, result, retval, extra_args = None): self.do_log(result) if retval == 0: self['progress'].setValue(95) backup_files = listdir(self.backuppath) for f in backup_files: f = '%s/%s' % (self.backuppath, f) if path.exists(f): chmod(f, 420) self.backup_success() else: errmsg = _('Backup of kernel failed') + self.text_logfile_hint self.errorBox(errmsg) def backup_success(self): self.run = False self.error = False self.finished = True self.cleanupBackup() self['progress'].setValue(100) self['task_four_state'].setText(self.text_done) text = _('Image backup finished successfully') self['description'].setText(text) def setVariablesRestore(self): boot_cfe_file = None if self.device == 'solo2': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'zero': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'solose': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'duo2': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'duo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'solo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'uno': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'ultimo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' rootfs = self.restorepath + '/vuplus/' + self.device + '/' + rootfsname kernelfile = self.restorepath + '/vuplus/' + self.device + '/kernel_cfe_auto.bin' if path.exists(rootfs) and path.exists(kernelfile): if self.session.current_dialog: self.session.nav.stopService() self.cmdlist.append('/usr/local/hbb-browser/launcher stop') self.cmdlist.append('/usr/lib/enigma2/python/Plugins/Extensions/DLNAServer/./dlnaserver -e') self.cmdlist.append('killall -9 smbd') self.cmdlist.append('sleep 5') self.cmdlist.append('sync') if boot_cfe_file: boot_cfe_file = self.restorepath + '/vuplus/' + self.device + '/' + boot_cfe_file if path.exists(boot_cfe_file): self.cmdlist.append('%s -q -j /dev/mtd%s 0 0 > /dev/ttyS0' % (self.flash_erase, mtdbootcfe)) self.cmdlist.append('%s -q -p /dev/mtd%s %s > /dev/ttyS0' % (self.nand_write, mtdbootcfe, boot_cfe_file)) self.cmdlist.append('%s /dev/mtd%s 0 0 > /dev/ttyS0' % (self.flash_erase, mtdkernel)) self.cmdlist.append('%s -q -p /dev/mtd%s %s > /dev/ttyS0' % (self.nand_write, mtdkernel, kernelfile)) self.cmdlist.append('init 2 ; sleep 3 ; sync ; %s /dev/mtd0 --image %s > /dev/ttyS0' % (self.ubi_image2nand, rootfs)) if self.checkBinaries(): self.cmd_run() else: errmsg = _('The system is missing some necessary files !') self.errorBox(errmsg) def startProgressTimer(self): self.progressTimer = eTimer() self.progressTimer.start(5000, True) self.progressTimer.callback.append(self.endTimer) def endTimer(self): if path.exists(self.vti_root_ubifs): st = stat(self.vti_root_ubifs) size = st.st_size progress = int((size - self.rootsize) / float(self.rootsize) * 75.0 + 85.0) if size <= self.rootsize: self['progress'].setValue(progress) self.startProgressTimer() def cmd_run(self): if self.container.execute(self.cmdlist[self.task]): self.cmd_run_finished(-1) def cmd_run_finished(self, retval): self.task += 1 if self.task != len(self.cmdlist): if self.container.execute(self.cmdlist[self.task]): self.cmd_run_finished(-1) else: self.task = 0 if not self.finished: self.close() def errorBox(self, errmsg): self.run = False self.error = True self['description'].setText(errmsg) def keyCancel(self, ret = None): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.run: self.error = True if self.backuppath and not self.finished: self.cleanupBackup() else: self.close() def keyOk(self): if not self.run: self.keyCancel()
class Network(): def __init__(self): self.ifaces = {} self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = 'ethtool' self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateInterfaceConsole = Console() self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): if self.remoteRootFS is None: import Harddisk for parts in Harddisk.getProcMounts(): if parts[1] == '/' and parts[2] == 'nfs': self.remoteRootFS = True break else: self.remoteRootFS = False return self.remoteRootFS def isBlacklisted(self, iface): return iface in ('lo', 'wifi0', 'wmaster0', 'sit0', 'tun0', 'tap0') def getInterfaces(self, callback = None): self.configuredInterfaces = [] for device in self.getInstalledAdapters(): self.getAddrInet(device, callback) def regExpMatch(self, pattern, string): if string is None: return try: return pattern.search(string).group() except AttributeError: return def convertIP(self, ip): return [ int(n) for n in ip.split('.') ] def getAddrInet(self, iface, callback): if not self.Console: self.Console = Console() cmd = 'ip -o addr show dev ' + iface self.Console.ePopen(cmd, self.IPaddrFinished, [iface, callback]) def IPaddrFinished(self, result, retval, extra_args): iface, callback = extra_args data = {'up': False, 'dhcp': False, 'preup': False, 'predown': False} globalIPpattern = re.compile('scope global') ipRegexp = '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}\\:[0-9a-fA-F]{2}' ipLinePattern = re.compile('inet ' + ipRegexp + '/') ipPattern = re.compile(ipRegexp) netmaskLinePattern = re.compile('/' + netRegexp) netmaskPattern = re.compile(netRegexp) bcastLinePattern = re.compile(' brd ' + ipRegexp) upPattern = re.compile('UP') macPattern = re.compile(macRegexp) macLinePattern = re.compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ', 2) if split[1][:-1] == iface: up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if split[1] == iface: if re.search(globalIPpattern, split[2]): ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = 'route -n | grep ' + iface self.Console.ePopen(cmd, self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): iface, data, callback = extra_args ipRegexp = '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) ipLinePattern = re.compile(ipRegexp) for line in result.splitlines(): print line[0:7] if line[0:7] == '0.0.0.0': gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data self.loadNetworkConfig(iface, callback) def writeNetworkConfig(self): self.configuredInterfaces = [] fp = file('/etc/network/interfaces', 'w') fp.write('# automatically generated by enigma2\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']: fp.write('auto ' + ifacename + '\n') self.configuredInterfaces.append(ifacename) if iface['dhcp']: fp.write('iface ' + ifacename + ' inet dhcp\n') fp.write(' hostname $(hostname)\n') if not iface['dhcp']: fp.write('iface ' + ifacename + ' inet static\n') fp.write(' hostname $(hostname)\n') if iface.has_key('ip'): fp.write('\taddress %d.%d.%d.%d\n' % tuple(iface['ip'])) fp.write('\tnetmask %d.%d.%d.%d\n' % tuple(iface['netmask'])) if iface.has_key('gateway'): fp.write('\tgateway %d.%d.%d.%d\n' % tuple(iface['gateway'])) if iface.has_key('configStrings'): fp.write(iface['configStrings']) if iface['preup'] is not False and not iface.has_key('configStrings'): fp.write(iface['preup']) if iface['predown'] is not False and not iface.has_key('configStrings'): fp.write(iface['predown']) fp.write('\n') fp.close() self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): try: os.system('rm -rf /etc/resolv.conf') fp = file('/etc/resolv.conf', 'w') for nameserver in self.nameservers: fp.write('nameserver %d.%d.%d.%d\n' % tuple(nameserver)) fp.close() except: print '[Network.py] interfaces - resolv.conf write failed' def loadNetworkConfig(self, iface, callback = None): interfaces = [] try: fp = file('/etc/network/interfaces', 'r') 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'] = True else: ifaces[currif]['dhcp'] = False if currif == iface: if split[0] == 'address': ifaces[currif]['address'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('ip'): if self.ifaces[currif]['ip'] != ifaces[currif]['address'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['ip'] = map(int, split[1].split('.')) if split[0] == 'netmask': ifaces[currif]['netmask'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('netmask'): if self.ifaces[currif]['netmask'] != ifaces[currif]['netmask'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['netmask'] = map(int, split[1].split('.')) if split[0] == 'gateway': ifaces[currif]['gateway'] = map(int, split[1].split('.')) if self.ifaces[currif].has_key('gateway'): if self.ifaces[currif]['gateway'] != ifaces[currif]['gateway'] and ifaces[currif]['dhcp'] == False: self.ifaces[currif]['gateway'] = map(int, split[1].split('.')) if split[0] == 'pre-up': if self.ifaces[currif].has_key('preup'): self.ifaces[currif]['preup'] = i if split[0] in ('pre-down', 'post-down'): if self.ifaces[currif].has_key('predown'): self.ifaces[currif]['predown'] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]['dhcp'] = iface['dhcp'] if self.Console: if len(self.Console.appContainers) == 0: self.configuredNetworkAdapters = self.configuredInterfaces self.loadNameserverConfig() self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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: self.nameservers.append(self.convertIP(ip)) def getInstalledAdapters(self): return [ x for x in os.listdir('/sys/class/net') if not self.isBlacklisted(x) ] def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get(x, x) def getFriendlyAdapterNaming(self, iface): name = None if self.isWirelessInterface(iface): if iface not in self.wlan_interfaces: name = _('WLAN connection') if len(self.wlan_interfaces): name += ' ' + str(len(self.wlan_interfaces) + 1) self.wlan_interfaces.append(iface) elif iface not in self.lan_interfaces: if getBoxType() == 'et10000' and iface == 'eth1': name = _('VLAN connection') else: name = _('LAN connection') if len(self.lan_interfaces) and not getBoxType() == 'et10000' and not iface == 'eth1': name += ' ' + str(len(self.lan_interfaces) + 1) self.lan_interfaces.append(iface) return name def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) if moduledir: name = os.path.basename(os.path.realpath(moduledir)) if name in ('ath_pci', 'ath5k'): name = 'Atheros' elif name in ('rt73', 'rt73usb', 'rt3070sta'): name = 'Ralink' elif name == 'zd1211b': name = 'Zydas' elif name == 'r871x_usb_drv': name = 'Realtek' else: name = _('Unknown') return name + ' ' + _('wireless network interface') def getAdapterName(self, iface): return iface 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] 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): 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 resetNetworkConfig(self, mode = 'lan', callback = None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append('/etc/init.d/avahi-daemon stop') for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append('ip addr flush dev ' + iface + ' scope global') self.commands.append('/etc/init.d/networking stop') self.commands.append('killall -9 udhcpc') self.commands.append('rm /var/run/udhcpc*') self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): mode, callback = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self, mode = 'lan', callback = None): fp = file('/etc/network/interfaces', 'w') fp.write('# automatically generated by enigma2\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') if mode == 'wlan-mpci': fp.write('auto ath0\n') fp.write('iface ath0 inet dhcp\n') if mode == 'lan': fp.write('auto eth0\n') fp.write('iface eth0 inet dhcp\n') fp.write('\n') fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append('ifconfig eth0 down') self.commands.append('ifconfig ath0 down') self.commands.append('ifconfig wlan0 up') if mode == 'wlan-mpci': self.commands.append('ifconfig eth0 down') self.commands.append('ifconfig wlan0 down') self.commands.append('ifconfig ath0 up') if mode == 'lan': self.commands.append('ifconfig eth0 up') self.commands.append('ifconfig wlan0 down') self.commands.append('ifconfig ath0 down') self.commands.append('/etc/init.d/avahi-daemon start') self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode, callback], debug=True) def resetNetworkFinished(self, extra_args): mode, callback = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True, mode) def checkNetworkState(self, statecallback): self.NetworkState = 0 cmd1 = 'ping -c 1 www.openpli.org' cmd2 = 'ping -c 1 www.google.nl' cmd3 = 'ping -c 1 www.google.com' self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished, statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished, statecallback) def checkNetworkStateFinished(self, result, retval, extra_args): statecallback = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self, callback = None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append('/etc/init.d/avahi-daemon stop') for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append('ifdown ' + iface) self.commands.append('ip addr flush dev ' + iface + ' scope global') self.commands.append('/etc/init.d/networking stop') self.commands.append('killall -9 udhcpc') self.commands.append('rm /var/run/udhcpc*') self.commands.append('/etc/init.d/networking start') self.commands.append('/etc/init.d/avahi-daemon start') self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self, extra_args): callback = extra_args if callback is not None: try: callback(True) except: pass def getLinkState(self, iface, callback): cmd = self.ethtool_bin + ' ' + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished, callback) def getLinkStateFinished(self, result, retval, extra_args): callback = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in self.PingConsole.appContainers.keys(): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: self.deactivateInterfaceConsole.killAll() self.deactivateInterfaceConsole = None def stopActivateInterfaceConsole(self): if self.activateInterfaceConsole is not None: self.activateInterfaceConsole.killAll() self.activateInterfaceConsole = None def checkforInterface(self, iface): if self.getAdapterAttribute(iface, 'up') is True: return True ret = os.system('ifconfig ' + iface + ' up') os.system('ifconfig ' + iface + ' down') if ret == 0: return True else: return False def checkDNSLookup(self, statecallback): cmd1 = 'nslookup www.dream-multimedia-tv.de' cmd2 = 'nslookup www.heise.de' cmd3 = 'nslookup www.google.de' self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished, statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished, statecallback) def checkDNSLookupFinished(self, result, retval, extra_args): statecallback = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self, ifaces, callback = None): self.config_ready = False self.msgPlugins() commands = [] def buildCommands(iface): commands.append('ifdown ' + iface) commands.append('ip addr flush dev ' + iface + ' scope global') if os.path.exists('/var/run/wpa_supplicant/' + iface): commands.append('wpa_cli -i' + iface + ' terminate') if not self.deactivateInterfaceConsole: self.deactivateInterfaceConsole = Console() if isinstance(ifaces, (list, tuple)): for iface in ifaces: if iface != 'eth0' or not self.onRemoteRootFS(): buildCommands(iface) else: if ifaces == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return buildCommands(ifaces) self.deactivateInterfaceConsole.eBatch(commands, self.deactivateInterfaceFinished, [ifaces, callback], debug=True) def deactivateInterfaceFinished(self, extra_args): ifaces, callback = extra_args def checkCommandResult(iface): if self.deactivateInterfaceConsole and self.deactivateInterfaceConsole.appResults.has_key('ifdown ' + iface): result = str(self.deactivateInterfaceConsole.appResults.get('ifdown ' + iface)).strip('\n') if result == 'ifdown: interface ' + iface + ' not configured': return False else: return True if isinstance(ifaces, (list, tuple)): for iface in ifaces: if checkCommandResult(iface) is False: Console().ePopen('ifconfig ' + iface + ' down') elif checkCommandResult(ifaces) is False: Console().ePopen('ifconfig ' + ifaces + ' down') if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def activateInterface(self, iface, callback = None): if self.config_ready: self.config_ready = False self.msgPlugins() if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return if not self.activateInterfaceConsole: self.activateInterfaceConsole = Console() commands = ['ifup ' + iface] self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) def activateInterfaceFinished(self, extra_args): callback = extra_args if self.activateInterfaceConsole: if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: try: callback(True) except: pass def sysfsPath(self, iface): return '/sys/class/net/' + iface def isWirelessInterface(self, iface): if iface in self.wlan_interfaces: return True try: if os.path.isdir(self.sysfsPath(iface) + '/wireless'): return True except: os.system('rm /etc/enigma2/settings;killall enigma2') device = re.compile('[a-z]{2,}[0-9]*:') ifnames = [] fp = open('/proc/net/wireless', 'r') for line in fp: try: ifnames.append(device.search(line).group()[:-1]) except AttributeError: pass fp.close() if iface in ifnames: return True return False def getWlanModuleDir(self, iface = None): devicedir = self.sysfsPath(iface) + '/device' moduledir = devicedir + '/driver/module' if os.path.isdir(moduledir): return moduledir for x in os.listdir(devicedir): if x.startswith('1-'): moduledir = devicedir + '/' + x + '/driver/module' if os.path.isdir(moduledir): return moduledir moduledir = devicedir + '/driver' if os.path.isdir(moduledir): return moduledir def detectWlanModule(self, iface = None): if not self.isWirelessInterface(iface): return None devicedir = self.sysfsPath(iface) + '/device' if os.path.isdir(devicedir + '/ieee80211'): return 'nl80211' moduledir = self.getWlanModuleDir(iface) if moduledir: module = os.path.basename(os.path.realpath(moduledir)) if module in ('ath_pci', 'ath5k'): return 'madwifi' if module in ('rt73', 'rt73'): return 'ralink' if module == 'zd1211b': return 'zydas' return 'wext' def calc_netmask(self, nmask): from struct import pack from socket import inet_ntoa mask = 2147483648L xnet = 4294967295L cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = (1L << cidr) - 1 << 32 - cidr netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready) def hotplug(self, event): interface = event['INTERFACE'] if self.isBlacklisted(interface): return action = event['ACTION'] if action == 'add': print '[Network] Add new interface:', interface self.getAddrInet(interface, None) elif action == 'remove': print '[Network] Removed interface:', interface try: del self.ifaces[interface] except KeyError: pass
class InfoPanel(Screen): def __init__(self, session, plugin_path): self.skin_path = plugin_path Screen.__init__(self, session) self.session = session self.title = 'VTi Info' try: self['title'] = StaticText(self.title) except: print 'self["title"] was not found in skin' self.storagedevices = [] self['storagelist'] = List(self.storagedevices) memorylist = [] self['memory'] = List(memorylist) netdevlist = [] self['netdev'] = List(netdevlist) toplist = [] self['proclist'] = List(toplist) self.isopen = True self._initialpoll = True self.console = Console() self.pollProcList() self['vtiversion'] = Label() self['uptime'] = Label() self['load'] = Label() self['temp'] = Label() self['fan'] = Label() self['kernel'] = Label() self['key_red'] = StaticText(_('Exit')) self['key_green'] = StaticText(_('Screenshot')) self['shortcuts'] = ActionMap(['OkCancelActions', 'ColorActions'], {'red': self.keyClose, 'green': self.grabScreenshot, 'ok': self.keyClose, 'cancel': self.keyClose}, -2) self.onLayoutFinish.append(self.createInfo) def pollProcList(self): cmd = 'top -b -n1' self.console.ePopen(cmd, self.createProcList) def createProcList(self, result, retval, extra_args = None): if retval == 0: self._initialpoll = False if len(result): toplist = [] proclist = result.split('\n')[7:][:5] toplist.append((_('PROCESS'), _('CPU %'), _('MEM %'), _('PID'))) for proc in proclist: proc = proc.split() if len(proc) >= 12: toplist.append((str(proc[11]), str(proc[8]), str(proc[9]), str(proc[0]))) self['proclist'].setList(toplist) def createInfo(self): devices = getMounts() self.storagedevices.append((_('DEVICE'), _('MOUNTPOINT'), _('FS'), _('SIZE'), _('FREE'))) for device in devices: user_friendly_device_name = device[0] if user_friendly_device_name == 'ubi0:rootfs': user_friendly_device_name = 'Flash' self.storagedevices.append((user_friendly_device_name, device[1], device[2], device[6], device[7])) self['storagelist'].setList(self.storagedevices) msg = _('KERNEL : ') + getKernel() self['kernel'].setText(msg) msg = _('IMAGE : ') + getVTiVersion() self['vtiversion'].setText(msg) self.updateValues() self.slowRefresh() def updateValues(self): memory = getMemory() memorylist = [] memorylist.append(('', _('RAM'), _('SWAP'))) memorylist.append((_('USED :'), memory[1], memory[4])) memorylist.append((_('FREE :'), memory[2], memory[5])) memorylist.append((_('TOTAL :'), memory[0], memory[3])) self['memory'].setList(memorylist) msg = _('UPTIME : ') + getUptime() self['uptime'].setText(msg) msg = _('LOAD : ') + getLoad() self['load'].setText(msg) text = getTemp() if text: msg = _('TEMP : ') + getTemp() + ' C' self['temp'].setText(msg) text = getFan() if text: msg = _('FAN : ') + getFan() self['fan'].setText(msg) if not self._initialpoll: self.pollProcList() self.updateTimer = eTimer() self.updateTimer.start(5000, True) self.updateTimer.callback.append(self.updateValues) def slowRefresh(self): netdevs = getNetwork() netdevlist = [] netdevlist.append((_('DEVICE'), _('RECEIVED'), _('SENT'))) for device in netdevs: netdevlist.append((device[0], device[1], device[2])) self['netdev'].setList(netdevlist) self.slow_updateTimer = eTimer() self.slow_updateTimer.start(10000, True) self.slow_updateTimer.callback.append(self.slowRefresh) def grabScreenshot(self): self['key_green'].setText('') from datetime import datetime from time import time as systime now = systime() now = datetime.fromtimestamp(now) now = now.strftime('%Y-%m-%d_%H-%M-%S') filename = '/media/hdd/vti_screenshot_sysinfo_' + now + '.png' cmd = 'grab -po %s' % filename self.console.ePopen(cmd, self.screenshotFinished) def screenshotFinished(self, result, retval, extra_args = None): self['key_green'].setText(_('Screenshot')) def keyClose(self): if self.console is not None: if len(self.console.appContainers): for name in self.console.appContainers.keys(): self.console.kill(name) self.close()
class SoftwareTools(PackageInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" PackageInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev', '-src') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback = None): if callback is not None: self.NotifierCallback = callback iNetwork.checkNetworkState(self.checkNetworkCB) def checkNetworkCB(self,data): if data is not None: if data <= 2: self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback = None): if self.lastDownloadDate is None: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() pass def startIpkgListAvailable(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append([name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval = None, extra_args = None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list_installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args = None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.countUpdates() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def countUpdates(self, callback = None): self.available_updates = 0 self.available_updatelist = [] for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates +=1 self.available_updatelist.append([packagename]) self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def startIpkgUpdate(self, callback = None): if not self.Console: self.Console = Console() cmd = self.ipkg.ipkg + " update" self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) def IpkgUpdateCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.Console: if len(self.Console.appContainers) == 0: if callback is not None: callback(True) callback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == HardwareInfo().device_name: hardware_found = True if not hardware_found: return False return True
class DriverManagerDownload(Screen): def __init__(self, session, plugin_path, args = 0): Screen.__init__(self, session) self.skin_path = plugin_path self.session = session self.title = _('VTI DriverManager') try: self['title'] = StaticText(self.title) except: print 'self["title"] was not found in skin' self.list = [] self.list.append((None, _('Please wait ...'), _(' downloading available drivers information'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'] = List(self.list) self['key_red'] = StaticText(_('Exit')) self['key_green'] = StaticText(_('Download')) self['shortcuts'] = ActionMap(['SetupActions', 'ColorActions', 'DirectionActions'], {'ok': self.keyOk, 'cancel': self.keyCancel, 'red': self.keyCancel, 'green': self.keyOk, 'yellow': self.keyEasteregg}, -2) self.Console = ComConsole() self.vudevice = getDeviceName() self.downloaddir = '/tmp/' self.htmlfile = 'driver.txt' self.location = 'http://archive.vuplus.com/download/drivers/' self.eastereggbutton = False self.onLayoutFinish.append(self.getDriver) def keyEasteregg(self): if self.eastereggbutton == True: print 'remove oops :-)' self.eastereggbutton == False self.list = [] self.list.append((None, _('Please wait ...'), _(' downloading available drivers information'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) if self.location == 'http://archive.vuplus.com/download/drivers/beta/': self.location = 'http://archive.vuplus.com/download/drivers/' else: self.location = 'http://archive.vuplus.com/download/drivers/beta/' self.getDriver() else: print 'oops' self.eastereggbutton = True self.eastereggTimer = eTimer() self.eastereggTimer.timeout.get().append(self.endEasteregg) self.eastereggTimer.start(500) def endEasteregg(self): self.eastereggbutton = False def getDriver(self): cmd = 'wget %s -O %s%s' % (self.location, self.downloaddir, self.htmlfile) self.Console.ePopen(cmd, self.createDownloadMenu) def createDownloadMenu(self, result, retval, extra_args = None): if retval == 0: self.list = [] if fileExists(self.downloaddir + self.htmlfile): readfile = open(self.downloaddir + self.htmlfile, 'r') text = readfile.read() readfile.close() cmd = 'rm %s%s' % (self.downloaddir, self.htmlfile) system(cmd) else: text = '' result = re.findall('vuplus-dvb-modules-' + self.vudevice + '-' + kernel_version + '-\\w+.tar.gz', text) result = list(set(result)) result.sort(reverse=True) for driver in result: driverfilename = driver driver = driver.split('.tar.gz') driver = driver[0].split(kernel_version + '-') if len(driver[1]) > 8: driverappendix = driver[1][8:10] driverappendix = driverappendix.replace('_', '') driverappendix = ' ver. ' + driverappendix else: driverappendix = '' driverday = driver[1][6:8] drivermonth = driver[1][4:6] driveryear = driver[1][0:4] drivertext = driverday + '.' + drivermonth + '.' + driveryear + driverappendix self.list.append((driverfilename, _('Driver : %s') % drivertext, _('choose this drivers for download'), LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sockets.png')), None)) self['downloadmenu'].setList(self.list) else: self.downloadError() def keyOk(self): self.driverselected = self['downloadmenu'].getCurrent() if self.driverselected: self.driverselected = self['downloadmenu'].getCurrent()[0] else: self.driverselected = None if not self.driverselected == None: self.driverselection = self.driverselected self.list = [] self.list.append((None, _('Please wait, downloading drivers: '), self.driverselection, LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/ntptime.png')), None)) self['downloadmenu'].setList(self.list) cmd = 'wget %s%s -O %s%s' % (self.location, self.driverselection, self.downloaddir, self.driverselection) self.Console.ePopen(cmd, self.downloadFinished) def downloadFinished(self, result, retval, extra_args = None): if retval == 0: fulldriverpath = self.downloaddir + self.driverselection self.close(fulldriverpath) else: self.downloadError() def downloadError(self): msg = self.session.open(MessageBox, _('Download failed !\nPlease check your internet connection'), MessageBox.TYPE_ERROR) msg.setTitle(_('VTI DriverManager')) self.close(None) def keyCancel(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) self.close(None)
class Network: def __init__(self): self.ifaces = {} self.configuredInterfaces = [] self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "/usr/sbin/ethtool" self.container = eConsoleAppContainer() self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateConsole = Console() self.deactivateInterfaceConsole = Console() self.activateConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.config_ready = None self.getInterfaces() def getInterfaces(self, callback = None): devicesPattern = re_compile('[a-z]+[0-9]+') self.configuredInterfaces = [] fp = file('/proc/net/dev', 'r') result = fp.readlines() fp.close() for line in result: try: device = devicesPattern.search(line).group() if device == 'wifi0': continue self.getDataForInterface(device, callback) except AttributeError: pass #print "self.ifaces:", self.ifaces #self.writeNetworkConfig() #print ord(' ') #for line in result: # print ord(line[0]) # 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,callback): #get ip out of ip addr, as avahi sometimes overrides it in ifconfig. if not self.Console: self.Console = Console() cmd = "ip -o addr" self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args data = { 'up': False, 'dhcp': False, 'preup' : False, 'postdown' : False } globalIPpattern = re_compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}' ipLinePattern = re_compile('inet ' + ipRegexp + '/') ipPattern = re_compile(ipRegexp) netmaskLinePattern = re_compile('/' + netRegexp) netmaskPattern = re_compile(netRegexp) bcastLinePattern = re_compile(' brd ' + ipRegexp) upPattern = re_compile('UP') macPattern = re_compile('[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}\:[a-z0-9]{2}') macLinePattern = re_compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ',2) if (split[1][:-1] == iface): up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if (split[1] == iface): if re_search(globalIPpattern, split[2]): ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = "route -n | grep " + iface self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re_compile(ipRegexp) ipLinePattern = re_compile(ipRegexp) for line in result.splitlines(): 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) self.ifaces[iface] = data self.loadNetworkConfig(iface,callback) def writeNetworkConfig(self): self.configuredInterfaces = [] 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") for ifacename, iface in self.ifaces.items(): if iface['up'] == True: fp.write("auto " + ifacename + "\n") self.configuredInterfaces.append(ifacename) if iface['dhcp'] == True: fp.write("iface "+ ifacename +" inet dhcp\n") if iface['dhcp'] == False: 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'])) if iface.has_key("configStrings"): fp.write("\n" + iface["configStrings"] + "\n") if iface["preup"] is not False and not iface.has_key("configStrings"): fp.write(iface["preup"]) fp.write(iface["postdown"]) 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,iface,callback = None): interfaces = [] # parse the interfaces-file try: fp = file('/etc/network/interfaces', 'r') 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"] = True else: ifaces[currif]["dhcp"] = False if (currif == iface): #read information only for available interfaces if (split[0] == "address"): ifaces[currif]["address"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("ip"): if self.ifaces[currif]["ip"] != ifaces[currif]["address"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["ip"] = map(int, split[1].split('.')) if (split[0] == "netmask"): ifaces[currif]["netmask"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("netmask"): if self.ifaces[currif]["netmask"] != ifaces[currif]["netmask"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["netmask"] = map(int, split[1].split('.')) if (split[0] == "gateway"): ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i if (split[0] == "post-down"): if self.ifaces[currif].has_key("postdown"): self.ifaces[currif]["postdown"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if self.Console: if len(self.Console.appContainers) == 0: # save configured interfacelist self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() print "read configured interfac:", ifaces print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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 def deactivateNetworkConfig(self, callback = None): self.deactivateConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.deactivateConsole.eBatch(self.commands, self.deactivateNetworkFinished, callback, debug=True) def deactivateNetworkFinished(self,extra_args): callback = extra_args if len(self.deactivateConsole.appContainers) == 0: if callback is not None: callback(True) def activateNetworkConfig(self, callback = None): self.activateConsole = Console() self.commands = [] #+++> self.configuredInterfaces = [] for ifacename, iface in self.ifaces.items(): if iface['dhcp'] == True: self.commands.append("/etc/init.d/udhcpc start") #+++< self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.activateConsole.eBatch(self.commands, self.activateNetworkFinished, callback, debug=True) def activateNetworkFinished(self,extra_args): callback = extra_args if len(self.activateConsole.appContainers) == 0: if callback is not None: callback(True) def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): # maybe this needs to be replaced by an external list. friendlyNames = { "eth0": _("Integrated Ethernet"), "wlan0": _("Wireless"), "ath0": _("Integrated Wireless") } return friendlyNames.get(x, x) # when we have no friendly name, use adapter name 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): 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): 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 resetNetworkConfig(self, mode='lan', callback = None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self,mode='lan', callback = None): 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") if mode == 'wlan-mpci': fp.write("auto ath0\n") fp.write("iface ath0 inet dhcp\n") if mode == 'lan': fp.write("auto eth0\n") fp.write("iface eth0 inet dhcp\n") fp.write("\n") fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig ath0 down") self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 up") if mode == 'lan': self.commands.append("ifconfig eth0 up") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 down") self.commands.append("/etc/init.d/avahi-daemon start") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True) def resetNetworkFinished(self,extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True,mode) def checkNetworkState(self,statecallback): # www.dream-multimedia-tv.de, www.heise.de, www.google.de cmd1 = "ping -c 1 82.149.226.170" cmd2 = "ping -c 1 193.99.144.85" cmd3 = "ping -c 1 209.85.135.103" self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback) def checkNetworkStateFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self,callback = None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): cmd = "ip addr flush " + iface self.commands.append(cmd) self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") #+++> self.configuredInterfaces = [] for ifacename, iface in self.ifaces.items(): if iface['dhcp'] == True: self.commands.append("/etc/init.d/udhcpc start") #+++< self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self,extra_args): ( callback ) = extra_args if callback is not None: callback(True) def getLinkState(self,iface,callback): cmd = self.ethtool_bin + " " + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback) def getLinkStateFinished(self, result, retval,extra_args): (callback) = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: if len(self.deactivateInterfaceConsole.appContainers): for name in self.deactivateInterfaceConsole.appContainers.keys(): self.deactivateInterfaceConsole.kill(name) def checkforInterface(self,iface): if self.getAdapterAttribute(iface, 'up') is True: return True else: ret=system("ifconfig " + iface + " up") system("ifconfig " + iface + " down") if ret == 0: return True else: return False def checkDNSLookup(self,statecallback): cmd1 = "nslookup www.dream-multimedia-tv.de" cmd2 = "nslookup www.heise.de" cmd3 = "nslookup www.google.de" self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback) def checkDNSLookupFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self,iface,callback = None): self.deactivateInterfaceConsole = Console() self.commands = [] cmd1 = "ip addr flush " + iface cmd2 = "ifconfig " + iface + " down" self.commands.append(cmd1) self.commands.append(cmd2) self.deactivateInterfaceConsole.eBatch(self.commands, self.deactivateInterfaceFinished, callback, debug=True) def deactivateInterfaceFinished(self,extra_args): callback = extra_args if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def detectWlanModule(self): self.wlanmodule = None rt73_dir = "/sys/bus/usb/drivers/rt73/" zd1211b_dir = "/sys/bus/usb/drivers/zd1211b/" madwifi_dir = "/sys/bus/pci/drivers/ath_pci/" if os_path.exists(madwifi_dir): files = listdir(madwifi_dir) if len(files) >= 1: self.wlanmodule = 'madwifi' if os_path.exists(rt73_dir): rtfiles = listdir(rt73_dir) if len(rtfiles) == 2: self.wlanmodule = 'ralink' if os_path.exists(zd1211b_dir): zdfiles = listdir(zd1211b_dir) if len(zdfiles) == 1: self.wlanmodule = 'zydas' return self.wlanmodule def calc_netmask(self,nmask): from struct import pack, unpack from socket import inet_ntoa, inet_aton mask = 1L<<31 xnet = (1L<<32)-1 cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = ((1L<<cidr)-1)<<(32-cidr) netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready)
class SoftwareTools(DreamInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} upgradable_packages = {} upgradeAvailable = False def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage( )[:2] # getLanguage returns e.g. "fi_FI" for "language_country" DreamInfoHandler.__init__(self, self.statusCallback, blocking=False, neededTag='ALL_TAGS', neededFlag=self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.UpgradeConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev') self.reboot_required_packages = ('dreambox-dvb-modules', 'kernel-') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback=None): if callback is not None: self.NotifierCallback = callback self.NetworkConnectionAvailable = eNetworkManager.getInstance().online( ) self.getUpdates() def getUpdates(self, callback=None): if self.lastDownloadDate is None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: self.NetworkConnectionAvailable = False self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() #print event, "-", param pass def startIpkgListAvailable(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list | grep -e '^[a-z][a-z0-9+.-]'" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args=None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any( name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append( [name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval=None, extra_args=None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list-installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args=None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.listUpgradable() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def listUpgradable(self, callback=None): self.list_updating = True if not self.UpgradeConsole: self.UpgradeConsole = Console() cmd = "opkg list-upgradable" self.UpgradeConsole.ePopen(cmd, self.listUpgradableCB, callback) def listUpgradableCB(self, result, retval, extra_args=None): (callback) = extra_args self.upgradable_packages = {} self.available_updates = 0 self.available_updatelist = [] if result: for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 2 and tokens[2].strip() or "" self.upgradable_packages[name] = version for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates += 1 self.available_updatelist.append([packagename]) self.list_updating = False if self.upgradable_packages: self.upgradeAvailable = True if self.UpgradeConsole: if len(self.UpgradeConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def cleanupSoftwareTools(self): self.cleanup() def cleanup(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) if self.UpgradeConsole is not None: if len(self.UpgradeConsole.appContainers): for name in self.UpgradeConsole.appContainers.keys(): self.UpgradeConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class Network: def __init__(self): self.ifaces = {} self.configuredInterfaces = [] self.configuredNetworkAdapters = [] self.NetworkState = 0 self.DnsState = 0 self.nameservers = [] self.ethtool_bin = "ethtool" self.Console = Console() self.LinkConsole = Console() self.restartConsole = Console() self.deactivateInterfaceConsole = Console() self.activateInterfaceConsole = Console() self.resetNetworkConsole = Console() self.DnsConsole = Console() self.PingConsole = Console() self.config_ready = None self.friendlyNames = {} self.lan_interfaces = [] self.wlan_interfaces = [] self.remoteRootFS = None self.getInterfaces() def onRemoteRootFS(self): if self.remoteRootFS is None: import Harddisk for parts in Harddisk.getProcMounts(): if parts[1] == '/' and parts[2] == 'nfs': self.remoteRootFS = True break else: self.remoteRootFS = False return self.remoteRootFS def isBlacklisted(self, iface): return iface in ('lo', 'wifi0', 'wmaster0', 'sit0', 'tun0') def getInterfaces(self, callback = None): self.configuredInterfaces = [] for device in self.getInstalledAdapters(): self.getAddrInet(device, callback) # helper function def regExpMatch(self, pattern, string): if string is None: return None try: return pattern.search(string).group() except AttributeError: return None # helper function to convert ips from a sring to a list of ints def convertIP(self, ip): return [ int(n) for n in ip.split('.') ] def getAddrInet(self, iface, callback): if not self.Console: self.Console = Console() cmd = "ip -o addr show dev " + iface self.Console.ePopen(cmd, self.IPaddrFinished, [iface,callback]) def IPaddrFinished(self, result, retval, extra_args): (iface, callback ) = extra_args data = { 'up': False, 'dhcp': False, 'preup' : False, 'predown' : False } globalIPpattern = re.compile("scope global") ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' netRegexp = '[0-9]{1,2}' macRegexp = '[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}\:[0-9a-fA-F]{2}' ipLinePattern = re.compile('inet ' + ipRegexp + '/') ipPattern = re.compile(ipRegexp) netmaskLinePattern = re.compile('/' + netRegexp) netmaskPattern = re.compile(netRegexp) bcastLinePattern = re.compile(' brd ' + ipRegexp) upPattern = re.compile('UP') macPattern = re.compile(macRegexp) macLinePattern = re.compile('link/ether ' + macRegexp) for line in result.splitlines(): split = line.strip().split(' ',2) if (split[1][:-1] == iface): up = self.regExpMatch(upPattern, split[2]) mac = self.regExpMatch(macPattern, self.regExpMatch(macLinePattern, split[2])) if up is not None: data['up'] = True if iface is not 'lo': self.configuredInterfaces.append(iface) if mac is not None: data['mac'] = mac if (split[1] == iface): if re.search(globalIPpattern, split[2]): ip = self.regExpMatch(ipPattern, self.regExpMatch(ipLinePattern, split[2])) netmask = self.calc_netmask(self.regExpMatch(netmaskPattern, self.regExpMatch(netmaskLinePattern, split[2]))) bcast = self.regExpMatch(ipPattern, self.regExpMatch(bcastLinePattern, split[2])) 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 not data.has_key('ip'): data['dhcp'] = True data['ip'] = [0, 0, 0, 0] data['netmask'] = [0, 0, 0, 0] data['gateway'] = [0, 0, 0, 0] cmd = "route -n | grep " + iface self.Console.ePopen(cmd,self.routeFinished, [iface, data, callback]) def routeFinished(self, result, retval, extra_args): (iface, data, callback) = extra_args ipRegexp = '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ipPattern = re.compile(ipRegexp) ipLinePattern = re.compile(ipRegexp) for line in result.splitlines(): print line[0:7] if line[0:7] == "0.0.0.0": gateway = self.regExpMatch(ipPattern, line[16:31]) if gateway: data['gateway'] = self.convertIP(gateway) self.ifaces[iface] = data self.loadNetworkConfig(iface,callback) def writeNetworkConfig(self): self.configuredInterfaces = [] fp = file('/etc/network/interfaces', 'w') fp.write("# automatically generated by enigma2\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") self.configuredInterfaces.append(ifacename) if iface['dhcp'] == True: fp.write("iface "+ ifacename +" inet dhcp\n") if iface['dhcp'] == False: 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'])) if iface.has_key("configStrings"): fp.write(iface["configStrings"]) if iface["preup"] is not False and not iface.has_key("configStrings"): fp.write(iface["preup"]) if iface["predown"] is not False and not iface.has_key("configStrings"): fp.write(iface["predown"]) fp.write("\n") fp.close() self.configuredNetworkAdapters = self.configuredInterfaces self.writeNameserverConfig() def writeNameserverConfig(self): fp = file('/etc/resolv.conf', 'w') fp.write("options rotate timeout:3\n") for nameserver in self.nameservers: fp.write("nameserver %d.%d.%d.%d\n" % tuple(nameserver)) fp.close() def loadNetworkConfig(self,iface,callback = None): interfaces = [] # parse the interfaces-file try: fp = file('/etc/network/interfaces', 'r') 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"] = True else: ifaces[currif]["dhcp"] = False if (currif == iface): #read information only for available interfaces if (split[0] == "address"): ifaces[currif]["address"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("ip"): if self.ifaces[currif]["ip"] != ifaces[currif]["address"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["ip"] = map(int, split[1].split('.')) if (split[0] == "netmask"): ifaces[currif]["netmask"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("netmask"): if self.ifaces[currif]["netmask"] != ifaces[currif]["netmask"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["netmask"] = map(int, split[1].split('.')) if (split[0] == "gateway"): ifaces[currif]["gateway"] = map(int, split[1].split('.')) if self.ifaces[currif].has_key("gateway"): if self.ifaces[currif]["gateway"] != ifaces[currif]["gateway"] and ifaces[currif]["dhcp"] == False: self.ifaces[currif]["gateway"] = map(int, split[1].split('.')) if (split[0] == "pre-up"): if self.ifaces[currif].has_key("preup"): self.ifaces[currif]["preup"] = i if (split[0] in ("pre-down","post-down")): if self.ifaces[currif].has_key("predown"): self.ifaces[currif]["predown"] = i for ifacename, iface in ifaces.items(): if self.ifaces.has_key(ifacename): self.ifaces[ifacename]["dhcp"] = iface["dhcp"] if self.Console: if len(self.Console.appContainers) == 0: # save configured interfacelist self.configuredNetworkAdapters = self.configuredInterfaces # load ns only once self.loadNameserverConfig() print "read configured interface:", ifaces print "self.ifaces after loading:", self.ifaces self.config_ready = True self.msgPlugins() if callback is not None: callback(True) 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() 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: self.nameservers.append(self.convertIP(ip)) print "nameservers:", self.nameservers def getInstalledAdapters(self): return [x for x in os.listdir('/sys/class/net') if not self.isBlacklisted(x)] def getConfiguredAdapters(self): return self.configuredNetworkAdapters def getNumberOfAdapters(self): return len(self.ifaces) def getFriendlyAdapterName(self, x): if x in self.friendlyNames.keys(): return self.friendlyNames.get(x, x) self.friendlyNames[x] = self.getFriendlyAdapterNaming(x) return self.friendlyNames.get(x, x) # when we have no friendly name, use adapter name def getFriendlyAdapterNaming(self, iface): name = None if self.isWirelessInterface(iface): if iface not in self.wlan_interfaces: name = _("WLAN connection") if len(self.wlan_interfaces): name += " " + str(len(self.wlan_interfaces)+1) self.wlan_interfaces.append(iface) else: if iface not in self.lan_interfaces: name = _("LAN connection") if len(self.lan_interfaces): name += " " + str(len(self.lan_interfaces)+1) self.lan_interfaces.append(iface) return name def getFriendlyAdapterDescription(self, iface): if not self.isWirelessInterface(iface): return _('Ethernet network interface') moduledir = self.getWlanModuleDir(iface) if moduledir: name = os.path.basename(os.path.realpath(moduledir)) if name in ('ath_pci','ath5k'): name = 'Atheros' elif name in ('rt73','rt73usb','rt3070sta'): name = 'Ralink' elif name == 'zd1211b': name = 'Zydas' elif name == 'r871x_usb_drv': name = 'Realtek' else: name = _('Unknown') return name + ' ' + _('wireless network interface') def getAdapterName(self, iface): return iface def getAdapterList(self): return self.ifaces.keys() def getAdapterAttribute(self, iface, attribute): return self.ifaces.get(iface, {}).get(attribute) def setAdapterAttribute(self, iface, attribute, value): print "setting for adapter", iface, "attribute", attribute, " to value", 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): 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 resetNetworkConfig(self, mode='lan', callback = None): self.resetNetworkConsole = Console() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ip addr flush dev " + iface + " scope global") self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinishedCB, [mode, callback], debug=True) def resetNetworkFinishedCB(self, extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: self.writeDefaultNetworkConfig(mode, callback) def writeDefaultNetworkConfig(self,mode='lan', callback = None): fp = file('/etc/network/interfaces', 'w') fp.write("# automatically generated by enigma2\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") if mode == 'wlan-mpci': fp.write("auto ath0\n") fp.write("iface ath0 inet dhcp\n") if mode == 'lan': fp.write("auto eth0\n") fp.write("iface eth0 inet dhcp\n") fp.write("\n") fp.close() self.resetNetworkConsole = Console() self.commands = [] if mode == 'wlan': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig ath0 down") self.commands.append("ifconfig wlan0 up") if mode == 'wlan-mpci': self.commands.append("ifconfig eth0 down") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 up") if mode == 'lan': self.commands.append("ifconfig eth0 up") self.commands.append("ifconfig wlan0 down") self.commands.append("ifconfig ath0 down") self.commands.append("/etc/init.d/avahi-daemon start") self.resetNetworkConsole.eBatch(self.commands, self.resetNetworkFinished, [mode,callback], debug=True) def resetNetworkFinished(self,extra_args): (mode, callback) = extra_args if len(self.resetNetworkConsole.appContainers) == 0: if callback is not None: callback(True,mode) def checkNetworkState(self,statecallback): self.NetworkState = 0 cmd1 = "ping -c 1 www.openpli.org" cmd2 = "ping -c 1 www.google.nl" cmd3 = "ping -c 1 www.google.com" self.PingConsole = Console() self.PingConsole.ePopen(cmd1, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd2, self.checkNetworkStateFinished,statecallback) self.PingConsole.ePopen(cmd3, self.checkNetworkStateFinished,statecallback) def checkNetworkStateFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.PingConsole is not None: if retval == 0: self.PingConsole = None statecallback(self.NetworkState) else: self.NetworkState += 1 if len(self.PingConsole.appContainers) == 0: statecallback(self.NetworkState) def restartNetwork(self,callback = None): self.restartConsole = Console() self.config_ready = False self.msgPlugins() self.commands = [] self.commands.append("/etc/init.d/avahi-daemon stop") for iface in self.ifaces.keys(): if iface != 'eth0' or not self.onRemoteRootFS(): self.commands.append("ifdown " + iface) self.commands.append("ip addr flush dev " + iface + " scope global") self.commands.append("/etc/init.d/networking stop") self.commands.append("killall -9 udhcpc") self.commands.append("rm /var/run/udhcpc*") self.commands.append("/etc/init.d/networking start") self.commands.append("/etc/init.d/avahi-daemon start") self.restartConsole.eBatch(self.commands, self.restartNetworkFinished, callback, debug=True) def restartNetworkFinished(self,extra_args): ( callback ) = extra_args if callback is not None: callback(True) def getLinkState(self,iface,callback): cmd = self.ethtool_bin + " " + iface self.LinkConsole = Console() self.LinkConsole.ePopen(cmd, self.getLinkStateFinished,callback) def getLinkStateFinished(self, result, retval,extra_args): (callback) = extra_args if self.LinkConsole is not None: if len(self.LinkConsole.appContainers) == 0: callback(result) def stopPingConsole(self): if self.PingConsole is not None: if len(self.PingConsole.appContainers): for name in self.PingConsole.appContainers.keys(): self.PingConsole.kill(name) def stopLinkStateConsole(self): if self.LinkConsole is not None: if len(self.LinkConsole.appContainers): for name in self.LinkConsole.appContainers.keys(): self.LinkConsole.kill(name) def stopDNSConsole(self): if self.DnsConsole is not None: if len(self.DnsConsole.appContainers): for name in self.DnsConsole.appContainers.keys(): self.DnsConsole.kill(name) def stopRestartConsole(self): if self.restartConsole is not None: if len(self.restartConsole.appContainers): for name in self.restartConsole.appContainers.keys(): self.restartConsole.kill(name) def stopGetInterfacesConsole(self): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) def stopDeactivateInterfaceConsole(self): if self.deactivateInterfaceConsole is not None: self.deactivateInterfaceConsole.killAll() self.deactivateInterfaceConsole = None def stopActivateInterfaceConsole(self): if self.activateInterfaceConsole is not None: self.activateInterfaceConsole.killAll() self.activateInterfaceConsole = None def checkforInterface(self, iface): return self.getAdapterAttribute(iface, 'up') def checkDNSLookup(self,statecallback): cmd1 = "nslookup www.dream-multimedia-tv.de" cmd2 = "nslookup www.heise.de" cmd3 = "nslookup www.google.de" self.DnsConsole = Console() self.DnsConsole.ePopen(cmd1, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd2, self.checkDNSLookupFinished,statecallback) self.DnsConsole.ePopen(cmd3, self.checkDNSLookupFinished,statecallback) def checkDNSLookupFinished(self, result, retval,extra_args): (statecallback) = extra_args if self.DnsConsole is not None: if retval == 0: self.DnsConsole = None statecallback(self.DnsState) else: self.DnsState += 1 if len(self.DnsConsole.appContainers) == 0: statecallback(self.DnsState) def deactivateInterface(self,ifaces,callback = None): self.config_ready = False self.msgPlugins() commands = [] def buildCommands(iface): commands.append("ifdown " + iface) commands.append("ip addr flush dev " + iface + " scope global") #wpa_supplicant sometimes doesn't quit properly on SIGTERM if os.path.exists('/var/run/wpa_supplicant/'+ iface): commands.append("wpa_cli -i" + iface + " terminate") if not self.deactivateInterfaceConsole: self.deactivateInterfaceConsole = Console() if isinstance(ifaces, (list, tuple)): for iface in ifaces: if iface != 'eth0' or not self.onRemoteRootFS(): buildCommands(iface) else: if ifaces == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return buildCommands(ifaces) self.deactivateInterfaceConsole.eBatch(commands, self.deactivateInterfaceFinished, [ifaces,callback], debug=True) def deactivateInterfaceFinished(self,extra_args): (ifaces, callback) = extra_args def checkCommandResult(iface): if self.deactivateInterfaceConsole and self.deactivateInterfaceConsole.appResults.has_key("ifdown " + iface): result = str(self.deactivateInterfaceConsole.appResults.get("ifdown " + iface)).strip("\n") if result == "ifdown: interface " + iface + " not configured": return False else: return True #ifdown sometimes can't get the interface down. if isinstance(ifaces, (list, tuple)): for iface in ifaces: if checkCommandResult(iface) is False: Console().ePopen(("ifconfig " + iface + " down" )) else: if checkCommandResult(ifaces) is False: Console().ePopen(("ifconfig " + ifaces + " down" )) if self.deactivateInterfaceConsole: if len(self.deactivateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def activateInterface(self,iface,callback = None): if self.config_ready: self.config_ready = False self.msgPlugins() if iface == 'eth0' and self.onRemoteRootFS(): if callback is not None: callback(True) return if not self.activateInterfaceConsole: self.activateInterfaceConsole = Console() commands = [] commands.append("ifup " + iface) self.activateInterfaceConsole.eBatch(commands, self.activateInterfaceFinished, callback, debug=True) def activateInterfaceFinished(self,extra_args): callback = extra_args if self.activateInterfaceConsole: if len(self.activateInterfaceConsole.appContainers) == 0: if callback is not None: callback(True) def sysfsPath(self, iface): return '/sys/class/net/' + iface def isWirelessInterface(self, iface): if iface in self.wlan_interfaces: return True if os.path.isdir(self.sysfsPath(iface) + '/wireless'): return True # r871x_usb_drv on kernel 2.6.12 is not identifiable over /sys/class/net/'ifacename'/wireless so look also inside /proc/net/wireless device = re.compile('[a-z]{2,}[0-9]*:') ifnames = [] fp = open('/proc/net/wireless', 'r') for line in fp: try: ifnames.append(device.search(line).group()[:-1]) except AttributeError: pass if iface in ifnames: return True return False def getWlanModuleDir(self, iface = None): devicedir = self.sysfsPath(iface) + '/device' if not os.path.isdir(devicedir): return None moduledir = devicedir + '/driver/module' if os.path.isdir(moduledir): return moduledir # identification is not possible over default moduledir for x in os.listdir(devicedir): # rt3070 on kernel 2.6.18 registers wireless devices as usb_device (e.g. 1-1.3:1.0) and identification is only possible over /sys/class/net/'ifacename'/device/1-xxx if x.startswith("1-"): moduledir = devicedir + '/' + x + '/driver/module' if os.path.isdir(moduledir): return moduledir # rt73, zd1211b, r871x_usb_drv on kernel 2.6.12 can be identified over /sys/class/net/'ifacename'/device/driver, so look also here moduledir = devicedir + '/driver' if os.path.isdir(moduledir): return moduledir return None def detectWlanModule(self, iface = None): if not self.isWirelessInterface(iface): return None devicedir = self.sysfsPath(iface) + '/device' if os.path.isdir(devicedir + '/ieee80211'): return 'nl80211' moduledir = self.getWlanModuleDir(iface) if moduledir: module = os.path.basename(os.path.realpath(moduledir)) if module in ('ath_pci','ath5k'): return 'madwifi' if module in ('rt73','rt73'): return 'ralink' if module == 'zd1211b': return 'zydas' return 'wext' def calc_netmask(self,nmask): from struct import pack, unpack from socket import inet_ntoa, inet_aton mask = 1L<<31 xnet = (1L<<32)-1 cidr_range = range(0, 32) cidr = long(nmask) if cidr not in cidr_range: print 'cidr invalid: %d' % cidr return None else: nm = ((1L<<cidr)-1)<<(32-cidr) netmask = str(inet_ntoa(pack('>L', nm))) return netmask def msgPlugins(self): if self.config_ready is not None: for p in plugins.getPlugins(PluginDescriptor.WHERE_NETWORKCONFIG_READ): p(reason=self.config_ready)
class BackupRestoreScreen(Screen): global skin_1 global skin_2 try: sz_w = getDesktop(0).size().width() except: sz_w = 720 if sz_w > 720: skin_1 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="1280,720" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="1280,360" font="Regular;24" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="progress" position="50,360" zPosition="1" borderWidth="1" size="1180,20" backgroundColor="#111111" transparent="0" />\n\t\t\t\t<widget name="task_one" position="50,390" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_one_state" position="950,390" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two" position="50,420" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two_state" position="950,420" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three" position="50,450" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three_state" position="950,450" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four" position="50,480" size="900,30" font="Regular;24" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four_state" position="950,480" size="280,30" font="Regular;24" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' skin_2 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="1280,720" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="1280,720" font="Regular;30" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' else: skin_1 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="720,576" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="720,288" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="progress" position="50,290" zPosition="1" borderWidth="1" size="620,20" backgroundColor="#111111" transparent="0" />\n\t\t\t\t<widget name="task_one" position="50,320" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_one_state" position="490,320" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two" position="50,350" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_two_state" position="490,350" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three" position="50,380" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_three_state" position="490,380" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four" position="50,410" size="440,30" font="Regular;20" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t\t<widget name="task_four_state" position="490,410" size="180,30" font="Regular;20" halign="right" valign="center" foregroundColor="#40FF00" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' skin_2 = '\n\t\t\t<screen name="BackupRestoreScreen" position="center,center" size="720,576" backgroundColor="#000000" flags="wfNoBorder">\n\t\t\t\t<widget name="description" position="0,0" size="720,576" font="Regular;30" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#000000" transparent="0" />\n\t\t\t</screen>\n\t\t\t' def __init__(self, session, title='Restore/Backup VTimage', restorepath=None, backuppath=None, image_flash=False): Screen.__init__(self, session) self.restorepath = restorepath self.backuppath = backuppath self.image_flash = image_flash self.run = True self.error = False self.finished = False self.device = HardwareInfoVu().get_device_name() self.vtiversion = getVTiVersionString() if self.restorepath: skin = skin_2 elif self.backuppath: skin = skin_1 self['task_one'] = Label() self['task_two'] = Label() self['task_three'] = Label() self['task_four'] = Label() self['task_one_state'] = Label() self['task_two_state'] = Label() self['task_three_state'] = Label() self['task_four_state'] = Label() self['progress'] = ProgressBar() self.skin = skin self['actions'] = ActionMap(['OkCancelActions'], { 'ok': self.keyOk, 'cancel': self.keyCancel }) self['description'] = Label() self.text_done = _('[ ok ]') self.logfile = '/tmp/vti-backup.log' self.text_logfile_hint = _( '\n\nPlease take a look at\n%s\nfor more details') % self.logfile self.mount = '/bin/mount' self.umount = '/bin/umount' self.rm = '/bin/rm' self.touch = '/bin/touch' self.mk_ubifs = '/usr/sbin/mkfs.ubifs' self.mk_jffs2 = '/usr/sbin/mkfs.jffs2' self.nanddump = '/usr/sbin/nanddump' self.ubinize = '/usr/sbin/ubinize' self.flash_erase = '/usr/sbin/flash_erase' self.nand_write = '/usr/sbin/nandwrite' self.ubi_image2nand = '/usr/sbin/ubi-image2nand' self.onLayoutFinish.append(self.layoutFinished) def layoutFinished(self): self.cmdlist = [] self.task = 0 self.container = eConsoleAppContainer() self.container.appClosed.append(self.cmd_run_finished) self.Console = ComConsole() if path.exists(self.logfile): remove(self.logfile) if self.restorepath: text = _( 'Restore of selected image is in progress.\nYour Vu+ STB will be rebooted after write process\nDo not power off !!!\n\nPlease wait ...' ) if self.image_flash: text = _( 'Flash process of selected image is in progress.\nYour Vu+ STB will be rebooted after write process\nDo not power off !!!\n\nPlease wait ...' ) self['description'].setText(text) self.setVariablesRestore() else: self['progress'].setValue(0) text = _( 'Backup of your running image is in progress.\nThe backup can take a few minutes\nPlease wait ...' ) self['description'].setText(text) self.setVariablesBackup() def do_log(self, result): with open(self.logfile, 'a') as file: file.write(result) def getRootSize(self): from os import statvfs stat_info = statvfs('/') free = stat_info.f_bfree * stat_info.f_bsize total = stat_info.f_blocks * stat_info.f_bsize used = total - free return used def checkBinaries(self): if self.restorepath: bins = (self.flash_erase, self.nand_write, self.ubi_image2nand, self.mount) for binary in bins: if not path.exists(binary): return False break elif self.backuppath: bins = (self.touch, self.mk_ubifs, self.mk_jffs2, self.nanddump, self.ubinize, self.mount, self.umount, self.rm) for binary in bins: if not path.exists(binary): return False break return True def cleanupBackup(self): self.cmdlist = [] self.cmdlist.append('%s /tmp/bi/root' % self.umount) self.cmdlist.append('%s %s' % (self.rm, self.ubicfgfile)) self.cmdlist.append('%s %s/vti.rootfs.ubifs' % (self.rm, self.backuppath)) self.cmdlist.append( 'if [ ! -d /tmp/bi/root/dev ] ; then %s -rf /tmp/bi; fi' % self.rm) if self.error: self.backuppath = self.backuppath.replace( '/vuplus/%s' % self.device, '') self.cmdlist.append('%s -rf %s' % (self.rm, self.backuppath)) else: self.cmdlist.append('%s -f %s' % (self.rm, self.logfile)) self.cmd_run() def createFolder(self): if not path.exists(self.backuppath): try: makedirs(self.backuppath) except: return 1 if not path.exists('/tmp/bi/root'): try: makedirs('/tmp/bi/root') except: return 1 return 0 def setVariablesBackup(self): if self.device == 'solo2': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'zero': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'solose': self.ubifsargs = '-m 2048 -e 126976 -c 4096' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'duo2': self.ubifsargs = '-m 2048 -e 126976 -c 8192' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '2' self.rootfsname = 'root_cfe_auto.bin' elif self.device == 'duo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'solo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'uno': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 4096 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' elif self.device == 'ultimo': self.boot_options = '--eraseblock=0x20000 -n -l' self.ubifsargs = '-m 2048 -e 126976 -c 3894 -F' self.ubinizeargs = '-m 2048 -p 128KiB' self.mtdkernel = '1' self.rootfsname = 'root_cfe_auto.jffs2' text = _('preparing backup of image') self['task_one'].setText(text) self.rootsize = self.getRootSize() self.boot_options = None self.ubicfgfile = '/tmp/ubinize.cfg' system('%s %s' % (self.touch, self.ubicfgfile)) now = systime() now = datetime.fromtimestamp(now) now = now.strftime('%Y-%m-%d_%H-%M-%S') self.backuppath = self.backuppath + '/vti_' + self.vtiversion + '_backup-image_' + self.device + '_' + now + '/vuplus/' + self.device if self.createFolder(): errmsg = _( 'Error at creating backup directories\nPlease try another backup location' ) + self.text_logfile_hint self.errorBox(errmsg) return if self.checkBinaries(): self.startMount() else: errmsg = _('The system is missing some necessary files !') self.errorBox(errmsg) def startMount(self): cmd = '%s -t ubifs ubi0:rootfs /tmp/bi/root' % self.mount self.Console.ePopen(cmd, self.rootmounted) def rootmounted(self, result, retval, extra_args=None): self.do_log(result) if retval == 0: self.backuproot() else: errmsg = _( 'Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def backuproot(self): content_ubifile = '[ubifs]\nmode=ubi\nimage=%s/vti.rootfs.ubifs\nvol_id=0\nvol_type=dynamic\nvol_name=rootfs\nvol_flags=autoresize\n\n' % self.backuppath f = open(self.ubicfgfile, 'w') f.write(content_ubifile) f.close() self.vti_root_ubifs = '%s/vti.rootfs.ubifs' % self.backuppath system('%s %s' % (self.touch, self.vti_root_ubifs)) if path.exists(self.vti_root_ubifs): chmod(self.vti_root_ubifs, 511) self['task_one_state'].setText(self.text_done) self['progress'].setValue(10) self.startProgressTimer() text = _('backup root filesystem') self['task_two'].setText(text) cmd = '%s -r /tmp/bi/root -o %s %s' % ( self.mk_ubifs, self.vti_root_ubifs, self.ubifsargs) self.Console.ePopen(cmd, self.ubinizeroot) else: errmsg = _('Error at preparing system for backup' ) + self.text_logfile_hint self.errorBox(errmsg) def ubinizeroot(self, result, retval, extra_args=None): self.do_log(result) try: self.progressTimer.stop() except: pass if retval == 0 and path.exists(self.vti_root_ubifs): self['progress'].setValue(85) self['task_two_state'].setText(self.text_done) text = _('create flashable file of root filesystem') self['task_three'].setText(text) cmd = '%s -o %s/%s %s %s' % (self.ubinize, self.backuppath, self.rootfsname, self.ubinizeargs, self.ubicfgfile) self.Console.ePopen(cmd, self.kerneldump) else: errmsg = _( 'Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def kerneldump(self, result, retval, extra_args=None): self.do_log(result) if retval == 0: text = _('backup of running kernel') self['task_four'].setText(text) self['progress'].setValue(90) self['task_three_state'].setText(self.text_done) cmd = '%s --bb=skipbad --omitoob --quiet /dev/mtd%s > %s/kernel_cfe_auto.bin' % ( self.nanddump, self.mtdkernel, self.backuppath) self.Console.ePopen(cmd, self.backup_finished) else: errmsg = _( 'Backup of root filesystem failed') + self.text_logfile_hint self.errorBox(errmsg) def backup_finished(self, result, retval, extra_args=None): self.do_log(result) if retval == 0: self['progress'].setValue(95) backup_files = listdir(self.backuppath) for f in backup_files: f = '%s/%s' % (self.backuppath, f) if path.exists(f): chmod(f, 420) self.backup_success() else: errmsg = _('Backup of kernel failed') + self.text_logfile_hint self.errorBox(errmsg) def backup_success(self): self.run = False self.error = False self.finished = True self.cleanupBackup() self['progress'].setValue(100) self['task_four_state'].setText(self.text_done) text = _('Image backup finished successfully') self['description'].setText(text) def setVariablesRestore(self): boot_cfe_file = None if self.device == 'solo2': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'zero': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'solose': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'duo2': rootfsname = 'root_cfe_auto.bin' mtdkernel = '2' elif self.device == 'duo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'solo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'uno': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' elif self.device == 'ultimo': rootfsname = 'root_cfe_auto.jffs2' mtdkernel = '1' mtdbootcfe = '2' boot_cfe_file = 'boot_cfe_auto.jffs2' rootfs = self.restorepath + '/vuplus/' + self.device + '/' + rootfsname kernelfile = self.restorepath + '/vuplus/' + self.device + '/kernel_cfe_auto.bin' if path.exists(rootfs) and path.exists(kernelfile): if self.session.current_dialog: self.session.nav.stopService() self.cmdlist.append('/usr/local/hbb-browser/launcher stop') self.cmdlist.append( '/usr/lib/enigma2/python/Plugins/Extensions/DLNAServer/./dlnaserver -e' ) self.cmdlist.append('killall -9 smbd') self.cmdlist.append('sleep 5') self.cmdlist.append('sync') if boot_cfe_file: boot_cfe_file = self.restorepath + '/vuplus/' + self.device + '/' + boot_cfe_file if path.exists(boot_cfe_file): self.cmdlist.append( '%s -q -j /dev/mtd%s 0 0 > /dev/ttyS0' % (self.flash_erase, mtdbootcfe)) self.cmdlist.append( '%s -q -p /dev/mtd%s %s > /dev/ttyS0' % (self.nand_write, mtdbootcfe, boot_cfe_file)) self.cmdlist.append('%s /dev/mtd%s 0 0 > /dev/ttyS0' % (self.flash_erase, mtdkernel)) self.cmdlist.append('%s -q -p /dev/mtd%s %s > /dev/ttyS0' % (self.nand_write, mtdkernel, kernelfile)) self.cmdlist.append( 'init 2 ; sleep 3 ; sync ; %s /dev/mtd0 --image %s > /dev/ttyS0' % (self.ubi_image2nand, rootfs)) if self.checkBinaries(): self.cmd_run() else: errmsg = _('The system is missing some necessary files !') self.errorBox(errmsg) def startProgressTimer(self): self.progressTimer = eTimer() self.progressTimer.start(5000, True) self.progressTimer.callback.append(self.endTimer) def endTimer(self): if path.exists(self.vti_root_ubifs): st = stat(self.vti_root_ubifs) size = st.st_size progress = int((size - self.rootsize) / float(self.rootsize) * 75.0 + 85.0) if size <= self.rootsize: self['progress'].setValue(progress) self.startProgressTimer() def cmd_run(self): if self.container.execute(self.cmdlist[self.task]): self.cmd_run_finished(-1) def cmd_run_finished(self, retval): self.task += 1 if self.task != len(self.cmdlist): if self.container.execute(self.cmdlist[self.task]): self.cmd_run_finished(-1) else: self.task = 0 if not self.finished: self.close() def errorBox(self, errmsg): self.run = False self.error = True self['description'].setText(errmsg) def keyCancel(self, ret=None): if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.run: self.error = True if self.backuppath and not self.finished: self.cleanupBackup() else: self.close() def keyOk(self): if not self.run: self.keyCancel()