コード例 #1
0
class UpdatePlugin(Screen, ProtectedScreen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None

        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

    def checkTraficLight(self):
        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)

        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ""
        picon = None
        default = True
        url = "http://altoconsejojedi.es/status/%s-%s/" % (getImageVersion(),
                                                           getImageType())
        # print "[SoftwareUpdate] url status: ", url
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            try:
                status = urlopen(url, timeout=5).read().split('!', 1)
                print status
            except:
                # bypass the certificate check
                from ssl import _create_unverified_context
                status = urlopen(
                    url, timeout=5,
                    context=_create_unverified_context()).read().split('!', 1)
                print status
            # prefer getMachineBuild
            if getMachineBuild() in status[0].split(','):
                message = len(status) > 1 and status[1] or _(
                    "The current software might not be stable.\nFor more information see %s."
                ) % ("http://altoconsejojedi.es")
                picon = MessageBox.TYPE_ERROR
                default = False
            # only use getBoxType if no getMachineBuild
            elif getBoxType() in status[0].split(','):
                message = len(status) > 1 and status[1] or _(
                    "The current software might not be stable.\nFor more information see %s."
                ) % ("http://altoconsejojedi.es")
                picon = MessageBox.TYPE_ERROR
                default = False
        except:
            message = _(
                "The status of the current software could not be checked because %s can not be reached."
            ) % ("http://altoconsejojedi.es")
            picon = MessageBox.TYPE_ERROR
            default = False
        socket.setdefaulttimeout(currentTimeoutDefault)
        if default:
            self.showDisclaimer()
        else:
            message += "\n" + _("Do you want to update your receiver?")
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          default=default,
                                          picon=picon)

    def showDisclaimer(self, justShow=False):
        if config.usage.show_update_disclaimer.value or justShow:
            message = _(
                "En estos momentos, no esta estipulada la actualizacion del software de la imagen de forma automatica, en un futuro tal vez se implemente, disculpaen las molestias. Team ACJ"
            )
            list = not justShow and [
                (_("no"), False), (_("yes"), True),
                (_("yes") + " " + _("and never show this message again"),
                 "never")
            ] or []
            self.session.openWithCallback(boundFunction(
                self.disclaimerCallback, justShow),
                                          MessageBox,
                                          message,
                                          list=list,
                                          title=_("Disclaimer"))
        else:
            self.startActualUpdate(True)

    def disclaimerCallback(self, justShow, answer):
        if answer == "never":
            config.usage.show_update_disclaimer.value = False
            config.usage.show_update_disclaimer.save()
        if justShow and answer:
            self.ipkgCallback(IpkgComponent.EVENT_DONE, None)
        else:
            self.startActualUpdate(answer)

    def getLatestImageTimestamp(self):
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        url = "http://altoconsejojedi.es/status/%s-%s/buildtimestamp-%s" % (
            getImageVersion(), getImageType(), getBoxType())
        # print "[SoftwareUpdate] url buildtimestamp: ", url
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            from time import strftime
            from datetime import datetime
            try:
                latestImageTimestamp = datetime.fromtimestamp(
                    int(urlopen(url, timeout=5).read())).strftime(
                        _("%Y-%m-%d %H:%M"))
            except:
                # bypass the certificate check
                from ssl import _create_unverified_context
                latestImageTimestamp = datetime.fromtimestamp(
                    int(
                        urlopen(url,
                                timeout=5,
                                context=_create_unverified_context()).read())
                ).strftime(_("%Y-%m-%d %H:%M"))
        except:
            latestImageTimestamp = ""
        print latestImageTimestamp
        print "[SoftwareUpdate] latestImageTimestamp:", latestImageTimestamp
        socket.setdefaulttimeout(currentTimeoutDefault)
        return latestImageTimestamp

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if param in self.sliderPackages:
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(
                _("Upgrading") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    latestImageTimestamp = self.getLatestImageTimestamp()
                    if latestImageTimestamp:
                        message = _(
                            "Latest available openacj %s build is from: %s"
                        ) % (getImageVersion(),
                             self.getLatestImageTimestamp()) + "\n"
                        message += _(
                            "Do you want to update your receiver?") + "\n"
                    else:
                        message = _(
                            "Do you want to update your receiver?") + "\n"
                    message += "(" + (ngettext(
                        "%s updated package available",
                        "%s updated packages available", self.total_packages) %
                                      self.total_packages) + ")"
                    if self.total_packages > 150:
                        message += " " + _("Reflash recommended!")
                    choices = [
                        (_("Update and reboot (recommended)"), "cold"),
                        (_("Update and ask to reboot"), "hot"),
                        #(_("Update channel list only"), "channels"),
                        (_("Show packages to be upgraded"), "showlist")
                    ]
                else:
                    message = _("No updates available")
                    choices = []
                if fileExists("/home/root/ipkgupgrade.log"):
                    choices.append((_("Show latest upgrade log"), "log"))
                choices.append((_("Show latest commits"), "commits"))
                if not config.usage.show_update_disclaimer.value:
                    choices.append((_("Show disclaimer"), "disclaimer"))
                choices.append((_("Cancel"), ""))
                self.session.openWithCallback(self.startActualUpgrade,
                                              ChoiceBox,
                                              title=message,
                                              list=choices,
                                              windowTitle=self.title)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your receiver does not have a working internet connection."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "commits":
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), CommitInfo)
        elif answer[1] == "disclaimer":
            self.showDisclaimer(justShow=True)
        elif answer[1] == "showlist":
            text = "\n".join([
                x[0]
                for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])
            ])
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Packages to update"), True)
        elif answer[1] == "log":
            text = open("/home/root/ipkgupgrade.log", "r").read()
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Packages upgraded"), True)
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Update completed. Do you want to reboot your receiver?")
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #2
0
ファイル: SoftwareUpdate.py プロジェクト: kingvuplus/boom
class UpdatePlugin(Screen):

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _('Software Update'))
        self.sliderPackages = {'dreambox-dvb-modules': 1,
         'enigma2': 2,
         'tuxbox-image-info': 3}
        self.setTitle(_('Software update'))
        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(_('Package list update'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        status_msgs = {'stable': _('Feeds status:   Stable'),
         'unstable': _('Feeds status:   Unstable'),
         'updating': _('Feeds status:   Updating'),
         'unknown': _('No connection')}
        self['tl_off'] = Pixmap()
        self['tl_red'] = Pixmap()
        self['tl_yellow'] = Pixmap()
        self['tl_green'] = Pixmap()
        self.feedsStatus()
        self['feedStatusMSG'] = Label(status_msgs[self.trafficLight])
        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.checkNetworkState()
        return

    def feedsStatus(self):
        from urllib import urlopen
        import socket
        self['tl_red'].hide()
        self['tl_yellow'].hide()
        self['tl_green'].hide()
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        try:
            d = urlopen('http://openvix.co.uk/TrafficLightState.php')
            self.trafficLight = d.read()
            if self.trafficLight == 'unstable':
                self['tl_off'].hide()
                self['tl_red'].show()
            elif self.trafficLight == 'updating':
                self['tl_off'].hide()
                self['tl_yellow'].show()
            elif self.trafficLight == 'stable':
                self['tl_off'].hide()
                self['tl_green'].show()
            else:
                self.trafficLight = 'unknown'
                self['tl_off'].show()
        except:
            self.trafficLight = 'unknown'
            self['tl_off'].show()

        socket.setdefaulttimeout(currentTimeoutDefault)

    def checkNetworkState(self):
        cmd1 = 'opkg update'
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args = None):
        if 'No space left on device' in result:
            self.session.openWithCallback(self.close, MessageBox, _('Your %s %s have a FULL flash memory, please free memory or expand in USB') % (getMachineBrand(), getMachineName()), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        elif 'bad address' in result:
            self.session.openWithCallback(self.close, MessageBox, _('Your %s %s is not connected to the internet, please check your network settings and try again.') % (getMachineBrand(), getMachineName()), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        elif ('wget returned 1' or 'wget returned 255' or '404 Not Found') in result:
            self.session.openWithCallback(self.close, MessageBox, _('Sorry feeds are down for maintenance, please try again later. If this issue persists please check www.italysat.eu'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        elif 'Collected errors' in result:
            self.session.openWithCallback(self.close, MessageBox, _('A background update check is in progress, please wait a few minutes and try again.'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        else:
            self.startCheck()

    def startCheck(self):
        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.exit,
         'back': self.exit}, -1)
        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(ngettext('Update completed, %d package was installed.', 'Update completed, %d packages were installed.', self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        global ocram
        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') + ': %s/%s' % (self.packages, self.total_packages))
            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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in ('N', 'Y'):
                self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(self.modificationCallback, MessageBox, _('A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?') % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                from urllib import urlopen
                import socket
                currentTimeoutDefault = socket.getdefaulttimeout()
                socket.setdefaulttimeout(3)
                status = urlopen('http://feeds.italysat.eu/status').read()
                if '404 Not Found' in status:
                    status = '1'
                config.softwareupdate.updateisunstable.setValue(status)
                socket.setdefaulttimeout(currentTimeoutDefault)
                self.total_packages = None
                if config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value:
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _('The current update may be unstable') + '\n' + _('Are you sure you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(' + ngettext('%s updated package available', '%s updated packages available', self.total_packages) % self.total_packages + ')'
                elif config.softwareupdate.updateisunstable.value == '0':
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(' + ngettext('%s updated package available', '%s updated packages available', self.total_packages) % self.total_packages + ')'
                if self.total_packages:
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith('enigma2-plugin-picons-tv-ocram'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'
                        elif package_tmp[0].startswith('enigma2-plugin-settings-ocram'):
                            ocram = ocram + '[ocram-settings] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'

                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_('Upgrade and reboot system'), 'cold')]
                    if path.exists('/usr/lib/enigma2/python/ItalySat/ItalysatBackupManager.pyo'):
                        if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                            choices.append((_('Perform a settings backup,') + '\n\t' + _('making a backup before updating') + '\n\t' + _('is strongly advised.'), 'backup'))
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_('Perform a full image backup'), 'imagebackup'))
                    choices.append((_('Cancel'), ''))
                    upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
                    upgrademessage.setTitle(_('Software update'))
                else:
                    upgrademessage = self.session.openWithCallback(self.close, MessageBox, _('Nothing to upgrade'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(_('Could not find installed channel list.'))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _('Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.') % (getMachineBrand(),
                 getMachineName(),
                 getMachineBrand(),
                 getMachineName())
                if self.packages == 0:
                    error = _('No updates available. Please try again later.')
                if self.updating:
                    error = _('Update failed. Your %s %s does not have a working internet connection.') % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        return

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == 'menu':
            if config.softwareupdate.updateisunstable.value == '1':
                message = _('The current update may be unstable') + '\n' + _('Are you sure you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(%s ' % self.total_packages + _('Packages') + ')'
            elif config.softwareupdate.updateisunstable.value == '0':
                message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(%s ' % self.total_packages + _('Packages') + ')'
            choices = [(_('Upgrade and reboot system'), 'cold')]
            if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                choices.append((_('Perform a settings backup, making a backup before updating is strongly advised.'), 'backup'))
            if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                choices.append((_('Perform a full image backup'), 'imagebackup'))
            choices.append((_('Cancel'), ''))
            upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == 'changes':
            self.session.openWithCallback(self.startActualUpgrade, SoftwareUpdateChanges)
        elif answer[1] == 'backup':
            self.doSettingsBackup()
        elif answer[1] == 'imagebackup':
            self.doImageBackup()
        elif answer[1] == 'channels':
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST, args={'installed_only': True})
        elif answer[1] == 'cold':
            if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value or config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                self.doAutoBackup()
            else:
                self.session.open(TryQuitMainloop, retvalue=42)
                self.close()

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

    def doSettingsBackup(self):
        backup = None
        from ItalySat.ItalysatBackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('italysat', 'Backup Manager'):
                break

        self.showJobView(job)
        return

    def doImageBackup(self):
        backup = None
        from ItalySat.ItalysatImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('italysat', 'Image Manager'):
                break

        self.showJobView(job)
        return

    def doAutoBackup(self, val = False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext('italysat', 'Image Manager'):
            self.ImageBackupDone = True
        elif job.name == dgettext('italysat', 'Backup Manager'):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(('menu', 'menu')), JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')
        else:
            self.session.openWithCallback(self.doAutoBackup, JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Upgrade finished.') + ' ' + _('Do you want to reboot your %s %s') % (getMachineBrand(), getMachineName()))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
        return
コード例 #3
0
class UpdatePlugin(Screen, ProtectedScreen):

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)
        Screen.setTitle(self, _('Software Update'))
        self['actions'] = ActionMap(['WizardActions'], {'ok': self.exit,
           'back': self.exit
           }, -1)
        self['actions'].csel = self
        self['actions'].setEnabled(False)
        self.sliderPackages = {'ini-dvb-modules': 1,'enigma2': 2,'tuxbox-image-info': 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(_('Package list update'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        self['tl_off'] = Pixmap()
        self['tl_red'] = Pixmap()
        self['tl_yellow'] = Pixmap()
        self['tl_green'] = Pixmap()
        self['feedStatusMSG'] = Label()
        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False
        self.updating = False
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.onFirstExecBegin.append(self.checkNetworkState)
        return

    def checkNetworkState(self):
        self.trafficLight = feedsstatuscheck.getFeedsBool()
        status_msgs = {'stable': _('Feeds status:   Stable'),'unstable': _('Feeds status:   Unstable'),'updating': _('Feeds status:   Updating'),'-2': _('ERROR:   No network found'),'404': _('ERROR:   No internet found'),'inprogress': _('ERROR: Check is already running in background'),'unknown': _('Feeds status:   Unkown')}
        self['tl_red'].hide()
        self['tl_yellow'].hide()
        self['tl_green'].hide()
        self['tl_off'].hide()
        if self.trafficLight:
            self['feedStatusMSG'].setText(status_msgs[str(self.trafficLight)])
        if self.trafficLight == 'stable':
            self['tl_green'].show()
        elif self.trafficLight == 'unstable':
            self['tl_red'].show()
        elif self.trafficLight == 'updating':
            self['tl_yellow'].show()
        else:
            self['tl_off'].show()
        if getImageType() != 'release' and self.trafficLight != 'unknown' or getImageType() == 'release' and self.trafficLight not in ('stable',
                                                                                                                                       'unstable'):
            self.session.openWithCallback(self.close, MessageBox, feedsstatuscheck.getFeedsErrorMessage(), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        elif getImageType() != 'release' or config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value or config.softwareupdate.updateisunstable.value == '0':
            self.startCheck()
        else:
            self.session.openWithCallback(self.close, MessageBox, _('Sorry the feeds seem to be in an unstable state, if you wish to use them please enable \'Allow unstable (experimental) updates\' in "Software update settings".'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)

    def startCheck(self):
        self.updating = True
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value or hasattr(self.session, 'infobar') and self.session.infobar is None) and config.ParentalControl.config_sections.software_update.value

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(ngettext('Update completed, %d package was installed.', 'Update completed, %d packages were installed.', self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        global ocram
        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') + ': %s/%s' % (self.packages, self.total_packages))
            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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in ('N', 'Y'):
                self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self['actions'].setEnabled(True)
                self.session.openWithCallback(self.modificationCallback, MessageBox, _('A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?') % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = None
                self.total_packages = len(self.ipkg.getFetchedList())
                message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(' + ngettext('%s updated package available', '%s updated packages available', self.total_packages) % self.total_packages + ')'
                if self.total_packages > 150:
                    message += ' ' + _('Reflash recommended!')
                if self.total_packages:
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith('enigma2-plugin-picons-tv-ocram'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'
                        elif package_tmp[0].startswith('enigma2-plugin-settings-ocram'):
                            ocram = ocram + '[ocram-settings] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'

                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_('View the changes'), 'changes'),
                     (
                      _('Update and ask to reboot'), 'hot'),
                     (
                      _('Upgrade and reboot system'), 'cold')]
                    if path.exists('/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo'):
                        if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                            choices.append((_('Perform a settings backup,') + '\n\t' + _('making a backup before updating') + '\n\t' + _('is strongly advised.'), 'backup'))
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_('Perform a full image backup'), 'imagebackup'))
                    choices.append((_('Update channel list only'), 'channels'))
                    choices.append((_('Cancel'), ''))
                    self['actions'].setEnabled(True)
                    upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
                    upgrademessage.setTitle(_('Software update'))
                else:
                    self['actions'].setEnabled(True)
                    upgrademessage = self.session.openWithCallback(self.close, MessageBox, _('Nothing to upgrade'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(_('Could not find installed channel list.'))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _('Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.') % (getMachineBrand(), getMachineName(), getMachineBrand(), getMachineName())
                if self.packages == 0:
                    error = _('A background update check is in progress,\nplease wait a few minutes and try again.')
                if self.updating:
                    error = _('Update failed. Your %s %s does not have a working internet connection.') % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        return

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == 'menu':
            message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(%s ' % self.total_packages + _('Packages') + ')'
            choices = [(_('View the changes'), 'changes'),
             (
              _('Update and ask to reboot'), 'hot'),
             (
              _('Upgrade and reboot system'), 'cold')]
            choices.append((_('Update channel list only'), 'channels'))
            choices.append((_('Cancel'), ''))
            self['actions'].setEnabled(True)
            upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == 'changes':
            from Plugins.Extensions.EGAMINews.plugin import EGAMIMainNews
            self.session.openWithCallback(self.startActualUpgrade, EGAMIMainNews)
        elif answer[1] == 'backup':
            self.doSettingsBackup()
        elif answer[1] == 'imagebackup':
            self.doImageBackup()
        elif answer[1] == 'channels':
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST, args={'installed_only': True})
        elif answer[1] == 'cold':
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args={'test_only': False})

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Backup Manager'):
                break

        self.showJobView(job)
        return

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Image Manager'):
                break

        self.showJobView(job)
        return

    def doAutoBackup(self, val=False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext('vix', 'Image Manager'):
            self.ImageBackupDone = True
        elif job.name == dgettext('vix', 'Backup Manager'):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(('menu', 'menu')), JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')
        else:
            self.session.openWithCallback(self.doAutoBackup, JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Upgrade finished.') + ' ' + _('Do you want to reboot your %s %s') % (getMachineBrand(), getMachineName()))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
        return
コード例 #4
0
ファイル: SoftwareUpdate.py プロジェクト: n3wb13/openNFR-gui2
class UpdatePlugin(Screen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _("Software Update"))

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        if self.isProtected() and config.ParentalControl.servicepin[0].value:
            self.onFirstExecBegin.append(
                boundFunction(
                    self.session.openWithCallback,
                    self.pinEntered,
                    PinInput,
                    pinList=[
                        x.value for x in config.ParentalControl.servicepin
                    ],
                    triesEntry=config.ParentalControl.retries.servicepin,
                    title=_("Please enter the correct pin code"),
                    windowTitle=_("Enter pin code")))
        else:
            self.checkNetworkState()

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and config.ParentalControl.config_sections.software_update.value

    def pinEntered(self, result4):
        if result4 is None:
            self.closeProtectedScreen()
        elif not result4:
            self.session.openWithCallback(
                self.close(),
                MessageBox,
                _("The pin code you entered is wrong."),
                MessageBox.TYPE_ERROR,
                timeout=3)
        else:
            self.checkNetworkState()

    def closeProtectedScreen(self, result2=None):
        self.close(None)

    def checkNetworkState(self):
        cmd1 = "opkg update"
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args=None):
        result = six.ensure_str(result)
        if 'bad address' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Your %s %s is not connected to the internet, please check your network settings and try again."
                  ) % (getMachineBrand(), getMachineName()),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif ('wget returned 1' or 'wget returned 255'
              or '404 Not Found') in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Sorry feeds are down for maintenance, please try again later."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif 'Collected errors' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("A background update check is in progress, please wait a few minutes and try again."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        else:
            self.startCheck()

    def startCheck(self):
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self.updating = False

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if param in self.sliderPackages:
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(
                _("Upgrading") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    message = _("Do you want to update your %s %s ?") % (
                        getMachineBrand(), getMachineName()) + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                    choices = [(_("Update and reboot (recommended)"), "cold"),
                               (_("Update and ask to reboot"), "hot"),
                               (_("Update channel list only"), "channels"),
                               (_("Cancel"), "")]
                    self.session.openWithCallback(self.startActualUpgrade,
                                                  ChoiceBox,
                                                  title=message,
                                                  list=choices)
                else:
                    self.session.openWithCallback(self.close,
                                                  MessageBox,
                                                  _("No updates available"),
                                                  type=MessageBox.TYPE_INFO,
                                                  timeout=10,
                                                  close_on_any_key=True)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s."
                ) % (getMachineBrand(), getMachineName(), getMachineBrand(),
                     getMachineName())
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your %s %s does not have a working internet connection."
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            fobj_in = open("/etc/image-version")
            fobj_out = open("/etc/image-version_new", "w")
            for line in fobj_in:
                if "date" in line:
                    line = "date=" + time.strftime("%Y%m%d%H%M%S") + '\n'
                    fobj_out.write(line)
                else:
                    fobj_out.write(line)

            fobj_in.close()
            fobj_out.close()
            os.system("mv /etc/image-version_new /etc/image-version")
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        else:
            fobj_in = open("/etc/image-version")
            fobj_out = open("/etc/image-version_new", "w")
            for line in fobj_in:
                if "date" in line:
                    line = "date=" + time.strftime("%Y%m%d%H%M%S") + '\n'
                    fobj_out.write(line)
                else:
                    fobj_out.write(line)

            fobj_in.close()
            fobj_out.close()
            os.system("mv /etc/image-version_new /etc/image-version")
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your %s %s") %
                    (getMachineBrand(), getMachineName()))
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #5
0
ファイル: SoftwareUpdate.py プロジェクト: almwad3/dvbapp2-gui
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""
		
	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software Update"))

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.channellist_only = 0
		self.channellist_name = ''
		self.SettingsBackupDone = False
		self.ImageBackupDone = False
		self.autobackuprunning = False

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None
		self.checkNetworkState()

	def checkNetworkState(self):
		cmd1 = "opkg update"
		self.CheckConsole = Console()
		self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

	def checkNetworkStateFinished(self, result, retval,extra_args=None):
		if 'bad address' in result:
			self.session.openWithCallback(self.close, MessageBox, _("Your %s %s is not connected to the internet, please check your network settings and try again.") % (getMachineBrand(), getMachineName()), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif ('wget returned 1' or 'wget returned 255' or '404 Not Found') in result:
			self.session.openWithCallback(self.close, MessageBox, _("Sorry feeds are down for maintenance, please try again later."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif 'Collected errors' in result:
			self.session.openWithCallback(self.close, MessageBox, _("A background update check is in progress, please wait a few minutes and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		else:
			self.startCheck()

	def startCheck(self):
		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.doActivityTimer)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self.updating = False

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.updating = True
		self.activityTimer.start(100, False)
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	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") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					message = _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot"),
						(_("Update channel list only"), "channels"),
						(_("Cancel"), "")]
					self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
				else:
					self.session.openWithCallback(self.close, MessageBox, _("No updates available"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.") % (getMachineBrand(), getMachineName(), getMachineBrand(), getMachineName())
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your %s %s does not have a working internet connection.") % (getMachineBrand(), getMachineName())
				self.status.setText(_("Error") +  " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your %s %s") % (getMachineBrand(), getMachineName()))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop,retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #6
0
ファイル: SoftwareUpdate.py プロジェクト: Huevos/enigma2
class UpdatePlugin(Screen, ProtectedScreen):
	def __init__(self, session, *args):
		Screen.__init__(self, session)
		ProtectedScreen.__init__(self)
		screentitle = _("Software Update")
		self.menu_path = args[0]
		if config.usage.show_menupath.value == 'large':
			self.menu_path += screentitle
			self.title = self.menu_path
			self.menu_path_compressed = ""
			self.menu_path += ' / '
		elif config.usage.show_menupath.value == 'small':
			self.title = screentitle
			condtext = ""
			if self.menu_path and not self.menu_path.endswith(' / '):
				condtext = self.menu_path + " >"
			elif self.menu_path:
				condtext = self.menu_path[:-3] + " >"
			self.menu_path_compressed = condtext
			self.menu_path += screentitle + ' / '
		else:
			self.title = screentitle
			self.menu_path_compressed = ""
		self["menu_path_compressed"] = StaticText(self.menu_path_compressed)
		Screen.setTitle(self, self.title)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)
		self['actions'].csel = self
		self["actions"].setEnabled(False)

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self['tl_off'] = Pixmap()
		self['tl_red'] = Pixmap()
		self['tl_yellow'] = Pixmap()
		self['tl_green'] = Pixmap()
		self['feedStatusMSG'] = Label()

		self.channellist_only = 0
		self.channellist_name = ''
		self.SettingsBackupDone = False
		self.ImageBackupDone = False
		self.autobackuprunning = False
		self.updating = False

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None
		self.onFirstExecBegin.append(self.checkNetworkState)

	def checkNetworkState(self):
		self['tl_red'].hide()
		self['tl_yellow'].hide()
		self['tl_green'].hide()
		self['tl_off'].hide()
		self.trafficLight = feedsstatuscheck.getFeedsBool() 
		if self.trafficLight in feedsstatuscheck.feed_status_msgs:
			status_text = feedsstatuscheck.feed_status_msgs[self.trafficLight]
		else:
			status_text = _('Feeds status: Unexpected')
		if self.trafficLight:
			self['feedStatusMSG'].setText(status_text)
		if self.trafficLight == 'stable':
			self['tl_green'].show()
		elif self.trafficLight == 'unstable':
			self['tl_red'].show()
		elif self.trafficLight == 'updating':
			self['tl_yellow'].show()
		else:
			self['tl_off'].show()
		if (getImageType() != 'release' and self.trafficLight != 'unknown') or (getImageType() == 'release' and self.trafficLight not in ('stable', 'unstable')):
			self.session.openWithCallback(self.close, MessageBox, feedsstatuscheck.getFeedsErrorMessage(), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		else:
			if getImageType() != 'release' or (config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value) or config.softwareupdate.updateisunstable.value == '0':
				self.startCheck()
			else:
				self.session.openWithCallback(self.close, MessageBox, _("Sorry the feeds seem to be in an unstable state, if you wish to use them please enable 'Allow unstable (experimental) updates' in \"Software update settings\"."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)

	def startCheck(self):
		self.updating = True
		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.doActivityTimer)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)

		self.activityTimer.start(100, False)
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	def isProtected(self):
		return config.ParentalControl.setuppinactive.value and\
			(not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
			config.ParentalControl.config_sections.software_update.value

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	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") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self["actions"].setEnabled(True)
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % param
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
			self.updating = False
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = None
				if getImageType() != 'release' or (config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value):
					self.total_packages = len(self.ipkg.getFetchedList())
					message = _("The current update may be unstable") + "\n" + _("Are you sure you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
				elif config.softwareupdate.updateisunstable.value == '0':
					self.total_packages = len(self.ipkg.getFetchedList())
					message = _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
				if self.total_packages > 150:
					message += " " + _("Reflash recommended!")
				if self.total_packages:
					global ocram
					ocram = ''
					for package_tmp in self.ipkg.getFetchedList():
						if package_tmp[0].startswith('enigma2-plugin-picons-snp'):
							ocram = ocram + '[ocram-picons] ' + package_tmp[0].split('enigma2-plugin-picons-snp-')[1].replace('.',' ') + ' updated ' + package_tmp[2].replace('--',' ') + '\n'
						elif package_tmp[0].startswith('enigma2-plugin-picons-srp'):
							ocram = ocram + '[ocram-picons] ' + package_tmp[0].split('enigma2-plugin-picons-srp-')[1].replace('.',' ') + ' updated ' + package_tmp[2].replace('--',' ') + '\n'
					config.softwareupdate.updatefound.setValue(True)
					choices = [(_("View the changes"), "changes"),
						(_("Upgrade and reboot system"), "cold")]
					if path.exists("/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo"):
						if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
							choices.append((_("Perform a settings backup,") + '\n\t' + _("making a backup before updating") + '\n\t' +_("is strongly advised."), "backup"))
						if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
							choices.append((_("Perform a full image backup"), "imagebackup"))
					choices.append((_("Update channel list only"), "channels"))
					choices.append((_("Cancel"), ""))
					self["actions"].setEnabled(True)
					upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name = "SoftwareUpdateChoices", var=self.trafficLight, menu_path=self.menu_path_compressed)
					upgrademessage.setTitle(self.title)
				else:
					self["actions"].setEnabled(True)
					upgrademessage = self.session.openWithCallback(self.close, MessageBox, _("Nothing to upgrade"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
					upgrademessage.setTitle(_('Software update'))
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.") % (getMachineBrand(), getMachineName(), getMachineBrand(), getMachineName())
				if self.packages == 0:
					error = _("A background update check is in progress,\nplease wait a few minutes and try again.")
				if self.updating:
					error = _("Update failed. Your %s %s does not have a working internet connection.") % (getMachineBrand(), getMachineName())
				self.status.setText(_("Error") +  " - " + error)
				self["actions"].setEnabled(True)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return

		if answer[1] == "menu":
			if config.softwareupdate.updateisunstable.value == '1':
				message = _("The current update may be unstable") + "\n" + _("Are you sure you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(%s " % self.total_packages + _("Packages") + ")"
			elif config.softwareupdate.updateisunstable.value == '0':
				message = _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(%s " % self.total_packages + _("Packages") + ")"
			choices = [(_("View the changes"), "changes"),
				(_("Upgrade and reboot system"), "cold")]
			if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
				choices.append((_("Perform a settings backup, making a backup before updating is strongly advised."), "backup"))
			if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
				choices.append((_("Perform a full image backup"), "imagebackup"))
			choices.append((_("Update channel list only"), "channels"))
			choices.append((_("Cancel"), ""))
			self["actions"].setEnabled(True)
			upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name="SoftwareUpdateChoices", var=self.trafficLight, menu_path=self.menu_path_compressed)
			upgrademessage.setTitle(self.title)
		elif answer[1] == "changes":
			self.session.openWithCallback(self.startActualUpgrade,SoftwareUpdateChanges, self.menu_path)
		elif answer[1] == "backup":
			self.doSettingsBackup()
		elif answer[1] == "imagebackup":
			self.doImageBackup()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "cold":
			if (config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value) or (config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value):
				self.doAutoBackup()
			else:
				self.session.open(TryQuitMainloop,retvalue=42)
				self.close()

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

	def doSettingsBackup(self):
		backup = None
		from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
		self.BackupFiles = BackupFiles(self.session, True)
		Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
		Components.Task.job_manager.in_background = False
		for job in Components.Task.job_manager.getPendingJobs():
			if job.name == dgettext('vix', 'Backup Manager'):
				break
		self.showJobView(job)

	def doImageBackup(self):
		backup = None
		from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
		self.ImageBackup = ImageBackup(self.session, True)
		Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
		Components.Task.job_manager.in_background = False
		for job in Components.Task.job_manager.getPendingJobs():
			if job.name == dgettext('vix', 'Image Manager'):
				break
		self.showJobView(job)

	def doAutoBackup(self, val = False):
		self.autobackuprunning = True
		if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
			self.doSettingsBackup()
		elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
			self.doImageBackup()
		else:
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()

	def showJobView(self, job):
		if job.name == dgettext('vix', 'Image Manager'):
			self.ImageBackupDone = True
		elif job.name == dgettext('vix', 'Backup Manager'):
			self.SettingsBackupDone = True
		from Screens.TaskView import JobView
		Components.Task.job_manager.in_background = False
		if not self.autobackuprunning:
			self.session.openWithCallback(self.startActualUpgrade(("menu", "menu")), JobView, job,  cancelable = False, backgroundable = False, afterEventChangeable = False, afterEvent="close")
		else:
			self.session.openWithCallback(self.doAutoBackup, JobView, job,  cancelable = False, backgroundable = False, afterEventChangeable = False, afterEvent="close")

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your %s %s") % (getMachineBrand(), getMachineName()))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()
コード例 #7
0
class UpdatePlugin(Screen, ProtectedScreen):
    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)
        Screen.setTitle(self, _("Software update"))

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)
        self['actions'].csel = self
        self["actions"].setEnabled(False)

        self.slider = Slider(0, 100)
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False
        self.updating = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.onFirstExecBegin.append(self.checkNetworkState)

    def checkNetworkState(self):
        cmd1 = "opkg update"
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args=None):
        if 'bad address' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Your %s %s is not connected to the Internet, please check your network settings and try again."
                  ) % (getMachineBrand(), getMachineName()),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif any(x in result for x in ('wget returned 1', 'wget returned 255',
                                       '404 Not Found')):
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Can not retrieve data from feed server. Check your Internet connection and try again later."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif 'Collected errors' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("A background update check is in progress, please wait a few minutes and try again."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        else:
            self.startCheck()

    def startCheck(self):
        self.updating = True
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
            self.package.setText(param.rpartition("/")[2].rstrip("."))
        elif event == IpkgComponent.EVENT_UPGRADE:
            self.slider.setValue(100 * self.packages / self.total_packages)
            self.package.setText(param)
            self.status.setText(
                _("Upgrading") + ": %s/%s" %
                (self.packages, self.total_packages))
            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(
                config.softwareupdate.overwriteConfigFiles.value and "Y"
                or "N")
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
            self.updating = False
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = None
                self.total_packages = len(self.ipkg.getFetchedList())
                message = _("Do you want to update your %s %s?") % (
                    getMachineBrand(), getMachineName()) + "\n(" + (ngettext(
                        "%s updated package available",
                        "%s updated packages available",
                        self.total_packages) % self.total_packages) + ")"
                if self.total_packages:
                    config.softwareupdate.updatefound.setValue(True)
                    choices = [
                        (_("View the changes"), "showlist"),
                        (_("Back up current settings"), "backup"),
                        (_("Update and ask to reboot"), "hot"),
                        # (_("Upgrade and reboot system"), "cold")
                    ]
                    choices.append((_("Cancel"), ""))
                    if self.total_packages > 198:
                        message += "\n" + _(
                            "\nThis is a large update. Consider a full USB update instead.\n"
                        )
                    upgrademessage = self.session.openWithCallback(
                        self.startActualUpgrade,
                        ChoiceBox,
                        text=message,
                        list=choices)
                    upgrademessage.setTitle(_('Software update'))
                else:
                    self["actions"].setEnabled(True)
                    upgrademessage = self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("Nothing to upgrade"),
                        type=MessageBox.TYPE_INFO,
                        timeout=10,
                        close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(33)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(66)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Errors were encountered during update.\nUSB update is recommended."
                )
                if self.packages == 0:
                    if self.error != 0:
                        error = _(
                            "Problem retrieving update list.\nIf this issue persists please check/report on forum"
                        )
                    else:
                        error = _(
                            "A background update check is in progress,\nplease wait a few minutes and try again."
                        )
                if self.updating:
                    error = _(
                        "Update failed. Your %s %s does not have a working Internet connection."
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_("Error") + " - " + error)
                self["actions"].setEnabled(True)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(100)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)
        self["actions"].setEnabled(True)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return

        if answer[1] == "menu":
            message = _("Do you want to update your %s %s?") % (
                getMachineBrand(), getMachineName()
            ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            choices = [
                (_("View the changes"), "showlist"),
                (_("Update and ask to reboot"), "hot"),
                # (_("Upgrade and reboot system"), "cold")
            ]
            choices.append((_("Cancel"), ""))
            self["actions"].setEnabled(True)
            upgrademessage = self.session.openWithCallback(
                self.startActualUpgrade,
                ChoiceBox,
                text=message,
                list=choices,
                skin_name="SoftwareUpdateChoices")
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == "showlist":
            format = "%-38.38s %-32.32s %-32.32s\n"
            text = format % ("Package name", "Current version", "New version")
            spaces = "-" * 50
            text += format % (spaces, spaces, spaces)
            for i in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0]):
                text += format % (i[0], i[1], i[2])
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), SoftwareUpdateChangeView, text)
        elif answer[1] == "backup":
            self.session.openWithCallback(self.backupDone,
                                          BackupScreen,
                                          runBackup=True)
        elif answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=QUIT_UPGRADE_PROGRAM)
            self.close()
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

    def backupDone(self, retval=None):
        if retval is True:
            self.session.openWithCallback(self.backupMessageDone,
                                          MessageBox,
                                          _("Backup done."),
                                          MessageBox.TYPE_INFO,
                                          timeout=10)
        else:
            self.session.openWithCallback(self.backupMessageDone, MessageBox,
                                          _("Backup failed."),
                                          MessageBox.TYPE_ERROR)

    def backupMessageDone(self, retval=None):
        self.ipkgCallback(IpkgComponent.EVENT_DONE, None)

    def exit(self):
        if self.updating:
            return
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your %s %s") %
                    (getMachineBrand(), getMachineName()))
            else:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=QUIT_REBOOT)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #8
0
ファイル: UpdatePlugin.py プロジェクト: aitchala/enigma2
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="620,160" title="Software update">
			<widget name="activityslider" position="10,10" size="600,10"  borderWidth="2" borderColor="#cccccc"/>
			<widget source="package" render="Label" position="10,40" size="600,25" font="Regular;22" />
			<widget source="status" render="Label" position="10,70" size="600,45" font="Regular;22" />
			<widget name="slider" position="10,140" size="600,12" borderWidth="2" borderColor="#cccccc" />
		</screen>"""

	def __init__(self, session, args = None):
		Screen.__init__(self, session)

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 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.modified_packages = []

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer_conn = self.activityTimer.timeout.connect(self.doActivityTimer)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)

		self.updating = False
		self.rebootRequired = False
		self.device_name = iSoftwareTools.hardware_info.device_name

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.checkNetwork()
		self.onClose.append(self.cleanup)

	def cleanup(self):
		iSoftwareTools.cleanupSoftwareTools()

	def checkNetwork(self):
		if eNetworkManager.getInstance().online():
			self.updating = True
			self.activityTimer.start(100, False)
			self.package.setText(_("Package list update"))
			self.status.setText(_("Upgrading Dreambox... Please wait"))
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
		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 not param 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 not param 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 not param 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_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				iSoftwareTools.listUpgradable(self.listUpgradableCB)
			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 dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
				if self.packages == 0:
					error = _("No packages were upgraded yet. So you can check your network and try again.")
				if self.updating:
					error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
				self.status.setText(_("Error") +  " - " + error)
		#print event, "-", param
		pass

	def listUpgradableCB(self, res):
		if iSoftwareTools.upgradeAvailable is False:
			self.updating = False
			self.slider.setValue(4)
			self.activityTimer.stop()
			self.activityslider.setValue(0)
			self.package.setText(_("Done - No updates available."))
			self.status.setText(self.oktext)
		else:
			self.updating = False
			upgrade_args = {'use_maintainer' : True, 'test_only': False}
			if config.plugins.softwaremanager.overwriteConfigFiles.value == 'N':
				upgrade_args = {'use_maintainer' : False, 'test_only': False}
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = upgrade_args)

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0:
				self.session.openWithCallback(self.exitReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitReboot(self, result):
		if result:
			quitMainloop(2)
		self.close()

	def exitRestart(self, result):
		if result:
			quitMainloop(3)
		self.close()
コード例 #9
0
ファイル: SoftwareUpdate.py プロジェクト: bally12345/enigma2
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software Update"))

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None
		self.checkNetworkState()

	def checkNetworkState(self):
		cmd1 = "opkg update"
		self.CheckConsole = Console()
		self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

	def checkNetworkStateFinished(self, result, retval,extra_args=None):
		if (float(about.getImageVersionString()) < 3.0 and result.find('mipsel/Packages.gz, wget returned 1') != -1) or (float(about.getImageVersionString()) >= 3.0 and result.find('mips32el/Packages.gz, wget returned 1') != -1):
			self.session.openWithCallback(self.close, MessageBox, _("Sorry feeds are down for maintenance, please try again later."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif result.find('bad address') != -1:
			self.session.openWithCallback(self.close, MessageBox, _("Your STB_BOX is not connected to the internet, please check your network settings and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif result.find('Collected errors') != -1:
			self.session.openWithCallback(self.close, MessageBox, _("A background update check is is progress, please wait a few minutes and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		else:
			self.startCheck()

	def startCheck(self):
		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.exit,
			"back": self.exit
		}, -1)

		self.updating = True
		self.activityTimer.start(100, False)
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	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") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					from urllib import urlopen
					import socket
					currentTimeoutDefault = socket.getdefaulttimeout()
					socket.setdefaulttimeout(3)
					config.usage.infobar_onlineupdatefound.setValue(True)
					try:
						config.usage.infobar_onlineupdateisunstable.setValue(urlopen("http://enigma2.world-of-satellite.com/feeds/status").read())
					except:
						config.usage.infobar_onlineupdateisunstable.setValue(1)
					socket.setdefaulttimeout(currentTimeoutDefault)
					if config.usage.infobar_onlineupdateisunstable.value == '1' and config.usage.infobar_onlineupdatebeta.value:
						message = _("The current update maybe unstable") + "\n" + _("Are you sure you want to update your STB_BOX?") + "\n(%s " % self.total_packages + _("Packages") + ")"
						choices = [(_("View the changes"), "changes"),
							(_("Unattended upgrade without GUI and reboot system"), "cold"),
							(_("Cancel"), "")]
						self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
					elif config.usage.infobar_onlineupdateisunstable.value == '0':
						message = _("Do you want to update your STB_BOX?") + "\n(%s " % self.total_packages + _("Packages") + ")"
						choices = [(_("View the changes"), "changes"),
							(_("Unattended upgrade without GUI and reboot system"), "cold"),
							(_("Cancel"), "")]
						self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
					else:
						self.session.openWithCallback(self.close, MessageBox, _("Nothing to upgrade"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
				else:
					self.session.openWithCallback(self.close, MessageBox, _("Nothing to upgrade"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
			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_BOX might be unusable now. Please consult the manual for further assistance before rebooting your STB_BOX.")
				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_BOX isn't connected to the internet properly. Please check it and try again.")
				self.status.setText(_("Error") +  " - " + error)
		#print event, "-", param
		pass

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return

		if answer[1] == "changes":
			self.session.openWithCallback(self.startActualUpgrade,SoftwareUpdateChanges)
		elif answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your STB_BOX?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop,retvalue=2)
		self.close()
コード例 #10
0
class UpdatePlugin(Screen, ProtectedScreen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		ProtectedScreen.__init__(self)

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None

		self.channellist_only = 0
		self.channellist_name = ''
		self.updating = False
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.checkTraficLight)
		self.activityTimer.callback.append(self.doActivityTimer)
		self.activityTimer.start(100, True)

	def isProtected(self):
		return config.ParentalControl.setuppinactive.value and\
			(not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
			config.ParentalControl.config_sections.software_update.value

	def checkTraficLight(self):
		self.activityTimer.callback.remove(self.checkTraficLight)
		self.activityTimer.start(100, False)
		message = ""
		picon = None
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			url = "https://openpli.org/status/"
			try:
				status = urlopen(url, timeout=5).read().split('!', 1)
			except:
				# OpenPli 5.0 uses python 2.7.11 and here we need to bypass the certificate check
				from ssl import _create_unverified_context
				status = urlopen(url, timeout=5, context=_create_unverified_context()).read().split('!', 1)
				print status
			if getBoxType() in status[0].split(','):
				message = len(status) > 1 and status[1] or _("The current image might not be stable.\nFor more information see %s.") % ("www.openpli.org")
				# strip any HTML that may be in the message, but retain line breaks
				import re
				message = message.replace("<br />", "\n\n").replace("<br>", "\n\n")
				message = re.sub('<[^<]+?>', '', re.sub('&#8209;', '-', message))
				picon = MessageBox.TYPE_ERROR
		except:
			message = _("The status of the current image could not be checked because %s can not be reached.") % ("www.openpli.org")
			picon = MessageBox.TYPE_ERROR
		if message != "":
			message += "\n" + _("Do you want to update your receiver?")
			self.session.openWithCallback(self.startActualUpdate, MessageBox, message, picon = picon)
		else:
			self.startActualUpdate(True)

	def getLatestImageTimestamp(self):
		def gettime(url):
			try:
				return str(datetime.datetime.strptime(urlopen("%s/Packages.gz" % url).info()["Last-Modified"], '%a, %d %b %Y %H:%M:%S %Z'))
			except:
				return ""
		return sorted([gettime(open("/etc/opkg/%s" % file, "r").readlines()[0].split()[2]) for file in os.listdir("/etc/opkg") if not file.startswith("3rd-party") and file not in ("arch.conf", "opkg.conf")], reverse=True)[0]

	def startActualUpdate(self,answer):
		if answer:
			self.updating = True
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
		else:
			self.close()

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_DOWNLOAD:
			self.status.setText(_("Downloading"))
		elif event == IpkgComponent.EVENT_UPGRADE:
			if param in self.sliderPackages:
				self.slider.setValue(self.sliderPackages[param])
			self.package.setText(param)
			self.status.setText(_("Upgrading") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					latestImageTimestamp = self.getLatestImageTimestamp()
					if latestImageTimestamp:
						message = _("Do you want to update your receiver to %s?") % latestImageTimestamp + "\n"
					else:
						message = _("Do you want to update your receiver?") + "\n"
					message += "(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					if self.total_packages > 150:
						choices = [(_("Update and reboot"), "cold")]
						message += " " + _("Reflash recommended!")
					else:
						choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot")]
					choices.append((_("Update channel list only"), "channels"))
					choices.append((_("Show packages to be upgraded"), "showlist"))
				else:
					message = _("No updates available")
					choices = []
				if fileExists("/home/root/ipkgupgrade.log"):
					choices.append((_("Show latest upgrade log"), "log"))
				choices.append((_("Show latest commits"), "commits"))
				choices.append((_("Cancel"), ""))
				self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, windowTitle=self.title)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your receiver does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "commits":
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), CommitInfo)
		elif answer[1] == "showlist":
			text = "\n".join([x[0] for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])])
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages to update"), True)
		elif answer[1] == "log":
			text = open("/home/root/ipkgupgrade.log", "r").read()
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Latest upgrade log"), True)
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Update completed. Do you want to reboot your receiver?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #11
0
ファイル: plugin.py プロジェクト: kingvuplus/EGAMI-tools
class UpdateEGAMI(Screen):
    skin = '<screen name="UpdateEGAMI" position="center,center" size="550,300" title="Software update" >\n\t\t<widget name="activityslider" position="0,0" size="550,5"  />\n\t\t<widget name="slider" position="0,150" size="550,30"  />\n\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<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 = {'ini-dvb-modules': 1,
         'enigma2': 2,
         'egami-version-info': 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.exit,
         '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 checkFreeSpace(self):
        free_flash_space = self.getFreeSpace('/')
        if free_flash_space > 19000000:
            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()
        else:
            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 Your ') + ' %s %s ' % (getMachineBrand(), getMachineName()) + _('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 %s %s might be unusable now. Please consult the manual for further assistance before rebooting your STB.') % (getMachineBrand(), getMachineName())
                if self.packages == 0:
                    error = _('No packages were upgraded yet. So you can check your network and try again.')
                if self.updating:
                    error = _("Your %s %s isn't connected to the internet properly. Please check it and try again.") % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)

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

    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('/etc/do_update', 'w+').close()
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Upgrade finished.') + ' ' + _('Do you want to reboot your %s %s ?') % (getMachineBrand(), getMachineName()))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, 2)
        self.close()
コード例 #12
0
ファイル: Ipkg.py プロジェクト: aitchala/enigma2
class Ipkg(Screen):
    def __init__(self, session, cmdList=[]):
        Screen.__init__(self, session)

        self.cmdList = cmdList

        self.sliderPackages = {}

        self.slider = Slider(0, len(cmdList))
        self["slider"] = self.slider
        self.activityslider = Slider(0, 100)
        self["activityslider"] = self.activityslider
        self.status = Label(_("Preparing... Please wait"))
        self["status"] = self.status
        self.package = Label()
        self["package"] = self.package

        self.packages = 0
        self.error = 0
        self.processed_packages = []

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer_conn = self.activityTimer.timeout.connect(
            self.doActivityTimer)
        #self.activityTimer.start(100, False)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)

        self.runningCmd = None
        self.runNextCmd()

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

    def runNextCmd(self):
        if self.runningCmd is None:
            self.runningCmd = 0
        else:
            self.runningCmd += 1
        print len(self.cmdList), self.runningCmd
        if len(self.cmdList) - 1 < self.runningCmd:
            self.activityslider.setValue(0)
            self.slider.setValue(len(self.cmdList))

            self.package.setText("")
            self.status.setText(
                _("Done - Installed, upgraded or removed %d packages with %d errors"
                  ) % (self.packages, self.error))
            return False
        else:
            cmd = self.cmdList[self.runningCmd]
            self.slider.setValue(self.runningCmd)
            self.ipkg.startCmd(cmd[0], args=cmd[1])
            self.startActivityTimer()

    def doActivityTimer(self):
        if not self.ipkg.isRunning():
            self.stopActivityTimer()
        else:
            self.activity += 1
            if self.activity == 100:
                self.activity = 0
            self.activityslider.setValue(self.activity)

    def startActivityTimer(self):
        self.activityTimer.start(100, False)

    def stopActivityTimer(self):
        self.activityTimer.stop()

    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 not param 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 not param 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 not param 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_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            self.runNextCmd()

    def exit(self):
        if not self.ipkg.isRunning():
            self.close()
コード例 #13
0
ファイル: SoftwareUpdate.py プロジェクト: popazerty/e2-gui
class UpdatePlugin(Screen):
	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software update"))

		self.setTitle(_("Software update"))
		self.slider = Slider(0, 100)
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.channellist_only = 0
		self.channellist_name = ''
		self.SettingsBackupDone = False
		self.ImageBackupDone = False
		self.autobackuprunning = False

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None
		self.checkNetworkState()

	def checkNetworkState(self):
		cmd1 = "opkg update"
		self.CheckConsole = Console()
		self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

	def checkNetworkStateFinished(self, result, retval, extra_args=None):
		if 'bad address' in result:
			self.session.openWithCallback(self.close, MessageBox, _("Your %s %s is not connected to the Internet, please check your network settings and try again.") % (getMachineBrand(), getMachineName()), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif ('wget returned 1' or 'wget returned 255' or '404 Not Found') in result:
			self.session.openWithCallback(self.close, MessageBox, _("Can not retrieve data from feed server. Check your Internet connection and try again later."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif 'Collected errors' in result:
			self.session.openWithCallback(self.close, MessageBox, _("A background update check is in progress, please wait a few minutes and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		else:
			self.startCheck()

	def startCheck(self):
		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.doActivityTimer)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self.updating = False

		self["actions"] = ActionMap(["WizardActions"], {
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.updating = True
		self.activityTimer.start(100, False)
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_DOWNLOAD:
			self.status.setText(_("Downloading"))
			self.package.setText(param.rpartition("/")[2].rstrip("."))
		elif event == IpkgComponent.EVENT_UPGRADE:
			self.slider.setValue(100 * self.packages / self.total_packages)
			self.package.setText(param)
			self.status.setText(_("Upgrading") + ": %s/%s" % (self.packages, self.total_packages))
			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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % param
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = None
				self.total_packages = len(self.ipkg.getFetchedList())
				message = _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
				if self.total_packages:
					config.softwareupdate.updatefound.setValue(True)
					choices = [
						(_("View the changes"), "showlist"),
						(_("Update and ask to reboot"), "hot"),
						# (_("Upgrade and reboot system"), "cold")
					]
					choices.append((_("Cancel"), ""))
					upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name="SoftwareUpdateChoices")
					upgrademessage.setTitle(_('Software update'))
				else:
					upgrademessage = self.session.openWithCallback(self.close, MessageBox, _("Nothing to upgrade"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
					upgrademessage.setTitle(_('Software update'))
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(33)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(66)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.") % (getMachineBrand(), getMachineName(), getMachineBrand(), getMachineName())
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your %s %s does not have a working Internet connection.") % (getMachineBrand(), getMachineName())
				self.status.setText(_("Error") + " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(100)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return

		if answer[1] == "menu":
			message = _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName()) + "\n(%s " % self.total_packages + _("Packages") + ")"
			choices = [
				(_("View the changes"), "showlist"),
				(_("Update and ask to reboot"), "hot"),
				# (_("Upgrade and reboot system"), "cold")
			]
			choices.append((_("Cancel"), ""))
			upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name="SoftwareUpdateChoices")
			upgrademessage.setTitle(_('Software update'))
		elif answer[1] == "showlist":
			format = "%-38.38s %-32.32s %-32.32s\n"
			text = format % ("Package name", "Current version", "New version")
			spaces = "-" * 50
			text += format % (spaces, spaces, spaces)
			for i in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0]):
				text += format % (i[0], i[1], i[2])
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), SoftwareUpdateChangeView, text)
		elif answer[1] == "cold":
			self.session.open(TryQuitMainloop, retvalue=42)
			self.close()
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args={'test_only': False})

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

	def exit(self):
		if self.updating:
			return
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") + " " + _("Do you want to reboot your %s %s") % (getMachineBrand(), getMachineName()))
			else:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #14
0
class UpdatePlugin(Screen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _("Software Update"))

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.checkNetworkState()

    def checkNetworkState(self):
        cmd1 = "opkg update"
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args=None):
        if (float(about.getImageVersionString()) < 3.0
                and result.find('mipsel/Packages.gz, wget returned 1') != -1
            ) or (float(about.getImageVersionString()) >= 3.0 and
                  result.find('mips32el/Packages.gz, wget returned 1') != -1):
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Sorry feeds are down for maintenance, please try again later."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif result.find('bad address') != -1:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Your STB_BOX is not connected to the internet, please check your network settings and try again."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif result.find('Collected errors') != -1:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("A background update check is is progress, please wait a few minutes and try again."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        else:
            self.startCheck()

    def startCheck(self):
        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.exit,
            "back": self.exit
        }, -1)

        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    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") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.getValue(
            ) in ("N", "Y"):
                self.ipkg.write(True and config.plugins.softwaremanager.
                                overwriteConfigFiles.getValue())
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                from urllib import urlopen
                import socket
                currentTimeoutDefault = socket.getdefaulttimeout()
                socket.setdefaulttimeout(3)
                try:
                    config.softwareupdate.updateisunstable.setValue(
                        urlopen(
                            "http://enigma2.world-of-satellite.com/feeds/" +
                            about.getImageVersionString() + "/status").read())
                except:
                    config.softwareupdate.updateisunstable.setValue(1)
                socket.setdefaulttimeout(currentTimeoutDefault)
                self.total_packages = None
                if config.softwareupdate.updateisunstable.getValue(
                ) == '1' and config.softwareupdate.updatebeta.getValue():
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _(
                        "The current update maybe unstable") + "\n" + _(
                            "Are you sure you want to update your STB_BOX?"
                        ) + "\n(" + (ngettext("%s updated package available",
                                              "%s updated packages available",
                                              self.total_packages) %
                                     self.total_packages) + ")"
                elif config.softwareupdate.updateisunstable.getValue() == '0':
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _(
                        "Do you want to update your STB_BOX?") + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                if self.total_packages:
                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_("View the changes"), "changes"),
                               (_("Upgrade and reboot system"), "cold")]
                    if path.exists(
                            "/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo"
                    ):
                        if not config.softwareupdate.autosettingsbackup.getValue(
                        ):
                            choices.append(
                                (_("Perform a setting backup,") + '\n\t' +
                                 _("making a backup before updating") +
                                 '\n\t' + _("is strongly advised."), "backup"))
                        if not config.softwareupdate.autoimagebackup.getValue(
                        ):
                            choices.append((_("Perform a full image backup"),
                                            "imagebackup"))
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append((_("Cancel"), ""))
                    upgrademessage = self.session.openWithCallback(
                        self.startActualUpgrade,
                        ChoiceBox,
                        title=message,
                        list=choices,
                        skin_name="SoftwareUpdateChoices")
                    upgrademessage.setTitle(_('Software update'))
                else:
                    upgrademessage = self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("Nothing to upgrade"),
                        type=MessageBox.TYPE_INFO,
                        timeout=10,
                        close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your STB_BOX might be unusable now. Please consult the manual for further assistance before rebooting your STB_BOX."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Your STB_BOX isn't connected to the internet properly. Please check it and try again."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return

        if answer[1] == "menu":
            if config.softwareupdate.updateisunstable.getValue() == '1':
                message = _("The current update maybe unstable") + "\n" + _(
                    "Are you sure you want to update your STB_BOX?"
                ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            elif config.softwareupdate.updateisunstable.getValue() == '0':
                message = _("Do you want to update your STB_BOX?"
                            ) + "\n(%s " % self.total_packages + _(
                                "Packages") + ")"
            choices = [(_("View the changes"), "changes"),
                       (_("Upgrade and reboot system"), "cold")]
            if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.getValue(
            ):
                choices.append((_(
                    "Perform a setting backup, making a backup before updating is strongly advised."
                ), "backup"))
            if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.getValue(
            ):
                choices.append(
                    (_("Perform a full image backup"), "imagebackup"))
            choices.append((_("Update channel list only"), "channels"))
            choices.append((_("Cancel"), ""))
            upgrademessage = self.session.openWithCallback(
                self.startActualUpgrade,
                ChoiceBox,
                title=message,
                list=choices)
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == "changes":
            self.session.openWithCallback(self.startActualUpgrade,
                                          SoftwareUpdateChanges)
        elif answer[1] == "backup":
            self.doSettingsBackup()
        elif answer[1] == "imagebackup":
            self.doImageBackup()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "cold":
            if config.softwareupdate.autosettingsbackup.getValue(
            ) or config.softwareupdate.autoimagebackup.getValue():
                self.doAutoBackup()
            else:
                self.session.open(TryQuitMainloop, retvalue=42)
                self.close()

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name.startswith(_("BackupManager")):
                backup = job
        if backup:
            self.showJobView(backup)

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name.startswith(_("ImageManager")):
                backup = job
        if backup:
            self.showJobView(backup)

    def doAutoBackup(self, val=False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.getValue(
        ) and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.getValue(
        ) and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name.startswith(_("ImageManager")):
            self.ImageBackupDone = True
        elif job.name.startswith(_("BackupManager")):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(
                ("menu", "menu")),
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")
        else:
            self.session.openWithCallback(self.doAutoBackup,
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your STB_BOX?"))
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
コード例 #15
0
class UpdatePlugin(Screen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, args=None):
        Screen.__init__(self, session)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.slider = Slider(0, 4)
        self["slider"] = self.slider
        self.activityslider = Slider(0, 100)
        self["activityslider"] = self.activityslider
        self.status = StaticText(_("Upgrading Dreambox... Please wait"))
        self["status"] = self.status
        self.package = StaticText()
        self["package"] = self.package

        self.packages = 0
        self.error = 0

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.firsttime = True
        self.onShown.append(self.confirmUpdate)

    def confirmUpdate(self):
        if self.firsttime:
            self.firsttime = False
            self.session.openWithCallback(self.confirmationResult, MessageBox,
                                          _("Do you want to upgrade?"))

    def confirmationResult(self, result):
        if not result:
            self.close()
        else:
            self.activityTimer.start(100, False)
            self.updating = True
            self.package.setText(_("Package list update"))
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    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"))
            self.packages += 1
        elif event == IpkgComponent.EVENT_INSTALL:
            self.package.setText(param)
            self.status.setText(_("Installing"))
            self.packages += 1
        elif event == IpkgComponent.EVENT_CONFIGURING:
            self.package.setText(param)
            self.status.setText(_("Configuring"))
        elif event == IpkgComponent.EVENT_MODIFIED:
            self.session.openWithCallback(
                self.modificationCallback, MessageBox,
                _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?"
                  ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                                   args={'test_only': False})
            elif self.error == 0:
                self.slider.setValue(4)

                self.activityTimer.stop()
                self.activityslider.setValue(0)

                self.package.setText("")
                self.status.setText(
                    _("Done - Installed or upgraded %d packages") %
                    self.packages)
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox."
                )
                if self.packages == 0:
                    error = _(
                        "No packages were upgraded yet. So you can check your network and try again."
                    )
                if self.updating:
                    error = _(
                        "Your dreambox isn't connected to the internet properly. Please check it and try again."
                    )
                self.status.setText(_("Error") + " - " + error)
        #print event, "-", param
        pass

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished. Do you want to reboot your Dreambox?")
                )
            else:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            quitMainloop(2)
        self.close()
コード例 #16
0
ファイル: SoftwareUpdate.py プロジェクト: Openesi2/e2
class UpdatePlugin(Screen):
    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _("Software Update"))

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))

        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        status_msgs = {
            'stable': _('Feeds status:   Stable'),
            'unstable': _('Feeds status:   Unstable'),
            'updating': _('Feeds status:   Updating'),
            'unknown': _('No connection')
        }
        self['tl_off'] = Pixmap()
        self['tl_red'] = Pixmap()
        self['tl_yellow'] = Pixmap()
        self['tl_green'] = Pixmap()
        self.feedsStatus()
        self['feedStatusMSG'] = Label(status_msgs[self.trafficLight])

        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.checkNetworkState()

    def feedsStatus(self):
        from urllib import urlopen
        import socket
        self['tl_red'].hide()
        self['tl_yellow'].hide()
        self['tl_green'].hide()
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        try:
            d = urlopen("http://openvix.co.uk/TrafficLightState.php")
            self.trafficLight = d.read()
            if self.trafficLight == 'unstable':
                self['tl_off'].hide()
                self['tl_red'].show()
            elif self.trafficLight == 'updating':
                self['tl_off'].hide()
                self['tl_yellow'].show()
            elif self.trafficLight == 'stable':
                self['tl_off'].hide()
                self['tl_green'].show()
            else:
                self.trafficLight = 'unknown'
                self['tl_off'].show()
        except:
            self.trafficLight = 'unknown'
            self['tl_off'].show()
        socket.setdefaulttimeout(currentTimeoutDefault)

    def checkNetworkState(self):
        cmd1 = "opkg update"
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args=None):
        if 'bad address' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Your %s %s is not connected to the internet, please check your network settings and try again."
                  ) % (getMachineBrand(), getMachineName()),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif ('wget returned 1' or 'wget returned 255'
              or '404 Not Found') in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Sorry feeds are down for maintenance, please try again later. If this issue persists please check www.openesi.eu"
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        elif 'Collected errors' in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("A background update check is in progress, please wait a few minutes and try again."
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True)
        else:
            self.startCheck()

    def startCheck(self):
        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.exit,
            "back": self.exit
        }, -1)

        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    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") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                from urllib import urlopen
                import socket
                currentTimeoutDefault = socket.getdefaulttimeout()
                socket.setdefaulttimeout(3)
                status = urlopen(
                    'http://www.openvix.co.uk/feeds/status').read()
                if '404 Not Found' in status:
                    status = '1'
                config.softwareupdate.updateisunstable.setValue(status)
                socket.setdefaulttimeout(currentTimeoutDefault)
                self.total_packages = None
                if config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value:
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _(
                        "The current update may be unstable") + "\n" + _(
                            "Are you sure you want to update your %s %s ?"
                        ) % (getMachineBrand(), getMachineName()) + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                elif config.softwareupdate.updateisunstable.value == '0':
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _("Do you want to update your %s %s ?") % (
                        getMachineBrand(), getMachineName()) + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                if self.total_packages:
                    global ocram
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith(
                                'enigma2-plugin-picons-tv-ocram'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[
                                0].split('enigma2-plugin-picons-tv-ocram.')[
                                    1] + 'updated ' + package_tmp[2] + '\n'
                        elif package_tmp[0].startswith(
                                'enigma2-plugin-settings-ocram'):
                            ocram = ocram + '[ocram-settings] ' + package_tmp[
                                0].split('enigma2-plugin-picons-tv-ocram.')[
                                    1] + 'updated ' + package_tmp[2] + '\n'
                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_("View the changes"), "changes"),
                               (_("Upgrade and reboot system"), "cold")]
                    if path.exists(
                            "/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo"
                    ):
                        if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                            choices.append(
                                (_("Perform a settings backup,") + '\n\t' +
                                 _("making a backup before updating") +
                                 '\n\t' + _("is strongly advised."), "backup"))
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_("Perform a full image backup"),
                                            "imagebackup"))
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append((_("Cancel"), ""))
                    upgrademessage = self.session.openWithCallback(
                        self.startActualUpgrade,
                        ChoiceBox,
                        title=message,
                        list=choices,
                        skin_name="SoftwareUpdateChoices",
                        var=self.trafficLight)
                    upgrademessage.setTitle(_('Software update'))
                else:
                    upgrademessage = self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("Nothing to upgrade"),
                        type=MessageBox.TYPE_INFO,
                        timeout=10,
                        close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s."
                ) % (getMachineBrand(), getMachineName(), getMachineBrand(),
                     getMachineName())
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your %s %s does not have a working internet connection."
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return

        if answer[1] == "menu":
            if config.softwareupdate.updateisunstable.value == '1':
                message = _("The current update may be unstable") + "\n" + _(
                    "Are you sure you want to update your %s %s ?") % (
                        getMachineBrand(), getMachineName()
                    ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            elif config.softwareupdate.updateisunstable.value == '0':
                message = _("Do you want to update your %s %s ?") % (
                    getMachineBrand(), getMachineName()
                ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            choices = [(_("View the changes"), "changes"),
                       (_("Upgrade and reboot system"), "cold")]
            if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                choices.append((_(
                    "Perform a settings backup, making a backup before updating is strongly advised."
                ), "backup"))
            if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                choices.append(
                    (_("Perform a full image backup"), "imagebackup"))
            choices.append((_("Update channel list only"), "channels"))
            choices.append((_("Cancel"), ""))
            upgrademessage = self.session.openWithCallback(
                self.startActualUpgrade,
                ChoiceBox,
                title=message,
                list=choices,
                skin_name="SoftwareUpdateChoices",
                var=self.trafficLight)
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == "changes":
            self.session.openWithCallback(self.startActualUpgrade,
                                          SoftwareUpdateChanges)
        elif answer[1] == "backup":
            self.doSettingsBackup()
        elif answer[1] == "imagebackup":
            self.doImageBackup()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "cold":
            if (config.softwareupdate.autosettingsbackup.value
                    and config.backupmanager.backuplocation.value) or (
                        config.softwareupdate.autoimagebackup.value
                        and config.imagemanager.backuplocation.value):
                self.doAutoBackup()
            else:
                self.session.open(TryQuitMainloop, retvalue=42)
                self.close()

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Backup Manager'):
                break
        self.showJobView(job)

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Image Manager'):
                break
        self.showJobView(job)

    def doAutoBackup(self, val=False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext('vix', 'Image Manager'):
            self.ImageBackupDone = True
        elif job.name == dgettext('vix', 'Backup Manager'):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(
                ("menu", "menu")),
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")
        else:
            self.session.openWithCallback(self.doAutoBackup,
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your %s %s") %
                    (getMachineBrand(), getMachineName()))
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
コード例 #17
0
class SerienRecorderUpdateScreen(Screen):
	DESKTOP_WIDTH  = getDesktop(0).size().width()
	DESKTOP_HEIGHT = getDesktop(0).size().height()

	skin = """
		<screen name="SerienRecorderUpdate" position="%d,%d" size="720,320" title="%s" backgroundColor="#26181d20" flags="wfNoBorder">
			<widget name="srlog" position="5,5" size="710,310" font="Regular;18" valign="center" halign="center" foregroundColor="white" transparent="1" zPosition="5"/>
			<widget name="activityslider" position="5,280" size="710,25" borderWidth="1" transparent="1" zPosition="4"/>
			<widget name="status" position="30,280" size="660,25" font="Regular;20" valign="center" halign="center" foregroundColor="#00808080" transparent="1" zPosition="6"/>
		</screen>""" % ((DESKTOP_WIDTH - 720) / 2, (DESKTOP_HEIGHT - 320) / 2, _("SerienRecorder Update"))

	def __init__(self, session, updateurl, version):
		from Components.Slider import Slider

		self.session = session
		Screen.__init__(self, session)
		self.target = updateurl
		self.version = version
		self.file_name = "/tmp/%s" % self.target.split('/')[-1]
		self.fileSize = 5 * 1024
		self.downloadDone = False
		self.container = eConsoleAppContainer()
		self.appClosed_conn = None
		self.stdoutAvail_conn = None

		self['srlog'] = Label()

		self.status = Label(_("Preparing... Please wait"))
		self['status'] = self.status
		self.activityslider = Slider(0, 100)
		self['activityslider'] = self.activityslider
		self.activity = 0
		self.activityTimer = eTimer()
		if isDreamboxOS:
			self.activityTimerConnection = self.activityTimer.timeout.connect(self.doActivityTimer)
		else:
			self.activityTimer.callback.append(self.doActivityTimer)

		self.onLayoutFinish.append(self.__onLayoutFinished)

	def doActivityTimer(self):
		if self.downloadDone:
			self.activity += 1
			if self.activity == 101:
				self.activity = 1
		else:
			if os.path.exists(self.file_name):
				kBbytesDownloaded = int(os.path.getsize(self.file_name) / 1024)
			else:
				kBbytesDownloaded = 0

			self.activity = int(kBbytesDownloaded * 100 / self.fileSize)
			self.status.setText("%s / %s kB (%s%%)" % (kBbytesDownloaded, self.fileSize, self.activity))

		self.activityslider.setValue(self.activity)

	def startActivityTimer(self):
		self.activityTimer.start(100, False)

	def stopActivityTimer(self):
		self.activityTimer.stop()
		if self.activityTimer:
			self.activityTimer.stop()
			self.activityTimer = None

		if isDreamboxOS:
			self.activityTimerConnection = None

	def __onLayoutFinished(self):
		sl = self['srlog']
		sl.instance.setZPosition(5)

		getPage(str(self.target.replace("/download/", "/tag/").rsplit('/', 1)[0]), timeout=WebTimeout, agent=getUserAgent(), headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.getFileSize).addErrback(self.downloadError)

		self['srlog'].setText(_("Download wurde gestartet, bitte warten..."))
		self.activityslider.setValue(0)
		self.startActivityTimer()

		if fileExists(self.file_name):
			os.remove(self.file_name)
		downloadPage(self.target, self.file_name).addCallback(self.downloadFinished).addErrback(self.downloadError)

	def getFileSize(self, data):
		if isDreamboxOS:
			raw = re.findall('<a href="/einfall/serienrecorder/releases/download/v.*?/enigma2-plugin-extensions-serienrecorder_.*?_all.deb".*?aria-label="(.*?)">enigma2-plugin-extensions-serienrecorder_.*?_all.deb</span>',data,re.S)
		else:
			raw = re.findall('<a href="/einfall/serienrecorder/releases/download/v.*?/enigma2-plugin-extensions-serienrecorder_.*?_all.ipk".*?aria-label="(.*?)">enigma2-plugin-extensions-serienrecorder_.*?_all.ipk</span>',data,re.S)
		if len(raw):
			self.fileSize = int(float(raw[0].replace("MB", "").strip()) * 1024.0)
		else:
			self.fileSize = 5 * 1024

	def downloadFinished(self, data):
		self.downloadDone = True
		self.activity = 0
		self.status.setText("")

		if fileExists(self.file_name):
			self['srlog'].setText("Starte Update, bitte warten...")
			if isDreamboxOS:
				self.stdoutAvail_conn = self.container.stdoutAvail.connect(self.srlog)
				self.appClosed_conn = self.container.appClosed.connect(self.finishedPluginUpdate)
				self.container.execute("apt-get update && dpkg -i %s && apt-get -f install" % str(self.file_name))
			else:
				self.container.stdoutAvail.append(self.srlog)
				self.container.appClosed.append(self.finishedPluginUpdate)
				self.container.execute("opkg update && opkg install --force-overwrite --force-depends --force-downgrade %s" % str(self.file_name))
		else:
			self.downloadError()

	def downloadError(self):
		self.stopActivityTimer()
		writeErrorLog("   SerienRecorderUpdateScreen():\n   Url: %s" % self.target)
		self.session.open(MessageBox, "[SerienRecorder]\nDer Download ist fehlgeschlagen.\nDie Installation wurde abgebrochen.", MessageBox.TYPE_INFO)
		self.close()

	def finishedPluginUpdate(self,retval):
		self.stopActivityTimer()
		if fileExists(self.file_name):
			os.remove(self.file_name)
		self.session.openWithCallback(self.restartGUI, MessageBox, "SerienRecorder wurde erfolgreich aktualisiert!\nWollen Sie jetzt Enigma2 GUI neu starten?", MessageBox.TYPE_YESNO)

	def restartGUI(self, answer):
		config.plugins.serienRec.showStartupInfoText.value = True
		config.plugins.serienRec.showStartupInfoText.save()
		configfile.save()

		if answer:
			self.session.open(Screens.Standby.TryQuitMainloop, 3)
		else:
			self.close()

	def srlog(self,string):
		self['srlog'].setText(string)
コード例 #18
0
class UpdatePlugin(Screen):
    def __init__(self, session, *args):
        Screen.__init__(self, session)
        Screen.setTitle(self, _("Software Update"))

        self.sliderPackages = {"dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3}

        self.setTitle(_("Software update"))

        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        status_msgs = {
            "stable": _("Feeds status:   Stable"),
            "unstable": _("Feeds status:   Unstable"),
            "updating": _("Feeds status:   Updating"),
            "unknown": _("No connection"),
        }
        self["tl_off"] = Pixmap()
        self["tl_red"] = Pixmap()
        self["tl_yellow"] = Pixmap()
        self["tl_green"] = Pixmap()
        self.feedsStatus()
        self["feedStatusMSG"] = Label(status_msgs[self.trafficLight])

        self.channellist_only = 0
        self.channellist_name = ""
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.checkNetworkState()

    def feedsStatus(self):
        from urllib import urlopen
        import socket

        self["tl_red"].hide()
        self["tl_yellow"].hide()
        self["tl_green"].hide()
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        try:
            d = urlopen("http://openvix.co.uk/TrafficLightState.php")
            self.trafficLight = d.read()
            if self.trafficLight == "unstable":
                self["tl_off"].hide()
                self["tl_red"].show()
            elif self.trafficLight == "updating":
                self["tl_off"].hide()
                self["tl_yellow"].show()
            elif self.trafficLight == "stable":
                self["tl_off"].hide()
                self["tl_green"].show()
            else:
                self.trafficLight = "unknown"
                self["tl_off"].show()
        except:
            self.trafficLight = "unknown"
            self["tl_off"].show()
        socket.setdefaulttimeout(currentTimeoutDefault)

    def checkNetworkState(self):
        cmd1 = "opkg update"
        self.CheckConsole = Console()
        self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

    def checkNetworkStateFinished(self, result, retval, extra_args=None):
        if "bad address" in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("Your %s %s is not connected to the internet, please check your network settings and try again.")
                % (getMachineBrand(), getMachineName()),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True,
            )
        elif ("wget returned 1" or "wget returned 255" or "404 Not Found") in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _(
                    "Sorry feeds are down for maintenance, please try again later. If this issue persists please check openvix.co.uk or world-of-satellite.com."
                ),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True,
            )
        elif "Collected errors" in result:
            self.session.openWithCallback(
                self.close,
                MessageBox,
                _("A background update check is in progress, please wait a few minutes and try again."),
                type=MessageBox.TYPE_INFO,
                timeout=10,
                close_on_any_key=True,
            )
        else:
            self.startCheck()

    def startCheck(self):
        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.exit, "back": self.exit}, -1)

        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext(
                "Update completed, %d package was installed.",
                "Update completed, %d packages were installed.",
                self.packages,
            )
            % self.packages
        )

    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") + ": %s/%s" % (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
                self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback,
                    MessageBox,
                    _(
                        "A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                    )
                    % param,
                )
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                from urllib import urlopen
                import socket

                currentTimeoutDefault = socket.getdefaulttimeout()
                socket.setdefaulttimeout(3)
                status = urlopen("http://www.openvix.co.uk/feeds/status").read()
                if "404 Not Found" in status:
                    status = "1"
                config.softwareupdate.updateisunstable.setValue(status)
                socket.setdefaulttimeout(currentTimeoutDefault)
                self.total_packages = None
                if config.softwareupdate.updateisunstable.value == "1" and config.softwareupdate.updatebeta.value:
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = (
                        _("The current update may be unstable")
                        + "\n"
                        + _("Are you sure you want to update your %s %s ?") % (getMachineBrand(), getMachineName())
                        + "\n("
                        + (
                            ngettext(
                                "%s updated package available", "%s updated packages available", self.total_packages
                            )
                            % self.total_packages
                        )
                        + ")"
                    )
                elif config.softwareupdate.updateisunstable.value == "0":
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = (
                        _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName())
                        + "\n("
                        + (
                            ngettext(
                                "%s updated package available", "%s updated packages available", self.total_packages
                            )
                            % self.total_packages
                        )
                        + ")"
                    )
                if self.total_packages:
                    global ocram
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith("enigma2-plugin-picons-tv-ocram"):
                            ocram = (
                                ocram
                                + "[ocram-picons] "
                                + package_tmp[0].split("enigma2-plugin-picons-tv-ocram.")[1]
                                + "updated "
                                + package_tmp[2]
                                + "\n"
                            )
                        elif package_tmp[0].startswith("enigma2-plugin-settings-ocram"):
                            ocram = (
                                ocram
                                + "[ocram-settings] "
                                + package_tmp[0].split("enigma2-plugin-picons-tv-ocram.")[1]
                                + "updated "
                                + package_tmp[2]
                                + "\n"
                            )
                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_("View the changes"), "changes"), (_("Upgrade and reboot system"), "cold")]
                    if path.exists("/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo"):
                        if (
                            not config.softwareupdate.autosettingsbackup.value
                            and config.backupmanager.backuplocation.value
                        ):
                            choices.append(
                                (
                                    _("Perform a settings backup,")
                                    + "\n\t"
                                    + _("making a backup before updating")
                                    + "\n\t"
                                    + _("is strongly advised."),
                                    "backup",
                                )
                            )
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_("Perform a full image backup"), "imagebackup"))
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append((_("Cancel"), ""))
                    upgrademessage = self.session.openWithCallback(
                        self.startActualUpgrade,
                        ChoiceBox,
                        title=message,
                        list=choices,
                        skin_name="SoftwareUpdateChoices",
                        var=self.trafficLight,
                    )
                    upgrademessage.setTitle(_("Software update"))
                else:
                    upgrademessage = self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("Nothing to upgrade"),
                        type=MessageBox.TYPE_INFO,
                        timeout=10,
                        close_on_any_key=True,
                    )
                    upgrademessage.setTitle(_("Software update"))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(_("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {"package": self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {"package": self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s."
                ) % (getMachineBrand(), getMachineName(), getMachineBrand(), getMachineName())
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _("Update failed. Your %s %s does not have a working internet connection.") % (
                        getMachineBrand(),
                        getMachineName(),
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if "enigma2-plugin-settings-" in param[0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
                # print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return

        if answer[1] == "menu":
            if config.softwareupdate.updateisunstable.value == "1":
                message = (
                    _("The current update may be unstable")
                    + "\n"
                    + _("Are you sure you want to update your %s %s ?") % (getMachineBrand(), getMachineName())
                    + "\n(%s " % self.total_packages
                    + _("Packages")
                    + ")"
                )
            elif config.softwareupdate.updateisunstable.value == "0":
                message = (
                    _("Do you want to update your %s %s ?") % (getMachineBrand(), getMachineName())
                    + "\n(%s " % self.total_packages
                    + _("Packages")
                    + ")"
                )
            choices = [(_("View the changes"), "changes"), (_("Upgrade and reboot system"), "cold")]
            if (
                not self.SettingsBackupDone
                and not config.softwareupdate.autosettingsbackup.value
                and config.backupmanager.backuplocation.value
            ):
                choices.append(
                    (_("Perform a settings backup, making a backup before updating is strongly advised."), "backup")
                )
            if (
                not self.ImageBackupDone
                and not config.softwareupdate.autoimagebackup.value
                and config.imagemanager.backuplocation.value
            ):
                choices.append((_("Perform a full image backup"), "imagebackup"))
            choices.append((_("Update channel list only"), "channels"))
            choices.append((_("Cancel"), ""))
            upgrademessage = self.session.openWithCallback(
                self.startActualUpgrade,
                ChoiceBox,
                title=message,
                list=choices,
                skin_name="SoftwareUpdateChoices",
                var=self.trafficLight,
            )
            upgrademessage.setTitle(_("Software update"))
        elif answer[1] == "changes":
            self.session.openWithCallback(self.startActualUpgrade, SoftwareUpdateChanges)
        elif answer[1] == "backup":
            self.doSettingsBackup()
        elif answer[1] == "imagebackup":
            self.doImageBackup()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST, args={"installed_only": True})
        elif answer[1] == "cold":
            if (config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value) or (
                config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value
            ):
                self.doAutoBackup()
            else:
                self.session.open(TryQuitMainloop, retvalue=42)
                self.close()

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles

        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext("vix", "Backup Manager"):
                break
        self.showJobView(job)

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup

        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext("vix", "Image Manager"):
                break
        self.showJobView(job)

    def doAutoBackup(self, val=False):
        self.autobackuprunning = True
        if (
            config.softwareupdate.autosettingsbackup.value
            and config.backupmanager.backuplocation.value
            and not self.SettingsBackupDone
        ):
            self.doSettingsBackup()
        elif (
            config.softwareupdate.autoimagebackup.value
            and config.imagemanager.backuplocation.value
            and not self.ImageBackupDone
        ):
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext("vix", "Image Manager"):
            self.ImageBackupDone = True
        elif job.name == dgettext("vix", "Backup Manager"):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView

        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(
                self.startActualUpgrade(("menu", "menu")),
                JobView,
                job,
                cancelable=False,
                backgroundable=False,
                afterEventChangeable=False,
                afterEvent="close",
            )
        else:
            self.session.openWithCallback(
                self.doAutoBackup,
                JobView,
                job,
                cancelable=False,
                backgroundable=False,
                afterEventChangeable=False,
                afterEvent="close",
            )

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer,
                    MessageBox,
                    _("Upgrade finished.")
                    + " "
                    + _("Do you want to reboot your %s %s") % (getMachineBrand(), getMachineName()),
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
コード例 #19
0
class PurePrestigeFlashBackupUpdateCheck(Screen):
    try:
        sz_w = getDesktop(0).size().width()
    except:
        sz_w = 720

    if sz_w == 1280:
        skin = '\n        <screen name="PPFlashBackupUpdateCheck" position="center,center" size="1280,720" title="Software update">\n        <widget source="Title" render="Label" position="80,80" size="450,30" zPosition="3" font="Regular;22" transparent="1"/>\n        <widget source="session.VideoPicture" render="Pig"  position="80,120" size="380,215" zPosition="3" backgroundColor="#ff000000"/>\n        <widget source="package" render="Label" position="550,130" size="660,28" font="Regular;24" backgroundColor="#25062748" transparent="1"/>\n        <widget source="status" render="Label" position="550,170" size="660,56" font="Regular;24" backgroundColor="#25062748" transparent="1"/>\n        <widget name="slider" position="550,290" size="660,20" borderWidth="1" transparent="1"/>\n        <widget name="activityslider" position="43,670" size="1194,6" transparent="1"/>\n        </screen>'
    elif sz_w == 1024:
        skin = '\n        <screen name="PPFlashBackupUpdateCheck" position="center,center" size="1024,576" title="Software update">\n        <widget name="activityslider" position="0,0" size="550,5"/>\n        <widget name="slider" position="0,150" size="550,30"/>\n        <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>\n        <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>\n        </screen>'
    else:
        skin = '\n        <screen name="PPFlashBackupUpdateCheck" position="center,center" size="550,300" title="Software update" >\n        <widget name="activityslider" position="0,0" size="550,5"/>\n        <widget name="slider" position="0,150" size="550,30"/>\n        <widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>\n        <widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1"/>\n        </screen>'

    def __init__(self, session, args=None):
        Screen.__init__(self, session)
        self.sliderPackages = {
            'dreambox-dvb-modules': 1,
            'enigma2': 2,
            'tuxbox-image-info': 3
        }
        self.slider = Slider(0, 4)
        self['slider'] = self.slider
        self.activityslider = Slider(0, 100)
        self['activityslider'] = self.activityslider
        self.status = StaticText(_('Upgrading Dreambox... Please wait'))
        self['status'] = self.status
        self.package = StaticText()
        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.activityTimer.start(100, False)
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.updating = True
        self.package.setText(_('Package list update'))
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        self['actions'] = ActionMap(['WizardActions'], {
            'ok': self.exit,
            'back': self.exit
        }, -1)

    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 param in self.sliderPackages:
                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:
            if config.plugins.SoftwareManager.overwriteConfigFiles.value in (
                    'N', 'Y'):
                self.ipkg.write(
                    True and
                    config.plugins.SoftwareManager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _('A configuration file (%s) was modified since Installation.\nDo you want to keep your version?'
                      ) % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                                   args={'test_only': False})
            elif self.error == 0:
                self.slider.setValue(4)
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                self.package.setText('')
                self.status.setText(
                    _('Done - Installed or upgraded %d packages') %
                    self.packages + '\n\n' + self.oktext)
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    'your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.'
                )
                if self.packages == 0:
                    error = _(
                        'No packages were upgraded yet. So you can check your network and try again.'
                    )
                if self.updating:
                    error = _(
                        "Your dreambox 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 exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _('Upgrade finished.') + ' ' +
                    _('Do you want to reboot your Dreambox?'))
            else:
                self.close()

    def exitAnswer(self, result):
        if result != None and result:
            quitMainloop(2)
        self.close()
        return

    def cancel(self):
        self.close(None)
        return
コード例 #20
0
class UpdatePlugin(Screen, ProtectedScreen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		ProtectedScreen.__init__(self)

		self.sliderPackages = { "enigma2": 1, "openvision": 2 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None

		self.channellist_only = 0
		self.channellist_name = ''
		self.updating = False
		self.opkg = OpkgComponent()
		self.opkg.addCallback(self.opkgCallback)
		self.onClose.append(self.__close)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.checkTraficLight)
		self.activityTimer.callback.append(self.doActivityTimer)
		self.activityTimer.start(100, True)

	def isProtected(self):
		return config.ParentalControl.setuppinactive.value and\
			(not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
			config.ParentalControl.config_sections.software_update.value

	def checkTraficLight(self):
		self.activityTimer.callback.remove(self.checkTraficLight)
		self.activityTimer.start(100, False)
		status = None
		message = None
		abort = False
		picon = MessageBox.TYPE_ERROR
		url = "https://openvision.tech/trafficlight"

		# try to fetch the trafficlight json from the website
		try:
			status = dict(json.load(urlopen(url, timeout=5)))
			print("[SoftwareUpdate] status is: ", status)
		except:
			pass

		# process the status fetched
		if status is not None:

			try:
				# get image version and machine name
				machine = getBoxType()
				version = open("/etc/issue").readlines()[-2].split()[1]

				# do we have an entry for this version
				if version in status and machine in status[version]['machines']:
					if 'abort' in status[version]:
						abort = status[version]['abort']
					if 'from' in status[version]:
						starttime = datetime.datetime.strptime(status[version]['from'], '%Y%m%d%H%M%S')
					else:
						starttime = datetime.datetime.now()
					if 'to' in status[version]:
						endtime = datetime.datetime.strptime(status[version]['to'], '%Y%m%d%H%M%S')
					else:
						endtime = datetime.datetime.now()
					if (starttime <= datetime.datetime.now() and endtime >= datetime.datetime.now()):
						message = str(status[version]['message'])

				# check if we have per-language messages
				if type(message) is dict:
					lang = language.getLanguage()
					if lang in message:
						message = message[lang]
					elif 'en_EN' in message:
						message = message['en_EN']
					else:
						message =  _("The current image might not be stable.\nFor more information see %s.") % ("openvision.tech")

			except Exception as e:
				print("[SoftwareUpdate] status error: ", str(e))
				message =  _("The current image might not be stable.\nFor more information see %s.") % ("openvision.tech")

		# or display a generic warning if fetching failed
		else:
			message = _("The status of the current image could not be checked because %s can not be reached.") % ("openvision.tech")

		# show the user the message first
		if message is not None:
			if abort:
				self.session.openWithCallback(self.close, MessageBox, message, type=MessageBox.TYPE_ERROR, picon = picon)
			else:
				message += "\n\n" + _("Do you want to update your receiver?")
				self.session.openWithCallback(self.startActualUpdate, MessageBox, message, picon = picon)

		# no message, continue with the update
		else:
			self.startActualUpdate(True)

	def getLatestImageTimestamp(self):
		def gettime(url):
			try:
				return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(calendar.timegm(urlopen("%s/Packages.gz" % url).info().getdate('Last-Modified'))-time.altzone))
			except:
				return ""
		return sorted([gettime(open("/etc/opkg/%s" % file, "r").readlines()[0].split()[2]) for file in os.listdir("/etc/opkg") if not file.startswith("3rd-party") and file not in ("arch.conf", "opkg.conf", "picons-feed.conf")], reverse=True)[0]

	def startActualUpdate(self,answer):
		if answer:
			self.updating = True
			self.opkg.startCmd(OpkgComponent.CMD_UPDATE)
		else:
			self.close()

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	def opkgCallback(self, event, param):
		if event == OpkgComponent.EVENT_DOWNLOAD:
			self.status.setText(_("Downloading"))
		elif event == OpkgComponent.EVENT_UPGRADE:
			if param in self.sliderPackages:
				self.slider.setValue(self.sliderPackages[param])
			self.package.setText(param)
			self.status.setText(_("Updating") + ": %s/%s" % (self.packages, self.total_packages))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event == OpkgComponent.EVENT_INSTALL:
			self.package.setText(param)
			self.status.setText(_("Installing"))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event == OpkgComponent.EVENT_REMOVE:
			self.package.setText(param)
			self.status.setText(_("Removing"))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event == OpkgComponent.EVENT_CONFIGURING:
			self.package.setText(param)
			self.status.setText(_("Configuring"))
		elif event == OpkgComponent.EVENT_MODIFIED:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.opkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == OpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == OpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.opkg.startCmd(OpkgComponent.CMD_UPGRADE_LIST)
			elif self.opkg.currentCommand == OpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.opkg.getFetchedList())
				if self.total_packages:
					latestImageTimestamp = self.getLatestImageTimestamp()
					if latestImageTimestamp:
						message = _("Do you want to update your receiver to %s?") % latestImageTimestamp + "\n"
					else:
						message = _("Do you want to update your receiver?") + "\n"
					message += "(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					if self.total_packages > 150:
						choices = [(_("Update and reboot"), "cold")]
						message += " " + _("Reflash recommended!")
					else:
						choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot")]
					choices.append((_("Update channel list only"), "channels"))
					choices.append((_("Show packages to be updated"), "showlist"))
				else:
					message = _("No updates available")
					choices = []
				if fileExists("/home/root/opkgupgrade.log"):
					choices.append((_("Show latest update log"), "log"))
				choices.append((_("Show latest commits"), "commits"))
				choices.append((_("Cancel"), ""))
				self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, windowTitle=self.title)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.opkg.startCmd(OpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.opkg.startCmd(OpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your receiver does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event == OpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print(event, "-", param)
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.opkg.startCmd(OpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "commits":
			self.session.openWithCallback(boundFunction(self.opkgCallback, OpkgComponent.EVENT_DONE, None), CommitInfo)
		elif answer[1] == "showlist":
			text = "\n".join([x[0] for x in sorted(self.opkg.getFetchedList(), key=lambda d: d[0])])
			self.session.openWithCallback(boundFunction(self.opkgCallback, OpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages to update"), True)
		elif answer[1] == "log":
			text = open("/home/root/opkgupgrade.log", "r").read()
			self.session.openWithCallback(boundFunction(self.opkgCallback, OpkgComponent.EVENT_DONE, None), TextBox, text, _("Latest update log"), True)
		else:
			self.opkg.startCmd(OpkgComponent.CMD_UPGRADE, args = {'test_only': False})

	def modificationCallback(self, res):
		self.opkg.write(res and "N" or "Y")

	def exit(self):
		if not self.opkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Update completed. Do you want to reboot your receiver?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()

	def __close(self):
		self.opkg.removeCallback(self.opkgCallback)
コード例 #21
0
ファイル: Ipkg.py プロジェクト: ahmedmoselhi/dvbapp2
class Ipkg(Screen):

    def __init__(self, session, cmdList = None):
        if not cmdList:
            cmdList = []
        Screen.__init__(self, session)
        self.setTitle(_('Installing Software...'))
        self.cmdList = cmdList
        self.sliderPackages = {}
        self.slider = Slider(0, len(cmdList))
        self['slider'] = self.slider
        self.activityslider = Slider(0, 100)
        self['activityslider'] = self.activityslider
        self.status = Label(_('Preparing... Please wait'))
        self['status'] = self.status
        self.package = Label()
        self['package'] = self.package
        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.runningCmd = None
        self.runNextCmd()
        self['actions'] = ActionMap(['WizardActions'], {'ok': self.exit,
         'back': self.exit}, -1)

    def runNextCmd(self):
        if self.runningCmd is None:
            self.runningCmd = 0
        else:
            self.runningCmd += 1
        print len(self.cmdList), self.runningCmd
        if len(self.cmdList) - 1 < self.runningCmd:
            self.activityslider.setValue(0)
            self.slider.setValue(len(self.cmdList))
            self.package.setText('')
            self.status.setText(ngettext('Done - Installed, upgraded or removed %d package (%s)', 'Done - Installed, upgraded or removed %d packages (%s)', self.packages) % (self.packages, ngettext('with %d error', 'with %d errors', self.error) % self.error))
            return False
        cmd = self.cmdList[self.runningCmd]
        self.slider.setValue(self.runningCmd)
        self.ipkg.startCmd(cmd[0], args=cmd[1])
        self.startActivityTimer()

    def doActivityTimer(self):
        if not self.ipkg.isRunning():
            self.stopActivityTimer()
        else:
            self.activity += 1
            if self.activity == 100:
                self.activity = 0
            self.activityslider.setValue(self.activity)

    def startActivityTimer(self):
        self.activityTimer.start(100, False)

    def stopActivityTimer(self):
        self.activityTimer.stop()

    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_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            self.runNextCmd()
        elif event == IpkgComponent.EVENT_MODIFIED:
            self.session.openWithCallback(self.modificationCallback, MessageBox, _('A configuration file (%s) was modified since Installation.\nDo you want to keep your version?') % param)

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

    def exit(self):
        if not self.ipkg.isRunning():
            self.close()
コード例 #22
0
ファイル: Ipkg.py プロジェクト: linuxbox10/e2-vix
class Ipkg(Screen):
    def __init__(self, session, cmdList=None):
        if not cmdList: cmdList = []
        Screen.__init__(self, session)

        self.cmdList = cmdList

        self.sliderPackages = {}

        self.slider = Slider(0, len(cmdList))
        self["slider"] = self.slider
        self.activityslider = Slider(0, 100)
        self["activityslider"] = self.activityslider
        self.status = Label(_("Preparing... Please wait"))
        self["status"] = self.status
        self.package = Label()
        self["package"] = self.package

        self.packages = 0
        self.error = 0
        self.processed_packages = []

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)
        #self.activityTimer.start(100, False)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)

        self.runningCmd = None
        self.runNextCmd()

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

    def runNextCmd(self):
        if self.runningCmd is None:
            self.runningCmd = 0
        else:
            self.runningCmd += 1
        print len(self.cmdList), self.runningCmd
        if len(self.cmdList) - 1 < self.runningCmd:
            self.activityslider.setValue(0)
            self.slider.setValue(len(self.cmdList))

            self.package.setText("")
            self.status.setText(
                ngettext(
                    "Done - Installed, upgraded or removed %d package (%s)",
                    "Done - Installed, upgraded or removed %d packages (%s)",
                    self.packages) %
                (self.packages,
                 ngettext("with %d error", "with %d errors", self.error) %
                 self.error))
            return False
        else:
            cmd = self.cmdList[self.runningCmd]
            self.slider.setValue(self.runningCmd)
            self.ipkg.startCmd(cmd[0], args=cmd[1])
            self.startActivityTimer()

    def doActivityTimer(self):
        if not self.ipkg.isRunning():
            self.stopActivityTimer()
        else:
            self.activity += 1
            if self.activity == 100:
                self.activity = 0
            self.activityslider.setValue(self.activity)

    def startActivityTimer(self):
        self.activityTimer.start(100, False)

    def stopActivityTimer(self):
        self.activityTimer.stop()

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if param in self.sliderPackages:
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(_("Upgrading"))
            if not param 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 not param 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 not param 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_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            self.runNextCmd()
        elif event == IpkgComponent.EVENT_MODIFIED:
            self.session.openWithCallback(
                self.modificationCallback, MessageBox,
                _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?"
                  ) % param)

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

    def exit(self):
        if not self.ipkg.isRunning():
            self.close()
コード例 #23
0
ファイル: plugin.py プロジェクト: Dima73/oe-alliance-plugins
class UpgradeStatus(Screen):
	skin = 	"""
		<screen position="center,center" size="450,130" title=" ">
			<widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
			<widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
			<widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/>
			<widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
		</screen>
		"""

	def __init__(self, session, parent, firmware, datafile, device):
		Screen.__init__(self,session)
		self.session = session

		self["actions"] = ActionMap(["OkCancelActions"],
                {
			"ok": self.keyExit,
                }, -1)

		self.firmware = firmware
		self.datafile = datafile
		#print "[FirmwareUpgrade] - [%s][%s][%s]" % (self.datafile, firmware, device)

		self["name"] = Label(" ")
		self["info"] = StaticText(_("Can't cancel during upgrade!!"))

		self["status"] = Label(_("Status : 0%"))

		self.slider = Slider(0, 100)
		self["slider"] = self.slider

		self.callback = None

		self.setTitle(firmware.upper() + " Upgrade Status")

		self.FU = FirmwareUpgradeManager()

		self.old_status   = 0
		self.status_exit  = None
		self.check_status = eTimer()
		self.check_status.callback.append(self.cbCheckStatus)
		self.check_status.start(self.FU.getInterval())

		self.exitTimerCallCount = 0;
		self.upgradeLock = True
		self.FU.startUpgrade(self.datafile, device, firmware)

	def cbCheckStatus(self):
		errmsg = ""
		errno  = self.FU.checkError()
		if errno:
			self.check_status.stop()
			errmsg = self.FU.getErrorMessage(errno, errmsg)
			print "[FirmwareUpgrade] - ERROR : [%d][%s]" % (errno, errmsg)
			self.session.open(MessageBox, _(errmsg), MessageBox.TYPE_INFO, timeout = 10)
			self.cbConfirmExit(False)
			return
		status = self.FU.getStatus()
		if self.old_status > status and status != -1:
			self.session.open(MessageBox, _("Fail to upgrade!! Retry!!"), MessageBox.TYPE_INFO, timeout = 10)
		self.slider.setValue(status)
		self["status"].setText(_("%d / 100" % (status)))
		if status == 100:
			self.check_status.stop()
			self["status"].setText(_("Success. Press OK to exit."))
			self.status_exit = eTimer()
			self.status_exit.callback.append(self.cbTimerExit)
			self.status_exit.start(1000)
			self.upgradeLock = False
		self.old_status = status

	def setCallback(self, cb):
		self.callback = cb

	def cbTimerExit(self):
		if self.exitTimerCallCount < 10: # exit after 10 sec.
			self.exitTimerCallCount = self.exitTimerCallCount + 1
			self.setTitle("%s Upgrade Status (%d)" % (self.firmware.upper(), 10-self.exitTimerCallCount))
			return
		if self.status_exit is not None:
			self.status_exit.stop()
		self.keyExit()

	def cbConfirmExit(self, ret):
		if ret:
			os.system("rm -f %s %s.md5" % (self.datafile, self.datafile))
		self.close()

	def keyExit(self):
		if self.upgradeLock:
			return
		if self.callback is not None:
			self.callback("Reboot now for a successful upgrade.", True)
		self.session.openWithCallback(self.cbConfirmExit, MessageBox, _("Do you want to remove binary data?"), MessageBox.TYPE_YESNO, timeout = 10, default = False)
コード例 #24
0
ファイル: UpdatePlugin.py プロジェクト: aitchala/enigma2
class UpdatePlugin(Screen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="620,160" title="Software update">
			<widget name="activityslider" position="10,10" size="600,10"  borderWidth="2" borderColor="#cccccc"/>
			<widget source="package" render="Label" position="10,40" size="600,25" font="Regular;22" />
			<widget source="status" render="Label" position="10,70" size="600,45" font="Regular;22" />
			<widget name="slider" position="10,140" size="600,12" borderWidth="2" borderColor="#cccccc" />
		</screen>"""

    def __init__(self, session, args=None):
        Screen.__init__(self, session)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 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.modified_packages = []

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer_conn = self.activityTimer.timeout.connect(
            self.doActivityTimer)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)

        self.updating = False
        self.rebootRequired = False
        self.device_name = iSoftwareTools.hardware_info.device_name

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.checkNetwork()
        self.onClose.append(self.cleanup)

    def cleanup(self):
        iSoftwareTools.cleanupSoftwareTools()

    def checkNetwork(self):
        if eNetworkManager.getInstance().online():
            self.updating = True
            self.activityTimer.start(100, False)
            self.package.setText(_("Package list update"))
            self.status.setText(_("Upgrading Dreambox... Please wait"))
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        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 not param 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 not param 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 not param 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_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                iSoftwareTools.listUpgradable(self.listUpgradableCB)
            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 dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox."
                )
                if self.packages == 0:
                    error = _(
                        "No packages were upgraded yet. So you can check your network and try again."
                    )
                if self.updating:
                    error = _(
                        "Your dreambox isn't connected to the internet properly. Please check it and try again."
                    )
                self.status.setText(_("Error") + " - " + error)
        #print event, "-", param
        pass

    def listUpgradableCB(self, res):
        if iSoftwareTools.upgradeAvailable is False:
            self.updating = False
            self.slider.setValue(4)
            self.activityTimer.stop()
            self.activityslider.setValue(0)
            self.package.setText(_("Done - No updates available."))
            self.status.setText(self.oktext)
        else:
            self.updating = False
            upgrade_args = {'use_maintainer': True, 'test_only': False}
            if config.plugins.softwaremanager.overwriteConfigFiles.value == 'N':
                upgrade_args = {'use_maintainer': False, 'test_only': False}
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args=upgrade_args)

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0:
                self.session.openWithCallback(
                    self.exitReboot, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your Dreambox?"))
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitReboot(self, result):
        if result:
            quitMainloop(2)
        self.close()

    def exitRestart(self, result):
        if result:
            quitMainloop(3)
        self.close()
コード例 #25
0
class UpdatePlugin(Screen, ProtectedScreen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)

        self.sliderPackages = {"enigma2": 1, "tuxbox-image-info": 2}

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None

        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

    def checkTraficLight(self):
        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)
        message = ""
        picon = None
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            url = "https://openvision.tech/status/"
            try:
                status = urlopen(url, timeout=5).read().split('!', 1)
            except:
                # OpenPli 5.0 uses python 2.7.11 and here we need to bypass the certificate check
                from ssl import _create_unverified_context
                status = urlopen(
                    url, timeout=5,
                    context=_create_unverified_context()).read().split('!', 1)
                print status
            if getBoxType() in status[0].split(','):
                message = len(status) > 1 and status[1] or _(
                    "The current image might not be stable.\nFor more information see %s."
                ) % ("openvision.tech")
                # strip any HTML that may be in the message, but retain line breaks
                import re
                message = message.replace("<br />",
                                          "\n\n").replace("<br>", "\n\n")
                message = re.sub('<[^<]+?>', '',
                                 re.sub('&#8209;', '-', message))
                picon = MessageBox.TYPE_ERROR
        except:
            message = _(
                "The status of the current image could not be checked because %s can not be reached."
            ) % ("openvision.tech")
            picon = MessageBox.TYPE_ERROR
        if message != "":
            message += "\n" + _("Do you want to update your receiver?")
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          picon=picon)
        else:
            self.startActualUpdate(True)

    def getLatestImageTimestamp(self):
        def gettime(url):
            try:
                return str(
                    datetime.datetime.strptime(
                        urlopen("%s/Packages.gz" %
                                url).info()["Last-Modified"],
                        '%a, %d %b %Y %H:%M:%S %Z'))
            except:
                return ""

        return sorted([
            gettime(
                open("/etc/opkg/%s" % file, "r").readlines()[0].split()[2])
            for file in os.listdir("/etc/opkg")
            if not file.startswith("3rd-party") and file not in ("arch.conf",
                                                                 "opkg.conf")
        ],
                      reverse=True)[0]

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if param in self.sliderPackages:
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(
                _("Upgrading") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    latestImageTimestamp = self.getLatestImageTimestamp()
                    if latestImageTimestamp:
                        message = _(
                            "Do you want to update your receiver to %s?"
                        ) % latestImageTimestamp + "\n"
                    else:
                        message = _(
                            "Do you want to update your receiver?") + "\n"
                    message += "(" + (ngettext(
                        "%s updated package available",
                        "%s updated packages available", self.total_packages) %
                                      self.total_packages) + ")"
                    if self.total_packages > 150:
                        choices = [(_("Update and reboot"), "cold")]
                        message += " " + _("Reflash recommended!")
                    else:
                        choices = [(_("Update and reboot (recommended)"),
                                    "cold"),
                                   (_("Update and ask to reboot"), "hot")]
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append(
                        (_("Show packages to be upgraded"), "showlist"))
                else:
                    message = _("No updates available")
                    choices = []
                if fileExists("/home/root/ipkgupgrade.log"):
                    choices.append((_("Show latest upgrade log"), "log"))
                choices.append((_("Show latest commits"), "commits"))
                choices.append((_("Cancel"), ""))
                self.session.openWithCallback(self.startActualUpgrade,
                                              ChoiceBox,
                                              title=message,
                                              list=choices,
                                              windowTitle=self.title)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your receiver does not have a working internet connection."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "commits":
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), CommitInfo)
        elif answer[1] == "showlist":
            text = "\n".join([
                x[0]
                for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])
            ])
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Packages to update"), True)
        elif answer[1] == "log":
            text = open("/home/root/ipkgupgrade.log", "r").read()
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Latest upgrade log"), True)
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Update completed. Do you want to reboot your receiver?")
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #26
0
class AirPlayMusicPlayer(Screen):
    def __init__(self, session, backend, message, lastservice=None):
        self.backend = backend
        backend.MusicWindow = self
        self.session = session
        self.skinName = 'AirPlayMusicPlayer'
        print('[AirPlayMusicPlayer] starting AirTunesPlayer')
        Screen.__init__(self, session)
        self['actions'] = ActionMap(['OkCancelActions', 'MoviePlayerActions'],
                                    {
                                        'cancel': self.Exit,
                                        'leavePlayer': self.Exit
                                    }, -1)
        self['label_message'] = Label()
        self['label_message'].setText(message)
        self['label_title'] = Label()
        self['label_album'] = Label()
        self['label_interpret'] = Label()
        self['label_title'].setText('No')
        self['label_album'].setText('Metadata')
        self['label_interpret'].setText('')
        self.progress = Slider(0, 100)
        self.progress.setValue(0)
        self['progress'] = self.progress
        self['progress'].setValue(0)
        self.runtime = None
        self.seconds = None
        self.libairtunes = None
        self.lastservice = lastservice or self.session.nav.getCurrentlyPlayingServiceReference(
        )
        self.session.nav.stopService()
        if config.plugins.airplayer.audioBackend.value == 'proxy':
            if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
                self.session.nav.stopService()
                open('/proc/player', 'w').write('0')
                open('/proc/player', 'w').write('2')
            sref = eServiceReference(self.backend.ENIGMA_SERVICE_ID, 0,
                                     'http://127.0.0.1:7098/stream.wav')
            sref.setName('AirTunes')
            self.session.nav.playService(sref)
        self.x_pos = None
        self.y_pos = None
        self.x_dir = 5
        self.y_dir = 5
        self.WindowMoveTimer = eTimer()
        self.WindowMoveTimer.timeout.get().append(self.moveWindow)
        if config.plugins.airplayer.screensaverEnabled.value:
            self.WindowMoveTimer.start(10000, True)
        self['cover'] = Pixmap()
        self.picload = ePicLoad()
        self.picload.PictureData.get().append(self.finish_decode)
        self.onLayoutFinish.append(self.setPicloadConf)
        self.bgcolor = '#00000000'
        self.progressTimer = eTimer()
        self.progressTimer.timeout.get().append(self.progressCallback)
        self.parseMetadata()
        return

    def moveWindow(self):
        try:
            if self.x_pos is None or self.y_pos is None:
                self.x_pos = self.instance.position().x()
                self.y_pos = self.instance.position().y()
            if self.instance.size().width() + 20 >= getDesktop(0).size().width(
            ) and self.instance.size().height() + 20 >= getDesktop(
                    0).size().height():
                return
            self.x_pos += self.x_dir
            self.y_pos += self.y_dir
            if self.x_dir > 0 and self.x_pos + self.instance.size().width(
            ) >= getDesktop(0).size().width():
                self.x_dir = -self.x_dir
            elif self.x_dir < 0 and self.x_pos <= 0:
                self.x_dir = -self.x_dir
            if self.y_dir > 0 and self.y_pos + self.instance.size().height(
            ) >= getDesktop(0).size().height():
                self.y_dir = -self.y_dir
            elif self.y_dir < 0 and self.y_pos <= 0:
                self.y_dir = -self.y_dir
            self.instance.move(ePoint(self.x_pos, self.y_pos))
        except Exception:
            pass

        try:
            self.WindowMoveTimer.start(150, True)
        except Exception:
            pass

        return

    def getScale(self):
        return AVSwitch().getFramebufferScale()

    def parseMetadata(self):
        try:
            if not os.path.exists(config.plugins.airplayer.path.value +
                                  '/metadata.bin'):
                print('[AirPlayMusicPlayer] No Metadata found')
                return
            if self.libairtunes is None:
                self.libairtunes = cdll.LoadLibrary(
                    resolveFilename(SCOPE_PLUGINS,
                                    'Extensions/AirPlayer/libairtunes.so.0'))
                print('[AirPlayMusicPlayer] loading lib done')
            response = create_string_buffer(1024)
            self.libairtunes.getMetadata(
                'asal', config.plugins.airplayer.path.value + '/metadata.bin',
                response)
            if response.value is not None and response.value != '':
                self['label_album'].setText(response.value)
                print('[AirPlayMusicPlayer] album: ', response.value)
            self.libairtunes.getMetadata(
                'minm', config.plugins.airplayer.path.value + '/metadata.bin',
                response)
            if response.value is not None and response.value != '':
                self['label_title'].setText(response.value)
                print('[AirPlayMusicPlayer] title: ', response.value)
            self.libairtunes.getMetadata(
                'asar', config.plugins.airplayer.path.value + '/metadata.bin',
                response)
            if response.value is not None and response.value != '':
                self['label_interpret'].setText(response.value)
                print('[AirPlayMusicPlayer] artist: ', response.value)
        except Exception as e:
            print('[AirPlayMusicPlayer] loading lib failed')
            print(str(e))
            self.libairtunes = None
            return False

        return

    def setProgress(self, seconds, runtime=None):
        self.seconds = seconds
        if runtime is not None:
            self.runtime = runtime
        if self.runtime is not None and self.runtime != 0:
            self.progress.setValue(100 * seconds / self.runtime)
        else:
            self.progress.setValue(0)
        self.progressTimer.stop()
        self.progressTimer.start(1000, True)
        return

    def progressCallback(self):
        if self.seconds is not None:
            self.setProgress(self.seconds + 1)
        return

    def setPicloadConf(self):
        sc = self.getScale()
        self.picload.setPara([
            self['cover'].instance.size().width(),
            self['cover'].instance.size().height(), sc[0], sc[1], 0, 1,
            self.bgcolor
        ])
        if os.path.exists(config.plugins.airplayer.path.value + '/cover.jpg'):
            self.start_decode()
        else:
            self.start_decode(
                resolveFilename(SCOPE_PLUGINS,
                                'Extensions/AirPlayer/cover.png'))

    def ShowCover(self):
        if self.currPic != None:
            self['cover'].instance.setPixmap(self.currPic.__deref__())
        return

    def finish_decode(self, picInfo=''):
        ptr = self.picload.getData()
        if ptr != None:
            self.currPic = ptr
            self.ShowCover()
        return

    def start_decode(self, filename=None):
        if filename is None or filename == '':
            filename = config.plugins.airplayer.path.value + '/cover.jpg'
        self.picload.startDecode(filename)
        return

    def leavePlayer(self):
        self.leavePlayerConfirmed(True)

    def leavePlayerConfirmed(self, answer):
        if answer:
            self.Exit()

    def Exit(self):
        print('[AirPlayMusicPlayer] stopping AirTunesPlayer')
        self.backend.MusicWindow = None
        if self.lastservice and self.lastservice is not None:
            self.backend.updateEventInfo('stopped')
        else:
            print(
                '[AirPlayMusicPlayer] lastService is None, not sending stop command'
            )
        Console().ePopen('killall -9 hairtunes')
        Console().ePopen('killall -9 atproxy')
        try:
            config.av.downmix_ac3.value = self.backend.downmix_ac3
            config.av.downmix_ac3.save()
        except Exception as e:
            print('[AirPlayMusicPlayer] rest downmix failed: ', e)

        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.session.nav.stopService()
            open('/proc/player', 'w').write('1')
            import time
            time.sleep(2)
        if self.lastservice and self.lastservice is not None:
            self.session.nav.playService(self.lastservice)
        eBackgroundFileEraser.getInstance().erase(
            config.plugins.airplayer.path.value + '/cover.jpg')
        eBackgroundFileEraser.getInstance().erase(
            config.plugins.airplayer.path.value + '/metadata.bin')
        self.close()
        return
コード例 #27
0
class AirPlayMusicPlayer(Screen):

    def __init__(self, session, backend, message, lastservice = None):
        self.backend = backend
        backend.MusicWindow = self
        self.session = session
        self.skinName = 'AirPlayMusicPlayer'
        print '[AirPlayMusicPlayer] starting AirTunesPlayer'
        Screen.__init__(self, session)
        self['actions'] = ActionMap(['OkCancelActions', 'MoviePlayerActions'], {'cancel': self.Exit,
         'leavePlayer': self.Exit}, -1)
        self['label_update'] = StaticText('')
        self['label_message'] = Label()
        self['label_message'].setText(message)
        self['label_title'] = Label()
        self['label_album'] = Label()
        self['label_interpret'] = Label()
        self['label_title'].setText('No')
        self['label_album'].setText('Metadata')
        self['label_interpret'].setText('')
        self.progress = Slider(0, 100)
        self.progress.setValue(0)
        self['progress'] = self.progress
        self['progress'].setValue(0)
        self.runtime = None
        self.seconds = None
        self.libairtunes = None
        self.lastservice = lastservice or self.session.nav.getCurrentlyPlayingServiceReference()
        self.session.nav.stopService()
        if config.plugins.airplayer.audioBackend.value == 'proxy':
            if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
                self.session.nav.stopService()
                open('/proc/player', 'w').write('0')
                open('/proc/player', 'w').write('2')
            sref = eServiceReference(self.backend.ENIGMA_SERVICE_ID, 0, 'http://127.0.0.1:7098/stream.wav')
            sref.setName('AirTunes')
            self.session.nav.playService(sref)
        start_new_thread(self.checkForUpdate, (self,))
        self.x_pos = None
        self.y_pos = None
        self.x_dir = 5
        self.y_dir = 5
        self.WindowMoveTimer = eTimer()
        self.WindowMoveTimer.timeout.get().append(self.moveWindow)
        if config.plugins.airplayer.screensaverEnabled.value:
            self.WindowMoveTimer.start(10000, True)
        self['cover'] = Pixmap()
        self.picload = ePicLoad()
        self.picload.PictureData.get().append(self.finish_decode)
        self.onLayoutFinish.append(self.setPicloadConf)
        self.bgcolor = '#00000000'
        self.progressTimer = eTimer()
        self.progressTimer.timeout.get().append(self.progressCallback)
        self.parseMetadata()

    def moveWindow(self):
        try:
            if self.x_pos is None or self.y_pos is None:
                self.x_pos = self.instance.position().x()
                self.y_pos = self.instance.position().y()
            if self.instance.size().width() + 20 >= getDesktop(0).size().width() and self.instance.size().height() + 20 >= getDesktop(0).size().height():
                return
            self.x_pos += self.x_dir
            self.y_pos += self.y_dir
            if self.x_dir > 0 and self.x_pos + self.instance.size().width() >= getDesktop(0).size().width():
                self.x_dir = -self.x_dir
            elif self.x_dir < 0 and self.x_pos <= 0:
                self.x_dir = -self.x_dir
            if self.y_dir > 0 and self.y_pos + self.instance.size().height() >= getDesktop(0).size().height():
                self.y_dir = -self.y_dir
            elif self.y_dir < 0 and self.y_pos <= 0:
                self.y_dir = -self.y_dir
            self.instance.move(ePoint(self.x_pos, self.y_pos))
        except Exception:
            pass

        try:
            self.WindowMoveTimer.start(150, True)
        except Exception:
            pass

    def getScale(self):
        return AVSwitch().getFramebufferScale()

    def parseMetadata(self):
        try:
            if not os.path.exists(config.plugins.airplayer.path.value + '/metadata.bin'):
                print '[AirPlayMusicPlayer] No Metadata found'
                return
            if self.libairtunes is None:
                self.libairtunes = cdll.LoadLibrary('/usr/lib/enigma2/python/Plugins/Extensions/IniAirPlayer/libairtunes.so.0')
                print '[AirPlayMusicPlayer] loading lib done'
            response = create_string_buffer(1024)
            self.libairtunes.getMetadata('asal', config.plugins.airplayer.path.value + '/metadata.bin', response)
            if response.value is not None and response.value != '':
                self['label_album'].setText(response.value)
                print '[AirPlayMusicPlayer] album: ', response.value
            self.libairtunes.getMetadata('minm', config.plugins.airplayer.path.value + '/metadata.bin', response)
            if response.value is not None and response.value != '':
                self['label_title'].setText(response.value)
                print '[AirPlayMusicPlayer] title: ', response.value
            self.libairtunes.getMetadata('asar', config.plugins.airplayer.path.value + '/metadata.bin', response)
            if response.value is not None and response.value != '':
                self['label_interpret'].setText(response.value)
                print '[AirPlayMusicPlayer] artist: ', response.value
        except Exception as e:
            print '[AirPlayMusicPlayer] loading lib failed'
            print e
            self.libairtunes = None
            return False

    def setProgress(self, seconds, runtime = None):
        self.seconds = seconds
        if runtime is not None:
            self.runtime = runtime
        if self.runtime is not None and self.runtime != 0:
            self.progress.setValue(100 * seconds / self.runtime)
        else:
            self.progress.setValue(0)
        self.progressTimer.stop()
        self.progressTimer.start(1000, True)

    def progressCallback(self):
        if self.seconds is not None:
            self.setProgress(self.seconds + 1)

    def setPicloadConf(self):
        sc = self.getScale()
        self.picload.setPara([self['cover'].instance.size().width(),
         self['cover'].instance.size().height(),
         sc[0],
         sc[1],
         0,
         1,
         self.bgcolor])
        if os.path.exists(config.plugins.airplayer.path.value + '/cover.jpg'):
            self.start_decode()
        else:
            self.start_decode('/usr/lib/enigma2/python/Plugins/Extensions/IniAirPlayer/cover.png')

    def ShowCover(self):
        if self.currPic != None:
            self['cover'].instance.setPixmap(self.currPic.__deref__())

    def finish_decode(self, picInfo = ''):
        ptr = self.picload.getData()
        if ptr != None:
            self.currPic = ptr
            self.ShowCover()

    def start_decode(self, filename = None):
        if filename is None or filename == '':
            filename = config.plugins.airplayer.path.value + '/cover.jpg'
        self.picload.startDecode(filename)

    def checkForUpdate(self, *args):
        url = self.backend.updater.checkForUpdate('AirTunes', 3)
        if url != '' and url != 'up to date':
            blockingCallFromMainThread(self['label_update'].setText, 'Update Available')

    def leavePlayer(self):
        self.leavePlayerConfirmed(True)

    def leavePlayerConfirmed(self, answer):
        if answer:
            self.Exit()

    def Exit(self):
        print '[AirPlayMusicPlayer] stopping AirTunesPlayer'
        self.backend.MusicWindow = None
        if self.lastservice and self.lastservice is not None:
            self.backend.updateEventInfo('stopped')
        else:
            print '[AirPlayMusicPlayer] lastService is None, not sending stop command'
        os.system('killall hairtunes')
        os.system('killall atproxy')
        try:
            config.av.downmix_ac3.value = self.backend.downmix_ac3
            config.av.downmix_ac3.save()
        except Exception as e:
            print '[AirPlayMusicPlayer] rest downmix failed: ', e

        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.session.nav.stopService()
            open('/proc/player', 'w').write('1')
            import time
            time.sleep(2)
        if self.lastservice and self.lastservice is not None:
            self.session.nav.playService(self.lastservice)
        eBackgroundFileEraser.getInstance().erase(config.plugins.airplayer.path.value + '/cover.jpg')
        eBackgroundFileEraser.getInstance().erase(config.plugins.airplayer.path.value + '/metadata.bin')
        self.close()
コード例 #28
0
class AirPlayMoviePlayer(MoviePlayer):
    def __init__(self,
                 session,
                 service,
                 backend,
                 start=None,
                 lastservice=None):
        self.backend = backend
        self.startNewServiceOnPlay = False
        self.start = start
        self.service = service
        self.session = session
        self.useProxy = False
        self.url = self.service.getPath()
        self.proxyReady = False
        self.proxyError = False
        self['useProxy'] = Boolean(False)
        self['premiumUser'] = Boolean(False)
        self.azBoxLastService = None
        self.proxyCaching = False
        print '[AirPlayMoviePlayer] MoviePlayer play url: ', self.url
        if self.url[:7] == 'http://' or self.url[:8] == 'https://':
            print '[AirPlayMoviePlayer] found http(s) link'
            if self.checkProxyUsable(
            ) and config.plugins.airplayer.useProxyIfPossible.value:
                print '[AirPlayMoviePlayer] using proxy'
                self.service = None
                self.startNewServiceOnPlay = True
                self.proxyCaching = True
                self.useProxy = True
                self['useProxy'] = Boolean(True)
        if 'm3u8' in self.url and self.useProxy == False:
            Notifications.AddNotification(
                MessageBox,
                _('You are trying to play an m3u8 stream. Playing m3u8 streams requires a Premium-Key to use the embedded proxy or a very new version of GStreamer and the gst-fragmented plugin. Otherwise the playback might not work!'
                  ),
                type=MessageBox.TYPE_INFO,
                timeout=10)
        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.azBoxLastService = lastservice or self.session.nav.getCurrentlyPlayingServiceReference(
            )
            self.session.nav.stopService()
            open('/proc/player', 'w').write('0')
            open('/proc/player', 'w').write('2')
        MoviePlayer.__init__(self, session, self.service)
        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.lastservice = self.azBoxLastService
        backend.MovieWindow = self
        self.skinName = 'AirPlayerMoviePlayer'
        if lastservice is not None:
            self.lastservice = lastservice
        self.bufferslider = Slider(0, 100)
        self.bufferslider.setValue(0)
        self['bufferslider'] = self.bufferslider
        self['bufferslider'].setValue(0)
        self['label_speed'] = StaticText('DL-Speed: N/A')
        self['label_update'] = StaticText('')
        self['label_cache'] = StaticText('Cache: N/A')
        self.endReached = False
        self.localCache = False
        self.dlactive = False
        self.localsize = 0
        self.proxyProcess = None
        self.liveStream = False
        self.m3u8Stream = False
        self['actions'] = ActionMap(
            ['InfobarInstantRecord', 'MoviePlayerActions'], {
                'instantRecord': self.keyStartLocalCache,
                'leavePlayer': self.leavePlayer
            }, -2)
        if config.plugins.airplayer.setSeekOnStart.value and self.start != None and self.start > 0.0:
            start_new_thread(self.seekWatcher, (self, ))
        start_new_thread(self.checkForUpdate, (self, ))
        self.__event_tracker = ServiceEventTracker(
            screen=self,
            eventmap={
                iPlayableService.evUser + 10: self.__evAudioDecodeError,
                iPlayableService.evUser + 11: self.__evVideoDecodeError,
                iPlayableService.evUser + 12: self.__evPluginError,
                iPlayableService.evEOF: self.__evEOF
            })
        if self.useProxy:
            start_new_thread(self.proxyWatcher, (self, ))
            self.backend.updateEventInfo('loading')
            self.onHide.append(self.lockInfoBar)
            self.proxyCaching = True
            self.checkProxyTimer = eTimer()
            self.checkProxyTimer.timeout.get().append(self.checkProxyStatus)
            self.checkProxyTimer.start(500, True)

    def checkProxyUsable(self):
        if not os.path.exists(PROXY_BINARY):
            return False
        try:
            self.libairtunes = cdll.LoadLibrary(
                '/usr/lib/enigma2/python/Plugins/Extensions/IniAirPlayer/libairtunes.so.0'
            )
            print '[AirPlayMoviePlayer] loading lib done'
            self.validationMessage = ''
            response = create_string_buffer(1024)
            if self.libairtunes.checkValidation(
                    config.plugins.airplayer.validationKey.value,
                    response) < 0:
                return False
            print '[AirPlayMoviePlayer] valid premium user'
            self['premiumUser'] = Boolean(True)
        except Exception as e:
            print '[AirPlayMoviePlayer] loading lib failed'
            print e
            self.libairtunes = None
            return False

        if not os.path.isdir(config.plugins.airplayer.path.value):
            Notifications.AddNotification(
                MessageBox,
                _('The path for temp files that you entered in the settings (%s) does not exist! Please set up a propper path in the Settings. The Path is needed for the built in proxy. The proxy was therefore disabled!'
                  ) % config.plugins.airplayer.path.value,
                type=MessageBox.TYPE_INFO,
                timeout=10)
            return False
        if not os.access(config.plugins.airplayer.path.value, os.W_OK):
            Notifications.AddNotification(
                MessageBox,
                _('The path for temp files that you entered in the settings (%s) is not writeable! Please set up a propper path in the Settings. The Path is needed for the built in proxy. The proxy was therefore disabled!'
                  ) % config.plugins.airplayer.path.value,
                type=MessageBox.TYPE_INFO,
                timeout=10)
            return False
        stat = os.statvfs(config.plugins.airplayer.path.value)
        free = stat.f_bfree * stat.f_bsize / 1024 / 1024
        print '[AirPlayMoviePlayer] free blocks:', stat.f_bfree, ' block size:', stat.f_bsize
        if free < 128:
            Notifications.AddNotification(
                MessageBox,
                _('The path for temp files that you entered in the settings (%s) has only %d MB left. The proxy was therefore disabled!'
                  ) % (config.plugins.airplayer.path.value, free),
                type=MessageBox.TYPE_INFO,
                timeout=10)
            return False
        return True

    def keyStartLocalCache(self):
        if self.useProxy:
            print '[AirPlayMoviePlayer] Proxy is in user, no neef for downloading the file'
            return
        print '[AirPlayMoviePlayer] start local file caheing'
        if '.m3u8' in self.url:
            self.session.open(
                MessageBox,
                _('This stream can not get saved on HDD\nm3u8 streams are not supported'
                  ), MessageBox.TYPE_INFO)
            return
        if self.localCache == True:
            return
        self.container = eConsoleAppContainer()
        self.container.appClosed.append(self.DLfinished)
        self.container.setCWD(config.plugins.airplayer.path.value)
        self.startDL()

    def startDL(self):
        self.filename = 'test.mov'
        try:
            req = Request(self.url)
            req.add_header(
                'User-agent',
                'QuickTime/7.6.2 (verqt=7.6.2;cpu=IA32;so=Mac 10.5.8)')
            usock = urlopen(req)
            self.filesize = usock.info().get('Content-Length')
        except Exception as e:
            print e
            self.filesize = 0

        if self.url[0:4] == 'http' or self.url[0:3] == 'ftp':
            useragentcmd = "--header='User-Agent: %s'" % 'QuickTime/7.6.2 (verqt=7.6.2;cpu=IA32;so=Mac 10.5.8)'
            cmd = "wget %s -q '%s' -O '%s/%s' &" % (
                useragentcmd, self.url, config.plugins.airplayer.path.value,
                self.filename)
        else:
            self.session.open(
                MessageBox,
                _('This stream can not get saved on HDD\nProtocol %s not supported'
                  ) % self.service.getPath()[0:5], MessageBox.TYPE_ERROR)
            return
        self.setSeekState(self.SEEK_STATE_PAUSE)
        self.localCache = True
        self.startNewServiceOnPlay = True
        self.StatusTimer = eTimer()
        self.StatusTimer.callback.append(self.UpdateStatus)
        self.StatusTimer.start(1000, True)
        self.dlactive = True
        self.backend.updateEventInfo('loading')
        print '[AirPlayMoviePlayer] execute command: ' + cmd
        self.container.execute(cmd)
        self.session.open(
            MessageBox,
            _('The Video will be downloaded to %s\n\nPlease wait until some MB are cached before hitting PLAY\nRecorded Videos from an iPhone/iPad need to be downloaded completely before playback is possible'
              ) % config.plugins.airplayer.path.value,
            type=MessageBox.TYPE_INFO,
            timeout=10)

    def UpdateStatus(self):
        if not self.dlactive:
            return
        lastSize = 0
        if fileExists(config.plugins.airplayer.path.value + self.filename,
                      'r'):
            lastSize = self.localsize
            self.localsize = os.path.getsize(
                config.plugins.airplayer.path.value + self.filename)
        else:
            self.localsize = 0
        if self.localsize > 0 and self.filesize > 0:
            percent = float(float(self.localsize) / float(self.filesize))
            percent = percent * 100.0
            self['bufferslider'].setValue(int(percent))
            if self.localsize - lastSize > 0:
                self['label_speed'].setText('DL-Speed: ' +
                                            self.formatKBits(self.localsize -
                                                             lastSize))
        self.StatusTimer.start(1000, True)

    def DLfinished(self, retval):
        self.dlactive = False
        print '[AirPlayMoviePlayer] DL done'
        self['bufferslider'].setValue(int(100))
        self.setSeekState(self.SEEK_STATE_PLAY)

    def __evAudioDecodeError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            sTagAudioCodec = currPlay.info().getInfoString(
                iServiceInformation.sTagAudioCodec)
            print "[AirPlayMoviePlayer] audio-codec %s can't be decoded by hardware" % sTagAudioCodec
            Notifications.AddNotification(
                MessageBox,
                _("This Box can't decode %s streams!") % sTagAudioCodec,
                type=MessageBox.TYPE_INFO,
                timeout=10)
        except Exception:
            pass

    def __evVideoDecodeError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            sTagVideoCodec = currPlay.info().getInfoString(
                iServiceInformation.sTagVideoCodec)
            print "[AirPlayMoviePlayer] video-codec %s can't be decoded by hardware" % sTagVideoCodec
            Notifications.AddNotification(
                MessageBox,
                _("This Box can't decode %s streams!") % sTagVideoCodec,
                type=MessageBox.TYPE_INFO,
                timeout=10)
        except Exception:
            pass

    def __evPluginError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            message = currPlay.info().getInfoString(iServiceInformation.sUser +
                                                    12)
            print '[AirPlayMoviePlayer] PluginError ', message
            Notifications.AddNotification(
                MessageBox,
                _("Your Box can't decode this video stream!\n%s") % message,
                type=MessageBox.TYPE_INFO,
                timeout=10)
        except Exception:
            pass

    def __evEOF(self):
        print '[AirPlayMoviePlayer] got evEOF'
        try:
            err = self.session.nav.getCurrentService().info().getInfoString(
                iServiceInformation.sUser + 12)
            print '[AirPlayMoviePlayer] Error: ', err
            if err != '':
                Notifications.AddNotification(
                    MessageBox,
                    _("Your Box can't decode this video stream!\n%s") % err,
                    type=MessageBox.TYPE_INFO,
                    timeout=10)
        except Exception as e:
            print '[AirPlayMoviePlayer] Exception: ', e

    def seekWatcher(self, *args):
        print '[AirPlayMoviePlayer] seekWatcher started'
        try:
            while self is not None and self.start is not None:
                self.seekToStartPos()
                sleep(0.2)

        except Exception:
            pass

        print '[AirPlayMoviePlayer] seekWatcher finished'

    def startServiceOfUri(self, uri, useTsService=False):
        self.startNewServiceOnPlay = False
        if useTsService:
            sref = eServiceReference(1, 0, uri)
        else:
            sref = eServiceReference(self.backend.ENIGMA_SERVICE_ID, 0, uri)
        sref.setName('AirPlay')
        self.session.nav.playService(sref)

    def startServiceOfProxy(self, useTsService=False):
        if useTsService:
            self.startServiceOfUri('http://127.0.0.1:7099', True)
        else:
            self.startServiceOfUri('http://127.0.0.1:7099', False)

    def startServiceOfLocalFile(self):
        self.startServiceOfUri(config.plugins.airplayer.path.value +
                               self.filename)

    def lockInfoBar(self):
        print '[AirPlayMoviePlayer] InfoBar is hiding ....'
        if self.startNewServiceOnPlay:
            self.doShow()

    def checkProxyStatus(self):
        print '[AirPlayMoviePlayer] checking prxy caching : ', self.proxyCaching, ' start new Service: ', self.startNewServiceOnPlay
        if self.proxyCaching == False:
            if self.proxyError:
                self.startServiceOfUri(self.url)
                return
            else:
                self.startServiceOfProxy(self.liveStream)
                return
        self.checkProxyTimer.start(500, True)

    def proxyWatcher(self, *args):
        print '[AirPlayMoviePlayer] proxy starting ....'
        self.liveStream = False
        self.m3u8Stream = False
        try:
            args = [
                PROXY_BINARY, self.url,
                config.plugins.airplayer.validationKey.value,
                config.plugins.airplayer.path.value
            ]
            print 'starting proxy'
            print args[0], args[1]
            self.proxyProcess = subprocess.Popen(args,
                                                 stdin=subprocess.PIPE,
                                                 stdout=subprocess.PIPE)
            print '[AirPlayMoviePlayer] proxy started ....'
            while self.proxyProcess.poll() == None:
                buff = self.proxyProcess.stdout.readline()
                self.proxyReady = True
                if len(buff) > 0:
                    if buff[:6] == 'rpos: ':
                        percent = int(buff[6:])
                        blockingCallFromMainThread(
                            self['bufferslider'].setValue, percent)
                        if not self.liveStream and percent == 100:
                            self.proxyCaching = False
                    elif buff[:7] == 'cache: ':
                        kb = int(buff[7:])
                        mb = kb / 1024
                        blockingCallFromMainThread(
                            self['label_cache'].setText,
                            'Cache: ' + self.formatKB(kb * 1024, 'B', 1))
                        print '[AirPlayMoviePlayer] cache is at ', mb, ' MB'
                        if self.liveStream == True and mb >= config.plugins.airplayer.cacheMbBeforeLivePlayback.value and self.startNewServiceOnPlay:
                            self.proxyCaching = False
                        if self.liveStream == False and mb >= config.plugins.airplayer.cacheMbBeforePlayback.value and self.startNewServiceOnPlay:
                            self.proxyCaching = False
                    elif buff[:19] == 'playing livestream!':
                        self.liveStream = True
                        print '[AirPlayMoviePlayer] playing livestream!'
                    elif buff[:13] == 'playing m3u8!':
                        self.m3u8Stream = True
                        print '[AirPlayMoviePlayer] playing m3u8 stream!'
                    elif buff[:8] == 'rspeed: ':
                        rspeed = int(buff[8:]) * 1000
                        blockingCallFromMainThread(
                            self['label_speed'].setText,
                            'DL-Speed: ' + self.formatKBits(rspeed))
                    elif buff[:7] == 'Error: ':
                        blockingCallFromMainThread(
                            Notifications.AddNotification,
                            MessageBox,
                            _('The Proxy encountered an Error: %s, starting direct playback now!'
                              ) % buff[7:],
                            type=MessageBox.TYPE_INFO,
                            timeout=10)
                        self.proxyError = True
                        self.proxyCaching = False
                    else:
                        print '[AirPlayMoviePlayer] Proxy: ', buff

            print '[AirPlayMoviePlayer] proxy done'
        except Exception as e:
            print '[AirPlayMoviePlayer] error in proxy: ', e
            traceback.print_exc()
            if self.proxyCaching == True:
                blockingCallFromMainThread(
                    Notifications.AddNotification,
                    MessageBox,
                    _('Starting the Proxy failed: %s, starting direct playback now!'
                      ) % e,
                    type=MessageBox.TYPE_INFO,
                    timeout=10)
                self.proxyError = True
                self.proxyCaching = False
            else:
                print '[AirPlayMoviePlayer] assume error comes from killing process after eof '

        print '[AirPlayMoviePlayer] proxy thread done'

    def seekToStartPos(self):
        time = 0
        try:
            if self.start is not None and config.plugins.airplayer.setSeekOnStart.value:
                service = self.session.nav.getCurrentService()
                seek = service and service.seek()
                if seek != None:
                    r = seek.getLength()
                    if not r[0]:
                        print '[AirPlayMoviePlayer] got duration'
                        if r[1] == 0:
                            print '[AirPlayMoviePlayer] duration 0'
                            return
                        length = r[1]
                        r = seek.getPlayPosition()
                        if not r[0]:
                            print 'playbacktime ', r[1]
                            if r[1] < 90000:
                                print 'do not seek yet', r[1]
                                return
                        else:
                            return
                        time = length * self.start
                        print '[AirPlayMoviePlayer] seeking to', time, ' length ', length, ''
                        self.start = None
                        if time < 2700000:
                            print '[AirPlayMoviePlayer] skip seeking < 30s'
                            return
                        blockingCallFromMainThread(self.doSeek, int(time))
        except Exception:
            pass

    def formatKBits(self, value, ending='Bit/s', roundNumbers=2):
        bits = value * 8
        if bits > 1048576:
            return str(round(float(bits) / float(1048576),
                             roundNumbers)) + ' M' + ending
        elif bits > 1024:
            return str(round(float(bits) / float(1024),
                             roundNumbers)) + ' K' + ending
        else:
            return str(bits) + ' ' + ending

    def formatKB(self, value, ending='B', roundNumbers=2):
        byte = value
        if byte > 1048576:
            return str(round(float(byte) / float(1048576),
                             roundNumbers)) + ' M' + ending
        elif byte > 1024:
            return str(round(float(byte) / float(1024),
                             roundNumbers)) + ' K' + ending
        else:
            return str(byte) + ' ' + ending

    def checkForUpdate(self, *args):
        url = self.backend.updater.checkForUpdate(self.url, 1)
        if url != '' and url != 'up to date':
            blockingCallFromMainThread(self['label_update'].setText,
                                       'Update Available')

    def setSeekState(self, state, dummy=False):
        if self.startNewServiceOnPlay and state == self.SEEK_STATE_PLAY:
            if self.useProxy:
                if self.proxyCaching == False:
                    print '[AirPlayMoviePlayer] start Proxy cache now'
                    self.startServiceOfProxy(self.liveStream)
            else:
                print '[AirPlayMoviePlayer] start downloaded file now'
                self.startServiceOfLocalFile()
            super(AirPlayMoviePlayer, self).setSeekState(self.SEEK_STATE_PLAY)
        else:
            super(AirPlayMoviePlayer, self).setSeekState(state)
        try:
            if state == self.SEEK_STATE_PAUSE:
                if self.useProxy:
                    self.backend.updateEventInfo('loading')
                else:
                    self.backend.updateEventInfo('paused')
            if state == self.SEEK_STATE_PLAY:
                self.backend.updateEventInfo('playing')
        except Exception as e:
            print e

    def processPlayerStop(self):
        try:
            self.backend.updateEventInfo('stopped')
            self.session.openWithCallback(self.leavePlayerConfirmed,
                                          MessageBox,
                                          _('Stop AirPlayer playback?'),
                                          MessageBox.TYPE_YESNO,
                                          timeout=10)
        except Exception:
            self.leavePlayerConfirmed(True)

    def leavePlayer(self):
        self.leavePlayerConfirmed(True)

    def leavePlayerConfirmed(self, answer):
        if answer:
            print '[AirPlayMoviePlayer] stopping MoviePlayer'
            self.backend.MovieWindow = None
            if self.localCache:
                self.container.kill()
                eBackgroundFileEraser.getInstance().erase(
                    config.plugins.airplayer.path.value + self.filename)
                self.StatusTimer.stop()
            if self.lastservice and self.lastservice is not None:
                self.backend.updateEventInfo('stopped')
            else:
                print '[AirPlayMoviePlayer] lastService is None, not sending stop command'
            self.backend.updateEventInfo('stopped')
            if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
                self.session.nav.stopService()
                open('/proc/player', 'w').write('1')
                import time
                time.sleep(2)
            try:
                print '[AirPlayMoviePlayer] try to remove proxy cache'
                os.system('rm %s/AirPlayerChunk* &' %
                          config.plugins.airplayer.path.value)
            except Exception:
                pass

            if self.proxyProcess != None:
                try:
                    self.proxyProcess.kill()
                except Exception:
                    pass

            self.close()

    def doEofInternal(self, playing):
        print '[AirPlayMoviePlayer] doEofInternal'
        if self.liveStream:
            print '[AirPlayMoviePlayer] got evEOF in live-stream ignoreing'
            return
        print '[AirPlayMoviePlayer] super.doEofInternal'
        self.backend.updateEventInfo('stopped')
        self.backend.stop_playing()

    def isPlaying(self):
        try:
            if self.seekstate != self.SEEK_STATE_PLAY:
                return False
            return True
        except Exception:
            return False

    def showMovies(self):
        pass
コード例 #29
0
ファイル: SoftwareUpdate.py プロジェクト: kingvuplus/PE-repos
class UpdatePlugin(Screen):
    skin = '\n\t\t<screen name="UpdatePlugin" position="center,center" size="550,300">\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):
        Screen.__init__(self, session)
        self.sliderPackages = {'dreambox-dvb-modules': 1,
         'enigma2': 2,
         'tuxbox-image-info': 3}
        self.setTitle(_('Software update'))
        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(_('Package list update'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)
        self['actions'] = ActionMap(['WizardActions'], {'ok': self.exit,
         'back': self.exit}, -1)
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def checkTraficLight(self):
        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ''
        picon = None
        default = True
        try:
            if getBoxType() in urlopen('http://openpli.org/status').read().split(','):
                message = _('The current beta image might not be stable.\nFor more information see %s.') % 'www.openpli.org'
                picon = MessageBox.TYPE_ERROR
                default = False
        except:
            message = _('The status of the current beta image could not be checked because %s can not be reached.') % 'www.openpli.org'
            picon = MessageBox.TYPE_ERROR
            default = False

        socket.setdefaulttimeout(currentTimeoutDefault)
        if default:
            self.startActualUpdate(True)
        else:
            message += '\n' + _('Do you want to update your receiver?')
            self.session.openWithCallback(self.startActualUpdate, MessageBox, message, default=default, picon=picon)

    def getLatestImageTimestamp(self):
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        latestImageTimestamp = ''
        try:
            latestImageTimestamp = re.findall('<dd>(.*?)</dd>', urlopen('http://openpli.org/download/' + getBoxType() + '/').read())[0][:16]
            latestImageTimestamp = time.strftime(_('%d-%b-%Y %-H:%M'), time.strptime(latestImageTimestamp, '%Y/%m/%d %H:%M'))
        except:
            pass

        socket.setdefaulttimeout(currentTimeoutDefault)
        return latestImageTimestamp

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(ngettext('Update completed, %d package was installed.', 'Update completed, %d packages were installed.', self.packages) % self.packages)

    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') + ': %s/%s' % (self.packages, self.total_packages))
            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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in ('N', 'Y'):
                self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(self.modificationCallback, MessageBox, _('A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?') % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    latestImageTimestamp = self.getLatestImageTimestamp()
                    if latestImageTimestamp:
                        message = _('Do you want to update your receiver to %s?') % self.getLatestImageTimestamp() + '\n'
                    else:
                        message = _('Do you want to update your receiver?') + '\n'
                    message = message + '(' + ngettext('%s updated package available', '%s updated packages available', self.total_packages) % self.total_packages + ')'
                    choices = [(_('Update and reboot (recommended)'), 'cold'),
                     (_('Update and ask to reboot'), 'hot'),
                     (_('Update channel list only'), 'channels'),
                     (_('Show latest commits on sourceforge'), 'commits'),
                     (_('Cancel'), '')]
                    self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
                else:
                    self.session.openWithCallback(self.close, MessageBox, _('No updates available'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(_('Could not find installed channel list.'))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _('Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.')
                if self.packages == 0:
                    error = _('No updates available. Please try again later.')
                if self.updating:
                    error = _('Update failed. Your receiver does not have a working internet connection.')
                self.status.setText(_('Error') + ' - ' + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == 'cold':
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == 'channels':
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST, args={'installed_only': True})
        elif answer[1] == 'commits':
            self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), CommitInfo)
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Update completed. Do you want to reboot your receiver?'))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #30
0
class UpdatePlugin(Screen, ProtectedScreen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None

        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

    def checkTraficLight(self):
        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)

        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ""
        picon = None
        message += "\n" + _("Do you want to update your receiver?")
        self.session.openWithCallback(self.startActualUpdate,
                                      MessageBox,
                                      message,
                                      picon=picon)

    def getLatestImageTimestamp(self):
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            from time import strftime
            from datetime import datetime
            imageVersion = about.getImageTypeString().split(" ")[1]
            imageVersion = (int(imageVersion) < 5 and "%.1f"
                            or "%s") % int(imageVersion)
            url = "https://openpli.org/download/timestamp/%s~%s" % (
                HardwareInfo().get_device_model(), imageVersion)
            try:
                latestImageTimestamp = datetime.fromtimestamp(
                    int(urlopen(url, timeout=5).read())).strftime(
                        _("%Y-%m-%d %H:%M"))
            except:
                # OpenPli 5.0 uses python 2.7.11 and here we need to bypass the certificate check
                from ssl import _create_unverified_context
                latestImageTimestamp = datetime.fromtimestamp(
                    int(
                        urlopen(url,
                                timeout=5,
                                context=_create_unverified_context()).read())
                ).strftime(_("%Y-%m-%d %H:%M"))
        except:
            latestImageTimestamp = ""
        socket.setdefaulttimeout(currentTimeoutDefault)
        return latestImageTimestamp

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    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") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    latestImageTimestamp = self.getLatestImageTimestamp()
                    if latestImageTimestamp:
                        message = _(
                            "Do you want to update your receiver to %s?"
                        ) % self.getLatestImageTimestamp() + "\n"
                    else:
                        message = _(
                            "Do you want to update your receiver?") + "\n"
                    message += "(" + (ngettext(
                        "%s updated package available",
                        "%s updated packages available", self.total_packages) %
                                      self.total_packages) + ")"
                    if self.total_packages > 150:
                        choices = [(_("Update and reboot"), "cold")]
                        message += " " + _("Reflash recommended!")
                    else:
                        choices = [(_("Update and reboot (recommended)"),
                                    "cold"),
                                   (_("Update and ask to reboot"), "hot")]
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append(
                        (_("Show packages to be upgraded"), "showlist"))
                else:
                    message = _("No updates available")
                    choices = []
                if fileExists("/home/root/ipkgupgrade.log"):
                    choices.append((_("Show latest upgrade log"), "log"))
                choices.append((_("Show latest commits"), "commits"))
                choices.append((_("Cancel"), ""))
                self.session.openWithCallback(self.startActualUpgrade,
                                              ChoiceBox,
                                              title=message,
                                              list=choices)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your receiver does not have a working internet connection."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "showlist":
            text = "\n".join([
                x[0]
                for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])
            ])
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Latest upgrade log"), True)
        elif answer[1] == "log":
            text = open("/home/root/ipkgupgrade.log", "r").read()
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback,
                              IpkgComponent.EVENT_DONE, None), TextBox, text,
                _("Packages to update"), True)
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Update completed. Do you want to reboot your receiver?")
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #31
0
class UpgradeStatus(Screen):
    skin = """
		<screen position="center,center" size="450,100" title="FPGA Upgrade">
			<widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
			<widget name="slider" position="10,25" size="430,30" backgroundColor="white"/>
			<widget name="status" position="10,27" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="black" backgroundColor="white" transparent="1"/>
			<widget source="info" render="Label" position="10,70" zPosition="1" size="430,30" font="Regular;22" halign="center" valign="center" backgroundColor="black" transparent="1"/>
		</screen>
		"""

    def __init__(self, session, parent, timeout=20):
        Screen.__init__(self, session)
        self.session = session

        self["actions"] = ActionMap(["OkCancelActions"], {
            "ok": self.keyExit,
        }, -2)

        self.is_done = 0
        self.exit_count = 0
        self.timeout = 20
        self.title_str = "FPGA Upgrade"

        #self["name"] = Label(_("Upgrade status"))
        self["name"] = Label(" ")
        self["info"] = StaticText(_("Can't cancel during upgrade!!"))

        self["status"] = Label(_("Status : 0%"))
        self.status_bar = self["status"]

        self.slider = Slider(0, 100)
        self["slider"] = self.slider

        self.parent = parent
        self.timer_check_progress = eTimer()
        self.timer_check_progress.callback.append(self.callbackDoCheckProgress)
        interval = self.parent.FPGA.get_interval()
        self.timer_check_progress.start(interval)
        self.need_restart = False

    def callbackDoCheckProgress(self):
        self.status = self.parent.FPGA.get_status()

        if self.status > 0:
            self.slider.setValue(self.status)

        if self.status == 100:
            #print "fpga-upgrade done!!"
            self.status_bar.setText(_("Succeed"))
            #self.status_bar.setText(_("%d / 100" % (self.status)))
            self.timer_check_progress.stop()
            self.is_done = 1
            self.timer_exit = eTimer()
            self.timer_exit.callback.append(self.callbackExit)
            self.timer_exit.start(1000)

        elif self.status < 0:  #elif self.status == -1 or self.status == -2:
            #print "fpga-upgrade error >> errno : [%d]" % (self.status)
            ERROR_MSG = ''
            ERROR_CODE = int(self.status) * -1
            ERROR_MSG = self.parent.FPGA.get_error_msg(ERROR_CODE, ERROR_MSG)
            self.status_bar.setText("Fail to update!!")
            self["info"].setText(
                _("Error[%d] : %s.\nPress OK to exit." %
                  (self.status, ERROR_MSG)))
            self.timer_check_progress.stop()
            self.is_done = 1

        else:
            #print "fpga-upgrade status : %d" % self.status
            self.status_bar.setText(_("%d / 100" % (self.status)))

    def callbackExit(self):
        self.need_restart = True
        if self.exit_count == self.timeout:
            self.timer_exit.stop()
            self.keyExit()
        self.exit_count = self.exit_count + 1
        #self.instance.setTitle("%s (%d)" % (self.title_str, (self.timeout-self.exit_count)))
        self["info"].setText(
            "Reboot after %d seconds.\nPress the OK to reboot now." %
            (self.timeout - self.exit_count))

    def keyExit(self):
        if self.need_restart:
            from Screens.Standby import TryQuitMainloop
            self.session.open(TryQuitMainloop, 2)
        if self.is_done:
            self.close()
コード例 #32
0
class UpdatePlugin(Screen, ProtectedScreen):
    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)
        screentitle = _("Software update")
        self.menu_path = args[0]
        if config.usage.show_menupath.value == 'large':
            self.menu_path += screentitle
            self.title = self.menu_path
            self.menu_path_compressed = ""
            self.menu_path += ' / '
        elif config.usage.show_menupath.value == 'small':
            self.title = screentitle
            condtext = ""
            if self.menu_path and not self.menu_path.endswith(' / '):
                condtext = self.menu_path + " >"
            elif self.menu_path:
                condtext = self.menu_path[:-3] + " >"
            self.menu_path_compressed = condtext
            self.menu_path += screentitle + ' / '
        else:
            self.title = screentitle
            self.menu_path_compressed = ""
        self["menu_path_compressed"] = StaticText(self.menu_path_compressed)
        Screen.setTitle(self, self.title)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)
        self['actions'].csel = self
        self["actions"].setEnabled(False)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self['tl_off'] = Pixmap()
        self['tl_red'] = Pixmap()
        self['tl_yellow'] = Pixmap()
        self['tl_green'] = Pixmap()
        self['feedStatusMSG'] = Label()

        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False
        self.updating = False

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.onFirstExecBegin.append(self.checkNetworkState)

    def checkNetworkState(self):
        self['tl_red'].hide()
        self['tl_yellow'].hide()
        self['tl_green'].hide()
        self['tl_off'].hide()
        self.trafficLight = feedsstatuscheck.getFeedsBool()
        if self.trafficLight in feedsstatuscheck.feed_status_msgs:
            status_text = feedsstatuscheck.feed_status_msgs[self.trafficLight]
        else:
            status_text = _('Feeds status: Unexpected')
        if self.trafficLight:
            self['feedStatusMSG'].setText(status_text)
        if self.trafficLight == 'stable':
            self['tl_green'].show()
        elif self.trafficLight == 'unstable':
            self['tl_red'].show()
        elif self.trafficLight == 'updating':
            self['tl_yellow'].show()
        else:
            self['tl_off'].show()

        if (getImageType() != 'release' and self.trafficLight != 'unknown'
            ) or (getImageType() == 'release'
                  and self.trafficLight not in ('stable', 'unstable')):
            self.session.openWithCallback(
                self.close,
                MessageBox,
                feedsstatuscheck.getFeedsErrorMessage(),
                type=MessageBox.TYPE_INFO,
                timeout=30,
                close_on_any_key=True)
            return
        else:
            if getImageType() != 'release' or (
                    config.softwareupdate.updateisunstable.value == '1'
                    and config.softwareupdate.updatebeta.value
            ) or config.softwareupdate.updateisunstable.value == '0':
                if kernelMismatch():
                    self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("The Linux kernel has changed, an update is not permitted. \nInstall latest image using USB stick or Image Manager."
                          ),
                        type=MessageBox.TYPE_INFO,
                        timeout=30,
                        close_on_any_key=True)
                    return
                message = statusMessage()
                if message:
                    message += "\nDo you want to continue?"
                    self.session.openWithCallback(self.statusMessageCallback,
                                                  MessageBox,
                                                  message,
                                                  type=MessageBox.TYPE_YESNO,
                                                  default=False)
                else:
                    self.startCheck()
            else:
                self.session.openWithCallback(
                    self.close,
                    MessageBox,
                    _("Sorry the feeds seem to be in an unstable state, if you wish to use them please enable 'Allow unstable (experimental) updates' in \"Software update settings\"."
                      ),
                    type=MessageBox.TYPE_INFO,
                    timeout=10,
                    close_on_any_key=True)

    def statusMessageCallback(self, answer):
        if answer:
            self.startCheck()
        else:
            self.close()

    def startCheck(self):
        self.updating = True
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.doActivityTimer)

        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)

        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

        # We've just manually checked for an update, so note this time as the last
        # check time, then update the next autocheck time too.
        #
        from time import time
        config.softwareupdate.updatelastcheck.setValue(int(time()))
        config.softwareupdate.updatelastcheck.save()
        from Components.OnlineUpdateCheck import onlineupdatecheckpoller
        onlineupdatecheckpoller.start()

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        if event == IpkgComponent.EVENT_DOWNLOAD:
            self.status.setText(_("Downloading"))
        elif event == IpkgComponent.EVENT_UPGRADE:
            if param in self.sliderPackages:
                self.slider.setValue(self.sliderPackages[param])
            self.package.setText(param)
            self.status.setText(
                _("Upgrading") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self["actions"].setEnabled(True)
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
            self.updating = False
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = None
                if getImageType() != 'release' or (
                        config.softwareupdate.updateisunstable.value == '1'
                        and config.softwareupdate.updatebeta.value):
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _(
                        "The current update may be unstable") + "\n" + _(
                            "Are you sure you want to update your %s %s ?"
                        ) % (getMachineBrand(), getMachineName()) + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                elif config.softwareupdate.updateisunstable.value == '0':
                    self.total_packages = len(self.ipkg.getFetchedList())
                    message = _("Do you want to update your %s %s ?") % (
                        getMachineBrand(), getMachineName()) + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                if self.total_packages > 150:
                    message += " " + _("Reflash recommended!")
                if self.total_packages:
                    global ocram
                    ocram = ''
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith(
                                'enigma2-plugin-picons-snp'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[
                                0].split(
                                    'enigma2-plugin-picons-snp-')[1].replace(
                                        '.', ' '
                                    ) + ' updated ' + package_tmp[2].replace(
                                        '--', ' ') + '\n'
                        elif package_tmp[0].startswith(
                                'enigma2-plugin-picons-srp'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[
                                0].split(
                                    'enigma2-plugin-picons-srp-')[1].replace(
                                        '.', ' '
                                    ) + ' updated ' + package_tmp[2].replace(
                                        '--', ' ') + '\n'
                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_("View the changes"), "changes"),
                               (_("Upgrade and reboot system"), "cold")]
                    if path.exists(
                            "/usr/lib/enigma2/python/Plugins/SystemPlugins/OBH/BackupManager.pyo"
                    ):
                        if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                            choices.append(
                                (_("Perform a settings backup,") + '\n\t' +
                                 _("making a backup before updating") +
                                 '\n\t' + _("is strongly advised."), "backup"))
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_("Perform a full image backup"),
                                            "imagebackup"))
                    choices.append((_("Update channel list only"), "channels"))
                    choices.append((_("Cancel"), ""))
                    self["actions"].setEnabled(True)
                    upgrademessage = self.session.openWithCallback(
                        self.startActualUpgrade,
                        ChoiceBox,
                        title=message,
                        list=choices,
                        skin_name="SoftwareUpdateChoices",
                        var=self.trafficLight,
                        menu_path=self.menu_path_compressed)
                    upgrademessage.setTitle(self.title)
                else:
                    self["actions"].setEnabled(True)
                    upgrademessage = self.session.openWithCallback(
                        self.close,
                        MessageBox,
                        _("Nothing to upgrade"),
                        type=MessageBox.TYPE_INFO,
                        timeout=10,
                        close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s."
                ) % (getMachineBrand(), getMachineName(), getMachineBrand(),
                     getMachineName())
                if self.packages == 0:
                    if self.error != 0:
                        error = _(
                            "Problem retrieving update list.\nIf this issue persists please check/report on forum"
                        )
                    else:
                        error = _(
                            "A background update check is in progress,\nplease wait a few minutes and try again."
                        )
                if self.updating:
                    error = _(
                        "Update failed. Your %s %s does not have a working internet connection."
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_("Error") + " - " + error)
                self["actions"].setEnabled(True)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return

        if answer[1] == "menu":
            if config.softwareupdate.updateisunstable.value == '1':
                message = _("The current update may be unstable") + "\n" + _(
                    "Are you sure you want to update your %s %s ?") % (
                        getMachineBrand(), getMachineName()
                    ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            elif config.softwareupdate.updateisunstable.value == '0':
                message = _("Do you want to update your %s %s ?") % (
                    getMachineBrand(), getMachineName()
                ) + "\n(%s " % self.total_packages + _("Packages") + ")"
            choices = [(_("View the changes"), "changes"),
                       (_("Upgrade and reboot system"), "cold")]
            if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                choices.append((_(
                    "Perform a settings backup, making a backup before updating is strongly advised."
                ), "backup"))
            if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                choices.append(
                    (_("Perform a full image backup"), "imagebackup"))
            choices.append((_("Update channel list only"), "channels"))
            choices.append((_("Cancel"), ""))
            self["actions"].setEnabled(True)
            upgrademessage = self.session.openWithCallback(
                self.startActualUpgrade,
                ChoiceBox,
                title=message,
                list=choices,
                skin_name="SoftwareUpdateChoices",
                var=self.trafficLight,
                menu_path=self.menu_path_compressed)
            upgrademessage.setTitle(self.title)
        elif answer[1] == "changes":
            self.session.openWithCallback(self.startActualUpgrade,
                                          SoftwareUpdateChanges,
                                          self.menu_path)
        elif answer[1] == "backup":
            self.doSettingsBackup()
        elif answer[1] == "imagebackup":
            self.doImageBackup()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "cold":
            if (config.softwareupdate.autosettingsbackup.value
                    and config.backupmanager.backuplocation.value) or (
                        config.softwareupdate.autoimagebackup.value
                        and config.imagemanager.backuplocation.value):
                self.doAutoBackup()
            else:
                self.session.open(TryQuitMainloop, retvalue=42)
                self.close()

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.OBH.BackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('obh', 'Backup manager'):
                break
        self.showJobView(job)

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.OBH.ImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('obh', 'Image manager'):
                break
        self.showJobView(job)

    def doAutoBackup(self, val=False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext('OBH', 'Image manager'):
            self.ImageBackupDone = True
        elif job.name == dgettext('obh', 'Backup manager'):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(
                ("menu", "menu")),
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")
        else:
            self.session.openWithCallback(self.doAutoBackup,
                                          JobView,
                                          job,
                                          cancelable=False,
                                          backgroundable=False,
                                          afterEventChangeable=False,
                                          afterEvent="close")

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Upgrade finished.") + " " +
                    _("Do you want to reboot your %s %s") %
                    (getMachineBrand(), getMachineName()))
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
コード例 #33
0
class UpdatePlugin(Screen, ProtectedScreen):
    skin = '\n\t\t<screen name="UpdatePlugin" position="center,center" size="550,300">\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):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)
        self.sliderPackages = {
            'dreambox-dvb-modules': 1,
            'enigma2': 2,
            'tuxbox-image-info': 3
        }
        self.setTitle(_('Software update'))
        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(_('Package list update'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)
        self['actions'] = ActionMap(['WizardActions'], {
            'ok': self.exit,
            'back': self.exit
        }, -1)
        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and (
            not config.ParentalControl.config_sections.main_menu.value and
            not config.ParentalControl.config_sections.configuration.value or
            hasattr(self.session, 'infobar') and self.session.infobar is None
        ) and config.ParentalControl.config_sections.software_update.value

    def checkTraficLight(self):
        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)
        from urllib import urlopen
        import socket
        import os
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ''
        picon = None
        default = True
        socket.setdefaulttimeout(currentTimeoutDefault)
        if default:
            self.showDisclaimer()
        else:
            message += '\n' + _('Do you want to update your receiver?')
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          default=default,
                                          picon=picon)

    def showDisclaimer(self, justShow=False):
        if config.usage.show_update_disclaimer.value or justShow:
            message = _(
                "The OpenSPA team would like to point out that upgrading to the latest nightly build comes not only with the latest features, but also with some risks. After the update, it is possible that your device no longer works as expected. We recommend you create backups. This allows you to quickly and easily restore your device to its previous state, should you experience any problems. If you encounter a 'bug', please report the issue on https://openspa.info.\n\nDo you understand this?"
            )
            list = not justShow and [
                (_('no'), False), (_('yes'), True),
                (_('yes') + ' ' + _('and never show this message again'),
                 'never')
            ] or []
            self.session.openWithCallback(boundFunction(
                self.disclaimerCallback, justShow),
                                          MessageBox,
                                          message,
                                          list=list)
        else:
            self.startActualUpdate(True)

    def disclaimerCallback(self, justShow, answer):
        if answer == 'never':
            config.usage.show_update_disclaimer.value = False
            config.usage.show_update_disclaimer.save()
        if justShow and answer:
            self.ipkgCallback(IpkgComponent.EVENT_DONE, None)
        else:
            self.startActualUpdate(answer)

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext('Update completed, %d package was installed.',
                     'Update completed, %d packages were installed.',
                     self.packages) % self.packages)

    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') + ': %s/%s' %
                (self.packages, self.total_packages))
            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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    'N', 'Y'):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _('A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?'
                      ) % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    message = _('Do you want to update your receiver?'
                                ) + '\n(' + ngettext(
                                    '%s updated package available',
                                    '%s updated packages available', self.
                                    total_packages) % self.total_packages + ')'
                    if self.total_packages > 150:
                        message += ' ' + _('Reflash recommended!')
                    choices = [(_('Update and reboot (recommended)'), 'cold'),
                               (_('Update and ask to reboot'), 'hot'),
                               (_('Update channel list only'), 'channels'),
                               (_('Show packages to be upgraded'), 'showlist')]
                else:
                    message = _('No updates available')
                    choices = []
                if not config.usage.show_update_disclaimer.value:
                    choices.append((_('Show disclaimer'), 'disclaimer'))
                choices.append((_('Cancel'), ''))
                self.session.openWithCallback(self.startActualUpgrade,
                                              ChoiceBox,
                                              title=message,
                                              list=choices)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _('Could not find installed channel list.'))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    'Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.'
                ) % (getMachineBrand(), getMachineName(), getMachineBrand(),
                     getMachineName())
                if self.packages == 0:
                    error = _('No updates available. Please try again later.')
                if self.updating:
                    error = _(
                        'Update failed. Your %s %s does not have a working internet connection.'
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == 'cold':
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == 'channels':
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == 'disclaimer':
            self.showDisclaimer(justShow=True)
        elif answer[1] == 'showlist':
            text = ''
            for i in [
                    x[0] for x in sorted(self.ipkg.getFetchedList(),
                                         key=lambda d: d[0])
            ]:
                text = text and text + '\n' + i or i

            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), TextBox, text, _('Packages to update'))
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                if fileExists('/etc/enigma2/.removelang'):
                    from Components.Language import language
                    language.delLanguage()
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _('Update completed. Do you want to reboot your receiver?')
                )
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #34
0
class UpgradeStatus(Screen):
	skin = 	"""
		<screen position="center,center" size="450,100" title="FPGA Upgrade">
			<widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
			<widget name="slider" position="10,25" size="430,30" backgroundColor="white"/>
			<widget name="status" position="10,27" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="black" backgroundColor="white" transparent="1"/>
			<widget source="info" render="Label" position="10,70" zPosition="1" size="430,30" font="Regular;22" halign="center" valign="center" backgroundColor="black" transparent="1"/>
		</screen>
		"""
	def __init__(self, session, parent, timeout = 20):
		Screen.__init__(self,session)
		self.session = session

		self["actions"] = ActionMap(["OkCancelActions"],
                {
			"ok": self.keyExit,
                }, -2)

		self.is_done = 0
		self.exit_count = 0
		self.timeout = 20
		self.title_str = "FPGA Upgrade"

		#self["name"] = Label(_("Upgrade status"))
		self["name"] = Label(" ")
		self["info"] = StaticText(_("Can't cancel during upgrade!!"))

		self["status"] = Label(_("Status : 0%"))
		self.status_bar = self["status"]

		self.slider = Slider(0, 100)
		self["slider"] = self.slider

		self.parent = parent
		self.timer_check_progress = eTimer()
		self.timer_check_progress.callback.append(self.callbackDoCheckProgress)
		interval = self.parent.FPGA.get_interval()
		self.timer_check_progress.start(interval)
		self.need_restart = False

	def callbackDoCheckProgress(self):
		self.status = self.parent.FPGA.get_status()

		if self.status > 0:
			self.slider.setValue(self.status)

		if self.status == 100:
			#print "fpga-upgrade done!!"
			self.status_bar.setText(_("Succeed"))
			#self.status_bar.setText(_("%d / 100" % (self.status)))
			self.timer_check_progress.stop()
			self.is_done = 1
			self.timer_exit = eTimer()
			self.timer_exit.callback.append(self.callbackExit)
			self.timer_exit.start(1000)

		elif self.status < 0:#elif self.status == -1 or self.status == -2:
			#print "fpga-upgrade error >> errno : [%d]" % (self.status)
			ERROR_MSG = ''
			ERROR_CODE = int(self.status) * -1
			ERROR_MSG = self.parent.FPGA.get_error_msg(ERROR_CODE, ERROR_MSG)
			self.status_bar.setText("Fail to update!!")
			self["info"].setText(_("Error[%d] : %s.\nPress OK to exit." % (self.status, ERROR_MSG)))
			self.timer_check_progress.stop()
			self.is_done = 1

		else:
			#print "fpga-upgrade status : %d" % self.status
			self.status_bar.setText(_("%d / 100" % (self.status)))

	def callbackExit(self):
		self.need_restart = True
		if self.exit_count == self.timeout:
			self.timer_exit.stop()
			self.keyExit()
		self.exit_count = self.exit_count + 1
		#self.instance.setTitle("%s (%d)" % (self.title_str, (self.timeout-self.exit_count)))
		self["info"].setText("Reboot after %d seconds.\nPress the OK to reboot now." %(self.timeout-self.exit_count))

	def keyExit(self):
		if self.need_restart:
			from Screens.Standby import TryQuitMainloop
			self.session.open(TryQuitMainloop, 2)
		if self.is_done :
			self.close()
コード例 #35
0
ファイル: SoftwareUpdate.py プロジェクト: hd75hd/enigma2
class UpdatePlugin(Screen, ProtectedScreen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		ProtectedScreen.__init__(self)

		self.sliderPackages = { "gigablue-": 1, "enigma2": 2, "teamblue-": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None

		self.channellist_only = 0
		self.channellist_name = ''
		self.updating = False
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.checkTraficLight)
		self.activityTimer.callback.append(self.doActivityTimer)
		self.activityTimer.start(100, True)

	def isProtected(self):
		return config.ParentalControl.setuppinactive.value and\
			(not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
			config.ParentalControl.config_sections.software_update.value

	def checkTraficLight(self):
		self.activityTimer.callback.remove(self.checkTraficLight)
		self.activityTimer.start(100, False)
		message = ""
		picon = None
		default = True
		url = "http://images.teamblue.tech/status/%s-%s/" % (getImageVersion(), getImageType())
		# print "[SoftwareUpdate] url status: ", url
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			try:
				status = urlopen(url, timeout=5).read().split('!', 1)
				print status
			except:
				# bypass the certificate check
				from ssl import _create_unverified_context
				status = urlopen(url, timeout=5, context=_create_unverified_context()).read().split('!', 1)
				print status
			# prefer getMachineBuild
			if getMachineBuild() in status[0].split(','):
				message = len(status) > 1 and status[1] or _("The current software might not be stable.\nFor more information see %s.") % ("http://images.teamblue.tech")
				picon = MessageBox.TYPE_ERROR
				default = False
			# only use getBoxType if no getMachineBuild
			elif getBoxType() in status[0].split(','):
				message = len(status) > 1 and status[1] or _("The current software might not be stable.\nFor more information see %s.") % ("http://images.teamblue.tech")
				picon = MessageBox.TYPE_ERROR
				default = False
		except:
			message = _("The status of the current software could not be checked because %s can not be reached.") % ("http://images.teamblue.tech")
			picon = MessageBox.TYPE_ERROR
			default = False
		if default:
			self.showDisclaimer()
		else:
			message += "\n" + _("Do you want to update your receiver?")
			self.session.openWithCallback(self.startActualUpdate, MessageBox, message, default = default, picon = picon)

	def showDisclaimer(self, justShow=False):
		if config.usage.show_update_disclaimer.value or justShow:
			message = _("With this disclaimer the teamBlue team is informing you that we are working with nightly builds and it might be that after the upgrades your set top box \
is not anymore working as expected. Therefore it is recommended to create backups. If something went wrong you can easily and quickly restore. \
If you discover 'bugs' please keep them reported on www.teamblue.tech.\n\nDo you understand this?")
			list = not justShow and [(_("no"), False), (_("yes"), True), (_("yes") + " " + _("and never show this message again"), "never")] or []
			self.session.openWithCallback(boundFunction(self.disclaimerCallback, justShow), MessageBox, message, list=list,  title=_("Disclaimer"))
		else:
			self.startActualUpdate(True)

	def disclaimerCallback(self, justShow, answer):
		if answer == "never":
			config.usage.show_update_disclaimer.value = False
			config.usage.show_update_disclaimer.save()
		if justShow and answer:
			self.ipkgCallback(IpkgComponent.EVENT_DONE, None)
		else:
			self.startActualUpdate(answer)

	def getLatestImageTimestamp(self):
		url = "http://images.teamblue.tech/status/%s-%s/buildtimestamp-%s" % (getImageVersion(), getImageType(), getBoxType())
		# print "[SoftwareUpdate] url buildtimestamp: ", url
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			from time import strftime
			from datetime import datetime
			try:
				latestImageTimestamp = datetime.fromtimestamp(int(urlopen(url, timeout=5).read())).strftime(_("%Y-%m-%d %H:%M"))
			except:
				# bypass the certificate check
				from ssl import _create_unverified_context
				latestImageTimestamp = datetime.fromtimestamp(int(urlopen(url, timeout=5, context=_create_unverified_context()).read())).strftime(_("%Y-%m-%d %H:%M"))
		except:
			latestImageTimestamp = ""
		print "[SoftwareUpdate] latestImageTimestamp:", latestImageTimestamp
		return latestImageTimestamp

	def startActualUpdate(self,answer):
		if answer:
			self.updating = True
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
		else:
			self.close()

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	def ipkgCallback(self, event, param):
		if event == IpkgComponent.EVENT_DOWNLOAD:
			self.status.setText(_("Downloading"))
		elif event == IpkgComponent.EVENT_UPGRADE:
			if param in self.sliderPackages:
				self.slider.setValue(self.sliderPackages[param])
			self.package.setText(param)
			self.status.setText(_("Upgrading") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					latestImageTimestamp = self.getLatestImageTimestamp()
					if latestImageTimestamp:
						message = _("Latest available teamBlue %s build is from: %s") % (getImageVersion(), self.getLatestImageTimestamp()) + "\n"
						message += _("Do you want to update your receiver?") + "\n"
					else:
						message = _("Do you want to update your receiver?") + "\n"
					message += "(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					if self.total_packages > 150:
						message += " " + _("Reflash recommended!")
					choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot"),
						#(_("Update channel list only"), "channels"),
						(_("Show packages to be upgraded"), "showlist")]
				else:
					message = _("No updates available")
					choices = []
				if fileExists("/home/root/ipkgupgrade.log"):
					choices.append((_("Show latest upgrade log"), "log"))
				choices.append((_("Show latest commits"), "commits"))
				if not config.usage.show_update_disclaimer.value:
					choices.append((_("Show disclaimer"), "disclaimer"))
				choices.append((_("Cancel"), ""))
				self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, windowTitle=self.title)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your receiver does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "commits":
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), CommitInfo)
		elif answer[1] == "disclaimer":
			self.showDisclaimer(justShow=True)
		elif answer[1] == "showlist":
			text = "\n".join([x[0] for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])])
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages to update"), True)
		elif answer[1] == "log":
			text = open("/home/root/ipkgupgrade.log", "r").read()
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages upgraded"), True)
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Update completed. Do you want to reboot your receiver?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #36
0
ファイル: SoftwareUpdate.py プロジェクト: sodo13/EG-gui
class UpdatePlugin(Screen, ProtectedScreen):

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)
        Screen.setTitle(self, _('Software Update'))
        self.sliderPackages = {'ini-dvb-modules': 1,
         'enigma2': 2,
         'tuxbox-image-info': 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(_('Package list update'))
        self['package'] = self.package
        self.oktext = _('Press OK on your remote control to continue.')
        self['tl_off'] = Pixmap()
        self['tl_red'] = Pixmap()
        self['tl_yellow'] = Pixmap()
        self['tl_green'] = Pixmap()
        self['feedStatusMSG'] = Label()
        self.channellist_only = 0
        self.channellist_name = ''
        self.SettingsBackupDone = False
        self.ImageBackupDone = False
        self.autobackuprunning = False
        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None
        self.onFirstExecBegin.append(self.checkNetworkState)

    def checkNetworkState(self):
        self.trafficLight = feedsstatuscheck.getFeedsBool()
        status_msgs = {'stable': _('Feeds status:   Stable'),
         'unstable': _('Feeds status:   Unstable'),
         'updating': _('Feeds status:   Updating'),
         '-2': _('ERROR:   No network found'),
         '404': _('ERROR:   No internet found'),
         'inprogress': _('ERROR: Check is already running in background'),
         'unknown': _('No connection')}
        self['tl_red'].hide()
        self['tl_yellow'].hide()
        self['tl_green'].hide()
        self['tl_off'].hide()
        if self.trafficLight:
            self['feedStatusMSG'].setText(status_msgs[str(self.trafficLight)])
        if self.trafficLight == 'stable':
            self['tl_green'].show()
        elif self.trafficLight == 'unstable':
            self['tl_red'].show()
        elif self.trafficLight == 'updating':
            self['tl_yellow'].show()
        else:
            self['tl_off'].show()
        if self.trafficLight not in ('stable', 'unstable'):
            self.session.openWithCallback(self.close, MessageBox, feedsstatuscheck.getFeedsErrorMessage(), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
        elif config.softwareupdate.updateisunstable.value == '1' and config.softwareupdate.updatebeta.value or config.softwareupdate.updateisunstable.value == '0':
            self.startCheck()
        else:
            self.session.openWithCallback(self.close, MessageBox, _('Sorry feeds seem to be in an unstable state, if you wish to use them please enable \'Allow unstable (experimental) updates\' in "Software update settings".'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)

    def startCheck(self):
        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.exit,
         'back': self.exit}, -1)
        self.updating = True
        self.activityTimer.start(100, False)
        self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value or hasattr(self.session, 'infobar') and self.session.infobar is None) and config.ParentalControl.config_sections.software_update.value

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(ngettext('Update completed, %d package was installed.', 'Update completed, %d packages were installed.', self.packages) % self.packages)

    def ipkgCallback(self, event, param):
        global ocram
        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') + ': %s/%s' % (self.packages, self.total_packages))
            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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in ('N', 'Y'):
                self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(self.modificationCallback, MessageBox, _('A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?') % param)
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = None
                self.total_packages = len(self.ipkg.getFetchedList())
                message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(' + ngettext('%s updated package available', '%s updated packages available', self.total_packages) % self.total_packages + ')'
                if self.total_packages > 150:
                    message += ' ' + _('Reflash recommended!')
                if self.total_packages:
                    for package_tmp in self.ipkg.getFetchedList():
                        if package_tmp[0].startswith('enigma2-plugin-picons-tv-ocram'):
                            ocram = ocram + '[ocram-picons] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'
                        elif package_tmp[0].startswith('enigma2-plugin-settings-ocram'):
                            ocram = ocram + '[ocram-settings] ' + package_tmp[0].split('enigma2-plugin-picons-tv-ocram.')[1] + 'updated ' + package_tmp[2] + '\n'

                    config.softwareupdate.updatefound.setValue(True)
                    choices = [(_('View the changes'), 'changes'), (_('Update and ask to reboot'), 'hot'), (_('Upgrade and reboot system'), 'cold')]
                    if path.exists('/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo'):
                        if not config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value:
                            choices.append((_('Perform a settings backup,') + '\n\t' + _('making a backup before updating') + '\n\t' + _('is strongly advised.'), 'backup'))
                        if not config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value:
                            choices.append((_('Perform a full image backup'), 'imagebackup'))
                    choices.append((_('Update channel list only'), 'channels'))
                    choices.append((_('Cancel'), ''))
                    upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
                    upgrademessage.setTitle(_('Software update'))
                else:
                    upgrademessage = self.session.openWithCallback(self.close, MessageBox, _('Nothing to upgrade'), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
                    upgrademessage.setTitle(_('Software update'))
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(_('Could not find installed channel list.'))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _('Your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your %s %s.') % (getMachineBrand(),
                 getMachineName(),
                 getMachineBrand(),
                 getMachineName())
                if self.packages == 0:
                    error = _('A background update check is in progress,\nplease wait a few minutes and try again.')
                if self.updating:
                    error = _('Update failed. Your %s %s does not have a working internet connection.') % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == 'menu':
            message = _('Do you want to update your %s %s ?') % (getMachineBrand(), getMachineName()) + '\n(%s ' % self.total_packages + _('Packages') + ')'
            choices = [(_('View the changes'), 'changes'), (_('Update and ask to reboot'), 'hot'), (_('Upgrade and reboot system'), 'cold')]
            choices.append((_('Update channel list only'), 'channels'))
            choices.append((_('Cancel'), ''))
            upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name='SoftwareUpdateChoices', var=self.trafficLight)
            upgrademessage.setTitle(_('Software update'))
        elif answer[1] == 'changes':
            from Plugins.Extensions.EGAMINews.plugin import EGAMIMainNews
            self.session.openWithCallback(self.startActualUpgrade, EGAMIMainNews)
        elif answer[1] == 'backup':
            self.doSettingsBackup()
        elif answer[1] == 'imagebackup':
            self.doImageBackup()
        elif answer[1] == 'channels':
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST, args={'installed_only': True})
        elif answer[1] == 'cold':
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args={'test_only': False})

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

    def doSettingsBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
        self.BackupFiles = BackupFiles(self.session, True)
        Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Backup Manager'):
                break

        self.showJobView(job)

    def doImageBackup(self):
        backup = None
        from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
        self.ImageBackup = ImageBackup(self.session, True)
        Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
        Components.Task.job_manager.in_background = False
        for job in Components.Task.job_manager.getPendingJobs():
            if job.name == dgettext('vix', 'Image Manager'):
                break

        self.showJobView(job)

    def doAutoBackup(self, val = False):
        self.autobackuprunning = True
        if config.softwareupdate.autosettingsbackup.value and config.backupmanager.backuplocation.value and not self.SettingsBackupDone:
            self.doSettingsBackup()
        elif config.softwareupdate.autoimagebackup.value and config.imagemanager.backuplocation.value and not self.ImageBackupDone:
            self.doImageBackup()
        else:
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()

    def showJobView(self, job):
        if job.name == dgettext('vix', 'Image Manager'):
            self.ImageBackupDone = True
        elif job.name == dgettext('vix', 'Backup Manager'):
            self.SettingsBackupDone = True
        from Screens.TaskView import JobView
        Components.Task.job_manager.in_background = False
        if not self.autobackuprunning:
            self.session.openWithCallback(self.startActualUpgrade(('menu', 'menu')), JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')
        else:
            self.session.openWithCallback(self.doAutoBackup, JobView, job, cancelable=False, backgroundable=False, afterEventChangeable=False, afterEvent='close')

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(self.exitAnswer, MessageBox, _('Upgrade finished.') + ' ' + _('Do you want to reboot your %s %s') % (getMachineBrand(), getMachineName()))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()
コード例 #37
0
ファイル: SoftwareUpdate.py プロジェクト: noox-/stbgui
class UpdatePlugin(Screen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None

        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def checkTraficLight(self):

        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)

        from urllib import urlopen
        import socket
        import os
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ""
        picon = None
        default = True
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            if getBoxType() in urlopen(
                    "http://openpli.org/status").read().split(','):
                message = _(
                    "The current beta image might not be stable.\nFor more information see www.openpli.org."
                )
                picon = MessageBox.TYPE_ERROR
                default = False
        except:
            message = _(
                "The status of the current beta image could not be checked because www.openpli.org can not be reached."
            )
            picon = MessageBox.TYPE_ERROR
            default = False
        socket.setdefaulttimeout(currentTimeoutDefault)
        if default:
            self.startActualUpdate(True)
        else:
            message += "\n" + _("Do you want to update your receiver?")
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          default=default,
                                          picon=picon)

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    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") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    message = _(
                        "Do you want to update your receiver?") + "\n(" + (
                            ngettext("%s updated package available",
                                     "%s updated packages available",
                                     self.total_packages) %
                            self.total_packages) + ")"
                    choices = [(_("Update and reboot (recommended)"), "cold"),
                               (_("Update and ask to reboot"), "hot"),
                               (_("Update channel list only"), "channels"),
                               (_("Cancel"), "")]
                    self.session.openWithCallback(self.startActualUpgrade,
                                                  ChoiceBox,
                                                  title=message,
                                                  list=choices)
                else:
                    self.session.openWithCallback(self.close,
                                                  MessageBox,
                                                  _("No updates available"),
                                                  type=MessageBox.TYPE_INFO,
                                                  timeout=10,
                                                  close_on_any_key=True)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your receiver does not have a working internet connection."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Update completed. Do you want to reboot your receiver?")
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #38
0
ファイル: SoftwareUpdate.py プロジェクト: noox-/stbgui
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None

		self.channellist_only = 0
		self.channellist_name = ''
		self.updating = False
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self["actions"] = ActionMap(["WizardActions"], 
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)
		
		self.activity = 0 
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.checkTraficLight)
		self.activityTimer.callback.append(self.doActivityTimer)
		self.activityTimer.start(100, True)

	def checkTraficLight(self):
	
		self.activityTimer.callback.remove(self.checkTraficLight)
		self.activityTimer.start(100, False)

		from urllib import urlopen
		import socket
		import os
		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		message = ""
		picon = None
		default = True
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			if getBoxType() in urlopen("http://openpli.org/status").read().split(','):
				message = _("The current beta image might not be stable.\nFor more information see www.openpli.org.")
				picon = MessageBox.TYPE_ERROR
				default = False
		except:
			message = _("The status of the current beta image could not be checked because www.openpli.org can not be reached.")
			picon = MessageBox.TYPE_ERROR
			default = False
		socket.setdefaulttimeout(currentTimeoutDefault)
		if default:
			self.startActualUpdate(True)
		else:
			message += "\n" + _("Do you want to update your receiver?")
			self.session.openWithCallback(self.startActualUpdate, MessageBox, message, default = default, picon = picon)

	def startActualUpdate(self,answer):
		if answer:
			self.updating = True
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
		else:
			self.close()

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	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") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					message = _("Do you want to update your receiver?") + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot"),
						(_("Update channel list only"), "channels"),
						(_("Cancel"), "")]
					self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
				else:
					self.session.openWithCallback(self.close, MessageBox, _("No updates available"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your receiver does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Update completed. Do you want to reboot your receiver?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop,retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #39
0
ファイル: Ipkg.py プロジェクト: popazerty/12
class Ipkg(Screen):
	def __init__(self, session, cmdList = []):
		Screen.__init__(self, session)
		
		self.cmdList = cmdList

		self.sliderPackages = {}
		
		self.slider = Slider(0, len(cmdList))
		self["slider"] = self.slider
		self.activityslider = Slider(0, 100)
		self["activityslider"] = self.activityslider
		self.status = Label(_("Preparing... Please wait"))
		self["status"] = self.status
		self.package = Label()
		self["package"] = self.package
		
		self.packages = 0
		self.error = 0
		self.processed_packages = []
		
		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer_conn = self.activityTimer.timeout.connect(self.doActivityTimer)
		#self.activityTimer.start(100, False)
				
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		
		self.runningCmd = None
		self.runNextCmd()
		
		self["actions"] = ActionMap(["WizardActions"], 
		{
			"ok": self.exit, 
			"back": self.exit
		}, -1)
		
	def runNextCmd(self):
		if self.runningCmd is None:
			self.runningCmd = 0
		else:
			self.runningCmd += 1
		print len(self.cmdList), self.runningCmd
		if len(self.cmdList) - 1 < self.runningCmd:
			self.activityslider.setValue(0)
			self.slider.setValue(len(self.cmdList))
				
			self.package.setText("")
			self.status.setText(_("Done - Installed, upgraded or removed %d packages with %d errors") % (self.packages, self.error))
			return False
		else:
			cmd = self.cmdList[self.runningCmd]
			self.slider.setValue(self.runningCmd)
			self.ipkg.startCmd(cmd[0], args = cmd[1])
			self.startActivityTimer()
			
	def doActivityTimer(self):
		if not self.ipkg.isRunning():
			self.stopActivityTimer()
		else:
			self.activity += 1
			if self.activity == 100:
				self.activity = 0
			self.activityslider.setValue(self.activity)
		
	def startActivityTimer(self):
		self.activityTimer.start(100, False)
		
	def stopActivityTimer(self):
		self.activityTimer.stop()
		
	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 not param 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 not param 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 not param 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_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			self.runNextCmd()

	def exit(self):
		if not self.ipkg.isRunning():
			self.close()
コード例 #40
0
ファイル: plugin.py プロジェクト: 4doe/enigma2-old
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,200" title="Software update" >
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,60" size="540,45" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""
		
	def __init__(self, session, args = None):
		Screen.__init__(self, session)
		
		self.sliderPackages = { "Settop Box-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
		
		self.slider = Slider(0, 4)
		self["slider"] = self.slider
		self.activityslider = Slider(0, 100)
		self["activityslider"] = self.activityslider
		self.status = StaticText(_("Upgrading Settop Box... Please wait"))
		self["status"] = self.status
		self.package = StaticText()
		self["package"] = self.package
		
		self.packages = 0
		self.error = 0
		
		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.doActivityTimer)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.firsttime = True
		self.onShown.append(self.confirmUpdate)

	def confirmUpdate(self):
		if self.firsttime:
			self.firsttime = False
			self.session.openWithCallback(self.confirmationResult, MessageBox, _("Do you want to upgrade?"))

	def confirmationResult(self, result):
		if not result:
			self.close()
		else:
			self.activityTimer.start(100, False)
			self.updating = True
			self.package.setText(_("Package list update"))
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

	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"))
			self.packages += 1
		elif event == IpkgComponent.EVENT_INSTALL:
			self.package.setText(param)
			self.status.setText(_("Installing"))
			self.packages += 1
		elif event == IpkgComponent.EVENT_CONFIGURING:
			self.package.setText(param)
			self.status.setText(_("Configuring"))
		elif event == IpkgComponent.EVENT_MODIFIED:
			self.session.openWithCallback(
				self.modificationCallback,
				MessageBox,
				_("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param)
			)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})
			elif self.error == 0:
				self.slider.setValue(4)
				
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				
				self.package.setText("")
				self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("your Settop Box might be unusable now. Please consult the manual for further assistance before rebooting your Settop Box.")
				if self.packages == 0:
					error = _("No packages were upgraded yet. So you can check your network and try again.")
				if self.updating:
					error = _("Your Settop Box isn't connected to the internet properly. Please check it and try again.")
				self.status.setText(_("Error") +  " - " + error)
		#print event, "-", param
		pass

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished. Do you want to reboot your Settop Box?"))
			else:
				self.close()
			
	def exitAnswer(self, result):
		if result is not None and result:
			quitMainloop(2)
		self.close()
コード例 #41
0
ファイル: Ipkg.py プロジェクト: 1198s/enigma2
class Ipkg(Screen):
	def __init__(self, session, cmdList=None):
		if not cmdList: cmdList = []
		Screen.__init__(self, session)

		self.cmdList = cmdList

		self.sliderPackages = {}

		self.slider = Slider(0, len(cmdList))
		self["slider"] = self.slider
		self.activityslider = Slider(0, 100)
		self["activityslider"] = self.activityslider
		self.status = Label(_("Preparing... Please wait"))
		self["status"] = self.status
		self.package = Label()
		self["package"] = self.package

		self.packages = 0
		self.error = 0
		self.processed_packages = []

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.doActivityTimer)
		#self.activityTimer.start(100, False)

		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)

		self.runningCmd = None
		self.runNextCmd()

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

	def runNextCmd(self):
		if self.runningCmd is None:
			self.runningCmd = 0
		else:
			self.runningCmd += 1
		print len(self.cmdList), self.runningCmd
		if len(self.cmdList) - 1 < self.runningCmd:
			self.activityslider.setValue(0)
			self.slider.setValue(len(self.cmdList))

			self.package.setText("")
			self.status.setText(ngettext("Done - Installed, upgraded or removed %d package (%s)", "Done - Installed, upgraded or removed %d packages (%s)", self.packages) % (self.packages, ngettext("with %d error", "with %d errors", self.error) % self.error))
			return False
		else:
			cmd = self.cmdList[self.runningCmd]
			self.slider.setValue(self.runningCmd)
			self.ipkg.startCmd(cmd[0], args = cmd[1])
			self.startActivityTimer()

	def doActivityTimer(self):
		if not self.ipkg.isRunning():
			self.stopActivityTimer()
		else:
			self.activity += 1
			if self.activity == 100:
				self.activity = 0
			self.activityslider.setValue(self.activity)

	def startActivityTimer(self):
		self.activityTimer.start(100, False)

	def stopActivityTimer(self):
		self.activityTimer.stop()

	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 not param 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 not param 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 not param 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_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			self.runNextCmd()
		elif event == IpkgComponent.EVENT_MODIFIED:
			self.session.openWithCallback(
				self.modificationCallback,
				MessageBox,
				_("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % param
			)

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

	def exit(self):
		if not self.ipkg.isRunning():
			self.close()
コード例 #42
0
ファイル: plugin.py プロジェクト: OpenVisionE2/extra-plugins
class UpgradeStatus(Screen):
	skin = """
		<screen position="center,center" size="450,130" title=" ">
			<widget name="name" position="10,0" size="430,20" font="Regular;18" halign="left" valign="bottom"/>
			<widget name="slider" position="10,25" size="430,30" borderWidth="2" borderColor="#cccccc"/>
			<widget name="status" position="10,25" zPosition="1" size="430,30" font="Regular;18" halign="center" valign="center" foregroundColor="#9f1313" transparent="1"/>
			<widget source="info" render="Label" position="10,70" zPosition="1" size="430,60" font="Regular;22" halign="center" valign="center" transparent="1"/>
		</screen>
		"""

	def __init__(self, session, parent, firmware, datafile, device):
		Screen.__init__(self, session)
		self.session = session

		self["actions"] = ActionMap(["OkCancelActions"],
                {
			"ok": self.keyExit,
                }, -1)

		self.firmware = firmware
		self.datafile = datafile
		#print("[FirmwareUpgrade] - [%s][%s][%s]" % (self.datafile, firmware, device))

		self["name"] = Label(" ")
		self["info"] = StaticText(_("Can't cancel during upgrade!!"))

		self["status"] = Label(_("Status : 0%"))

		self.slider = Slider(0, 100)
		self["slider"] = self.slider

		self.callback = None

		self.setTitle(firmware.upper() + " Upgrade Status")

		self.FU = FirmwareUpgradeManager()

		self.old_status = 0
		self.status_exit = None
		self.check_status = eTimer()
		self.check_status.callback.append(self.cbCheckStatus)
		self.check_status.start(self.FU.getInterval())

		self.exitTimerCallCount = 0
		self.upgradeLock = True
		self.FU.startUpgrade(self.datafile, device, firmware)

	def cbCheckStatus(self):
		errmsg = ""
		errno = self.FU.checkError()
		if errno:
			self.check_status.stop()
			errmsg = self.FU.getErrorMessage(errno, errmsg)
			print("[FirmwareUpgrade] - ERROR : [%d][%s]" % (errno, errmsg))
			self.session.open(MessageBox, _(errmsg), MessageBox.TYPE_INFO, timeout=10)
			self.cbConfirmExit(False)
			return
		status = self.FU.getStatus()
		if self.old_status > status and status != -1:
			self.session.open(MessageBox, _("Fail to upgrade!! Retry!!"), MessageBox.TYPE_INFO, timeout=10)
		self.slider.setValue(status)
		self["status"].setText(_("%d / 100" % (status)))
		if status == 100:
			self.check_status.stop()
			self["status"].setText(_("Success. Press OK to exit."))
			self.status_exit = eTimer()
			self.status_exit.callback.append(self.cbTimerExit)
			self.status_exit.start(1000)
			self.upgradeLock = False
		self.old_status = status

	def setCallback(self, cb):
		self.callback = cb

	def cbTimerExit(self):
		if self.exitTimerCallCount < 10: # exit after 10 sec.
			self.exitTimerCallCount = self.exitTimerCallCount + 1
			self.setTitle("%s Upgrade Status (%d)" % (self.firmware.upper(), 10 - self.exitTimerCallCount))
			return
		if self.status_exit is not None:
			self.status_exit.stop()
		self.keyExit()

	def cbConfirmExit(self, ret):
		if ret:
			Console().ePopen("rm -f %s %s.md5" % (self.datafile, self.datafile))
		self.close()

	def keyExit(self):
		if self.upgradeLock:
			return
		if self.callback is not None:
			self.callback("Reboot now for a successful upgrade.", True)
		self.session.openWithCallback(self.cbConfirmExit, MessageBox, _("Do you want to remove binary data?"), MessageBox.TYPE_YESNO, timeout=10, default=False)
コード例 #43
0
ファイル: SoftwareUpdate.py プロジェクト: torac/enigma2
class UpdatePlugin(Screen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		Screen.setTitle(self, _("Software Update"))

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.channellist_only = 0
		self.channellist_name = ''
		self.SettingsBackupDone = False
		self.ImageBackupDone = False
		self.autobackuprunning = False

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None
		self.checkNetworkState()

	def checkNetworkState(self):
		cmd1 = "opkg update"
		self.CheckConsole = Console()
		self.CheckConsole.ePopen(cmd1, self.checkNetworkStateFinished)

	def checkNetworkStateFinished(self, result, retval,extra_args=None):
		if result.find('wget returned 1') != -1 or result.find('wget returned 255') != -1 or result.find('404 Not Found') != -1:
			self.session.openWithCallback(self.close, MessageBox, _("Sorry feeds are down for maintenance, please try again later."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif result.find('bad address') != -1:
			self.session.openWithCallback(self.close, MessageBox, _("Your STB_BOX is not connected to the internet, please check your network settings and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		elif result.find('Collected errors') != -1:
			self.session.openWithCallback(self.close, MessageBox, _("A background update check is is progress, please wait a few minutes and try again."), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
		else:
			self.startCheck()

	def startCheck(self):
		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.exit,
			"back": self.exit
		}, -1)

		self.updating = True
		self.activityTimer.start(100, False)
		self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	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") + ": %s/%s" % (self.packages, self.total_packages))
			if not param 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 not param 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 not param 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:
			if config.plugins.softwaremanager.overwriteConfigFiles.getValue() in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.getValue())
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event == IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event == IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
				from urllib import urlopen
				import socket
				currentTimeoutDefault = socket.getdefaulttimeout()
				socket.setdefaulttimeout(3)
				try:
					config.softwareupdate.updateisunstable.setValue(urlopen("http://enigma2.world-of-satellite.com/feeds/" + about.getImageVersionString() + "/status").read())
				except:
					config.softwareupdate.updateisunstable.setValue(1)
				socket.setdefaulttimeout(currentTimeoutDefault)
				self.total_packages = None
				if config.softwareupdate.updateisunstable.getValue() == '1' and config.softwareupdate.updatebeta.getValue():
					self.total_packages = len(self.ipkg.getFetchedList())
					message = _("The current update maybe unstable") + "\n" + _("Are you sure you want to update your STB_BOX?") + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
				elif config.softwareupdate.updateisunstable.getValue() == '0':
					self.total_packages = len(self.ipkg.getFetchedList())
					message = _("Do you want to update your STB_BOX?") + "\n(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
				if self.total_packages:
					config.softwareupdate.updatefound.setValue(True)
					choices = [(_("View the changes"), "changes"),
						(_("Upgrade and reboot system"), "cold")]
					if path.exists("/usr/lib/enigma2/python/Plugins/SystemPlugins/ViX/BackupManager.pyo"):
						if not config.softwareupdate.autosettingsbackup.getValue():
							choices.append((_("Perform a setting backup,") + '\n\t' + _("making a backup before updating") + '\n\t' +_("is strongly advised."), "backup"))
						if not config.softwareupdate.autoimagebackup.getValue():
							choices.append((_("Perform a full image backup"), "imagebackup"))
					choices.append((_("Update channel list only"), "channels"))
					choices.append((_("Cancel"), ""))
					upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name = "SoftwareUpdateChoices")
					upgrademessage.setTitle(_('Software update'))
				else:
					upgrademessage = self.session.openWithCallback(self.close, MessageBox, _("Nothing to upgrade"), type=MessageBox.TYPE_INFO, timeout=10, close_on_any_key=True)
					upgrademessage.setTitle(_('Software update'))
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your STB_BOX might be unusable now. Please consult the manual for further assistance before rebooting your STB_BOX.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your STB_BOX does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event == IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return

		if answer[1] == "menu":
			if config.softwareupdate.updateisunstable.getValue() == '1':
				message = _("The current update maybe unstable") + "\n" + _("Are you sure you want to update your STB_BOX?") + "\n(%s " % self.total_packages + _("Packages") + ")"
			elif config.softwareupdate.updateisunstable.getValue() == '0':
				message = _("Do you want to update your STB_BOX?") + "\n(%s " % self.total_packages + _("Packages") + ")"
			choices = [(_("View the changes"), "changes"),
				(_("Upgrade and reboot system"), "cold")]
			if not self.SettingsBackupDone and not config.softwareupdate.autosettingsbackup.getValue():
				choices.append((_("Perform a setting backup, making a backup before updating is strongly advised."), "backup"))
			if not self.ImageBackupDone and not config.softwareupdate.autoimagebackup.getValue():
				choices.append((_("Perform a full image backup"), "imagebackup"))
			choices.append((_("Update channel list only"), "channels"))
			choices.append((_("Cancel"), ""))
			upgrademessage = self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices, skin_name = "SoftwareUpdateChoices")
			upgrademessage.setTitle(_('Software update'))
		elif answer[1] == "changes":
			self.session.openWithCallback(self.startActualUpgrade,SoftwareUpdateChanges)
		elif answer[1] == "backup":
			self.doSettingsBackup()
		elif answer[1] == "imagebackup":
			self.doImageBackup()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "cold":
			if config.softwareupdate.autosettingsbackup.getValue() or config.softwareupdate.autoimagebackup.getValue():
				self.doAutoBackup()
			else:
				self.session.open(TryQuitMainloop,retvalue=42)
				self.close()

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

	def doSettingsBackup(self):
		backup = None
		from Plugins.SystemPlugins.ViX.BackupManager import BackupFiles
		self.BackupFiles = BackupFiles(self.session)
		Components.Task.job_manager.AddJob(self.BackupFiles.createBackupJob())
		Components.Task.job_manager.in_background = False
		for job in Components.Task.job_manager.getPendingJobs():
			if job.name == dgettext('ViX', 'Backup Manager'):
				break
		self.showJobView(job)

	def doImageBackup(self):
		backup = None
		from Plugins.SystemPlugins.ViX.ImageManager import ImageBackup
		self.ImageBackup = ImageBackup(self.session)
		Components.Task.job_manager.AddJob(self.ImageBackup.createBackupJob())
		Components.Task.job_manager.in_background = False
		for job in Components.Task.job_manager.getPendingJobs():
			if job.name == dgettext('ViX', 'Image Manager'):
				break
		self.showJobView(job)

	def doAutoBackup(self, val = False):
		self.autobackuprunning = True
		if config.softwareupdate.autosettingsbackup.getValue() and not self.SettingsBackupDone:
			self.doSettingsBackup()
		elif config.softwareupdate.autoimagebackup.getValue() and not self.ImageBackupDone:
			self.doImageBackup()
		else:
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()

	def showJobView(self, job):
		if job.name == dgettext('ViX', 'Image Manager'):
			self.ImageBackupDone = True
		elif job.name == dgettext('ViX', 'Backup Manager'):
			self.SettingsBackupDone = True
		from Screens.TaskView import JobView
		Components.Task.job_manager.in_background = False
		if not self.autobackuprunning:
			self.session.openWithCallback(self.startActualUpgrade(("menu", "menu")), JobView, job,  cancelable = False, backgroundable = False, afterEventChangeable = False, afterEvent="close")
		else:
			self.session.openWithCallback(self.doAutoBackup, JobView, job,  cancelable = False, backgroundable = False, afterEventChangeable = False, afterEvent="close")

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your STB_BOX?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop, retvalue=2)
		self.close()
コード例 #44
0
class UpdatePlugin(Screen, ProtectedScreen):
    skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

    def __init__(self, session, *args):
        Screen.__init__(self, session)
        ProtectedScreen.__init__(self)

        self.sliderPackages = {
            "dreambox-dvb-modules": 1,
            "enigma2": 2,
            "tuxbox-image-info": 3
        }

        self.setTitle(_("Software update"))
        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(_("Package list update"))
        self["package"] = self.package
        self.oktext = _("Press OK on your remote control to continue.")

        self.packages = 0
        self.error = 0
        self.processed_packages = []
        self.total_packages = None

        self.channellist_only = 0
        self.channellist_name = ''
        self.updating = False
        self.ipkg = IpkgComponent()
        self.ipkg.addCallback(self.ipkgCallback)
        self.onClose.append(self.__close)

        self["actions"] = ActionMap(["WizardActions"], {
            "ok": self.exit,
            "back": self.exit
        }, -1)

        self.activity = 0
        self.activityTimer = eTimer()
        self.activityTimer.callback.append(self.checkTraficLight)
        self.activityTimer.callback.append(self.doActivityTimer)
        self.activityTimer.start(100, True)

    def isProtected(self):
        return config.ParentalControl.setuppinactive.value and\
         (not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
         config.ParentalControl.config_sections.software_update.value

    def checkTraficLight(self):

        self.activityTimer.callback.remove(self.checkTraficLight)
        self.activityTimer.start(100, False)

        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        message = ""
        picon = None
        default = True
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            status = urlopen("http://sfteam.es/status").read().split('!', 1)
            if getBoxType() in status[0].split(','):
                message = len(status) > 1 and status[1] or _(
                    "The current beta image might not be stable.\nFor more information see %s."
                ) % ("www.sfteam.es")
                picon = MessageBox.TYPE_ERROR
                default = False
        except:
            message = _(
                "The status of the current beta image could not be checked because %s can not be reached."
            ) % ("www.sfteam.es")
            picon = MessageBox.TYPE_ERROR
            default = False
        socket.setdefaulttimeout(currentTimeoutDefault)
        if default:
            self.showDisclaimer()
        else:
            message += "\n" + _("Do you want to update your receiver?")
            self.session.openWithCallback(self.startActualUpdate,
                                          MessageBox,
                                          message,
                                          default=default,
                                          picon=picon)

    def showDisclaimer(self, justShow=False):
        if config.usage.show_update_disclaimer.value or justShow:
            message = _(
                "The SFteam team would like to point out that upgrading to the latest nightly build comes not only with the latest features, but also with some risks. After the update, it is possible that your device no longer works as expected. We recommend you create backups with Autobackup or Backupsuite. This allows you to quickly and easily restore your device to its previous state, should you experience any problems. If you encounter a 'bug', please report the issue on www.sfteam.es.\n\nDo you understand this?"
            )
            list = not justShow and [
                (_("no"), False), (_("yes"), True),
                (_("yes") + " " + _("and never show this message again"),
                 "never")
            ] or []
            self.session.openWithCallback(boundFunction(
                self.disclaimerCallback, justShow),
                                          MessageBox,
                                          message,
                                          list=list)
        else:
            self.startActualUpdate(True)

    def disclaimerCallback(self, justShow, answer):
        if answer == "never":
            config.usage.show_update_disclaimer.value = False
            config.usage.show_update_disclaimer.save()
        if justShow and answer:
            self.ipkgCallback(IpkgComponent.EVENT_DONE, None)
        else:
            self.startActualUpdate(answer)

    def getLatestImageTimestamp(self):
        currentTimeoutDefault = socket.getdefaulttimeout()
        socket.setdefaulttimeout(3)
        latestImageTimestamp = ""
        try:
            # TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
            # run in parallel to the package update.
            latestImageTimestamp = re.findall(
                '<dd>(.*?)</dd>',
                urlopen("http://sfteam.es/download/" + getBoxType() +
                        "/").read())[0][:16]
            latestImageTimestamp = time.strftime(
                _("%d-%b-%Y %-H:%M"),
                time.strptime(latestImageTimestamp, "%Y/%m/%d %H:%M"))
        except:
            pass
        socket.setdefaulttimeout(currentTimeoutDefault)
        return latestImageTimestamp

    def startActualUpdate(self, answer):
        if answer:
            self.updating = True
            self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
        else:
            self.close()

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

    def showUpdateCompletedMessage(self):
        self.setEndMessage(
            ngettext("Update completed, %d package was installed.",
                     "Update completed, %d packages were installed.",
                     self.packages) % self.packages)

    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") + ": %s/%s" %
                (self.packages, self.total_packages))
            if not param 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 not param 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 not param 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:
            if config.plugins.softwaremanager.overwriteConfigFiles.value in (
                    "N", "Y"):
                self.ipkg.write(
                    True and
                    config.plugins.softwaremanager.overwriteConfigFiles.value)
            else:
                self.session.openWithCallback(
                    self.modificationCallback, MessageBox,
                    _("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?"
                      ) % (param))
        elif event == IpkgComponent.EVENT_ERROR:
            self.error += 1
        elif event == IpkgComponent.EVENT_DONE:
            if self.updating:
                self.updating = False
                self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
            elif self.ipkg.currentCommand == IpkgComponent.CMD_UPGRADE_LIST:
                self.total_packages = len(self.ipkg.getFetchedList())
                if self.total_packages:
                    latestImageTimestamp = self.getLatestImageTimestamp()
                    if latestImageTimestamp:
                        message = _(
                            "Do you want to update your receiver to %s?"
                        ) % self.getLatestImageTimestamp() + "\n"
                    else:
                        message = _(
                            "Do you want to update your receiver?") + "\n"
                    message += "(" + (ngettext(
                        "%s updated package available",
                        "%s updated packages available", self.total_packages) %
                                      self.total_packages) + ")"
                    if self.total_packages > 150:
                        message += " " + _("Reflash recommended!")
                    choices = [(_("Update and reboot (recommended)"), "cold"),
                               (_("Update and ask to reboot"), "hot"),
                               (_("Update channel list only"), "channels"),
                               (_("Show packages to be upgraded"), "showlist")]
                else:
                    message = _("No updates available")
                    choices = []
                if fileExists("/home/root/ipkgupgrade.log"):
                    choices.append((_("Show latest upgrade log"), "log"))
                choices.append(
                    (_("Show latest commits on sourceforge"), "commits"))
                if not config.usage.show_update_disclaimer.value:
                    choices.append((_("Show disclaimer"), "disclaimer"))
                choices.append((_("Cancel"), ""))
                self.session.openWithCallback(self.startActualUpgrade,
                                              ChoiceBox,
                                              title=message,
                                              list=choices)
            elif self.channellist_only > 0:
                if self.channellist_only == 1:
                    self.setEndMessage(
                        _("Could not find installed channel list."))
                elif self.channellist_only == 2:
                    self.slider.setValue(2)
                    self.ipkg.startCmd(IpkgComponent.CMD_REMOVE,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 3:
                    self.slider.setValue(3)
                    self.ipkg.startCmd(IpkgComponent.CMD_INSTALL,
                                       {'package': self.channellist_name})
                    self.channellist_only += 1
                elif self.channellist_only == 4:
                    self.showUpdateCompletedMessage()
                    eDVBDB.getInstance().reloadBouquets()
                    eDVBDB.getInstance().reloadServicelist()
            elif self.error == 0:
                self.showUpdateCompletedMessage()
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    "Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver."
                )
                if self.packages == 0:
                    error = _("No updates available. Please try again later.")
                if self.updating:
                    error = _(
                        "Update failed. Your receiver does not have a working internet connection."
                    )
                self.status.setText(_("Error") + " - " + error)
        elif event == IpkgComponent.EVENT_LISTITEM:
            if 'enigma2-plugin-settings-' in param[
                    0] and self.channellist_only > 0:
                self.channellist_name = param[0]
                self.channellist_only = 2
        #print event, "-", param
        pass

    def setEndMessage(self, txt):
        self.slider.setValue(4)
        self.activityTimer.stop()
        self.activityslider.setValue(0)
        self.package.setText(txt)
        self.status.setText(self.oktext)

    def startActualUpgrade(self, answer):
        if not answer or not answer[1]:
            self.close()
            return
        if answer[1] == "cold":
            self.session.open(TryQuitMainloop, retvalue=42)
            self.close()
        elif answer[1] == "channels":
            self.channellist_only = 1
            self.slider.setValue(1)
            self.ipkg.startCmd(IpkgComponent.CMD_LIST,
                               args={'installed_only': True})
        elif answer[1] == "commits":
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), CommitInfo)
        elif answer[1] == "disclaimer":
            self.showDisclaimer(justShow=True)
        elif answer[1] == "showlist":
            text = ""
            for i in [
                    x[0] for x in sorted(self.ipkg.getFetchedList(),
                                         key=lambda d: d[0])
            ]:
                text = text and text + "\n" + i or i
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), TextBox, text, _("Packages to update"))
        elif answer[1] == "log":
            text = ""
            for i in open("/home/root/ipkgupgrade.log", "r").readlines():
                text += i
            self.session.openWithCallback(
                boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE,
                              None), TextBox, text, _("Packages to update"))
        else:
            self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE,
                               args={'test_only': False})

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

    def exit(self):
        if not self.ipkg.isRunning():
            if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _("Update completed. Do you want to reboot your receiver?")
                )
            else:
                self.close()
        else:
            if not self.updating:
                self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, retvalue=2)
        self.close()

    def __close(self):
        self.ipkg.removeCallback(self.ipkgCallback)
コード例 #45
0
ファイル: plugin.py プロジェクト: vuteam/dvbapp2-gui
class UpdateEGAMI(Screen):
    skin = '<screen name="UpdateEGAMI" position="center,center" size="550,300" title="Software update" >\n\t\t<widget name="activityslider" position="0,0" size="550,5"  />\n\t\t<widget name="slider" position="0,150" size="550,30"  />\n\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<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 = {
            'ceryon-dvb-modules': 1,
            'broadmedia-dvb-modules': 2,
            'ini-dvb-modules': 3,
            'enigma2': 4,
            'egami-version-info': 5
        }
        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.exit,
            'back': self.exit
        }, -1)
        self['actions'].csel = self
        self['actions'].setEnabled(False)
        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 checkFreeSpace(self):
        free_flash_space = self.getFreeSpace('/')
        if free_flash_space > 19000000:
            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()
        else:
            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 Your ') + ' %s %s ' %
                    (getMachineBrand(), getMachineName()) + _('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['actions'].setEnabled(True)
        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)
                self['actions'].setEnabled(True)
            else:
                self.activityTimer.stop()
                self.activityslider.setValue(0)
                error = _(
                    'your %s %s might be unusable now. Please consult the manual for further assistance before rebooting your STB.'
                ) % (getMachineBrand(), getMachineName())
                if self.packages == 0:
                    error = _(
                        'No packages were upgraded yet. So you can check your network and try again.'
                    )
                if self.updating:
                    error = _(
                        "Your %s %s isn't connected to the internet properly. Please check it and try again."
                    ) % (getMachineBrand(), getMachineName())
                self.status.setText(_('Error') + ' - ' + error)
                self['actions'].setEnabled(True)

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

    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('/etc/do_update', 'w+').close()
                self.session.openWithCallback(
                    self.exitAnswer, MessageBox,
                    _('Upgrade finished.') + ' ' +
                    _('Do you want to reboot your %s %s ?') %
                    (getMachineBrand(), getMachineName()))
            else:
                self.close()
        elif not self.updating:
            self.close()

    def exitAnswer(self, result):
        if result is not None and result:
            self.session.open(TryQuitMainloop, 2)
        self.close()
コード例 #46
0
class UpdatePlugin(Screen, ProtectedScreen):
	skin = """
		<screen name="UpdatePlugin" position="center,center" size="550,300">
			<widget name="activityslider" position="0,0" size="550,5"  />
			<widget name="slider" position="0,150" size="550,30"  />
			<widget source="package" render="Label" position="10,30" size="540,20" font="Regular;18" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
			<widget source="status" render="Label" position="10,180" size="540,100" font="Regular;20" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
		</screen>"""

	def __init__(self, session, *args):
		Screen.__init__(self, session)
		ProtectedScreen.__init__(self)

		self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }

		self.setTitle(_("Software update"))
		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(_("Package list update"))
		self["package"] = self.package
		self.oktext = _("Press OK on your remote control to continue.")

		self.packages = 0
		self.error = 0
		self.processed_packages = []
		self.total_packages = None

		self.channellist_only = 0
		self.channellist_name = ''
		self.updating = False
		self.ipkg = IpkgComponent()
		self.ipkg.addCallback(self.ipkgCallback)
		self.onClose.append(self.__close)

		self["actions"] = ActionMap(["WizardActions"],
		{
			"ok": self.exit,
			"back": self.exit
		}, -1)

		self.activity = 0
		self.activityTimer = eTimer()
		self.activityTimer.callback.append(self.checkTraficLight1)
		self.activityTimer.callback.append(self.doActivityTimer)
		self.activityTimer.start(20, True)

	def checkTraficLight1(self):
		self.activityTimer.callback.remove(self.checkTraficLight1)
		self.activityTimer.start(100, False)
		self.showDisclaimer()

	def isProtected(self):
		return config.ParentalControl.setuppinactive.value and\
			(not config.ParentalControl.config_sections.main_menu.value and not config.ParentalControl.config_sections.configuration.value  or hasattr(self.session, 'infobar') and self.session.infobar is None) and\
			config.ParentalControl.config_sections.software_update.value

	def checkTraficLight(self):

		self.activityTimer.callback.remove(self.checkTraficLight)
		self.activityTimer.start(100, False)

		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		message = ""
		picon = None
		default = True
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			status = urlopen("http://openpli.org/status/").read().split('!', 1)
			if getBoxType() in status[0].split(','):
				message = len(status) > 1 and status[1] or _("The current beta image might not be stable.\nFor more information see %s.") % ("www.openpli.org")
				picon = MessageBox.TYPE_ERROR
				default = False
		except:
			message = _("The status of the current beta image could not be checked because %s can not be reached.") % ("www.openpli.org")
			picon = MessageBox.TYPE_ERROR
			default = False
		socket.setdefaulttimeout(currentTimeoutDefault)
		if default:
			self.showDisclaimer()
		else:
			message += "\n" + _("Do you want to update your receiver?")
			self.session.openWithCallback(self.startActualUpdate, MessageBox, message, default = default, picon = picon)

	def showDisclaimer(self, justShow=False):
		if config.usage.show_update_disclaimer.value or justShow:
			message = _("The OpenPLi team would like to point out that upgrading to the latest nightly build comes not only with the latest features, but also with some risks. After the update, it is possible that your device no longer works as expected. We recommend you create backups with Autobackup or Backupsuite. This allows you to quickly and easily restore your device to its previous state, should you experience any problems. If you encounter a 'bug', please report the issue on www.openpli.org.\n\nDo you understand this?")
			list = not justShow and [(_("no"), False), (_("yes"), True), (_("yes") + " " + _("and never show this message again"), "never")] or []
			self.session.openWithCallback(boundFunction(self.disclaimerCallback, justShow), MessageBox, message, list=list)
		else:
			self.startActualUpdate(True)

	def disclaimerCallback(self, justShow, answer):
		if answer == "never":
			config.usage.show_update_disclaimer.value = False
			config.usage.show_update_disclaimer.save()
		if justShow and answer:
			self.ipkgCallback(IpkgComponent.EVENT_DONE, None)
		else:
			self.startActualUpdate(answer)

	def getLatestImageTimestamp(self):
		# TODO: Impement own sh4 timestamp
		return ""
		
		currentTimeoutDefault = socket.getdefaulttimeout()
		socket.setdefaulttimeout(3)
		latestImageTimestamp = ""
		try:
			# TODO: Use Twisted's URL fetcher, urlopen is evil. And it can
			# run in parallel to the package update.
			latestImageTimestamp = re.findall('<dd>(.*?)</dd>', urlopen("http://openpli.org/download/"+getBoxType()+"/").read())[0][:16]
			latestImageTimestamp = time.strftime(_("%d-%b-%Y %-H:%M"), time.strptime(latestImageTimestamp, "%Y/%m/%d %H:%M"))
		except:
			pass
		socket.setdefaulttimeout(currentTimeoutDefault)
		return latestImageTimestamp

	def startActualUpdate(self,answer):
		if answer:
			self.updating = True
			self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
		else:
			self.close()

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

	def showUpdateCompletedMessage(self):
		self.setEndMessage(ngettext("Update completed, %d package was installed.", "Update completed, %d packages were installed.", self.packages) % self.packages)

	def ipkgCallback(self, event, param):
		if event is IpkgComponent.EVENT_DOWNLOAD:
			self.status.setText(_("Downloading"))
		elif event is IpkgComponent.EVENT_UPGRADE:
			if self.sliderPackages.has_key(param):
				self.slider.setValue(self.sliderPackages[param])
			self.package.setText(param)
			self.status.setText(_("Upgrading") + ": %s/%s" % (self.packages, self.total_packages))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event is IpkgComponent.EVENT_INSTALL:
			self.package.setText(param)
			self.status.setText(_("Installing"))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event is IpkgComponent.EVENT_REMOVE:
			self.package.setText(param)
			self.status.setText(_("Removing"))
			if not param in self.processed_packages:
				self.processed_packages.append(param)
				self.packages += 1
		elif event is IpkgComponent.EVENT_CONFIGURING:
			self.package.setText(param)
			self.status.setText(_("Configuring"))
		elif event is IpkgComponent.EVENT_MODIFIED:
			if config.plugins.softwaremanager.overwriteConfigFiles.value in ("N", "Y"):
				self.ipkg.write(True and config.plugins.softwaremanager.overwriteConfigFiles.value)
			else:
				self.session.openWithCallback(
					self.modificationCallback,
					MessageBox,
					_("A configuration file (%s) has been modified since it was installed.\nDo you want to keep your modifications?") % (param)
				)
		elif event is IpkgComponent.EVENT_ERROR:
			self.error += 1
		elif event is IpkgComponent.EVENT_DONE:
			if self.updating:
				self.updating = False
				self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE_LIST)
			elif self.ipkg.currentCommand is IpkgComponent.CMD_UPGRADE_LIST and self.error == 0:
				self.total_packages = len(self.ipkg.getFetchedList())
				if self.total_packages:
					latestImageTimestamp = self.getLatestImageTimestamp()
					if latestImageTimestamp:
						message = _("Do you want to update your receiver to %s?") % self.getLatestImageTimestamp() + "\n"
					else:
						message = _("Do you want to update your receiver?") + "\n"
					message += "(" + (ngettext("%s updated package available", "%s updated packages available", self.total_packages) % self.total_packages) + ")"
					if self.total_packages > 150:
						message += " " + _("Reflash recommended!")
					choices = [(_("Update and reboot (recommended)"), "cold"),
						(_("Update and ask to reboot"), "hot"),
						(_("Update channel list only"), "channels"),
						(_("Show updated packages"), "showlist")]
				else:
					message = _("No updates available")
					choices = []
				if fileExists("/hdd/ipkgupgrade.log"):
					choices.append((_("Show latest upgrade log"), "log"))
				choices.append((_("Show latest commits"), "commits"))
				if not config.usage.show_update_disclaimer.value:
					choices.append((_("Show disclaimer"), "disclaimer"))
				choices.append((_("Cancel"), ""))
				self.session.openWithCallback(self.startActualUpgrade, ChoiceBox, title=message, list=choices)
			elif self.channellist_only > 0:
				if self.channellist_only == 1:
					self.setEndMessage(_("Could not find installed channel list."))
				elif self.channellist_only == 2:
					self.slider.setValue(2)
					self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 3:
					self.slider.setValue(3)
					self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': self.channellist_name})
					self.channellist_only += 1
				elif self.channellist_only == 4:
					self.showUpdateCompletedMessage()
					eDVBDB.getInstance().reloadBouquets()
					eDVBDB.getInstance().reloadServicelist()
			elif self.error == 0:
				self.showUpdateCompletedMessage()
			else:
				self.activityTimer.stop()
				self.activityslider.setValue(0)
				error = _("Your receiver might be unusable now. Please consult the manual for further assistance before rebooting your receiver.")
				if self.packages == 0:
					error = _("No updates available. Please try again later.")
				if self.updating:
					error = _("Update failed. Your receiver does not have a working internet connection.")
				self.status.setText(_("Error") +  " - " + error)
		elif event is IpkgComponent.EVENT_LISTITEM:
			if 'enigma2-plugin-settings-' in param[0] and self.channellist_only > 0:
				self.channellist_name = param[0]
				self.channellist_only = 2
		#print event, "-", param
		pass

	def setEndMessage(self, txt):
		self.slider.setValue(4)
		self.activityTimer.stop()
		self.activityslider.setValue(0)
		self.package.setText(txt)
		self.status.setText(self.oktext)

	def startActualUpgrade(self, answer):
		if not answer or not answer[1]:
			self.close()
			return
		if answer[1] == "cold":
			self.session.open(TryQuitMainloop,retvalue=42)
			self.close()
		elif answer[1] == "channels":
			self.channellist_only = 1
			self.slider.setValue(1)
			self.ipkg.startCmd(IpkgComponent.CMD_LIST, args = {'installed_only': True})
		elif answer[1] == "commits":
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), CommitInfo)
		elif answer[1] == "disclaimer":
			self.showDisclaimer(justShow=True)
		elif answer[1] == "showlist":
			text = ""
			for i in [x[0] for x in sorted(self.ipkg.getFetchedList(), key=lambda d: d[0])]:
				text = text and text + "\n" + i or i
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages to update"))
		elif answer[1] == "log":
			text = ""
			for i in open("/hdd/ipkgupgrade.log", "r").readlines():
				text += i
			self.session.openWithCallback(boundFunction(self.ipkgCallback, IpkgComponent.EVENT_DONE, None), TextBox, text, _("Packages to update"))
		else:
			self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False})

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

	def exit(self):
		if not self.ipkg.isRunning():
			if self.packages != 0 and self.error == 0 and self.channellist_only == 0:
				self.session.openWithCallback(self.exitAnswer, MessageBox, _("Update completed. Do you want to reboot your receiver?"))
			else:
				self.close()
		else:
			if not self.updating:
				self.close()

	def exitAnswer(self, result):
		if result is not None and result:
			self.session.open(TryQuitMainloop,retvalue=2)
		self.close()

	def __close(self):
		self.ipkg.removeCallback(self.ipkgCallback)
コード例 #47
0
class AirPlayMoviePlayer(MoviePlayer):

    def __init__(self, session, service, backend, start = None, lastservice = None):
        self.backend = backend
        self.startNewServiceOnPlay = False
        self.start = start
        self.service = service
        self.session = session
        self.useProxy = False
        self.url = self.service.getPath()
        self.proxyReady = False
        self.proxyError = False
        self['useProxy'] = Boolean(False)
        self['premiumUser'] = Boolean(False)
        self.azBoxLastService = None
        self.proxyCaching = False
        print '[AirPlayMoviePlayer] MoviePlayer play url: ', self.url
        if self.url[:7] == 'http://' or self.url[:8] == 'https://':
            print '[AirPlayMoviePlayer] found http(s) link'
            if self.checkProxyUsable() and config.plugins.airplayer.useProxyIfPossible.value:
                print '[AirPlayMoviePlayer] using proxy'
                self.service = None
                self.startNewServiceOnPlay = True
                self.proxyCaching = True
                self.useProxy = True
                self['useProxy'] = Boolean(True)
        if 'm3u8' in self.url and self.useProxy == False:
            Notifications.AddNotification(MessageBox, _('You are trying to play an m3u8 stream. Playing m3u8 streams requires a Premium-Key to use the embedded proxy or a very new version of GStreamer and the gst-fragmented plugin. Otherwise the playback might not work!'), type=MessageBox.TYPE_INFO, timeout=10)
        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.azBoxLastService = lastservice or self.session.nav.getCurrentlyPlayingServiceReference()
            self.session.nav.stopService()
            open('/proc/player', 'w').write('0')
            open('/proc/player', 'w').write('2')
        MoviePlayer.__init__(self, session, self.service)
        if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
            self.lastservice = self.azBoxLastService
        backend.MovieWindow = self
        self.skinName = 'AirPlayerMoviePlayer'
        if lastservice is not None:
            self.lastservice = lastservice
        self.bufferslider = Slider(0, 100)
        self.bufferslider.setValue(0)
        self['bufferslider'] = self.bufferslider
        self['bufferslider'].setValue(0)
        self['label_speed'] = StaticText('DL-Speed: N/A')
        self['label_update'] = StaticText('')
        self['label_cache'] = StaticText('Cache: N/A')
        self.endReached = False
        self.localCache = False
        self.dlactive = False
        self.localsize = 0
        self.proxyProcess = None
        self.liveStream = False
        self.m3u8Stream = False
        self['actions'] = ActionMap(['InfobarInstantRecord', 'MoviePlayerActions'], {'instantRecord': self.keyStartLocalCache,
         'leavePlayer': self.leavePlayer}, -2)
        if config.plugins.airplayer.setSeekOnStart.value and self.start != None and self.start > 0.0:
            start_new_thread(self.seekWatcher, (self,))
        start_new_thread(self.checkForUpdate, (self,))
        self.__event_tracker = ServiceEventTracker(screen=self, eventmap={iPlayableService.evUser + 10: self.__evAudioDecodeError,
         iPlayableService.evUser + 11: self.__evVideoDecodeError,
         iPlayableService.evUser + 12: self.__evPluginError,
         iPlayableService.evEOF: self.__evEOF})
        if self.useProxy:
            start_new_thread(self.proxyWatcher, (self,))
            self.backend.updateEventInfo('loading')
            self.onHide.append(self.lockInfoBar)
            self.proxyCaching = True
            self.checkProxyTimer = eTimer()
            self.checkProxyTimer.timeout.get().append(self.checkProxyStatus)
            self.checkProxyTimer.start(500, True)

    def checkProxyUsable(self):
        if not os.path.exists(PROXY_BINARY):
            return False
        try:
            self.libairtunes = cdll.LoadLibrary('/usr/lib/enigma2/python/Plugins/Extensions/IniAirPlayer/libairtunes.so.0')
            print '[AirPlayMoviePlayer] loading lib done'
            self.validationMessage = ''
            response = create_string_buffer(1024)
            if self.libairtunes.checkValidation(config.plugins.airplayer.validationKey.value, response) < 0:
                return False
            print '[AirPlayMoviePlayer] valid premium user'
            self['premiumUser'] = Boolean(True)
        except Exception as e:
            print '[AirPlayMoviePlayer] loading lib failed'
            print e
            self.libairtunes = None
            return False

        if not os.path.isdir(config.plugins.airplayer.path.value):
            Notifications.AddNotification(MessageBox, _('The path for temp files that you entered in the settings (%s) does not exist! Please set up a propper path in the Settings. The Path is needed for the built in proxy. The proxy was therefore disabled!') % config.plugins.airplayer.path.value, type=MessageBox.TYPE_INFO, timeout=10)
            return False
        if not os.access(config.plugins.airplayer.path.value, os.W_OK):
            Notifications.AddNotification(MessageBox, _('The path for temp files that you entered in the settings (%s) is not writeable! Please set up a propper path in the Settings. The Path is needed for the built in proxy. The proxy was therefore disabled!') % config.plugins.airplayer.path.value, type=MessageBox.TYPE_INFO, timeout=10)
            return False
        stat = os.statvfs(config.plugins.airplayer.path.value)
        free = stat.f_bfree * stat.f_bsize / 1024 / 1024
        print '[AirPlayMoviePlayer] free blocks:', stat.f_bfree, ' block size:', stat.f_bsize
        if free < 128:
            Notifications.AddNotification(MessageBox, _('The path for temp files that you entered in the settings (%s) has only %d MB left. The proxy was therefore disabled!') % (config.plugins.airplayer.path.value, free), type=MessageBox.TYPE_INFO, timeout=10)
            return False
        return True

    def keyStartLocalCache(self):
        if self.useProxy:
            print '[AirPlayMoviePlayer] Proxy is in user, no neef for downloading the file'
            return
        print '[AirPlayMoviePlayer] start local file caheing'
        if '.m3u8' in self.url:
            self.session.open(MessageBox, _('This stream can not get saved on HDD\nm3u8 streams are not supported'), MessageBox.TYPE_INFO)
            return
        if self.localCache == True:
            return
        self.container = eConsoleAppContainer()
        self.container.appClosed.append(self.DLfinished)
        self.container.setCWD(config.plugins.airplayer.path.value)
        self.startDL()

    def startDL(self):
        self.filename = 'test.mov'
        try:
            req = Request(self.url)
            req.add_header('User-agent', 'QuickTime/7.6.2 (verqt=7.6.2;cpu=IA32;so=Mac 10.5.8)')
            usock = urlopen(req)
            self.filesize = usock.info().get('Content-Length')
        except Exception as e:
            print e
            self.filesize = 0

        if self.url[0:4] == 'http' or self.url[0:3] == 'ftp':
            useragentcmd = "--header='User-Agent: %s'" % 'QuickTime/7.6.2 (verqt=7.6.2;cpu=IA32;so=Mac 10.5.8)'
            cmd = "wget %s -q '%s' -O '%s/%s' &" % (useragentcmd,
             self.url,
             config.plugins.airplayer.path.value,
             self.filename)
        else:
            self.session.open(MessageBox, _('This stream can not get saved on HDD\nProtocol %s not supported') % self.service.getPath()[0:5], MessageBox.TYPE_ERROR)
            return
        self.setSeekState(self.SEEK_STATE_PAUSE)
        self.localCache = True
        self.startNewServiceOnPlay = True
        self.StatusTimer = eTimer()
        self.StatusTimer.callback.append(self.UpdateStatus)
        self.StatusTimer.start(1000, True)
        self.dlactive = True
        self.backend.updateEventInfo('loading')
        print '[AirPlayMoviePlayer] execute command: ' + cmd
        self.container.execute(cmd)
        self.session.open(MessageBox, _('The Video will be downloaded to %s\n\nPlease wait until some MB are cached before hitting PLAY\nRecorded Videos from an iPhone/iPad need to be downloaded completely before playback is possible') % config.plugins.airplayer.path.value, type=MessageBox.TYPE_INFO, timeout=10)

    def UpdateStatus(self):
        if not self.dlactive:
            return
        lastSize = 0
        if fileExists(config.plugins.airplayer.path.value + self.filename, 'r'):
            lastSize = self.localsize
            self.localsize = os.path.getsize(config.plugins.airplayer.path.value + self.filename)
        else:
            self.localsize = 0
        if self.localsize > 0 and self.filesize > 0:
            percent = float(float(self.localsize) / float(self.filesize))
            percent = percent * 100.0
            self['bufferslider'].setValue(int(percent))
            if self.localsize - lastSize > 0:
                self['label_speed'].setText('DL-Speed: ' + self.formatKBits(self.localsize - lastSize))
        self.StatusTimer.start(1000, True)

    def DLfinished(self, retval):
        self.dlactive = False
        print '[AirPlayMoviePlayer] DL done'
        self['bufferslider'].setValue(int(100))
        self.setSeekState(self.SEEK_STATE_PLAY)

    def __evAudioDecodeError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            sTagAudioCodec = currPlay.info().getInfoString(iServiceInformation.sTagAudioCodec)
            print "[AirPlayMoviePlayer] audio-codec %s can't be decoded by hardware" % sTagAudioCodec
            Notifications.AddNotification(MessageBox, _("This Box can't decode %s streams!") % sTagAudioCodec, type=MessageBox.TYPE_INFO, timeout=10)
        except Exception:
            pass

    def __evVideoDecodeError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            sTagVideoCodec = currPlay.info().getInfoString(iServiceInformation.sTagVideoCodec)
            print "[AirPlayMoviePlayer] video-codec %s can't be decoded by hardware" % sTagVideoCodec
            Notifications.AddNotification(MessageBox, _("This Box can't decode %s streams!") % sTagVideoCodec, type=MessageBox.TYPE_INFO, timeout=10)
        except Exception:
            pass

    def __evPluginError(self):
        try:
            currPlay = self.session.nav.getCurrentService()
            message = currPlay.info().getInfoString(iServiceInformation.sUser + 12)
            print '[AirPlayMoviePlayer] PluginError ', message
            Notifications.AddNotification(MessageBox, _("Your Box can't decode this video stream!\n%s") % message, type=MessageBox.TYPE_INFO, timeout=10)
        except Exception:
            pass

    def __evEOF(self):
        print '[AirPlayMoviePlayer] got evEOF'
        try:
            err = self.session.nav.getCurrentService().info().getInfoString(iServiceInformation.sUser + 12)
            print '[AirPlayMoviePlayer] Error: ', err
            if err != '':
                Notifications.AddNotification(MessageBox, _("Your Box can't decode this video stream!\n%s") % err, type=MessageBox.TYPE_INFO, timeout=10)
        except Exception as e:
            print '[AirPlayMoviePlayer] Exception: ', e

    def seekWatcher(self, *args):
        print '[AirPlayMoviePlayer] seekWatcher started'
        try:
            while self is not None and self.start is not None:
                self.seekToStartPos()
                sleep(0.2)

        except Exception:
            pass

        print '[AirPlayMoviePlayer] seekWatcher finished'

    def startServiceOfUri(self, uri, useTsService = False):
        self.startNewServiceOnPlay = False
        if useTsService:
            sref = eServiceReference(1, 0, uri)
        else:
            sref = eServiceReference(self.backend.ENIGMA_SERVICE_ID, 0, uri)
        sref.setName('AirPlay')
        self.session.nav.playService(sref)

    def startServiceOfProxy(self, useTsService = False):
        if useTsService:
            self.startServiceOfUri('http://127.0.0.1:7099', True)
        else:
            self.startServiceOfUri('http://127.0.0.1:7099', False)

    def startServiceOfLocalFile(self):
        self.startServiceOfUri(config.plugins.airplayer.path.value + self.filename)

    def lockInfoBar(self):
        print '[AirPlayMoviePlayer] InfoBar is hiding ....'
        if self.startNewServiceOnPlay:
            self.doShow()

    def checkProxyStatus(self):
        print '[AirPlayMoviePlayer] checking prxy caching : ', self.proxyCaching, ' start new Service: ', self.startNewServiceOnPlay
        if self.proxyCaching == False:
            if self.proxyError:
                self.startServiceOfUri(self.url)
                return
            else:
                self.startServiceOfProxy(self.liveStream)
                return
        self.checkProxyTimer.start(500, True)

    def proxyWatcher(self, *args):
        print '[AirPlayMoviePlayer] proxy starting ....'
        self.liveStream = False
        self.m3u8Stream = False
        try:
            args = [PROXY_BINARY,
             self.url,
             config.plugins.airplayer.validationKey.value,
             config.plugins.airplayer.path.value]
            print 'starting proxy'
            print args[0], args[1]
            self.proxyProcess = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            print '[AirPlayMoviePlayer] proxy started ....'
            while self.proxyProcess.poll() == None:
                buff = self.proxyProcess.stdout.readline()
                self.proxyReady = True
                if len(buff) > 0:
                    if buff[:6] == 'rpos: ':
                        percent = int(buff[6:])
                        blockingCallFromMainThread(self['bufferslider'].setValue, percent)
                        if not self.liveStream and percent == 100:
                            self.proxyCaching = False
                    elif buff[:7] == 'cache: ':
                        kb = int(buff[7:])
                        mb = kb / 1024
                        blockingCallFromMainThread(self['label_cache'].setText, 'Cache: ' + self.formatKB(kb * 1024, 'B', 1))
                        print '[AirPlayMoviePlayer] cache is at ', mb, ' MB'
                        if self.liveStream == True and mb >= config.plugins.airplayer.cacheMbBeforeLivePlayback.value and self.startNewServiceOnPlay:
                            self.proxyCaching = False
                        if self.liveStream == False and mb >= config.plugins.airplayer.cacheMbBeforePlayback.value and self.startNewServiceOnPlay:
                            self.proxyCaching = False
                    elif buff[:19] == 'playing livestream!':
                        self.liveStream = True
                        print '[AirPlayMoviePlayer] playing livestream!'
                    elif buff[:13] == 'playing m3u8!':
                        self.m3u8Stream = True
                        print '[AirPlayMoviePlayer] playing m3u8 stream!'
                    elif buff[:8] == 'rspeed: ':
                        rspeed = int(buff[8:]) * 1000
                        blockingCallFromMainThread(self['label_speed'].setText, 'DL-Speed: ' + self.formatKBits(rspeed))
                    elif buff[:7] == 'Error: ':
                        blockingCallFromMainThread(Notifications.AddNotification, MessageBox, _('The Proxy encountered an Error: %s, starting direct playback now!') % buff[7:], type=MessageBox.TYPE_INFO, timeout=10)
                        self.proxyError = True
                        self.proxyCaching = False
                    else:
                        print '[AirPlayMoviePlayer] Proxy: ', buff

            print '[AirPlayMoviePlayer] proxy done'
        except Exception as e:
            print '[AirPlayMoviePlayer] error in proxy: ', e
            traceback.print_exc()
            if self.proxyCaching == True:
                blockingCallFromMainThread(Notifications.AddNotification, MessageBox, _('Starting the Proxy failed: %s, starting direct playback now!') % e, type=MessageBox.TYPE_INFO, timeout=10)
                self.proxyError = True
                self.proxyCaching = False
            else:
                print '[AirPlayMoviePlayer] assume error comes from killing process after eof '

        print '[AirPlayMoviePlayer] proxy thread done'

    def seekToStartPos(self):
        time = 0
        try:
            if self.start is not None and config.plugins.airplayer.setSeekOnStart.value:
                service = self.session.nav.getCurrentService()
                seek = service and service.seek()
                if seek != None:
                    r = seek.getLength()
                    if not r[0]:
                        print '[AirPlayMoviePlayer] got duration'
                        if r[1] == 0:
                            print '[AirPlayMoviePlayer] duration 0'
                            return
                        length = r[1]
                        r = seek.getPlayPosition()
                        if not r[0]:
                            print 'playbacktime ', r[1]
                            if r[1] < 90000:
                                print 'do not seek yet', r[1]
                                return
                        else:
                            return
                        time = length * self.start
                        print '[AirPlayMoviePlayer] seeking to', time, ' length ', length, ''
                        self.start = None
                        if time < 2700000:
                            print '[AirPlayMoviePlayer] skip seeking < 30s'
                            return
                        blockingCallFromMainThread(self.doSeek, int(time))
        except Exception:
            pass

    def formatKBits(self, value, ending = 'Bit/s', roundNumbers = 2):
        bits = value * 8
        if bits > 1048576:
            return str(round(float(bits) / float(1048576), roundNumbers)) + ' M' + ending
        elif bits > 1024:
            return str(round(float(bits) / float(1024), roundNumbers)) + ' K' + ending
        else:
            return str(bits) + ' ' + ending

    def formatKB(self, value, ending = 'B', roundNumbers = 2):
        byte = value
        if byte > 1048576:
            return str(round(float(byte) / float(1048576), roundNumbers)) + ' M' + ending
        elif byte > 1024:
            return str(round(float(byte) / float(1024), roundNumbers)) + ' K' + ending
        else:
            return str(byte) + ' ' + ending

    def checkForUpdate(self, *args):
        url = self.backend.updater.checkForUpdate(self.url, 1)
        if url != '' and url != 'up to date':
            blockingCallFromMainThread(self['label_update'].setText, 'Update Available')

    def setSeekState(self, state, dummy = False):
        if self.startNewServiceOnPlay and state == self.SEEK_STATE_PLAY:
            if self.useProxy:
                if self.proxyCaching == False:
                    print '[AirPlayMoviePlayer] start Proxy cache now'
                    self.startServiceOfProxy(self.liveStream)
            else:
                print '[AirPlayMoviePlayer] start downloaded file now'
                self.startServiceOfLocalFile()
            super(AirPlayMoviePlayer, self).setSeekState(self.SEEK_STATE_PLAY)
        else:
            super(AirPlayMoviePlayer, self).setSeekState(state)
        try:
            if state == self.SEEK_STATE_PAUSE:
                if self.useProxy:
                    self.backend.updateEventInfo('loading')
                else:
                    self.backend.updateEventInfo('paused')
            if state == self.SEEK_STATE_PLAY:
                self.backend.updateEventInfo('playing')
        except Exception as e:
            print e

    def processPlayerStop(self):
        try:
            self.backend.updateEventInfo('stopped')
            self.session.openWithCallback(self.leavePlayerConfirmed, MessageBox, _('Stop AirPlayer playback?'), MessageBox.TYPE_YESNO, timeout=10)
        except Exception:
            self.leavePlayerConfirmed(True)

    def leavePlayer(self):
        self.leavePlayerConfirmed(True)

    def leavePlayerConfirmed(self, answer):
        if answer:
            print '[AirPlayMoviePlayer] stopping MoviePlayer'
            self.backend.MovieWindow = None
            if self.localCache:
                self.container.kill()
                eBackgroundFileEraser.getInstance().erase(config.plugins.airplayer.path.value + self.filename)
                self.StatusTimer.stop()
            if self.lastservice and self.lastservice is not None:
                self.backend.updateEventInfo('stopped')
            else:
                print '[AirPlayMoviePlayer] lastService is None, not sending stop command'
            self.backend.updateEventInfo('stopped')
            if self.backend.ENIGMA_SERVICE_ID == self.backend.ENIGMA_SERVICEAZ_ID:
                self.session.nav.stopService()
                open('/proc/player', 'w').write('1')
                import time
                time.sleep(2)
            try:
                print '[AirPlayMoviePlayer] try to remove proxy cache'
                os.system('rm %s/AirPlayerChunk* &' % config.plugins.airplayer.path.value)
            except Exception:
                pass

            if self.proxyProcess != None:
                try:
                    self.proxyProcess.kill()
                except Exception:
                    pass

            self.close()

    def doEofInternal(self, playing):
        print '[AirPlayMoviePlayer] doEofInternal'
        if self.liveStream:
            print '[AirPlayMoviePlayer] got evEOF in live-stream ignoreing'
            return
        print '[AirPlayMoviePlayer] super.doEofInternal'
        self.backend.updateEventInfo('stopped')
        self.backend.stop_playing()

    def isPlaying(self):
        try:
            if self.seekstate != self.SEEK_STATE_PLAY:
                return False
            return True
        except Exception:
            return False

    def showMovies(self):
        pass