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 Components.ActionMap import ActionMap
6 from Components.Sources.StaticText import StaticText
7 from Components.Sources.Progress import Progress
8 from Components.Sources.Boolean import Boolean
9 from Components.Label import Label
10 from Components.FileList import FileList
11 from Components.Task import Task, Job, job_manager, Condition
12 from Screens.TaskView import JobView
13 from Tools.Directories import fileExists
14 from Tools.HardwareInfo import HardwareInfo
16 from enigma import eConsoleAppContainer
17 from Components.About import about
19 class md5Postcondition(Condition):
20 def check(self, task):
21 print "md5Postcondition::check", task.returncode
22 return task.returncode == 0
24 def getErrorMessage(self, task):
25 if task.returncode == 1:
26 return _("The md5sum validation failed, the file may be corrupted!")
29 class md5verify(Task):
30 def __init__(self, job, path, md5):
31 Task.__init__(self, job, "md5sum")
32 self.postconditions.append(md5Postcondition())
35 self.setTool("md5sum")
36 self.args += ["-c", "-s"]
37 self.initial_input = md5
39 def writeInput(self, input):
40 self.container.dataSent.append(self.md5ready)
41 print "[writeInput]", input
42 Task.writeInput(self, input)
44 def md5ready(self, retval):
45 self.container.sendEOF()
47 def processOutput(self, data):
50 class writeNAND(Task):
51 def __init__(self, job, param, box):
52 Task.__init__(self,job, ("Writing image file to NAND Flash"))
53 self.setTool("/usr/lib/enigma2/python/Plugins/SystemPlugins/NFIFlash/writenfi-mipsel-2.6.18-r1")
56 elif box[:5] == "dm800":
61 def processOutput(self, data):
62 print "[writeNand] " + data
63 if data == "." or data.endswith(" ."):
65 elif data.find("*** done!") > 0:
66 print "data.found done"
67 self.setProgress(self.end)
69 self.output_line = data
71 class NFIFlash(Screen):
73 <screen name="NFIFlash" position="center,center" size="610,410" title="Image flash utility" >
74 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
75 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
76 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
77 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
78 <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" />
79 <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" />
80 <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" />
81 <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" />
82 <ePixmap pixmap="skin_default/border_menu_350.png" position="5,50" zPosition="1" size="350,300" transparent="1" alphatest="on" />
83 <widget name="filelist" position="15,60" size="330,284" scrollbarMode="showOnDemand" />
84 <widget source="infolabel" render="Label" position="360,50" size="240,300" font="Regular;13" />
85 <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" />
88 def __init__(self, session, destdir=None):
89 Screen.__init__(self, session)
91 self.box = HardwareInfo().get_device_name()
92 self.usbmountpoint = "/mnt/usb/"
94 self["key_red"] = StaticText()
95 self["key_green"] = StaticText()
96 self["key_yellow"] = StaticText()
97 self["key_blue"] = StaticText()
98 self.filelist = FileList(self.usbmountpoint, matchingPattern = "^.*\.(nfi|NFI)")
99 self["filelist"] = self.filelist
100 self["infolabel"] = StaticText("")
102 self["status"] = StaticText("currently installed image: %s" % (about.getImageVersionString()))
105 self["shortcuts"] = ActionMap(["OkCancelActions", "ColorActions", "ShortcutActions", "DirectionActions"],
110 "upRepeated": self.keyUp,
111 "downRepeated": self.keyDown,
112 "down": self.keyDown,
113 "left": self.keyLeft,
114 "yellow": self.reboot,
115 "right": self.keyRight
120 self["filelist"].up()
124 self["filelist"].down()
128 self["filelist"].pageDown()
132 self["filelist"].pageUp()
136 if self.job is None or self.job.status is not self.job.IN_PROGRESS:
137 if self["filelist"].canDescent(): # isDir
138 self["filelist"].descent()
140 elif self["filelist"].getFilename():
141 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)
143 def check_for_NFO(self, nfifile=None):
144 print "check_for_NFO", self["filelist"].getFilename(), self["filelist"].getCurrentDirectory()
145 self["infolabel"].text = ""
146 self["key_green"].text = ""
149 if self["filelist"].getFilename() is None:
151 if self["filelist"].getCurrentDirectory() is not None:
152 self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()
154 self.nfifile = nfifile
156 if self.nfifile.upper().endswith(".NFI"):
157 self["key_green"].text = _("Flash")
158 nfofilename = self.nfifile[0:-3]+"nfo"
159 print nfofilename, fileExists(nfofilename)
160 if fileExists(nfofilename):
161 nfocontent = open(nfofilename, "r").read()
162 print "nfocontent:", nfocontent
163 self["infolabel"].text = nfocontent
164 pos = nfocontent.find("MD5:")
166 self.md5sum = nfocontent[pos+5:pos+5+32] + " " + self.nfifile
170 self["infolabel"].text = _("No details for this image file") + (self["filelist"].getFilename() or "")
173 def queryCB(self, answer):
178 self.job = Job("Image flashing job")
179 cwd = self["filelist"].getCurrentDirectory()
180 md5verify(self.job, cwd, self.md5sum)
181 writeNAND(self.job, [self.nfifile], self.box)
182 self["key_blue"].text = ""
183 self["key_yellow"].text = ""
184 self["key_green"].text = ""
185 job_manager.AddJob(self.job)
186 self.session.openWithCallback(self.flashed, JobView, self.job, cancelable = False, backgroundable = False)
188 def flashed(self, bg):
190 self["key_yellow"].text = _("Reboot")
192 def reboot(self, ret=None):
193 if self.job.status == self.job.FINISHED:
194 self["status"].text = ("rebooting...")
195 TryQuitMainloop(self.session,2)