class SoftwareTools(PackageInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" PackageInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev', '-src') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback = None): if callback is not None: self.NotifierCallback = callback iNetwork.checkNetworkState(self.checkNetworkCB) def checkNetworkCB(self,data): if data is not None: if data <= 2: self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback = None): if self.lastDownloadDate is None: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() pass def startIpkgListAvailable(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append([name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval = None, extra_args = None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list_installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args = None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.countUpdates() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def countUpdates(self, callback = None): self.available_updates = 0 self.available_updatelist = [] for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates +=1 self.available_updatelist.append([packagename]) self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def startIpkgUpdate(self, callback = None): if not self.Console: self.Console = Console() cmd = self.ipkg.ipkg + " update" self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) def IpkgUpdateCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.Console: if len(self.Console.appContainers) == 0: if callback is not None: callback(True) callback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == HardwareInfo().device_name: hardware_found = True if not hardware_found: return False return True
class SoftwareTools(PackageInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} def __init__(self): aboutInfo = getImageVersion() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage( )[:2] # getLanguage returns e.g. "fi_FI" for "language_country" PackageInfoHandler.__init__(self, self.statusCallback, blocking=False, neededTag='ALL_TAGS', neededFlag=self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev', '-src') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback=None): if callback is not None: self.NotifierCallback = callback iNetwork.checkNetworkState(self.checkNetworkCB) def checkNetworkCB(self, data): if data is not None: if data <= 2: self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback=None): if self.lastDownloadDate is None: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() pass def startIpkgListAvailable(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any( name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append( [name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval=None, extra_args=None): (callback) = extra_args or None if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = self.ipkg.ipkg + " list_installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.countUpdates() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def countUpdates(self, callback=None): self.available_updates = 0 self.available_updatelist = [] for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates += 1 self.available_updatelist.append([packagename]) self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def startIpkgUpdate(self, callback=None): if not self.Console: self.Console = Console() cmd = self.ipkg.ipkg + " update" self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) def IpkgUpdateCB(self, result, retval, extra_args=None): (callback) = extra_args or None if result: if self.Console: if len(self.Console.appContainers) == 0: if callback is not None: callback(True) callback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class 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()
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()
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))
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)
class SoftwareTools(DreamInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} upgradable_packages = {} upgradeAvailable = False def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.UpgradeConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev') self.reboot_required_packages = ('dreambox-dvb-modules', 'kernel-') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback = None): if callback is not None: self.NotifierCallback = callback if eNetworkManager.getInstance().online(): self.NetworkConnectionAvailable = True self.getUpdates() else: self.NetworkConnectionAvailable = False self.getUpdates() def getUpdates(self, callback = None): if self.lastDownloadDate is None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: self.NetworkConnectionAvailable = False self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() #print event, "-", param pass def startIpkgListAvailable(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list | grep -e '^[a-z][a-z0-9+.-]'" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args = None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append([name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval = None, extra_args = None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback = None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list-installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args = None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.listUpgradable() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def listUpgradable(self, callback = None): self.list_updating = True if not self.UpgradeConsole: self.UpgradeConsole = Console() cmd = "opkg list-upgradable" self.UpgradeConsole.ePopen(cmd, self.listUpgradableCB, callback) def listUpgradableCB(self, result, retval, extra_args = None): (callback) = extra_args self.upgradable_packages = {} self.available_updates = 0 self.available_updatelist = [] if result: for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 2 and tokens[2].strip() or "" self.upgradable_packages[name] = version for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates +=1 self.available_updatelist.append([packagename]) self.list_updating = False if self.upgradable_packages: self.upgradeAvailable = True if self.UpgradeConsole: if len(self.UpgradeConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def cleanupSoftwareTools(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) if self.UpgradeConsole is not None: if len(self.UpgradeConsole.appContainers): for name in self.UpgradeConsole.appContainers.keys(): self.UpgradeConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class SoftwareTools(DreamInfoHandler): lastDownloadDate = None NetworkConnectionAvailable = None list_updating = False available_updates = 0 available_updatelist = [] available_packetlist = [] installed_packetlist = {} upgradable_packages = {} upgradeAvailable = False def __init__(self): aboutInfo = about.getImageVersionString() if aboutInfo.startswith("dev-"): self.ImageVersion = 'Experimental' else: self.ImageVersion = 'Stable' self.language = language.getLanguage( )[:2] # getLanguage returns e.g. "fi_FI" for "language_country" DreamInfoHandler.__init__(self, self.statusCallback, blocking=False, neededTag='ALL_TAGS', neededFlag=self.ImageVersion) self.directory = resolveFilename(SCOPE_METADIR) self.hardware_info = HardwareInfo() self.list = List([]) self.NotifierCallback = None self.Console = Console() self.UpdateConsole = Console() self.UpgradeConsole = Console() self.cmdList = [] self.unwanted_extensions = ('-dbg', '-dev', '-doc', '-staticdev') self.reboot_required_packages = ('dreambox-dvb-modules', 'kernel-') self.ipkg = IpkgComponent() self.ipkg.addCallback(self.ipkgCallback) def statusCallback(self, status, progress): pass def startSoftwareTools(self, callback=None): if callback is not None: self.NotifierCallback = callback self.NetworkConnectionAvailable = eNetworkManager.getInstance().online( ) self.getUpdates() def getUpdates(self, callback=None): if self.lastDownloadDate is None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: self.NetworkConnectionAvailable = False self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) else: if self.NetworkConnectionAvailable == True: self.lastDownloadDate = time() if self.list_updating is False and callback is None: self.list_updating = True self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is False and callback is not None: self.list_updating = True self.NotifierCallback = callback self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) elif self.list_updating is True and callback is not None: self.NotifierCallback = callback else: if self.list_updating and callback is not None: etpm = eTPM() l2cert = etpm.getData(eTPM.DT_LEVEL2_CERT) if l2cert is None: return l2key = validate_cert(l2cert, rootkey) if l2key is None: return l3cert = etpm.getData(eTPM.DT_LEVEL3_CERT) if l3cert is None: return l3key = validate_cert(l3cert, l2key) if l3key is None: return rnd = read_random() if rnd is None: return val = etpm.computeSignature(rnd) result = decrypt_block(val, l3key) if result[80:88] == rnd: self.NotifierCallback = callback self.startIpkgListAvailable() else: self.list_updating = False if callback is not None: callback(False) elif self.NotifierCallback is not None: self.NotifierCallback(False) def ipkgCallback(self, event, param): if event == IpkgComponent.EVENT_ERROR: self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback(False) elif event == IpkgComponent.EVENT_DONE: if self.list_updating: self.startIpkgListAvailable() #print event, "-", param pass def startIpkgListAvailable(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list | grep -e '^[a-z][a-z0-9+.-]'" self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) def IpkgListAvailableCB(self, result, retval, extra_args=None): (callback) = extra_args if result: if self.list_updating: self.available_packetlist = [] for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any( name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" descr = l > 2 and tokens[2].strip() or "" self.available_packetlist.append( [name, version, descr]) if callback is None: self.startInstallMetaPackage() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startInstallMetaPackage(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if self.NetworkConnectionAvailable == True: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) else: self.InstallMetaPackageCB(True) def InstallMetaPackageCB(self, result, retval=None, extra_args=None): (callback) = extra_args if result: self.fillPackagesIndexList() if callback is None: self.startIpkgListInstalled() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def startIpkgListInstalled(self, callback=None): if callback is not None: self.list_updating = True if self.list_updating: if not self.UpdateConsole: self.UpdateConsole = Console() cmd = "opkg list-installed" self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) def IpkgListInstalledCB(self, result, retval, extra_args=None): (callback) = extra_args if result: self.installed_packetlist = {} for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 1 and tokens[1].strip() or "" self.installed_packetlist[name] = version for package in self.packagesIndexlist[:]: if not self.verifyPrerequisites(package[0]["prerequisites"]): self.packagesIndexlist.remove(package) for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] if attributes.has_key("packagetype"): if attributes["packagetype"] == "internal": self.packagesIndexlist.remove(package) if callback is None: self.listUpgradable() else: if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: callback(True) else: self.list_updating = False if self.UpdateConsole: if len(self.UpdateConsole.appContainers) == 0: if callback is not None: callback(False) def listUpgradable(self, callback=None): self.list_updating = True if not self.UpgradeConsole: self.UpgradeConsole = Console() cmd = "opkg list-upgradable" self.UpgradeConsole.ePopen(cmd, self.listUpgradableCB, callback) def listUpgradableCB(self, result, retval, extra_args=None): (callback) = extra_args self.upgradable_packages = {} self.available_updates = 0 self.available_updatelist = [] if result: for x in result.splitlines(): tokens = x.split(' - ') name = tokens[0].strip() if not any(name.endswith(x) for x in self.unwanted_extensions): l = len(tokens) version = l > 2 and tokens[2].strip() or "" self.upgradable_packages[name] = version for package in self.packagesIndexlist[:]: attributes = package[0]["attributes"] packagename = attributes["packagename"] for x in self.available_packetlist: if x[0] == packagename: if self.installed_packetlist.has_key(packagename): if self.installed_packetlist[packagename] != x[1]: self.available_updates += 1 self.available_updatelist.append([packagename]) self.list_updating = False if self.upgradable_packages: self.upgradeAvailable = True if self.UpgradeConsole: if len(self.UpgradeConsole.appContainers) == 0: if callback is not None: callback(True) callback = None elif self.NotifierCallback is not None: self.NotifierCallback(True) self.NotifierCallback = None def cleanupSoftwareTools(self): self.cleanup() def cleanup(self): self.list_updating = False if self.NotifierCallback is not None: self.NotifierCallback = None self.ipkg.stop() if self.Console is not None: if len(self.Console.appContainers): for name in self.Console.appContainers.keys(): self.Console.kill(name) if self.UpdateConsole is not None: if len(self.UpdateConsole.appContainers): for name in self.UpdateConsole.appContainers.keys(): self.UpdateConsole.kill(name) if self.UpgradeConsole is not None: if len(self.UpgradeConsole.appContainers): for name in self.UpgradeConsole.appContainers.keys(): self.UpgradeConsole.kill(name) def verifyPrerequisites(self, prerequisites): if prerequisites.has_key("hardware"): hardware_found = False for hardware in prerequisites["hardware"]: if hardware == self.hardware_info.device_name: hardware_found = True if not hardware_found: return False return True
class 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()
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()
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()