From 2ca2437ed16a3676fea816e2061aefb69ccf047d Mon Sep 17 00:00:00 2001 From: Andreas Frisch Date: Sun, 12 Oct 2008 16:37:24 +0000 Subject: [PATCH] add NFIFlash plugin --- .../SystemPlugins/NFIFlash/Makefile.am | 7 + .../SystemPlugins/NFIFlash/__init__.py | 0 .../SystemPlugins/NFIFlash/dm8000_writenand | Bin 0 -> 71669 bytes .../SystemPlugins/NFIFlash/downloader.py | 669 ++++++++++++++++++ .../Plugins/SystemPlugins/NFIFlash/flash.png | Bin 0 -> 3007 bytes .../Plugins/SystemPlugins/NFIFlash/flasher.py | 255 +++++++ .../SystemPlugins/NFIFlash/mywritenand | Bin 0 -> 71626 bytes .../Plugins/SystemPlugins/NFIFlash/plugin.py | 20 + 8 files changed, 951 insertions(+) create mode 100644 lib/python/Plugins/SystemPlugins/NFIFlash/Makefile.am create mode 100644 lib/python/Plugins/SystemPlugins/NFIFlash/__init__.py create mode 100755 lib/python/Plugins/SystemPlugins/NFIFlash/dm8000_writenand create mode 100644 lib/python/Plugins/SystemPlugins/NFIFlash/downloader.py create mode 100755 lib/python/Plugins/SystemPlugins/NFIFlash/flash.png create mode 100644 lib/python/Plugins/SystemPlugins/NFIFlash/flasher.py create mode 100755 lib/python/Plugins/SystemPlugins/NFIFlash/mywritenand create mode 100644 lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/Makefile.am b/lib/python/Plugins/SystemPlugins/NFIFlash/Makefile.am new file mode 100644 index 00000000..cbb69572 --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/Makefile.am @@ -0,0 +1,7 @@ +installdir = $(LIBDIR)/enigma2/python/Plugins/SystemPlugins/NFIFlash + +install_PYTHON = __init__.py plugin.py downloader.py flasher.py + +#install_SCRIPTS = mywritenand dm8000_writenand + +install_DATA = flash.png diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/__init__.py b/lib/python/Plugins/SystemPlugins/NFIFlash/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/dm8000_writenand b/lib/python/Plugins/SystemPlugins/NFIFlash/dm8000_writenand new file mode 100755 index 0000000000000000000000000000000000000000..bd02d8fe6dd5b1b0789a741511c4e7ae81b4fcab GIT binary patch literal 71669 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

&1|LJd18HowcCUWcH|FN*^&5sf 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 + + + + + + + + + + + + + + + + + + + + + """ + + def __init__(self, session, destdir="/tmp/"): + self.skin = NFIDownload.skin + Screen.__init__(self, session) + + self["job_progressbar"] = Progress() + self["job_progresslabel"] = StaticText() + + self["infolabel"] = StaticText() + self["statusbar"] = StaticText() + self["label_top"] = StaticText() + self["label_bottom"] = StaticText() + self["path_bottom"] = StaticText() + + self["key_green"] = StaticText() + self["key_yellow"] = StaticText() + self["key_blue"] = StaticText() + + self["key_red"] = StaticText() + + self["feedlist"] = Feedlist([0,(eListboxPythonMultiContent.TYPE_TEXT, 0, 0,250, 30, 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, "feed not available")]) + self["destlist"] = FileList(destdir, showDirectories = True, showFiles = False) + self["destlist"].hide() + + self.download_container = eConsoleAppContainer() + self.nfo = "" + self.nfofile = "" + self.feedhtml = "" + self.focus = None + self.download = None + self.box = HardwareInfo().get_device_name() + self.feed_base = "http://www.dreamboxupdate.com/opendreambox/1.5/%s/images/" % self.box + self.nfi_filter = "" # "release" # only show NFIs containing this string, or all if "" + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "EPGSelectActions"], + { + "cancel": self.closeCB, + "red": self.closeCB, + "green": self.nfi_download, + "yellow": self.switchList, + "blue": self.askCreateUSBstick, + "prevBouquet": self.switchList, + "nextBouquet": self.switchList, + "ok": self.ok, + "left": self.left, + "right": self.right, + "up": self.up, + "upRepeated": self.up, + "downRepeated": self.down, + "down": self.down + }, -1) + + self.feed_download() + + def downloading(self, state=True): + if state is True: + self["key_red"].text = _("Cancel") + self["key_green"].text = "" + self["key_yellow"].text = "" + self["key_blue"].text = "" + + else: + self.download = None + self["key_red"].text = _("Exit") + if self["feedlist"].isValid(): + self["key_green"].text = (_("Download")) + if self.focus is self.LIST_SOURCE: + self["key_yellow"].text = (_("Change dir.")) + else: + self["key_yellow"].text = (_("Select image")) + self["key_blue"].text = (_("Fix USB stick")) + + def switchList(self,to_where=None): + if self.download or not self["feedlist"].isValid(): + return + + self["job_progressbar"].value = 0 + self["job_progresslabel"].text = "" + + if to_where is None: + if self.focus is self.LIST_SOURCE: + to_where = self.LIST_DEST + if self.focus is self.LIST_DEST: + to_where = self.LIST_SOURCE + + if to_where is self.LIST_DEST: + self.focus = self.LIST_DEST + self["statusbar"].text = _("Please select target directory or medium") + self["label_top"].text = _("choose destination directory")+":" + self["feedlist"].hide() + self["destlist"].show() + self["label_bottom"].text = _("Selected source image")+":" + self["path_bottom"].text = str(self["feedlist"].getNFIname()) + self["key_yellow"].text = (_("Select image")) + + elif to_where is self.LIST_SOURCE: + self.focus = self.LIST_SOURCE + self["statusbar"].text = _("Please choose .NFI image file from feed server to download") + self["label_top"].text = _("select image from server")+":" + self["feedlist"].show() + self["destlist"].hide() + self["label_bottom"].text = _("Destination directory")+":" + self["path_bottom"].text = str(self["destlist"].getCurrentDirectory()) + self["key_yellow"].text = (_("Change dir.")) + + def up(self): + if self.download: + return + if self.focus is self.LIST_SOURCE: + self["feedlist"].up() + self.nfo_download() + if self.focus is self.LIST_DEST: + self["destlist"].up() + + def down(self): + if self.download: + return + if self.focus is self.LIST_SOURCE: + self["feedlist"].down() + self.nfo_download() + if self.focus is self.LIST_DEST: + self["destlist"].down() + + def left(self): + if self.download: + return + if self.focus is self.LIST_SOURCE: + self["feedlist"].pageUp() + self.nfo_download() + if self.focus is self.LIST_DEST: + self["destlist"].pageUp() + + def right(self): + if self.download: + return + if self.focus is self.LIST_SOURCE: + self["feedlist"].pageDown() + self.nfo_download() + if self.focus is self.LIST_DEST: + self["destlist"].pageDown() + + def ok(self): + if self.download: + return + if self.focus is self.LIST_DEST: + if self["destlist"].canDescent(): + self["destlist"].descent() + + def feed_download(self): + self.downloading(True) + self.download = self.feed_download + client.getPage(self.feed_base).addCallback(self.feed_finished).addErrback(self.feed_failed) + + def feed_failed(self, failure_instance): + print "[feed_failed] " + str(failure_instance) + self["infolabel"].text = _("Could not connect to Dreambox .NFI Image Feed Server:") + "\n" + failure_instance.getErrorMessage() + "\n\n" + _("Please check your network settings!") + self.downloading(False) + + def feed_finished(self, feedhtml): + print "[feed_finished] " + str(feedhtml) + self.downloading(False) + fileresultmask = re.compile(".*?)[\'\"]>(?P.*?.nfi)", re.DOTALL) + searchresults = fileresultmask.finditer(feedhtml) + fileresultlist = [] + if searchresults: + for x in searchresults: + url = x.group("url") + if url[0:7] != "http://": + url = self.feed_base + x.group("url") + name = x.group("name") + if name.find(self.nfi_filter) > -1: + entry = [[name, url],(eListboxPythonMultiContent.TYPE_TEXT, 0, 0,250, 30, 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, name)] + print "adding to feedlist: " + str(entry) + fileresultlist.append(entry) + else: + print "NOT adding to feedlist: " + name + self["feedlist"].l.setList(fileresultlist) + self["feedlist"].moveSelection(0) + + if len(fileresultlist) > 0: + self.switchList(self.LIST_SOURCE) + self.nfo_download() + else: + self["infolabel"].text = _("Cannot parse feed directory") + + def nfo_download(self): + print "[check_for_NFO]" + if self["feedlist"].isValid(): + print "nfiname: " + self["feedlist"].getNFIname() + self["job_progressbar"].value = 0 + self["job_progresslabel"].text = "" + if self["feedlist"].getNFIurl() is None: + self["key_green"].text = "" + return + self["key_green"].text = _("Download") + nfourl = self["feedlist"].getNFOurl() + print "downloading " + nfourl + self.download = self.nfo_download + self.downloading(True) + client.getPage(nfourl).addCallback(self.nfo_finished).addErrback(self.nfo_failed) + self["statusbar"].text = _("Downloading image description...") + + def nfo_failed(self, failure_instance): + print "[nfo_failed] " + str(failure_instance) + self["infolabel"].text = _("No details for this image file") + "\n" + self["feedlist"].getNFIname() + self["statusbar"].text = "" + self.nfofilename = "" + self.nfo = "" + self.downloading(False) + + def nfo_finished(self,nfodata=""): + print "[nfo_finished] " + str(nfodata) + self.downloading(False) + self.nfo = nfodata + if self.nfo != "": + self.nfofilename = self["destlist"].getCurrentDirectory() + '/' + self["feedlist"].getNFOname() + self["infolabel"].text = self.nfo + else: + self.nfofilename = "" + self["infolabel"].text = _("No details for this image file") + self["statusbar"].text = "" + + def nfi_download(self): + if self["destlist"].getCurrentDirectory() is None: + self.switchList(self.LIST_TARGET) + if self["feedlist"].isValid(): + url = self["feedlist"].getNFIurl() + localfile = self["destlist"].getCurrentDirectory()+'/'+self["feedlist"].getNFIname() + print "[nfi_download] downloading %s to %s" % (url, localfile) + self.download = downloadWithProgress(url,localfile) + self.download.addProgress(self.nfi_progress) + self["job_progressbar"].range = 1000 + self.download.start().addCallback(self.nfi_finished).addErrback(self.nfi_failed) + self.downloading(True) + + def nfi_progress(self, recvbytes, totalbytes): + #print "[update_progress] recvbytes=%d, totalbytes=%d" % (recvbytes, totalbytes) + self["job_progressbar"].value = int(1000*recvbytes/float(totalbytes)) + self["job_progresslabel"].text = "%d of %d kBytes (%.2f%%)" % (recvbytes/1024, totalbytes/1024, 100*recvbytes/float(totalbytes)) + + def nfi_failed(self, failure_instance=None, error_message=""): + if error_message == "" and failure_instance is not None: + error_message = failure_instance.getErrorMessage() + print "[nfi_failed] " + error_message + if fileExists(self["destlist"].getCurrentDirectory()+'/'+self["feedlist"].getNFIname()): + message = "%s %s\n%s" % (_(".NFI Download failed:"), error_message, _("Remove the incomplete .NFI file?")) + self.session.openWithCallback(self.nfi_remove, MessageBox, message, MessageBox.TYPE_YESNO) + else: + message = "%s %s" % (_(".NFI Download failed:"),error_message) + self.session.open(MessageBox, message, MessageBox.TYPE_ERROR) + self.downloading(False) + + #def nfi_failed(self, failure_instance): + #print "[nfi_failed] " + #print failure_instance + #if isinstance(failure_instance, Plugins.SystemPlugins.NFIFlash.plugin.UserRequestedCancel): + #print "is instance of Plugins.SystemPlugins.NFIFlash.plugin.UserRequestedCancel" + #else: + #print "not an instance of Plugins.SystemPlugins.NFIFlash.plugin.UserRequestedCancel" + + def nfi_finished(self, string=""): + print "[nfi_finished] " + str(string) + if self.nfo != "": + nfofd = open(self.nfofilename, "w") + if nfofd: + nfofd.write(self.nfo) + nfofd.close() + else: + print "couldn't save nfo file " + self.nfofilename + + pos = self.nfo.find("md5sum") + if pos > 0: + self["statusbar"].text = _("Please wait for md5 signature verification...") + cmd = "md5sum -cs " + self.nfofilename + print cmd + self.download_container.setCWD(self["destlist"].getCurrentDirectory()) + self.download_container.appClosed.get().append(self.md5finished) + self.download_container.execute(cmd) + else: + self["statusbar"].text = "Download completed." + self.downloading(False) + else: + self["statusbar"].text = "Download completed." + self.downloading(False) + + def md5finished(self, retval): + print "[md5finished]: " + str(retval) + self.download_container.appClosed.get().remove(self.md5finished) + if retval==0: + self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!") + self.switchList(self.LIST_SOURCE) + self.downloading(False) + else: + self.session.openWithCallback(self.nfi_remove, MessageBox, (_("The md5sum validation failed, the file may be downloaded incompletely or be corrupted!") + "\n" + _("Remove the broken .NFI file?")), MessageBox.TYPE_YESNO) + + def nfi_remove(self, answer): + self.downloading(False) + if answer == True: + nfifilename = self["destlist"].getCurrentDirectory()+'/'+self["feedlist"].getNFIname() + if fileExists(self.nfofilename): + remove(self.nfofilename) + if fileExists(nfifilename): + remove(nfifilename) + self.switchList(self.LIST_SOURCE) + + def askCreateUSBstick(self): + self.downloading() + self.imagefilename = "/tmp/nfiflash_" + self.box + ".img" + message = _("You have chosen to create a new .NFI flasher bootable USB stick. This will repartition the USB stick and therefore all data on it will be erased.") + self.session.openWithCallback(self.flasherdownload_query, MessageBox, (message + '\n' + _("First we need to download the latest boot environment for the USB flasher.")), MessageBox.TYPE_YESNO) + + def flasherdownload_query(self, answer): + if answer is False: + self.downloading(False) + self.switchList(self.LIST_SOURCE) + return + #url = self.feed_base + "/nfiflasher_" + self.box + ".tar.bz2" + url = "http://www.dreamboxupdate.com/download/opendreambox/dreambox-nfiflasher-%s.tar.bz2" % self.box + localfile = "/tmp/nfiflasher_image.tar.bz2" + print "[flasherdownload_query] downloading %s to %s" % (url, localfile) + self["statusbar"].text = ("Downloading %s..." % url) + self.download = downloadWithProgress(url,localfile) + self.download.addProgress(self.nfi_progress) + self["job_progressbar"].range = 1000 + self.download.start().addCallback(self.flasherdownload_finished).addErrback(self.flasherdownload_failed) + + def flasherdownload_failed(self, failure_instance=None, error_message=""): + if error_message == "" and failure_instance is not None: + error_message = failure_instance.getErrorMessage() + print "[flasherdownload_failed] " + error_message + message = "%s %s" % (_("Download of USB flasher boot image failed: "),error_message) + self.session.open(MessageBox, message, MessageBox.TYPE_ERROR) + self.query_remove_img(True) + + def flasherdownload_finished(self, string=""): + print "[flasherdownload_finished] " + str(string) + self.container = eConsoleAppContainer() + self.container.appClosed.get().append(self.umount_finished) + self.container.dataAvail.get().append(self.tool_avail) + self.taskstring = "" + umountdevs = "" + from os import listdir + for device in listdir("/dev"): + if device[:2] == "sd" and device[-1:].isdigit(): + umountdevs += "/dev/"+device + self.cmd = "umount " + umountdevs + print "executing " + self.cmd + self.container.execute(self.cmd) + + def tool_avail(self, string): + print "[tool_avail]" + string + self.taskstring += string + + def umount_finished(self, retval): + self.container.appClosed.get().remove(self.umount_finished) + self.session.openWithCallback(self.dmesg_clear, MessageBox, _("To make sure you intend to do this, please remove the target USB stick now and stick it back in upon prompt. Press OK when you have taken the stick out."), MessageBox.TYPE_INFO) + + def dmesg_clear(self, answer): + self.container.appClosed.get().append(self.dmesg_cleared) + self.taskstring = "" + self.cmd = "dmesg -c" + print "executing " + self.cmd + self.container.execute(self.cmd) + + def dmesg_cleared(self, retval): + self.container.appClosed.get().remove(self.dmesg_cleared) + self.session.openWithCallback(self.stick_back_in, MessageBox, (_("Now please insert the USB stick (minimum size is 64 MB) that you want to format and use as .NFI image flasher. Press OK after you've put the stick back in.")), MessageBox.TYPE_INFO) + + def stick_back_in(self, answer): + self["statusbar"].text = _("Waiting for USB stick to settle...") + self.delayTimer = eTimer() + self.delayTimer.callback.append(self.waiting_for_stick) + self.delayCount = -1 + self.delayTimer.start(1000) + + def waiting_for_stick(self): + self.delayCount += 1 + self["job_progressbar"].range = 6 + self["job_progressbar"].value = self.delayCount + self["job_progresslabel"].text = "-%d s" % (6-self.delayCount) + if self.delayCount > 5: + self.delayTimer.stop() + self.container.appClosed.get().append(self.dmesg_scanned) + self.taskstring = "" + self.cmd = "dmesg" + print "executing " + self.cmd + self.container.execute(self.cmd) + + def dmesg_scanned(self, retval): + self.container.appClosed.get().remove(self.dmesg_scanned) + dmesg_lines = self.taskstring.splitlines() + self.devicetext = None + self.stickdevice = None + for i, line in enumerate(dmesg_lines): + if line.find("usb-storage: waiting for device") != -1 and len(dmesg_lines) > i+3: + self.devicetext = dmesg_lines[i+1].lstrip()+"\n"+dmesg_lines[i+3] + elif line.find("/dev/scsi/host") != -1: + self.stickdevice = line.split(":",1)[0].lstrip() + + if retval != 0 or self.devicetext is None or self.stickdevice is None: + self.session.openWithCallback(self.remove_img, MessageBox, _("No useable USB stick found"), MessageBox.TYPE_ERROR) + else: + self.session.openWithCallback(self.fdisk_query, MessageBox, (_("The following device was found:\n\n%s\n\nDo you want to write the USB flasher to this stick?") % self.devicetext), MessageBox.TYPE_YESNO) + + def fdisk_query(self, answer): + if answer == True: + self["statusbar"].text = _("Partitioning USB stick...") + self["job_progressbar"].range = 1000 + self["job_progressbar"].value = 100 + self["job_progresslabel"].text = "5.00%" + self.taskstring = "" + self.container.appClosed.get().append(self.fdisk_finished) + self.container.execute("fdisk " + self.stickdevice + "/disc") + self.container.write("d\nn\np\n1\n\n\nt\n6\nw\n") + self.delayTimer = eTimer() + self.delayTimer.callback.append(self.progress_increment) + self.delayTimer.start(105, False) + else: + self.remove_img() + + def fdisk_finished(self, retval): + self.container.appClosed.get().remove(self.fdisk_finished) + self.delayTimer.stop() + if retval == 0: + if fileExists(self.imagefilename): + self.tar_finished(0) + self["job_progressbar"].value = 700 + else: + self["statusbar"].text = _("Decompressing USB stick flasher boot image...") + self.taskstring = "" + self.container.appClosed.get().append(self.tar_finished) + self.container.setCWD("/tmp") + self.cmd = "tar -xjvf nfiflasher_image.tar.bz2" + self.container.execute(self.cmd) + print "executing " + self.cmd + self.delayTimer = eTimer() + self.delayTimer.callback.append(self.progress_increment) + self.delayTimer.start(105, False) + else: + print "fdisk failed: " + str(retval) + self.session.openWithCallback(self.remove_img, MessageBox, ("fdisk " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + + def progress_increment(self): + newval = int(self["job_progressbar"].value) + 1 + if newval < 950: + self["job_progressbar"].value = newval + self["job_progresslabel"].text = "%.2f%%" % (newval/10.0) + + def tar_finished(self, retval): + self.delayTimer.stop() + if len(self.container.appClosed.get()) > 0: + self.container.appClosed.get().remove(self.tar_finished) + if retval == 0: + self.imagefilename = "/tmp/nfiflash_" + self.box + ".img" + self["statusbar"].text = _("Copying USB flasher boot image to stick...") + self.taskstring = "" + self.container.appClosed.get().append(self.dd_finished) + self.cmd = "dd if=%s of=%s" % (self.imagefilename,self.stickdevice+"/part1") + self.container.execute(self.cmd) + print "executing " + self.cmd + self.delayTimer = eTimer() + self.delayTimer.callback.append(self.progress_increment) + self.delayTimer.start(105, False) + else: + self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + + def dd_finished(self, retval): + self.delayTimer.stop() + self.container.appClosed.get().remove(self.dd_finished) + self.downloading(False) + if retval == 0: + self["job_progressbar"].value = 950 + self["job_progresslabel"].text = "95.00%" + self["statusbar"].text = _("Remounting stick partition...") + self.taskstring = "" + self.container.appClosed.get().append(self.mount_finished) + self.cmd = "mount %s /mnt/usb -o rw,sync" % (self.stickdevice+"/part1") + self.container.execute(self.cmd) + print "executing " + self.cmd + else: + self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + + def mount_finished(self, retval): + self.container.dataAvail.get().remove(self.tool_avail) + self.container.appClosed.get().remove(self.mount_finished) + if retval == 0: + self["job_progressbar"].value = 1000 + self["job_progresslabel"].text = "100.00%" + self["statusbar"].text = _(".NFI Flasher bootable USB stick successfully created.") + self.session.openWithCallback(self.remove_img, MessageBox, _("The .NFI Image flasher USB stick is now ready to use. Please download an .NFI image file from the feed server and save it on the stick. Then reboot and hold the 'Down' key on the front panel to boot the .NFI flasher from the stick!"), MessageBox.TYPE_INFO) + self["destlist"].changeDir("/mnt/usb") + else: + self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR) + + def remove_img(self, answer): + if fileExists("/tmp/nfiflasher_image.tar.bz2"): + remove("/tmp/nfiflasher_image.tar.bz2") + if fileExists(self.imagefilename): + remove(self.imagefilename) + self.downloading(False) + self.switchList(self.LIST_SOURCE) + + def closeCB(self): + if self.download: + self.download.stop() + #self.nfi_failed(None, "Cancelled by user request") + self.downloading(False) + else: + self.close() + +def main(session, **kwargs): + session.open(NFIDownload,"/home/root") + +def filescan_open(list, session, **kwargs): + dev = "/dev/" + (list[0].path).rsplit('/',1)[0][7:] + print "mounting device " + dev + " to /mnt/usb..." + system("mount "+dev+" /mnt/usb/ -o rw,sync") + session.open(NFIDownload,"/mnt/usb/") + +def filescan(**kwargs): + from Components.Scanner import Scanner, ScanPath + return \ + Scanner(mimetypes = ["application/x-dream-image"], + paths_to_scan = + [ + ScanPath(path = "", with_subdirs = False), + ], + name = "NFI", + description = (_("Download .NFI-Files for USB-Flasher")+"..."), + openfnc = filescan_open, ) diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/flash.png b/lib/python/Plugins/SystemPlugins/NFIFlash/flash.png new file mode 100755 index 0000000000000000000000000000000000000000..55245f57bcb041828ae4918f387487190dbdf1f2 GIT binary patch literal 3007 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 0: + print "data.found done" + self.setProgress(self.end) + else: + self.output_line = data + +class NFISummary(Screen): + skin = """ + + + + + + """ + + def __init__(self, session, parent): + Screen.__init__(self, session, parent) + self["title"] = StaticText(_("Image flash utility")) + self["content"] = StaticText(_("Please select .NFI flash image file from medium")) + self["job_progressbar"] = Progress() + self["job_progresslabel"] = StaticText("") + + def setText(self, text): + self["content"].setText(text) + +class NFIFlash(Screen): + skin = """ + + + + + + + + + + + + + + """ + + 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("md5sum") + if pos > 0: + self.md5sum = nfofilename + 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.get().append(self.md5finished) + self.container.execute("md5sum -cs " + 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 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 diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/mywritenand b/lib/python/Plugins/SystemPlugins/NFIFlash/mywritenand new file mode 100755 index 0000000000000000000000000000000000000000..073a204f3ab414351bcd54755037f396e3743288 GIT binary patch literal 71626 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 literal 0 HcmV?d00001 diff --git a/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py new file mode 100644 index 00000000..0394d81b --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/NFIFlash/plugin.py @@ -0,0 +1,20 @@ +# -*- coding: utf8 -*- + +def Plugins(**kwargs): + from Plugins.Plugin import PluginDescriptor + from Tools.Directories import fileExists + if fileExists("/usr/share/bootlogo-flasher.mvi"): + import flasher + # started from usb stick # don't try to be intelligent and trick this - it's not possible to rewrite the flash memory with a system currently booted from it + return [PluginDescriptor(where = PluginDescriptor.WHERE_WIZARD, fnc = (9,flasher.NFIFlash))] + else: + # started on real enigma2 + import downloader + return [PluginDescriptor(name="NFI Image Flashing", + description = _("Download .NFI-Files for USB-Flasher"), + icon = "flash.png", + where = [PluginDescriptor.WHERE_PLUGINMENU], + fnc = downloader.main), PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_FILESCAN, fnc = downloader.filescan) + ] + #, + #PluginDescriptor(name="nfi", where = PluginDescriptor.WHERE_WIZARD, fnc = (1,downloader.NFIDownload)) ] -- 2.30.2