示例#1
0
class NFIFlash(Screen):
    skin = """
		<screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility">
			<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
			<widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
			<widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
			<widget source="listlabel" render="Label" position="10,44" size="250,20" font="Regular;16" />
			<widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" />
			<widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
			<widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
			<widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" />
			<widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
		</screen>"""

    def __init__(self, session, cancelable=True, close_on_finish=False):
        self.skin = NFIFlash.skin
        Screen.__init__(self, session)

        self["job_progressbar"] = Progress()
        self["job_progresslabel"] = StaticText("")

        self["finished"] = Boolean()

        self["infolabel"] = StaticText("")
        self["statusbar"] = StaticText(
            _("Please select .NFI flash image file from medium"))
        self["listlabel"] = StaticText(_("select .NFI flash file") + ":")

        self["key_green"] = StaticText()
        self["key_yellow"] = StaticText()
        self["key_blue"] = StaticText()

        self["actions"] = ActionMap(
            ["OkCancelActions", "ColorActions", "DirectionActions"], {
                "green": self.ok,
                "yellow": self.reboot,
                "blue": self.runWizard,
                "ok": self.ok,
                "left": self.left,
                "right": self.right,
                "up": self.up,
                "down": self.down
            }, -1)

        currDir = "/media/usb/"
        self.filelist = FileList(currDir, matchingPattern="^.*\.(nfi|NFI)")
        self["filelist"] = self.filelist
        self.nfifile = ""
        self.md5sum = ""
        self.job = None
        self.box = HardwareInfo().get_device_name()
        self.configuration_restorable = None
        self.wizard_mode = False
        from enigma import eTimer
        self.delayTimer = eTimer()
        self.delayTimer.callback.append(self.runWizard)
        self.delayTimer.start(50, 1)

    def check_for_wizard(self):
        if self["filelist"].getCurrentDirectory() is not None and fileExists(
                self["filelist"].getCurrentDirectory() + "wizard.nfo"):
            self["key_blue"].text = _("USB stick wizard")
            return True
        else:
            self["key_blue"].text = ""
            return False

    def runWizard(self):
        if not self.check_for_wizard():
            self.wizard_mode = False
            return
        wizardcontent = open(
            self["filelist"].getCurrentDirectory() + "/wizard.nfo",
            "r").readlines()
        nfifile = None
        for line in wizardcontent:
            line = line.strip()
            if line.startswith("image: "):
                nfifile = self["filelist"].getCurrentDirectory() + line[7:]
            if line.startswith("configuration: "):
                backupfile = self["filelist"].getCurrentDirectory() + line[15:]
                if fileExists(backupfile):
                    print "wizard configuration:", backupfile
                    self.configuration_restorable = backupfile
                else:
                    self.configuration_restorable = None
        if nfifile and fileExists(nfifile):
            self.wizard_mode = True
            print "wizard image:", nfifile
            self.check_for_NFO(nfifile)
            self.queryFlash()

    def closeCB(self):
        if (self.job is None or self.job.status
                is not self.job.IN_PROGRESS) and not self.no_autostart:
            self.close()
        #else:
        #if self.cancelable:
        #self.cancel()

    def up(self):
        self["filelist"].up()
        self.check_for_NFO()

    def down(self):
        self["filelist"].down()
        self.check_for_NFO()

    def right(self):
        self["filelist"].pageDown()
        self.check_for_NFO()

    def left(self):
        self["filelist"].pageUp()
        self.check_for_NFO()

    def check_for_NFO(self, nfifile=None):
        self.session.summary.setText(self["filelist"].getFilename())
        if nfifile is None:
            self.session.summary.setText(self["filelist"].getFilename())
            if self["filelist"].getFilename() is None:
                return
            if self["filelist"].getCurrentDirectory() is not None:
                self.nfifile = self["filelist"].getCurrentDirectory(
                ) + self["filelist"].getFilename()
        else:
            self.nfifile = nfifile

        if self.nfifile.upper().endswith(".NFI"):
            self["key_green"].text = _("Flash")
            nfofilename = self.nfifile[0:-3] + "nfo"
            if fileExists(nfofilename):
                nfocontent = open(nfofilename, "r").read()
                self["infolabel"].text = nfocontent
                pos = nfocontent.find("MD5:")
                if pos > 0:
                    self.md5sum = nfocontent[pos + 5:pos + 5 +
                                             32] + "  " + self.nfifile
                else:
                    self.md5sum = ""
            else:
                self["infolabel"].text = _("No details for this image file"
                                           ) + (self["filelist"].getFilename()
                                                or "")
                self.md5sum = ""
        else:
            self["infolabel"].text = ""
            self["key_green"].text = ""

    def ok(self):
        if self.job is None or self.job.status is not self.job.IN_PROGRESS:
            if self["filelist"].canDescent():  # isDir
                self["filelist"].descent()
                self.session.summary.setText(self["filelist"].getFilename())
                self.check_for_NFO()
                self.check_for_wizard()
            else:
                self.queryFlash()

    def queryFlash(self):
        fd = open(self.nfifile, 'r')
        print fd
        sign = fd.read(11)
        print sign
        if sign.find("NFI1" + self.box + "\0") == 0:
            if self.md5sum != "":
                self["statusbar"].text = (
                    "Please wait for md5 signature verification...")
                self.session.summary.setText(
                    ("Please wait for md5 signature verification..."))
                self.container = eConsoleAppContainer()
                self.container.setCWD(self["filelist"].getCurrentDirectory())
                self.container.appClosed.append(self.md5finished)
                self.container.dataSent.append(self.md5ready)
                self.container.execute("md5sum -cw -")
                self.container.write(self.md5sum)
            else:
                self.session.openWithCallback(
                    self.queryCB, MessageBox,
                    _("This .NFI file does not have a md5sum signature and is not guaranteed to work. Do you really want to burn this image to flash memory?"
                      ), MessageBox.TYPE_YESNO)
        else:
            self.session.open(
                MessageBox,
                (_("This .NFI file does not contain a valid %s image!") %
                 (self.box.upper())), MessageBox.TYPE_ERROR)

    def md5ready(self, retval):
        self.container.sendEOF()

    def md5finished(self, retval):
        if retval == 0:
            if self.wizard_mode:
                self.session.openWithCallback(
                    self.queryCB, MessageBox,
                    _("Shall the USB stick wizard proceed and program the image file %s into flash memory?"
                      % self.nfifile.rsplit('/', 1)[-1]),
                    MessageBox.TYPE_YESNO)
            else:
                self.session.openWithCallback(
                    self.queryCB, MessageBox,
                    _("This .NFI file has a valid md5 signature. Continue programming this image to flash memory?"
                      ), MessageBox.TYPE_YESNO)
        else:
            self.session.openWithCallback(
                self.queryCB, MessageBox,
                _("The md5sum validation failed, the file may be corrupted! Are you sure that you want to burn this image to flash memory? You are doing this at your own risk!"
                  ), MessageBox.TYPE_YESNO)

    def queryCB(self, answer):
        if answer == True:
            self.createJob()
        else:
            self["statusbar"].text = _(
                "Please select .NFI flash image file from medium")
            self.wizard_mode = False

    def createJob(self):
        self.job = Job("Image flashing job")
        param = [self.nfifile]
        writeNAND(self.job, param, self.box)
        #writeNAND2(self.job,param)
        #writeNAND3(self.job,param)
        self.job.state_changed.append(self.update_job)
        self.job.end = 540
        self.cwd = self["filelist"].getCurrentDirectory()
        self["job_progressbar"].range = self.job.end
        self.startJob()

    def startJob(self):
        self["key_blue"].text = ""
        self["key_yellow"].text = ""
        self["key_green"].text = ""
        #self["progress0"].show()
        #self["progress1"].show()

        self.job.start(self.jobcb)

    def update_job(self):
        j = self.job
        #print "[job state_changed]"
        if j.status == j.IN_PROGRESS:
            self.session.summary["job_progressbar"].value = j.progress
            self.session.summary["job_progressbar"].range = j.end
            self.session.summary["job_progresslabel"].text = "%.2f%%" % (
                100 * j.progress / float(j.end))
            self["job_progressbar"].range = j.end
            self["job_progressbar"].value = j.progress
            #print "[update_job] j.progress=%f, j.getProgress()=%f, j.end=%d, text=%f" % (j.progress, j.getProgress(), j.end,  (100*j.progress/float(j.end)))
            self["job_progresslabel"].text = "%.2f%%" % (100 * j.progress /
                                                         float(j.end))
            self.session.summary.setText(j.tasks[j.current_task].name)
            self["statusbar"].text = (j.tasks[j.current_task].name)

        elif j.status == j.FINISHED:
            self["statusbar"].text = _(
                "Writing NFI image file to flash completed")
            self.session.summary.setText(
                _("NFI image flashing completed. Press Yellow to Reboot!"))
            if self.wizard_mode:
                self.restoreConfiguration()
            self["key_yellow"].text = _("Reboot")

        elif j.status == j.FAILED:
            self["statusbar"].text = j.tasks[j.current_task].name + " " + _(
                "failed")
            self.session.open(
                MessageBox,
                (_("Flashing failed") + ":\n" + j.tasks[j.current_task].name +
                 ":\n" + j.tasks[j.current_task].output_line),
                MessageBox.TYPE_ERROR)

    def jobcb(self, jobref, fasel, blubber):
        print "[jobcb] %s %s %s" % (jobref, fasel, blubber)
        self["key_green"].text = _("Flash")

    def reboot(self, ret=None):
        if self.job.status == self.job.FINISHED:
            self["statusbar"].text = ("rebooting...")
            TryQuitMainloop(self.session, 2)

    def restoreConfiguration(self):
        if self.configuration_restorable:
            from Screens.Console import Console
            cmdlist = [
                "mount /dev/mtdblock/3 /mnt/realroot -t jffs2", "tar -xzvf " +
                self.configuration_restorable + " -C /mnt/realroot/"
            ]
            self.session.open(Console,
                              title="Restore running",
                              cmdlist=cmdlist,
                              finishedCallback=self.restore_finished,
                              closeOnSuccess=True)

    def restore_finished(self):
        self.session.openWithCallback(
            self.reboot, MessageBox,
            _("USB stick wizard finished. Your dreambox will now restart with your new image!"
              ), MessageBox.TYPE_INFO)

    def createSummary(self):
        return NFISummary
示例#2
0
文件: flasher.py 项目: TitanNit/tdt
class NFIFlash(Screen):
	skin = """
		<screen name="NFIFlash" position="90,95" size="560,420" title="Image flash utility">
			<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
			<widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
			<widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
			<widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
			<widget source="listlabel" render="Label" position="16,44" size="200,21" valign="center" font="Regular;18" />
			<widget name="filelist" position="0,68" size="260,260" scrollbarMode="showOnDemand" />
			<widget source="infolabel" render="Label" position="270,44" size="280,284" font="Regular;16" />
			<widget source="job_progressbar" render="Progress" position="10,374" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
			<widget source="job_progresslabel" render="Label" position="180,378" zPosition="2" font="Regular;18" halign="center" transparent="1" size="200,22" foregroundColor="#000000" />
			<widget source="statusbar" render="Label" position="10,404" size="540,16" font="Regular;16" foregroundColor="#cccccc" />
		</screen>"""

	def __init__(self, session, cancelable = True, close_on_finish = False):
		self.skin = NFIFlash.skin
		Screen.__init__(self, session)
		
		self["job_progressbar"] = Progress()
		self["job_progresslabel"] = StaticText("")
		
		self["finished"] = Boolean()

		self["infolabel"] = StaticText("")
		self["statusbar"] = StaticText(_("Please select .NFI flash image file from medium"))
		self["listlabel"] = StaticText(_("select .NFI flash file")+":")
		
		self["key_green"] = StaticText()
		self["key_yellow"] = StaticText()
		self["key_blue"] = StaticText()

		self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"],
		{
			"green": self.ok,
			"yellow": self.reboot,
			"ok": self.ok,
			"left": self.left,
			"right": self.right,
			"up": self.up,
			"down": self.down
		}, -1)

		currDir = "/media/usb/"
		self.filelist = FileList(currDir, matchingPattern = "^.*\.(nfi|NFI)")
		self["filelist"] = self.filelist
		self.nfifile = ""
		self.md5sum = ""
		self.job = None
		self.box = HardwareInfo().get_device_name()

	def closeCB(self):
		if ( self.job is None or self.job.status is not self.job.IN_PROGRESS ) and not self.no_autostart:
			self.close()
		#else:
			#if self.cancelable:
				#self.cancel()

	def up(self):
		self["filelist"].up()
		self.check_for_NFO()

	def down(self):
		self["filelist"].down()
		self.check_for_NFO()
	
	def right(self):
		self["filelist"].pageDown()
		self.check_for_NFO()

	def left(self):
		self["filelist"].pageUp()
		self.check_for_NFO()

	def check_for_NFO(self):
		self.session.summary.setText(self["filelist"].getFilename())
		if self["filelist"].getFilename() is None:
			return
		if self["filelist"].getCurrentDirectory() is not None:
			self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()

		if self.nfifile.upper().endswith(".NFI"):
			self["key_green"].text = _("Flash")
			nfofilename = self.nfifile[0:-3]+"nfo"
			if fileExists(nfofilename):
				nfocontent = open(nfofilename, "r").read()
				self["infolabel"].text = nfocontent
				pos = nfocontent.find("MD5:")
				if pos > 0:
					self.md5sum = nfocontent[pos+5:pos+5+32] + "  " + self.nfifile
				else:
					self.md5sum = ""
			else:
				self["infolabel"].text = _("No details for this image file") + ":\n" + self["filelist"].getFilename()
				self.md5sum = ""
		else:
			self["infolabel"].text = ""
			self["key_green"].text = ""

	def ok(self):
		if self.job is None or self.job.status is not self.job.IN_PROGRESS:
			if self["filelist"].canDescent(): # isDir
				self["filelist"].descent()
				self.session.summary.setText(self["filelist"].getFilename())
				self.check_for_NFO()
			else:
				self.queryFlash()
	
	def queryFlash(self):
		fd = open(self.nfifile, 'r')
		print fd
		sign = fd.read(11)
		print sign
		if sign.find("NFI1" + self.box + "\0") == 0:
			if self.md5sum != "":
				self["statusbar"].text = ("Please wait for md5 signature verification...")
				self.session.summary.setText(("Please wait for md5 signature verification..."))
				self.container = eConsoleAppContainer()
				self.container.setCWD(self["filelist"].getCurrentDirectory())
				self.container.appClosed.append(self.md5finished)
				self.container.dataSent.append(self.md5ready)
				self.container.execute("md5sum -cw -")
				self.container.write(self.md5sum)
			else:
				self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file does not have a md5sum signature and is not guaranteed to work. Do you really want to burn this image to flash memory?"), MessageBox.TYPE_YESNO)
		else:
			self.session.open(MessageBox, (_("This .NFI file does not contain a valid %s image!") % (self.box.upper())), MessageBox.TYPE_ERROR)

	def md5ready(self, retval):
		self.container.sendEOF()

	def md5finished(self, retval):
		if retval==0:
			self.session.openWithCallback(self.queryCB, MessageBox, _("This .NFI file has a valid md5 signature. Continue programming this image to flash memory?"), MessageBox.TYPE_YESNO)
		else:
			self.session.openWithCallback(self.queryCB, MessageBox, _("The md5sum validation failed, the file may be corrupted! Are you sure that you want to burn this image to flash memory? You are doing this at your own risk!"), MessageBox.TYPE_YESNO)

	def queryCB(self, answer):
		if answer == True:
			self.createJob()
		else:
			self["statusbar"].text = _("Please select .NFI flash image file from medium")

	def createJob(self):
		self.job = Job("Image flashing job")
		param = [self.nfifile]
		writeNAND(self.job,param,self.box)
		#writeNAND2(self.job,param)
		#writeNAND3(self.job,param)
		self.job.state_changed.append(self.update_job)
		self.job.end = 540
		self.cwd = self["filelist"].getCurrentDirectory()
		self["job_progressbar"].range = self.job.end
		self.startJob()

	def startJob(self):
		self["key_blue"].text = ""
		self["key_yellow"].text = ""
		self["key_green"].text = ""
		#self["progress0"].show()
		#self["progress1"].show()

		self.job.start(self.jobcb)

	def update_job(self):
		j = self.job
		#print "[job state_changed]"
		if j.status == j.IN_PROGRESS:
			self.session.summary["job_progressbar"].value = j.progress
			self.session.summary["job_progressbar"].range = j.end
			self.session.summary["job_progresslabel"].text = "%.2f%%" % (100*j.progress/float(j.end))
			self["job_progressbar"].range = j.end
			self["job_progressbar"].value = j.progress
			#print "[update_job] j.progress=%f, j.getProgress()=%f, j.end=%d, text=%f" % (j.progress, j.getProgress(), j.end,  (100*j.progress/float(j.end)))
			self["job_progresslabel"].text = "%.2f%%" % (100*j.progress/float(j.end))
			self.session.summary.setText(j.tasks[j.current_task].name)
			self["statusbar"].text = (j.tasks[j.current_task].name)

		elif j.status == j.FINISHED:
			self["statusbar"].text = _("Writing NFI image file to flash completed")
			self.session.summary.setText(_("NFI image flashing completed. Press Yellow to Reboot!"))
			self["key_yellow"].text = _("Reboot")

		elif j.status == j.FAILED:
			self["statusbar"].text = j.tasks[j.current_task].name + " " + _("failed")
			self.session.open(MessageBox, (_("Flashing failed") + ":\n" + j.tasks[j.current_task].name + ":\n" + j.tasks[j.current_task].output_line), MessageBox.TYPE_ERROR)

	def jobcb(self, jobref, fasel, blubber):
		print "[jobcb] %s %s %s" % (jobref, fasel, blubber)
		self["key_green"].text = _("Flash")

	def reboot(self):
		if self.job.status == self.job.FINISHED:
			self["statusbar"].text = ("rebooting...")
			TryQuitMainloop(self.session,2)
			
	def createSummary(self):
		return NFISummary