Example #1
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
Example #2
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
Example #3
0
class SoftwarePanel(Screen):

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software Panel"))
		skin = """
		<screen name="SoftwarePanel" position="center,center" size="650,605" title="Software Panel">
			<widget name="a_off" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/aoff.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_red" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/ared.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_yellow" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/ayellow.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_green" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/agreen.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="feedstatusRED" position="60,14" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusYELLOW" position="60,46" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusGREEN" position="60,78" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="packagetext" position="180,50" size="350,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget name="packagenr" position="511,50" size="50,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget source="list" render="Listbox" position="10,120" size="630,365" scrollbarMode="showOnDemand">
				<convert type="TemplatedMultiContent">
					{"template": [
							MultiContentEntryText(pos = (5, 1), size = (540, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
							MultiContentEntryText(pos = (5, 26), size = (540, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
							MultiContentEntryPixmapAlphaBlend(pos = (545, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
							MultiContentEntryPixmapAlphaBlend(pos = (5, 50), size = (610, 2), png = 5), # index 4 is the div pixmap
						],
					"fonts": [gFont("Regular", 22),gFont("Regular", 14)],
					"itemHeight": 52
					}
				</convert>
			</widget>
			<ePixmap pixmap="skin_default/buttons/red.png" position=" 30,570" size="35,27" alphatest="blend" />
			<widget name="key_green_pic" pixmap="skin_default/buttons/green.png" position="290,570" size="35,27" alphatest="blend" />
			<widget name="key_red" position=" 80,573" size="200,26" zPosition="1" font="Regular;22" halign="left" transparent="1" />
			<widget name="key_green" position="340,573" size="200,26" zPosition="1" font="Regular;22" halign="left" transparent="1" />
		</screen> """
		self.skin = skin
		self.list = []
		self.statuslist = []
		self["list"] = List(self.list)
		self['a_off'] = Pixmap()
		self['a_red'] = Pixmap()
		self['a_yellow'] = Pixmap()
		self['a_green'] = Pixmap()
		self['key_green_pic'] = Pixmap()
		self['key_red_pic'] = Pixmap()
		self['key_red'] = Label(_("Cancel"))
		self['key_green'] = Label(_("Update"))
		self['packagetext'] = Label(_("Updates Available:"))
		self['packagenr'] = Label("0")
		self['feedstatusRED'] = Label("<  " + _("feed status"))
		self['feedstatusYELLOW'] = Label("<  " + _("feed status"))
		self['feedstatusGREEN'] = Label("<  " + _("feed status"))
		self['key_green'].hide()
		self['key_green_pic'].hide()
		self.update = False
		self.packages = 0
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "SetupActions"],
		{
			"cancel": self.Exit,
			"green": self.Green,
			"red": self.Exit,
		}, -2)

		self.onLayoutFinish.append(self.layoutFinished)

	def Exit(self):
		self.ipkg.stop()
		self.close()

	def Green(self):
		if self.packages > 0:
			if self.packages <= 200:
				from Plugins.SystemPlugins.SoftwareManager.plugin import UpdatePlugin
				self.session.open(UpdatePlugin)
				self.close()
			else:
				print "DO NOT UPDATE !!!"
				message = _("There are to many update packages !!\n\n"
				"There is a risk that your %s %s will not\n"
				"boot after online-update, or will show disfunction in running Image.\n\n"
				"You need to flash new !!\n\n"
				"Do you want to flash-online ?") % (getMachineBrand(), getMachineName())
				self.session.openWithCallback(self.checkPackagesCallback, MessageBox, message, default = True)

	def checkPackagesCallback(self, ret):
		print ret
		if ret:
			from Plugins.SystemPlugins.SoftwareManager.Flash_online import FlashOnline
			self.session.open(FlashOnline)
		self.close()

	def layoutFinished(self):
		self.checkTraficLight()
		self.rebuildList()

	def UpdatePackageNr(self):
		self.packages = len(self.list)
		print self.packages
		print"packagenr" + str(self.packages)
		self["packagenr"].setText(str(self.packages))
		if self.packages == 0:
			self['key_green'].hide()
			self['key_green_pic'].hide()
		else:
			self['key_green'].show()
			self['key_green_pic'].show()

	def checkTraficLight(self):
		print"checkTraficLight"
		from urllib import urlopen
		import socket
		self['a_red'].hide()
		self['a_yellow'].hide()
		self['a_green'].hide()
		self['feedstatusRED'].hide()
		self['feedstatusYELLOW'].hide()
		self['feedstatusGREEN'].hide()
		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		try:
			urlopenATV = "http://ampel.mynonpublic.com/Ampel/index.php"
			d = urlopen(urlopenATV)
			tmpStatus = d.read()
			if 'rot.png' in tmpStatus:
				self['a_off'].hide()
				self['a_red'].show()
				self['feedstatusRED'].show()
			elif 'gelb.png' in tmpStatus:
				self['a_off'].hide()
				self['a_yellow'].show()
				self['feedstatusYELLOW'].show()
			elif 'gruen.png' in tmpStatus:
				self['a_off'].hide()
				self['a_green'].show()
				self['feedstatusGREEN'].show()
		except:
			self['a_off'].show()
		socket.setdefaulttimeout(currentTimeoutDefault)

	def setStatus(self,status = None):
		if status:
			self.statuslist = []
			divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
			if status == 'update':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
				self.statuslist.append(( _("Package list update"), '', _("Trying to download a new updatelist. Please wait..." ),'',statuspng, divpng ))
			elif status == 'error':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
				self.statuslist.append(( _("Error"), '', _("There was an error downloading the updatelist. Please try again." ),'',statuspng, divpng ))
			elif status == 'noupdate':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
				self.statuslist.append(( _("Nothing to upgrade"), '', _("There are no updates available." ),'',statuspng, divpng ))

			self['list'].setList(self.statuslist)

	def rebuildList(self):
		self.setStatus('update')
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_ERROR:
			self.setStatus('error')
		elif event == IpkgComponent.EVENT_DONE:
			if self.update == False:
				self.update = True
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			else:
				self.buildPacketList()
		pass
	
	def buildEntryComponent(self, name, version, description, state):
		divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
		if not description:
			description = "No description available."
		if state == 'installed':
			installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
			return((name, version, _(description), state, installedpng, divpng))	
		elif state == 'upgradeable':
			upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
			return((name, version, _(description), state, upgradeablepng, divpng))	
		else:
			installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
			return((name, version, _(description), state, installablepng, divpng))

	def buildPacketList(self):
		self.list = []
		fetchedList = self.ipkg.getFetchedList()
		excludeList = self.ipkg.getExcludeList()

		if len(fetchedList) > 0:
			for x in fetchedList:
				try:
					self.list.append(self.buildEntryComponent(x[0], x[1], x[2], "upgradeable"))
				except:
					print "[SOFTWAREPANEL] " + x[0] + " no valid architecture, ignoring !!"
#					self.list.append(self.buildEntryComponent(x[0], '', 'no valid architecture, ignoring !!', "installable"))
#			if len(excludeList) > 0:
#				for x in excludeList:
#					try:
#						self.list.append(self.buildEntryComponent(x[0], x[1], x[2], "installable"))
#					except:
#						self.list.append(self.buildEntryComponent(x[0], '', 'no valid architecture, ignoring !!', "installable"))

			if self.list:
				self['list'].setList(self.list)
			else:
				self.setStatus('noupdate')
		elif len(fetchedList) == 0:
			self.setStatus('noupdate')
		else:
			self.setStatus('error')

		self.UpdatePackageNr()
Example #4
0
class SoftwarePanel(Screen):

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software Panel"))
		skin = """
		<screen name="SoftwarePanel" position="center,center" size="650,605" title="Software Panel">
			<widget name="a_off" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/aoff.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_red" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/ared.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_yellow" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/ayellow.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_green" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/Infopanel/icons/agreen.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="feedstatusRED" position="60,14" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusYELLOW" position="60,46" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusGREEN" position="60,78" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="packagetext" position="180,50" size="350,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget name="packagenr" position="511,50" size="50,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget source="list" render="Listbox" position="10,120" size="630,365" scrollbarMode="showOnDemand">
				<convert type="TemplatedMultiContent">
					{"template": [
							MultiContentEntryText(pos = (5, 1), size = (540, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
							MultiContentEntryText(pos = (5, 26), size = (540, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
							MultiContentEntryPixmapAlphaBlend(pos = (545, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
							MultiContentEntryPixmapAlphaBlend(pos = (5, 50), size = (610, 2), png = 5), # index 4 is the div pixmap
						],
					"fonts": [gFont("Regular", 22),gFont("Regular", 14)],
					"itemHeight": 52
					}
				</convert>
			</widget>
			<ePixmap pixmap="skin_default/buttons/red.png" position=" 30,570" size="35,27" alphatest="blend" />
			<widget name="key_green_pic" pixmap="skin_default/buttons/green.png" position="290,570" size="35,27" alphatest="blend" />
			<widget name="key_red" position=" 80,573" size="200,26" zPosition="1" font="Regular;22" halign="left" transparent="1" />
			<widget name="key_green" position="340,573" size="200,26" zPosition="1" font="Regular;22" halign="left" transparent="1" />
		</screen> """
		self.skin = skin
		self.list = []
		self.statuslist = []
		self["list"] = List(self.list)
		self['a_off'] = Pixmap()
		self['a_red'] = Pixmap()
		self['a_yellow'] = Pixmap()
		self['a_green'] = Pixmap()
		self['key_green_pic'] = Pixmap()
		self['key_red_pic'] = Pixmap()
		self['key_red'] = Label(_("Cancel"))
		self['key_green'] = Label(_("Update"))
		self['packagetext'] = Label(_("Updates Available:"))
		self['packagenr'] = Label("0")
		self['feedstatusRED'] = Label("<  " + _("feed status"))
		self['feedstatusYELLOW'] = Label("<  " + _("feed status"))
		self['feedstatusGREEN'] = Label("<  " + _("feed status"))
		self['key_green'].hide()
		self['key_green_pic'].hide()
		self.update = False
		self.packages = 0
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "SetupActions"],
		{
			"cancel": self.Exit,
			"green": self.Green,
			"red": self.Exit,
		}, -2)

		self.onLayoutFinish.append(self.layoutFinished)

	def Exit(self):
		self.ipkg.stop()
		self.close()

	def Green(self):
		if self.packages > 0:
			if self.packages <= 200:
				from Plugins.SystemPlugins.SoftwareManager.plugin import UpdatePlugin
				self.session.open(UpdatePlugin)
				self.close()
			else:
				print("DO NOT UPDATE !!!")
				message = _("There are to many update packages !!\n\n"
				"There is a risk that your %s %s will not\n"
				"boot after online-update, or will show disfunction in running Image.\n\n"
				"You need to flash new !!\n\n"
				"Do you want to flash-online ?") % (getMachineBrand(), getMachineName())
				self.session.openWithCallback(self.checkPackagesCallback, MessageBox, message, default = True)

	def checkPackagesCallback(self, ret):
		print(ret)
		if ret:
			from Plugins.SystemPlugins.SoftwareManager.Flash_online import FlashOnline
			self.session.open(FlashOnline)
		self.close()

	def layoutFinished(self):
		self.checkTraficLight()
		self.rebuildList()

	def UpdatePackageNr(self):
		self.packages = len(self.list)
		print(self.packages)
		print("packagenr" + str(self.packages))
		self["packagenr"].setText(str(self.packages))
		if self.packages == 0:
			self['key_green'].hide()
			self['key_green_pic'].hide()
		else:
			self['key_green'].show()
			self['key_green_pic'].show()

	def checkTraficLight(self):
		print("checkTraficLight")
		from six.moves.urllib.request import urlopen
		import socket
		self['a_red'].hide()
		self['a_yellow'].hide()
		self['a_green'].hide()
		self['feedstatusRED'].hide()
		self['feedstatusYELLOW'].hide()
		self['feedstatusGREEN'].hide()
		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		try:
			urlopenATV = "http://ampel.mynonpublic.com/Ampel/index.php"
			d = urlopen(urlopenATV)
			tmpStatus = d.read()
			if 'rot.png' in tmpStatus:
				self['a_off'].hide()
				self['a_red'].show()
				self['feedstatusRED'].show()
			elif 'gelb.png' in tmpStatus:
				self['a_off'].hide()
				self['a_yellow'].show()
				self['feedstatusYELLOW'].show()
			elif 'gruen.png' in tmpStatus:
				self['a_off'].hide()
				self['a_green'].show()
				self['feedstatusGREEN'].show()
		except:
			self['a_off'].show()
		socket.setdefaulttimeout(currentTimeoutDefault)

	def setStatus(self,status = None):
		if status:
			self.statuslist = []
			divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
			if status == 'update':
				if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/upgrade.png")):
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/upgrade.png"))
				else:
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
				self.statuslist.append(( _("Package list update"), '', _("Trying to download a new updatelist. Please wait..." ), '', statuspng, divpng ))
			elif status == 'error':
				if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/remove.png")):
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/remove.png"))
				else:
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
				self.statuslist.append(( _("Error"), '', _("There was an error downloading the updatelist. Please try again." ), '', statuspng, divpng ))
			elif status == 'noupdate':
				if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/installed.png")):
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/installed.png"))
				else:
					statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
				self.statuslist.append(( _("Nothing to upgrade"), '', _("There are no updates available." ), '', statuspng, divpng ))

			self['list'].setList(self.statuslist)

	def rebuildList(self):
		self.setStatus('update')
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_ERROR:
			self.setStatus('error')
		elif event == IpkgComponent.EVENT_DONE:
			if self.update == False:
				self.update = True
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			else:
				self.buildPacketList()
		pass
	
	def buildEntryComponent(self, name, version, description, state):
		divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
		if not description:
			description = "No description available."
		if state == 'installed':
			if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/installed.png")):
				installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/installed.png"))
			else:
				installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
			return((name, version, _(description), state, installedpng, divpng))
		elif state == 'upgradeable':
			if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/upgradeable.png")):
				upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/upgradeable.png"))
			else:
				upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
			return((name, version, _(description), state, upgradeablepng, divpng))
		else:
			if os_path.exists(resolveFilename(SCOPE_CURRENT_SKIN, "icons/installable.png")):
				installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/installable.png"))
			else:
				installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
			return((name, version, _(description), state, installablepng, divpng))

	def buildPacketList(self):
		self.list = []
		fetchedList = self.ipkg.getFetchedList()
		excludeList = self.ipkg.getExcludeList()

		if len(fetchedList) > 0:
			for x in fetchedList:
				try:
					self.list.append(self.buildEntryComponent(x[0], x[1], x[2], "upgradeable"))
				except:
					print("[SOFTWAREPANEL] " + x[0] + " no valid architecture, ignoring !!")
#					self.list.append(self.buildEntryComponent(x[0], '', 'no valid architecture, ignoring !!', "installable"))
#			if len(excludeList) > 0:
#				for x in excludeList:
#					try:
#						self.list.append(self.buildEntryComponent(x[0], x[1], x[2], "installable"))
#					except:
#						self.list.append(self.buildEntryComponent(x[0], '', 'no valid architecture, ignoring !!', "installable"))

			if self.list:
				self['list'].setList(self.list)
			else:
				self.setStatus('noupdate')
		elif len(fetchedList) == 0:
			self.setStatus('noupdate')
		else:
			self.setStatus('error')

		self.UpdatePackageNr()
Example #5
0
class MyPluginManager(Screen):

    def __init__(self, session, plugin_path, args = 0):
        Screen.__init__(self, session)
        self.session = session
        self.skin_path = plugin_path
        self.wanted_extensions_base = ('enigma2', 'kernel-module')
        self.wanted_extensions = self.wanted_extensions_base
        self['shortcuts'] = ActionMap(['ShortcutActions', 'WizardActions'], {'ok': self.go,
         'back': self.exit,
         'red': self.exit,
         'green': self.reloadinfo,
         'yellow': self.doInstall}, -1)
        self.list = []
        self.statuslist = []
        self['list'] = List(self.list)
        self['key_red'] = StaticText(_('Close'))
        self['key_green'] = Label()
        self['key_green'].setText(_('reload package data'))
        self['key_yellow'] = Label()
        self['key_yellow'].setText('')
        self.title = _('Download or delete Software')
        try:
            self['title'] = StaticText(self.title)
        except:
            print 'self["title"] was not found in skin'

        self.start_vc = 0
        self.list_updating = True
        self.plugin_list_state = False
        self.first_run = True
        self.replacename = None
        self.greenpressed = False
        self.packetlist = []
        self.installed_packetlist = {}
        self.Console = ComConsole()
        self.cmdList = []
        self.changeList = []
        self.changed = False
        self.doSoftwareAction = False
        self.opkgupdated = False
        self.upgradablelist = []
        self.cachelist = []
        self.cache_ttl = 21600
        self.cache_file = '/tmp/packetsoftwaremanager.cache'
        self.oktext = _('\nAfter pressing OK, please wait!')
        self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onShown.append(self.setWindowTitle)
        self.onLayoutFinish.append(self.rebuildList)
        if self.selectionChanged not in self['list'].onSelectionChanged:
            self['list'].onSelectionChanged.append(self.selectionChanged)

    def getFreeSpace(self, mountpoint):
        if mountpoint:
            stat_info = statvfs(mountpoint)
            free_flash_space = stat_info.f_bfree * stat_info.f_bsize
            return free_flash_space

    def checkFreeSpace(self):
        free_flash_space = self.getFreeSpace('/')
        if free_flash_space < 8000000:
            human_free_space = free_flash_space / 1048576
            msg = _('There are only %d MB free FLASH space available\nInstalling or updating software can cause serious software problems !\nContinue installing/updating software (at your own risk) ?') % human_free_space
            self.session.openWithCallback(self.cbSpaceCheck, MessageBox, msg)

    def cbSpaceCheck(self, result):
        if not result:
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.close()

    def exit(self):
        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.plugin_list_state == True and self.doSoftwareAction == False:
            self.setStatus('startmenu')
        elif self.plugin_list_state == True and self.doSoftwareAction == True:
            self['list'].setList(self.list)
        elif self.plugin_list_state == False and self.doSoftwareAction == True:
            self.setStatus('startmenu')
        else:
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.reloadPluginlist()
            self.close()
        self.doSoftwareAction = False
        if len(self.cmdList):
            self['key_yellow'].setText(_('Excecute'))

    def reloadinfo(self):
        if self.plugin_list_state == True:
            self.greenpressed = True
            self.go()
        else:
            self.replacename = None
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.list_updating = True
            self.rebuildList()

    def setWindowTitle(self, title = None):
        if not title:
            title = self.title
        try:
            self['title'] = StaticText(title)
        except:
            print 'self["title"] was not found in skin'

    def selectionChanged(self):
        if self.plugin_list_state == True:
            current = self['list'].getCurrent()
            if current:
                if current[3] == 'installed':
                    self['key_green'].setText(_('Remove'))
                elif current[3] == 'installable':
                    self['key_green'].setText(_('Install'))
                elif current[3] == 'upgradeable':
                    self['key_green'].setText(_('Upgrade'))
            else:
                self['key_green'].setText('')
        elif self.doSoftwareAction == False:
            self['key_green'].setText(_('reload package data'))

    def setStatus(self, status = None):
        if status:
            self.statuslist = []
            self.plugin_list_state = False
            divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, '750S/div-h.png'))
            if status == 'update':
                statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installable.png'))
                self.statuslist.append((_('Package list update'),
                 '',
                 _('Trying to download a new packetlist. Please wait...'),
                 '',
                 statuspng,
                 divpng))
                self['list'].setList(self.statuslist)
            elif status == 'error':
                statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/remove.png'))
                self.statuslist.append((_('Error'),
                 '',
                 _('There was an error downloading the packetlist. Please try again.'),
                 '',
                 statuspng,
                 divpng))
                self['list'].setList(self.statuslist)
            elif status == 'startmenu':
                self.statuslist.append((_('Extensions'),
                 '',
                 _('install/remove common plugins'),
                 'extensions',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_plugin.png')),
                 divpng))
                self.statuslist.append((_('Systemplugins'),
                 '',
                 _('install/remove systemplugins'),
                 'systemplugins',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_systemplugin.png')),
                 divpng))
                self.statuslist.append((_('Skins'),
                 '',
                 _('install/remove skins to change look of OSD'),
                 'skins',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_skin.png')),
                 divpng))
                self.statuslist.append((_('SoftCams'),
                 '',
                 _('install/remove softcams'),
                 'softcams',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_softcam.png')),
                 divpng))
                self.statuslist.append((_('Configurations'),
                 '',
                 _('install/remove configuration files for softcams'),
                 'configs',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_softcam_config.png')),
                 divpng))
                self.statuslist.append((_('Picons'),
                 '',
                 _('install/remove picons for OSD and graphical VFD'),
                 'picons',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_picon.png')),
                 divpng))
                self.statuslist.append((_('Settings'),
                 '',
                 _('install/remove channel lists'),
                 'settings',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_channel.png')),
                 divpng))
                self.statuslist.append((_('Kernel modules'),
                 '',
                 _('install/remove kernel modules'),
                 'kernel',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_kernel.png')),
                 divpng))
                self.statuslist.append((_('Language packages'),
                 '',
                 _('install/remove language packages for dvbapp2'),
                 'locale',
                 LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/sm_world.png')),
                 divpng))
                self['list'].setList(self.statuslist)

    def rebuildList(self):
        self.changed = False
        self.cmdList = []
        self.changeList = []
        self.upgradablelist = []
        self['key_yellow'].setText('')
        self.setStatus('update')
        self.inv_cache = 0
        if self.start_vc != 0:
            self.vc = valid_cache(self.cache_file, self.cache_ttl)
        else:
            self.vc = 0
        if self.cache_ttl > 0 and self.vc != 0:
            try:
                self.buildPacketList()
            except:
                self.inv_cache = 1

        if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
            self.run = 0
            self.wanted_extensions = self.wanted_extensions_base
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def go(self, returnValue = None):
        cur = self['list'].getCurrent()
        self.submenulist = ('systemplugins', 'extensions', 'skins', 'picons', 'settings', 'softcams', 'configs', 'drivers', 'kernel', 'locale')
        if cur:
            if self.doSoftwareAction == True:
                if self.greenpressed == True:
                    self.greenpressed = False
                    self.runInstall()
            elif cur[3] in self.submenulist:
                self.plugin_list_state = True
                if cur[3] == 'systemplugins':
                    self.wanted_extensions = 'enigma2-plugin-systemplugins-'
                elif cur[3] == 'extensions':
                    self.wanted_extensions = 'enigma2-plugin-extensions-'
                elif cur[3] == 'kernel':
                    self.wanted_extensions = 'kernel-module-'
                elif cur[3] == 'skins':
                    self.wanted_extensions = 'enigma2-plugin-skin-'
                elif cur[3] == 'picons':
                    self.wanted_extensions = 'enigma2-plugin-picons-'
                elif cur[3] == 'settings':
                    self.wanted_extensions = 'enigma2-plugin-settings-'
                elif cur[3] == 'softcams':
                    self.wanted_extensions = 'enigma2-plugin-cams-'
                elif cur[3] == 'configs':
                    self.wanted_extensions = 'enigma2-plugin-config-'
                elif cur[3] == 'drivers':
                    self.wanted_extensions = 'enigma2-plugin-drivers-'
                elif cur[3] == 'locale':
                    self.wanted_extensions = 'enigma2-locale-'
                self.replacename = self.wanted_extensions
                self.vc = valid_cache(self.cache_file, self.cache_ttl)
                self.buildPacketList()
                self.setStatus(None)
            else:
                status = cur[3]
                if self.replacename is not None:
                    package = self.wanted_extensions + cur[0]
                else:
                    package = cur[0]
                if status == 'upgradeable':
                    self.upgradablelist.append(package)
                self.changecmdList = True
                item = self['list'].getIndex()
                curcache = [package,
                 cur[1],
                 cur[2],
                 cur[3]]
                for cmdListitem in self.cmdList:
                    if str(cmdListitem).find(package) != -1:
                        self.cmdList.remove(cmdListitem)
                        self.changecmdList = False

                if package in self.upgradablelist:
                    self.changecmdList = True
                if package in self.changeList:
                    self.changeList.remove(package)
                    self.changed = False
                else:
                    self.changeList.append(package)
                    self.changed = True
                if status == 'installed':
                    if self.changed == True or package in self.upgradablelist:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'goremove')
                    else:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installable')
                    try:
                        cacheindex = self.cachelist.index(curcache)
                        self.cachelist[cacheindex] = [package,
                         cur[1],
                         cur[2],
                         'installable']
                    except:
                        print '[VTI SoftwareManager] failed to modify packetcachefile'

                    self['key_green'].setText(_('Install'))
                    if self.changecmdList == True:
                        expert_args = ''
                        if config.usage.use_rm_force_depends.value:
                            expert_args = '--force-depends '
                        if config.usage.use_rm_autoremove.value:
                            expert_args += '--autoremove '
                        self.cmdList.append((IpkgComponent.CMD_REMOVE, {'package': expert_args + package}))
                elif status == 'upgradeable':
                    if self.changed == True:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'goinstalled')
                    else:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
                    try:
                        cacheindex = self.cachelist.index(curcache)
                        self.cachelist[cacheindex] = [package,
                         cur[1],
                         cur[2],
                         'installed']
                    except:
                        print '[VTI SoftwareManager] failed to modify packetcachefile'

                    self['key_green'].setText(_('Remove'))
                    if self.changecmdList == True:
                        self.cmdList.append((IpkgComponent.CMD_INSTALL, {'package': package}))
                elif status == 'installable':
                    if self.changed == True:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'goinstalled')
                    else:
                        self.list[item] = self.buildEntryComponent(cur[0], cur[1], cur[2], 'installed')
                    try:
                        cacheindex = self.cachelist.index(curcache)
                        self.cachelist[cacheindex] = [package,
                         cur[1],
                         cur[2],
                         'installed']
                    except:
                        print '[VTI SoftwareManager] failed to modify packetcachefile'

                    self['key_green'].setText(_('Remove'))
                    if self.changecmdList == True:
                        self.cmdList.append((IpkgComponent.CMD_INSTALL, {'package': package}))
                write_cache(self.cache_file, self.cachelist)
                self['list'].updateList(self.list)
                self.selectionChanged
                if len(self.cmdList):
                    self['key_yellow'].setText(_('Excecute'))
                else:
                    self['key_yellow'].setText('')

    def doInstall(self):
        if len(self.cmdList) and self.doSoftwareAction != True:
            self.removetextlist = ['enigma2-plugin-systemplugins-',
             'enigma2-plugin-extensions-',
             'kernel-module-',
             'enigma2-plugin-skin-',
             'enigma2-plugin-picons-',
             'enigma2-plugin-settings-',
             'enigma2-plugin-cams-',
             'enigma2-plugin-config-',
             'enigma2-plugin-drivers-',
             '--force-depends ',
             '--autoremove ']
            self.execlist = []
            self.plugin_list_state == False
            self.text = ''
            divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, '750S/div-h.png'))
            for self.textitem in self.cmdList:
                self.textitemaction = self.textitem[0]
                if self.textitemaction == 0:
                    self.textitemaction = _('Install')
                    actionpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installed.png'))
                elif self.textitemaction == 2:
                    self.textitemaction = _('Remove')
                    actionpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/remove.png'))
                else:
                    self.textitemaction = _('upgrade')
                self.textitempackage = self.textitem[1]
                self.textitem = self.textitempackage['package']
                for removetext in self.removetextlist:
                    self.textitem = self.textitem.replace(removetext, '')

                self.execlist.append((self.textitem,
                 self.textitemaction,
                 '',
                 '',
                 actionpng,
                 divpng))

            self['list'].setList(self.execlist)
            self['key_yellow'].setText('')
            self['key_green'].setText(_('Start'))
            self.doSoftwareAction = True

    def runInstall(self):
        self.doSoftwareAction = False
        self.session.openWithCallback(self.runInstallFinished, Ipkg, cmdList=self.cmdList)

    def runInstallFinished(self):
        needs_restart_list = ('enigma2-plugin-systemplugins-crossepg', 'enigma2-plugin-extensions-atmolightd', 'enigma2-plugin-extensions-enhancedmoviecenter', 'enigma2-plugin-extensions-epgimport', 'enigma2-plugin-extensions-grannybutton', 'enigma2-plugin-extensions-infobartunerstate', 'enigma2-plugin-extensions-lcd4linux', 'enigma2-plugin-extensions-multiquickbutton', 'enigma2-plugin-extensions-openvpn', 'enigma2-plugin-extensions-openwebif', 'enigma2-plugin-extensions-secondinfobar', 'enigma2-plugin-extensions-webbouqueteditor')
        skin_installed = False
        restart_required = False
        for x in self.cmdList:
            if len(x) > 1 and x[0] == 0:
                if x[1].has_key('package'):
                    if x[1]['package'].startswith('enigma2-plugin-skin-'):
                        skin_installed = True
                    if len([ p_name for p_name in needs_restart_list if x[1]['package'].startswith(p_name) ]):
                        restart_required = True
            if restart_required and skin_installed:
                break

        self.plugin_list_state = False
        self.changed = False
        self.cmdList = []
        self.changeList = []
        self.upgradablelist = []
        self.reloadPluginlist()
        self['key_yellow'].setText('')
        if restart_required:
            plugins.restart_required = True
        if skin_installed:
            self.session.openWithCallback(self.exitAnswerSkinChoice, MessageBox, _('A new skin was installed\n') + _('Do you want to open the skin choice list?'))
        elif not plugins.restart_required:
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.close()
        else:
            self.session.openWithCallback(self.exitAnswer, MessageBox, _('Execution finished.\n') + _('Do you want to restart GUI ?'))

    def exitAnswerSkinChoice(self, result):
        if result:
            from Plugins.SystemPlugins.SkinSelector.plugin import SkinSelector
            self.prev_skin = config.skin.primary_skin.value
            self.session.openWithCallback(self.skinChanged, SkinSelector, silent_close=True)
        elif plugins.restart_required:
            self.session.openWithCallback(self.exitAnswer, MessageBox, _('Execution finished.\n') + _('Do you want to restart GUI ?'))
        else:
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.close()

    def exitAnswer(self, result):
        if result:
            self.session.open(Screens.Standby.TryQuitMainloop, 3)
        else:
            self.reloadinfo()

    def skinChanged(self, res = None):
        need_restart = False
        if plugins.restart_required:
            need_restart = True
        if self.prev_skin != config.skin.primary_skin.value:
            need_restart = True
        if need_restart:
            self.session.openWithCallback(self.exitAnswer, MessageBox, _('Execution finished.\n') + _('Do you want to restart GUI ?'))
        else:
            if os_path.exists(self.cache_file) == True:
                remove(self.cache_file)
            self.close()

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_ERROR:
            self.list_updating = False
            self.setStatus('error')
        elif event == IpkgComponent.EVENT_DONE:
            if self.list_updating:
                self.list_updating = False
                if not self.Console:
                    self.Console = Console()
                cmd = 'opkg list-installed'
                self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)

    def IpkgList_Finished(self, result, retval, extra_args = None):
        if len(result):
            self.packetlist = []
            for x in result.splitlines():
                split = x.split(' - ')
                if split[0].strip().startswith(self.wanted_extensions):
                    try:
                        self.packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()])
                    except:
                        self.packetlist.append([split[0].strip(), split[1].strip(), ' '])

        if not self.Console:
            self.Console = Console()
        cmd = 'opkg list-upgradable'
        self.Console.ePopen(cmd, self.OpkgUpgradableList_Finished)

    def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
        if len(result):
            self.installed_packetlist = {}
            for x in result.splitlines():
                split = x.split(' - ')
                if split[0].strip().startswith(self.wanted_extensions):
                    self.installed_packetlist[split[0].strip()] = split[1].strip()

        if not self.Console:
            self.Console = Console()
        cmd = "opkg list |  grep -v '^[[:space:]]'"
        self.Console.ePopen(cmd, self.IpkgList_Finished)

    def OpkgUpgradableList_Finished(self, result, retval, extra_args = None):
        self.upgradable_packetlist = {}
        if len(result):
            for x in result.splitlines():
                split = x.split(' - ')
                if split[0].strip().startswith(self.wanted_extensions):
                    self.upgradable_packetlist[split[0].strip()] = split[1].strip()

        self.opkgupdated = True
        self.buildPacketList()

    def buildEntryComponent(self, name, version, description, state):
        divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, '750S/div-h.png'))
        self.fullname = name
        if self.replacename is not None:
            name = name.replace(self.wanted_extensions, '')
        if state == 'installed':
            if self.fullname in self.changeList:
                installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installplugin.png'))
            else:
                installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installed.png'))
            return (name,
             version,
             description,
             state,
             installedpng,
             divpng)
        elif state == 'upgradeable':
            upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/upgradeable.png'))
            return (name,
             version,
             description,
             state,
             upgradeablepng,
             divpng)
        elif state == 'goinstalled':
            state = 'installed'
            goinstalledpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installplugin.png'))
            return (name,
             version,
             description,
             state,
             goinstalledpng,
             divpng)
        elif state == 'goremove':
            state = 'installable'
            goremovepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/removeplugin.png'))
            return (name,
             version,
             description,
             state,
             goremovepng,
             divpng)
        else:
            if self.fullname in self.changeList or self.fullname in self.upgradablelist:
                installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/removeplugin.png'))
            else:
                installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, 'SystemPlugins/VTIPanel/pictures/installable.png'))
            return (name,
             version,
             description,
             state,
             installablepng,
             divpng)

    def buildPacketList(self):
        self.list = []
        self.cachelist = []
        if self.cache_ttl > 0 and self.vc != 0:
            try:
                self.cachelist = load_cache(self.cache_file)
                if len(self.cachelist) > 0:
                    for x in self.cachelist:
                        if x[0].strip().startswith(self.wanted_extensions):
                            self.list.append(self.buildEntryComponent(x[0], x[1], x[2], x[3]))

                    if self.first_run == True:
                        self.first_run = False
                        self.setStatus('startmenu')
                    else:
                        self['list'].setList(self.list)
            except:
                self.inv_cache = 1

        if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
            for x in self.packetlist:
                status = ''
                if self.upgradable_packetlist.has_key(x[0].strip()):
                    status = 'upgradeable'
                    self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
                elif self.installed_packetlist.has_key(x[0].strip()):
                    status = 'installed'
                    if x[1].strip() == self.installed_packetlist[x[0].strip()]:
                        self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
                else:
                    status = 'installable'
                    self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), status))
                if self.installed_packetlist.has_key(x[0].strip()):
                    if x[1].strip() == self.installed_packetlist[x[0].strip()]:
                        self.cachelist.append([x[0].strip(),
                         x[1].strip(),
                         x[2].strip(),
                         status])
                else:
                    self.cachelist.append([x[0].strip(),
                     x[1].strip(),
                     x[2].strip(),
                     status])

            write_cache(self.cache_file, self.cachelist)
            self.first_run = False
            self.setStatus('startmenu')
        self.selectionChanged()
        if self.opkgupdated == True:
            self.opkgupdated = False
            self.checkFreeSpace()

    def reloadPluginlist(self):
        plugins.clearPluginList()
        plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
Example #6
0
class manageDttDevice(Screen):
    __module__ = __name__
    skin = '\n\t\t<screen position="80,95" size="560,430">\n\t\t\t<widget source="conn" render=Label position="10,10" size="540,340" font="Regular;20" halign="center" transparent="1" />\n\t\t\t<widget source="list" render="Listbox" position="10,10" size="540,340" scrollbarMode="showOnDemand">\n\t\t\t\t<convert type="TemplatedMultiContent">\n\t\t\t\t\t{"template": [\n\t\t\t\t\t\t\tMultiContentEntryText(pos = (0, 0), size = (400, 30), font=0, flags = RT_HALIGN_LEFT | RT_HALIGN_LEFT, text = 1),\n\t\t\t\t\t\t\tMultiContentEntryPixmapAlphaTest(pos=(405, 6), size=(80, 23), png=png),\n\t\t\t\t\t\t],\n\t\t\t\t\t"fonts": [gFont("Regular", 20)],\n\t\t\t\t\t"itemHeight": 30\n\t\t\t\t\t}\n\t\t\t\t</convert>\n\t\t\t</widget>\n\t\t\t<widget name="key_red" position="0,400" size="280,20" zPosition="1" font="Regular;22" valign="center" foregroundColor="#0064c7" backgroundColor="#9f1313" transparent="1" />\n\t\t\t<widget name="key_yellow" position="400,510" size="280,20" zPosition="1" font="Regular;22" valign="center" foregroundColor="#bab329" backgroundColor="#9f1313" transparent="1" />\n\t\t</screen>'
    
    def __init__(self, session):
        Screen.__init__(self, session)
        self.list = []
        self.devList = checkDev()
        self.devstatus = { }
        self.needInstall = False
        self.updating = True
        self['list'] = List(self.list)
        self['key_red'] = Label(_('Exit'))
        self['key_yellow'] = Label('')
        self['conn'] = StaticText('')
        self['actions'] = ActionMap([
            'WizardActions',
            'ColorActions'], {
            'ok': self.KeyOk,
            'yellow': self.modulesInstall,
            'red': self.exit,
            'back': self.exit })
        self.cmdList = []
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.timeoutTimer = eTimer()
        self.timeoutTimer.callback.append(self.doTimeoutTimer)
        self.onLayoutFinish.append(self.updateList)
        self.onShown.append(self.setWindowTitle)

    
    def exit(self):
        if not self.ipkg.isRunning():
            self.close()
        

    
    def setWindowTitle(self):
        self.setTitle(_('Manage DVB-T/C Adapter'))

    
    def KeyOk(self):
        if self.devList:
            sel = self['list'].getCurrent()[0]
            if sel:
                self.devstatus[sel] = not self.devstatus[sel]
                self.saveStatus()
                self.updateList()
                if self.devstatus[sel]:
                    msg = _('Enigma2 will be now hard restarted to enable DVB/T.please wait\nDo You want restart now?')
                    box = self.session.openWithCallback(self.restartEnigma2, MessageBox, msg, MessageBox.TYPE_YESNO)
                    box.setTitle(_('Restart Enigma2'))
                else:
                    msg = _('Dreambox will be now rebooted to disable DVB/T.\nDo You want reboot the box now?')
                    box = self.session.openWithCallback(self.rebootDream, MessageBox, msg, MessageBox.TYPE_YESNO)
                    box.setTitle(_('Reboot Dreambox'))
            
        else:
            self.close()

    
    def restartEnigma2(self, answer):
        if answer is True:
            self.session.open(TryQuitMainloop, 3)
        

    
    def rebootDream(self, answer):
        if answer is True:
            self.session.open(TryQuitMainloop, 2)
        

    
    def readStatus(self):
        
        try:
            if self.devList:
                for x in self.devList:
                    self.devstatus[x[1]] = False
                if fileExists('/etc/dtt.devices'):
                    loadedDevices = open('/etc/dtt.devices', 'r')
                    for d in loadedDevices.readlines():
                        for dev in self.devList:
                            if dev[1] == d[:-1]:
                                self.devstatus[dev[1]] = True
                                continue
                    loadedDevices.close()
                
            elif fileExists('/etc/dtt.devices'):
                unlink('/etc/dtt.devices')
            
            return None
        except IOError:
            return None


    
    def saveStatus(self):
        out = open('/etc/dtt.devices', 'w')
        for dev in self.devList:
            if self.devstatus.get(dev[1]):
                out.write(dev[1] + '\n')
                continue
        out.close()

    
    def updateList(self):
        del self.list[:]
        if fileExists('/usr/script/loaddttmodules.sh'):
            self['conn'].text = ''
            self['key_yellow'].setText(_('Remove Driver'))
            self.readStatus()
            self.needInstall = False
            skin_path = GetSkinPath()
            if self.devList:
                for dev in self.devList:
                    res = [
                        dev[1]]
                    png = LoadPixmap({
                        True: skin_path + 'menu/menu_on.png',
                        False: skin_path + 'menu/menu_off.png' }[self.devstatus.get(dev[1])])
                    self.list.append((dev[1], dev[2], png))
                
            
            self['list'].setList(self.list)
        else:
            self.needInstall = True
            self['key_yellow'].setText(_('Install Driver'))
            self.showInstMess()

    
    def showInstMess(self):
        diskSpace = t.getVarSpaceKb()
        percFree = int((diskSpace[0] / diskSpace[1]) * 100)
        strMess = _('Modules for support\nUSB DVB-T/C adapter\nare not installed!\n\nPress yellow button\nto install it.')
        self['conn'].text = '%s\n\nFree: %d kB (%d%%)' % (strMess, int(diskSpace[0]), percFree)

    
    def modulesInstall(self):
        if self.needInstall:
            if int(t.getVarSpaceKb()[0]) < 2500:
                msg = _('Not enough space!\nPlease delete addons before install new.')
                self.session.open(MessageBox, msg, MessageBox.TYPE_INFO)
                return None
            self['conn'].setText(_('Connetting to addons server.\nPlease wait...'))
            self.updating = True
            self.timeoutTimer.start(config.nemesis.ipkg.updateTimeout.value * 1000)
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            msg = _('Do you want remove the support\npackages, for DVB-T/C adapters?') + _('\nAfter pressing OK, please wait!')
            self.session.openWithCallback(self.runRemove, MessageBox, msg, MessageBox.TYPE_YESNO)

    
    def doTimeoutTimer(self):
        self['conn'].text = _('Server connection timeout!\nPlease try again later.')
        self.ipkg.stop()

    
    def runUpgrade(self, result):
        if result:
            self.session.openWithCallback(self.updateList, Ipkg, cmdList = self.cmdList)
        else:
            self.showInstMess()

    
    def runRemove(self, result):
        if result:
            self.cmdList = []
            self.cmdList.append((IpkgComponent.CMD_REMOVE, {
                'package': 'dreambox-tuner-usb' }))
            if len(self.cmdList):
                self.session.openWithCallback(self.pakageRemoved, Ipkg, cmdList = self.cmdList)
            
        

    
    def pakageRemoved(self):
        self.updateList()
        if fileExists('/etc/dtt.devices'):
            unlink('/etc/dtt.devices')
        
        msg = _('Dreambox will be now rebooted to disable DVB/T.\nDo You want reboot the box now?')
        box = self.session.openWithCallback(self.rebootDream, MessageBox, msg, MessageBox.TYPE_YESNO)
        box.setTitle(_('Reboot Dreambox'))

    
    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_ERROR:
            self.updating = False
            self['conn'].text = _('Server not found!\nPlease check internet connection.')
        elif event == IpkgComponent.EVENT_DONE:
            if self.timeoutTimer.isActive():
                self.timeoutTimer.stop()
            
            if self.updating:
                self.cmdList = []
                self.cmdList.append((IpkgComponent.CMD_INSTALL, {
                    'package': 'dreambox-tuner-usb' }))
                if len(self.cmdList):
                    self.session.openWithCallback(self.runUpgrade, MessageBox, _('Do you want install the support\npackages, for DVB-T/C adapters?') + _('\nAfter pressing OK, please wait!'), MessageBox.TYPE_YESNO)
Example #7
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
Example #8
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
Example #9
0
class UpdatePlugin(Screen):
    skin = '\n\t\t<screen name="UpdatePlugin" position="center,center" size="550,300" title="Software update" >\n\t\t\t<widget name="activityslider" position="0,0" size="550,5"  />\n\t\t\t<widget name="slider" position="0,150" size="550,30"  />\n\t\t\t<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />\n\t\t\t<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />\n\t\t</screen>'

    def __init__(self, session, args = None):
        Screen.__init__(self, session)
        self.sliderPackages = {'vuplus-dvb-modules': 1,
         'enigma2': 2,
         'opera-hbbtv': 3}
        self.slider = Slider(0, 4)
        self['slider'] = self.slider
        self.activityslider = Slider(0, 100)
        self['activityslider'] = self.activityslider
        self.status = StaticText(_('Please wait...'))
        self['status'] = self.status
        self.package = StaticText(_('Verifying your internet connection...'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.updating = False
        self['actions'] = ActionMap(['WizardActions'], {'ok': self.keyOk,
         'back': self.exit}, -1)
        iNetwork.checkNetworkState(self.checkNetworkCB)
        self.onClose.append(self.cleanup)

    def startUpgrade(self):
        update_options = ' '
        if config.usage.use_force_overwrite.value:
            update_options += '--force-overwrite '
        if config.usage.use_package_conffile.value:
            update_options += '--force-maintainer '
        f = open(update_trigger, 'w+')
        f.write(update_options)
        f.close()
        config.usage.update_available.value = False
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def cleanup(self):
        iNetwork.stopPingConsole()

    def getFreeSpace(self, mountpoint):
        if mountpoint:
            stat_info = statvfs(mountpoint)
            free_flash_space = stat_info.f_bfree * stat_info.f_bsize
            return free_flash_space

    def doBackupSuite(self):
        backupactions = BackupActions('auto')
        if backupactions.createPluginList() and backupactions.createSettingFile() and backupactions.createConfigFile():
            backupactions.houseKeeping()
            return True
        backupactions.houseKeeping()
        msg = _('There was a problem at creating an automatic backup for VTi BackupSuite. Do you really want to continue ?')
        self.session.openWithCallback(self.cbBackupSuite, MessageBox, msg, MessageBox.TYPE_YESNO, default=False)

    def cbBackupSuite(self, result = None):
        if result:
            self.startUpgrade()
        else:
            self.close()

    def checkFreeSpace(self):
        free_flash_space = self.getFreeSpace('/')
        if free_flash_space > 19000000:
            if self.doBackupSuite():
                self.startUpgrade()
        else:
            human_free_space = free_flash_space / 1048576
            msg = _('There are only %d MB free FLASH space available\nInstalling or updating software can cause serious software problems !\nContinue installing/updating software (at your own risk) ?') % human_free_space
            self.session.openWithCallback(self.cbSpaceCheck, MessageBox, msg, MessageBox.TYPE_YESNO, default=False)

    def cbSpaceCheck(self, result):
        if not result:
            self.close()
        elif self.doBackupSuite():
            self.startUpgrade()

    def checkNetworkCB(self, data):
        if data is not None:
            if data <= 2:
                self.updating = True
                self.activityTimer.start(100, False)
                self.package.setText(_('Package list update'))
                self.status.setText(_('Upgrading STB... Please wait'))
                self.checkFreeSpace()
            else:
                self.package.setText(_('Your network is not working. Please try again.'))
                self.status.setText(self.oktext)

    def doActivityTimer(self):
        self.activity += 1
        if self.activity == 100:
            self.activity = 0
        self.activityslider.setValue(self.activity)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_('Downloading'))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if self.sliderPackages.has_key(param):
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(_('Upgrading'))
            if param not in self.processed_packages:
                self.processed_packages.append(param)
                self.packages += 1
        elif event == IpkgComponent.EVENT_INSTALL:
            self.package.setText(param)
            self.status.setText(_('Installing'))
            if param not in self.processed_packages:
                self.processed_packages.append(param)
                self.packages += 1
        elif event == IpkgComponent.EVENT_REMOVE:
            self.package.setText(param)
            self.status.setText(_('Removing'))
            if param not in self.processed_packages:
                self.processed_packages.append(param)
                self.packages += 1
        elif event == IpkgComponent.EVENT_CONFIGURING:
            self.package.setText(param)
            self.status.setText(_('Configuring'))
        elif event == IpkgComponent.EVENT_MODIFIED:
            self.ipkg.write('Y')
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                if config.usage.use_package_conffile.value == True:
                    upgrade_args = {'use_maintainer': True,
                     'test_only': False}
                else:
                    upgrade_args = {'use_maintainer': False,
                     'test_only': False}
                if config.usage.use_force_overwrite.value:
                    upgrade_args['force_overwrite'] = True
                else:
                    upgrade_args['force_overwrite'] = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args=upgrade_args)
            elif self.error == 0:
                self.slider.setValue(4)
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                self.package.setText(_('Done - Installed or upgraded %d packages') % self.packages)
                self.status.setText(self.oktext)
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _('your STB might be unusable now. Please consult the manual for further assistance before rebooting your STB.')
                if self.packages == 0:
                    error = _('No packages were upgraded yet. So you can check your network and try again.')
                if self.updating:
                    error = _("Your STB isn't connected to the internet properly. Please check it and try again.")
                self.status.setText(_('Error') + ' - ' + error)

    def modificationCallback(self, res):
        self.ipkg.write(res and 'N' or 'Y')

    def keyOk(self):
        if not self.updating:
            self.exit()

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages == 0 and os_path.exists(update_trigger):
                remove(update_trigger)
            if self.packages != 0 and self.error == 0:
                f = open(update_trigger, 'w+').close()
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Upgrade finished.') + ' ' + _('Do you want to reboot your STB?'))
            else:
                self.close()
        else:
            self.ipkg.stop()
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, 4)
        self.close()
Example #10
0
class SoftwarePanel(Screen):
    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _("Openeight Software Panel"))
        skin = """
		<screen name="SoftwarePanel" position="center,center" size="650,605" title="Software Panel">
			<widget name="a_off" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/aoff.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_red" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/ared.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_yellow" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/ayellow.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_green" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/agreen.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="feedstatusRED" position="60,14" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusYELLOW" position="60,46" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusGREEN" position="60,78" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="packagetext" position="276,50" size="247,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget name="packagenr" position="529,50" size="69,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget source="list" render="Listbox" position="10,120" size="630,365" scrollbarMode="showOnDemand">
				<convert type="TemplatedMultiContent">
					{"template": [
							MultiContentEntryText(pos = (5, 1), size = (540, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
							MultiContentEntryText(pos = (5, 26), size = (540, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
							MultiContentEntryPixmapAlphaTest(pos = (545, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
							MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (610, 2), png = 5), # index 4 is the div pixmap
						],
					"fonts": [gFont("Regular", 22),gFont("Regular", 14)],
					"itemHeight": 52
					}
				</convert>
			</widget>
			<ePixmap pixmap="skin_default/buttons/red.png" position="30,560" size="138,40" alphatest="blend" />
                        <widget name="key_green_pic" pixmap="skin_default/buttons/green.png" position="180,560" size="138,40" alphatest="blend" />
                        <ePixmap pixmap="skin_default/buttons/yellow.png" position="333,560" size="138,40" alphatest="blend" />
                        <ePixmap pixmap="skin_default/buttons/blue.png" position="481,560" size="138,40" alphatest="blend" />
                        <widget name="key_red" position="38,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_green" position="188,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_yellow" position="340,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_blue" position="491,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
		</screen> """
        self.skin = skin
        self.list = []
        self.statuslist = []
        self["list"] = List(self.list)
        self['a_off'] = Pixmap()
        self['a_red'] = Pixmap()
        self['a_yellow'] = Pixmap()
        self['a_green'] = Pixmap()
        self['key_green_pic'] = Pixmap()
        self['key_red_pic'] = Pixmap()
        self['key_red'] = Label(_("Cancel"))
        self['key_green'] = Label(_("Update"))
        self['key_yellow'] = Label(_(""))
        self['packagetext'] = Label(_("Updates Available:"))
        self['packagenr'] = Label("0")
        self['feedstatusRED'] = Label("<  " + _("feed status"))
        self['feedstatusYELLOW'] = Label("<  " + _("feed status"))
        self['feedstatusGREEN'] = Label("<  " + _("feed status"))
        self['key_green'].hide()
        self['key_green_pic'].hide()
        self.update = False
        self.packages = 0
        self.trafficLight = 0
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self["actions"] = ActionMap([
            "OkCancelActions", "DirectionActions", "ColorActions",
            "SetupActions"
        ], {
            "cancel": self.Exit,
            "green": self.Green,
            "yellow": self.showCommitLog
        }, -2)

        self.onLayoutFinish.append(self.layoutFinished)

    def Exit(self):
        self.ipkg.stop()
        self.close()

    def Green(self):
        if self.packages > 0 and self.trafficLight > 0:
            if self.trafficLight == 1:  # yellow
                message = _(
                    "The current image might not be stable.\nFor more information see %s."
                ) % ("http://octagon-forum.eu")
                picon = MessageBox.TYPE_WARNING
            elif self.trafficLight == 2:  # red
                message = _(
                    "The current image is not stable.\nFor more information see %s."
                ) % ("http://octagon-forum.eu")
                picon = MessageBox.TYPE_ERROR
                self.session.open(MessageBox,
                                  message,
                                  type=MessageBox.TYPE_ERROR,
                                  picon=picon,
                                  timeout=15,
                                  close_on_any_key=True)
                return
            elif self.trafficLight == 3:  # unknown
                message = _(
                    "The status of the current image could not be checked because %s can not be reached."
                ) % ("http://octagon-forum.eu")
                picon = MessageBox.TYPE_ERROR
            message += "\n" + _("Do you want to update your receiver?")
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          default=False,
                                          picon=picon)
        elif self.packages > 0:
            self.startActualUpdate(True)

    def showCommitLog(self):
        self.session.open(CommitInfo)

    def startActualUpdate(self, answer):
        if answer:
            from Plugins.SystemPlugins.SoftwareManager.plugin import UpdatePlugin
            self.session.open(UpdatePlugin)
            self.close()

    def layoutFinished(self):
        self.checkTrafficLight()
        self.rebuildList()

    def UpdatePackageNr(self):
        self.packages = len(self.list)
        print self.packages
        print "packagenr" + str(self.packages)
        self["packagenr"].setText(str(self.packages))
        if self.packages == 0:
            self['key_green'].hide()
            self['key_green_pic'].hide()
        else:
            self['key_green'].show()
            self['key_green_pic'].show()

    def checkTrafficLight(self):
        print "checkTrafficLight"
        from urllib import urlopen
        import socket
        self['a_red'].hide()
        self['a_yellow'].hide()
        self['a_green'].hide()
        self['feedstatusRED'].hide()
        self['feedstatusYELLOW'].hide()
        self['feedstatusGREEN'].hide()
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        try:
            urlOpeneight = "http://feed.openeight.de/status"
            d = urlopen(urlOpeneight)
            self.trafficLight = int(d.read())
            if self.trafficLight == 2:
                self['a_off'].hide()
                self['a_red'].show()
                self['feedstatusRED'].show()
            elif self.trafficLight == 1:
                self['a_off'].hide()
                self['a_yellow'].show()
                self['feedstatusYELLOW'].show()
            elif self.trafficLight == 0:
                self['a_off'].hide()
                self['a_green'].show()
                self['feedstatusGREEN'].show()
        except:
            self.trafficLight = 3
            self['a_off'].show()
        socket.setdefaulttimeout(currentTimeoutDefault)

    def setStatus(self, status=None):
        if status:
            self.statuslist = []
            divpng = LoadPixmap(cached=True,
                                path=resolveFilename(SCOPE_CURRENT_SKIN,
                                                     "skin_default/div-h.png"))
            if status == 'update':
                statuspng = LoadPixmap(
                    cached=True,
                    path=resolveFilename(
                        SCOPE_CURRENT_PLUGIN,
                        "SystemPlugins/SoftwareManager/upgrade.png"))
                self.statuslist.append(
                    (_("Package list update"), '',
                     _("Trying to download a new updatelist. Please wait..."),
                     '', statuspng, divpng))
            elif status == 'error':
                statuspng = LoadPixmap(
                    cached=True,
                    path=resolveFilename(
                        SCOPE_CURRENT_PLUGIN,
                        "SystemPlugins/SoftwareManager/remove.png"))
                self.statuslist.append((
                    _("Error"), '',
                    _("There was an error downloading the updatelist. Please try again."
                      ), '', statuspng, divpng))
            elif status == 'noupdate':
                statuspng = LoadPixmap(
                    cached=True,
                    path=resolveFilename(
                        SCOPE_CURRENT_PLUGIN,
                        "SystemPlugins/SoftwareManager/installed.png"))
                self.statuslist.append((_("Nothing to upgrade"), '',
                                        _("There are no updates available."),
                                        '', statuspng, divpng))

            self['list'].setList(self.statuslist)

    def rebuildList(self):
        self.setStatus('update')
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_ERROR:
            self.setStatus('error')
        elif event == IpkgComponent.EVENT_DONE:
            if self.update == False:
                self.update = True
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            else:
                self.buildPacketList()
        pass

    def buildEntryComponent(self, name, version, description, state):
        divpng = LoadPixmap(cached=True,
                            path=resolveFilename(SCOPE_CURRENT_SKIN,
                                                 "skin_default/div-h.png"))
        if not description:
            description = "No description available."
        if state == 'installed':
            installedpng = LoadPixmap(
                cached=True,
                path=resolveFilename(
                    SCOPE_CURRENT_PLUGIN,
                    "SystemPlugins/SoftwareManager/installed.png"))
            return ((name, version, _(description), state, installedpng,
                     divpng))
        elif state == 'upgradeable':
            upgradeablepng = LoadPixmap(
                cached=True,
                path=resolveFilename(
                    SCOPE_CURRENT_PLUGIN,
                    "SystemPlugins/SoftwareManager/upgradeable.png"))
            return ((name, version, _(description), state, upgradeablepng,
                     divpng))
        else:
            installablepng = LoadPixmap(
                cached=True,
                path=resolveFilename(
                    SCOPE_CURRENT_PLUGIN,
                    "SystemPlugins/SoftwareManager/installable.png"))
            return ((name, version, _(description), state, installablepng,
                     divpng))

    def buildPacketList(self):
        self.list = []
        fetchedList = self.ipkg.getFetchedList()

        if len(fetchedList) > 0:
            for x in fetchedList:
                try:
                    self.list.append(
                        self.buildEntryComponent(x[0], x[1], x[2],
                                                 "upgradeable"))
                except:
                    print "[SOFTWAREPANEL] " + x[
                        0] + " no valid architecture, ignoring !!"

            self['list'].setList(self.list)

        elif len(fetchedList) == 0:
            self.setStatus('noupdate')
        else:
            self.setStatus('error')

        self.UpdatePackageNr()
Example #11
0
class SoftwarePanel(Screen):

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("OpenXTA Software Panel"))
		skin = """
		<screen name="SoftwarePanel" position="center,center" size="650,605" title="Software Panel">
			<widget name="a_off" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/aoff.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_red" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/ared.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_yellow" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/ayellow.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="a_green" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/ExtrasPanel/pics/agreen.png" position="10,10" zPosition="1" size="36,97" alphatest="on" />
			<widget name="feedstatusRED" position="60,14" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusYELLOW" position="60,46" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="feedstatusGREEN" position="60,78" size="200,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget name="packagetext" position="276,50" size="247,30" zPosition="1" font="Regular;25" halign="right" transparent="1" />
			<widget name="packagenr" position="529,50" size="69,30" zPosition="1" font="Regular;25" halign="left" transparent="1" />
			<widget source="list" render="Listbox" position="10,120" size="630,365" scrollbarMode="showOnDemand">
				<convert type="TemplatedMultiContent">
					{"template": [
							MultiContentEntryText(pos = (5, 1), size = (540, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
							MultiContentEntryText(pos = (5, 26), size = (540, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
							MultiContentEntryPixmapAlphaTest(pos = (545, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
							MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (610, 2), png = 5), # index 4 is the div pixmap
						],
					"fonts": [gFont("Regular", 22),gFont("Regular", 14)],
					"itemHeight": 52
					}
				</convert>
			</widget>
			<ePixmap pixmap="skin_default/buttons/red.png" position="30,560" size="138,40" alphatest="blend" />
                        <widget name="key_green_pic" pixmap="skin_default/buttons/green.png" position="180,560" size="138,40" alphatest="blend" />
                        <ePixmap pixmap="skin_default/buttons/yellow.png" position="333,560" size="138,40" alphatest="blend" />
                        <ePixmap pixmap="skin_default/buttons/blue.png" position="481,560" size="138,40" alphatest="blend" />
                        <widget name="key_red" position="38,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_green" position="188,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_yellow" position="340,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
                        <widget name="key_blue" position="491,570" size="124,26" zPosition="1" font="Regular;17" halign="center" transparent="1" />
		</screen> """
		self.skin = skin
		self.list = []
		self.statuslist = []
		self["list"] = List(self.list)
		self['a_off'] = Pixmap()
		self['a_red'] = Pixmap()
		self['a_yellow'] = Pixmap()
		self['a_green'] = Pixmap()
		self['key_green_pic'] = Pixmap()
		self['key_red_pic'] = Pixmap()
		self['key_red'] = Label(_("Cancel"))
		self['key_green'] = Label(_("Update"))
		self['key_yellow'] = Label(_(""))
		self['key_blue'] = Label(_("Setup Commits"))
		self['packagetext'] = Label(_("Updates Available:"))
		self['packagenr'] = Label("0")
		self['feedstatusRED'] = Label("<  " + _("feed status"))
		self['feedstatusYELLOW'] = Label("<  " + _("feed status"))
		self['feedstatusGREEN'] = Label("<  " + _("feed status"))
		self['key_green'].hide()
		self['key_green_pic'].hide()
		self.update = False
		self.packages = 0
		self.trafficLight = 0
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "SetupActions"],      
		{
			"cancel": self.Exit,
			"green": self.Green,
			"blue": self.showCommitLogSetup,
			"yellow": self.showCommitLog
		}, -2)

		if config.CommitInfoSetup.commiturl.value == 'Enigma2':
                        self["key_yellow"].setText("E2 Commits")
                elif config.CommitInfoSetup.commiturl.value == 'XTA':
                        self["key_yellow"].setText("XTA Commits")
                elif config.CommitInfoSetup.commiturl.value == 'TechniHD':
                        self["key_yellow"].setText("THD Commits")
                elif config.CommitInfoSetup.commiturl.value == 'Metrix':
                        self["key_yellow"].setText("Metrix Commits")
                self.onLayoutFinish.append(self.layoutFinished)

	def Exit(self):
		self.ipkg.stop()
		self.close()

	def Green(self):
		if self.packages > 0 and self.trafficLight > 0:
			if self.trafficLight == 1: # yellow
				message = _("The current image might not be stable.\nFor more information see %s.") % ("www.xtrend-alliance.com")
				picon = MessageBox.TYPE_WARNING
			elif self.trafficLight == 2: # red
				message = _("The current image is not stable.\nFor more information see %s.") % ("www.xtrend-alliance.com")
				picon = MessageBox.TYPE_ERROR
				self.session.open(MessageBox, message, type=MessageBox.TYPE_ERROR, picon=picon, timeout = 15, close_on_any_key=True)
				return
			elif self.trafficLight == 3: # unknown
				message = _("The status of the current image could not be checked because %s can not be reached.") % ("www.xtrend-alliance.com")
				picon = MessageBox.TYPE_ERROR
			message += "\n" + _("Do you want to update your receiver?")
			self.session.openWithCallback(self.startActualUpdate, MessageBox, message, default = False, picon = picon)
		elif self.packages > 0:
				self.startActualUpdate(True)

	def showCommitLog(self):
                self.session.open(CommitInfo)
        
        def showCommitLogSetup(self):
                self.session.openWithCallback(self.commitinfoupdate, CommitInfoSetup)
                
        def commitinfoupdate(self):
        	if config.CommitInfoSetup.commiturl.value == 'Enigma2':
                        self["key_yellow"].setText("E2 Commits")
                elif config.CommitInfoSetup.commiturl.value == 'XTA':
                        self["key_yellow"].setText("XTA Commits")
                elif config.CommitInfoSetup.commiturl.value == 'TechniHD':
                        self["key_yellow"].setText("THD Commits")
                elif config.CommitInfoSetup.commiturl.value == 'Metrix':
                        self["key_yellow"].setText("Metrix Commits")
               
	def startActualUpdate(self, answer):
		if answer:
			from Plugins.SystemPlugins.SoftwareManager.plugin import UpdatePlugin
			self.session.open(UpdatePlugin)
			self.close()

	def layoutFinished(self):
		self.checkTrafficLight()
		self.rebuildList()

	def UpdatePackageNr(self):
		self.packages = len(self.list)
		print self.packages
		print"packagenr" + str(self.packages)
		self["packagenr"].setText(str(self.packages))
		if self.packages == 0:
			self['key_green'].hide()
			self['key_green_pic'].hide()
		else:
			self['key_green'].show()
			self['key_green_pic'].show()

	def checkTrafficLight(self):
		print"checkTrafficLight"
		from urllib import urlopen
		import socket
		self['a_red'].hide()
		self['a_yellow'].hide()
		self['a_green'].hide()
		self['feedstatusRED'].hide()
		self['feedstatusYELLOW'].hide()
		self['feedstatusGREEN'].hide()
		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		try:
			urlOpenXta = "http://feed.openxta.com/status"
			d = urlopen(urlOpenXta)
			self.trafficLight = int(d.read())
			if self.trafficLight == 2:
				self['a_off'].hide()
				self['a_red'].show()
				self['feedstatusRED'].show()
			elif self.trafficLight == 1:
				self['a_off'].hide()
				self['a_yellow'].show()
				self['feedstatusYELLOW'].show()
			elif self.trafficLight == 0:
				self['a_off'].hide()
				self['a_green'].show()
				self['feedstatusGREEN'].show()
		except:
			self.trafficLight = 3
			self['a_off'].show()
		socket.setdefaulttimeout(currentTimeoutDefault)

	def setStatus(self,status = None):
		if status:
			self.statuslist = []
			divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
			if status == 'update':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgrade.png"))
				self.statuslist.append(( _("Package list update"), '', _("Trying to download a new updatelist. Please wait..." ),'',statuspng, divpng ))
			elif status == 'error':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
				self.statuslist.append(( _("Error"), '', _("There was an error downloading the updatelist. Please try again." ),'',statuspng, divpng ))
			elif status == 'noupdate':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
				self.statuslist.append(( _("Nothing to upgrade"), '', _("There are no updates available." ),'',statuspng, divpng ))

			self['list'].setList(self.statuslist)

	def rebuildList(self):
		self.setStatus('update')
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_ERROR:
			self.setStatus('error')
		elif event == IpkgComponent.EVENT_DONE:
			if self.update == False:
				self.update = True
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			else:
				self.buildPacketList()
		pass
	
	def buildEntryComponent(self, name, version, description, state):
		divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
		if not description:
			description = "No description available."
		if state == 'installed':
			installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
			return((name, version, _(description), state, installedpng, divpng))	
		elif state == 'upgradeable':
			upgradeablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/upgradeable.png"))
			return((name, version, _(description), state, upgradeablepng, divpng))	
		else:
			installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
			return((name, version, _(description), state, installablepng, divpng))

	def buildPacketList(self):
		self.list = []
		fetchedList = self.ipkg.getFetchedList()

		if len(fetchedList) > 0:
			for x in fetchedList:
				try:
					self.list.append(self.buildEntryComponent(x[0], x[1], x[2], "upgradeable"))
				except:
					print "[SOFTWAREPANEL] " + x[0] + " no valid architecture, ignoring !!"

			self['list'].setList(self.list)

		elif len(fetchedList) == 0:
			self.setStatus('noupdate')
		else:
			self.setStatus('error')

		self.UpdatePackageNr()