예제 #1
0
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
예제 #2
0
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 = ""
예제 #3
0
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)
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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)
예제 #7
0
파일: Jopkg.py 프로젝트: serge61/eePlugins
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 = ""
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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)
예제 #11
0
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)
예제 #12
0
파일: Wlan.py 프로젝트: ostende/bh
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)
예제 #13
0
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()
예제 #14
0
파일: Network.py 프로젝트: sodo13/EG-gui
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
예제 #15
0
파일: InfoPanel.py 프로젝트: ostende/test2
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()
예제 #16
0
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
예제 #17
0
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)
예제 #18
0
파일: Network.py 프로젝트: TitanNit/tdt
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)
예제 #19
0
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
예제 #20
0
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)
예제 #21
0
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()