1 from Screens.Screen import Screen
2 from Screens.MessageBox import MessageBox
3 from Screens.ChoiceBox import ChoiceBox
4 from Screens.Standby import TryQuitMainloop
5 from Screens.Console import Console
6 from Components.ActionMap import ActionMap
7 from Components.Sources.StaticText import StaticText
8 from Components.Sources.Progress import Progress
9 from Components.Sources.Boolean import Boolean
10 from Components.Label import Label
11 from Components.FileList import FileList
12 from Components.Task import Task, Job, job_manager, Condition
13 from Screens.TaskView import JobView
14 from Tools.Directories import fileExists
15 from Tools.HardwareInfo import HardwareInfo
17 from enigma import eConsoleAppContainer, quitMainloop
18 from Components.About import about
20 class md5Postcondition(Condition):
21 def check(self, task):
22 print "md5Postcondition::check", task.returncode
23 return task.returncode == 0
25 def getErrorMessage(self, task):
26 if task.returncode == 1:
27 return _("The md5sum validation failed, the file may be corrupted!")
30 class md5verify(Task):
31 def __init__(self, job, path, md5):
32 Task.__init__(self, job, "md5sum")
33 self.postconditions.append(md5Postcondition())
36 self.setTool("md5sum")
37 self.args += ["-c", "-s"]
38 self.initial_input = md5
40 def writeInput(self, input):
41 self.container.dataSent.append(self.md5ready)
42 print "[writeInput]", input
43 Task.writeInput(self, input)
45 def md5ready(self, retval):
46 self.container.sendEOF()
48 def processOutput(self, data):
51 class writeNAND(Task):
52 def __init__(self, job, param, box):
53 Task.__init__(self,job, ("Writing image file to NAND Flash"))
54 self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/writenfi-mipsel-2.6.18-r1")
57 elif box[:5] == "dm800":
62 def processOutput(self, data):
63 print "[writeNand] " + data
64 if data == "." or data.endswith(" ."):
66 elif data.find("*** done!") > 0:
67 print "data.found done"
68 self.setProgress(self.end)
70 self.output_line = data
72 class NFIFlash(Screen):
74 <screen name="NFIFlash" position="center,center" size="610,410" title="Image flash utility" >
75 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
76 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
77 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
78 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
79 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
80 <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" />
81 <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" />
82 <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" />
83 <ePixmap pixmap="skin_default/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" />
84 <widget name="filelist" position="15,60" size="330,284" scrollbarMode="showOnDemand" />
85 <widget source="infolabel" render="Label" position="360,50" size="240,300" font="Regular;13" />
86 <widget source="status" render="Label" position="5,360" zPosition="10" size="600,50" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
89 def __init__(self, session, destdir=None):
90 Screen.__init__(self, session)
92 self.box = HardwareInfo().get_device_name()
93 self.usbmountpoint = "/mnt/usb/"
95 self["key_red"] = StaticText()
96 self["key_green"] = StaticText()
97 self["key_yellow"] = StaticText()
98 self["key_blue"] = StaticText()
99 self.filelist = FileList(self.usbmountpoint, matchingPattern = "^.*\.(nfi|NFI)", showDirectories = False, showMountpoints = False)
100 self["filelist"] = self.filelist
101 self["infolabel"] = StaticText()
103 self["status"] = StaticText(_("Please select an NFI file and press green key to flash!") + '\n' + _("currently installed image: %s") % (about.getImageVersionString()))
106 self["shortcuts"] = ActionMap(["OkCancelActions", "ColorActions", "ShortcutActions", "DirectionActions"],
111 "upRepeated": self.keyUp,
112 "downRepeated": self.keyDown,
113 "down": self.keyDown,
114 "left": self.keyLeft,
115 "yellow": self.reboot,
116 "right": self.keyRight
119 self.onShown.append(self.autostart)
122 self.onShown.remove(self.autostart)
124 print "[[layoutFinished]]", len(self["filelist"].getFileList())
125 if len(self["filelist"].getFileList()) == 1:
130 self["filelist"].up()
134 self["filelist"].down()
138 self["filelist"].pageDown()
142 self["filelist"].pageUp()
146 if self.job is None or self.job.status is not self.job.IN_PROGRESS:
147 if self["filelist"].canDescent(): # isDir
148 self["filelist"].descent()
150 elif self["filelist"].getFilename():
151 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)
153 def check_for_NFO(self, nfifile=None):
154 print "check_for_NFO", self["filelist"].getFilename(), self["filelist"].getCurrentDirectory()
155 self["infolabel"].text = ""
156 self["key_green"].text = ""
159 if self["filelist"].getFilename() is None:
161 if self["filelist"].getCurrentDirectory() is not None:
162 self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()
164 self.nfifile = nfifile
166 if self.nfifile.upper().endswith(".NFI"):
167 self["key_green"].text = _("Flash")
168 nfofilename = self.nfifile[0:-3]+"nfo"
169 print nfofilename, fileExists(nfofilename)
170 if fileExists(nfofilename):
171 nfocontent = open(nfofilename, "r").read()
172 print "nfocontent:", nfocontent
173 self["infolabel"].text = nfocontent
174 pos = nfocontent.find("MD5:")
176 self.md5sum = nfocontent[pos+5:pos+5+32] + " " + self.nfifile
180 self["infolabel"].text = _("No details for this image file") + (self["filelist"].getFilename() or "")
183 def queryCB(self, answer):
188 self.job = Job("Image flashing job")
189 self.job.afterEvent = "close"
190 cwd = self["filelist"].getCurrentDirectory()
191 md5verify(self.job, cwd, self.md5sum)
192 writeNAND(self.job, [self.nfifile], self.box)
193 self["key_blue"].text = ""
194 self["key_yellow"].text = ""
195 self["key_green"].text = ""
196 job_manager.AddJob(self.job)
197 self.session.openWithCallback(self.flashed, JobView, self.job, cancelable = False, backgroundable = False, afterEventChangeable = False)
199 def flashed(self, bg):
201 if self.job.status == self.job.FINISHED:
202 self["status"].text = _("NFI image flashing completed. Press Yellow to Reboot!")
203 filename = self.usbmountpoint+'enigma2settingsbackup.tar.gz'
204 if fileExists(filename):
206 date = time.ctime(os.path.getmtime(filename))
207 self.session.openWithCallback(self.askRestoreCB, MessageBox, _("The wizard found a configuration backup. Do you want to restore your old settings from %s?") % date, MessageBox.TYPE_YESNO)
209 self.unlockRebootButton()
211 self["status"].text = _("Flashing failed")
213 def askRestoreCB(self, ret):
215 from Plugins.SystemPlugins.SoftwareManager.BackupRestore import getBackupFilename
216 restorecmd = ["tar -xzvf " + self.usbmountpoint + getBackupFilename() + " -C /"]
217 self.session.openWithCallback(self.unlockRebootButton, Console, title = _("Restore is running..."), cmdlist = restorecmd, closeOnSuccess = True)
219 self.unlockRebootButton()
221 def unlockRebootButton(self, retval = None):
222 if self.job.status == self.job.FINISHED:
223 self["key_yellow"].text = _("Reboot")
225 def reboot(self, ret=None):
226 if self.job.status == self.job.FINISHED:
227 self["status"].text = ("rebooting...")
228 from os import system
229 system("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/kill_e2_reboot.sh")