95c7eee9b5a8bee223fecc9fed4a34788819ac77
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / NFIFlash / flasher.py
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
15 from os import system
16 from enigma import eConsoleAppContainer
17 from Components.About import about
18
19 class md5Postcondition(Condition):
20         def check(self, task):
21                 print "md5Postcondition::check", task.returncode
22                 return task.returncode == 0
23
24         def getErrorMessage(self, task):
25                 if task.returncode == 1:
26                         return _("The md5sum validation failed, the file may be corrupted!")
27                 return "md5 error"
28
29 class md5verify(Task):
30         def __init__(self, job, path, md5):
31                 Task.__init__(self, job, "md5sum")
32                 self.postconditions.append(md5Postcondition())
33                 self.weighting = 5
34                 self.cwd = path
35                 self.setTool("md5sum")
36                 self.args += ["-c", "-s"]
37                 self.initial_input = md5
38         
39         def writeInput(self, input):
40                 self.container.dataSent.append(self.md5ready)
41                 print "[writeInput]", input
42                 Task.writeInput(self, input)
43
44         def md5ready(self, retval):
45                 self.container.sendEOF()
46
47         def processOutput(self, data):
48                 print "[md5sum]",
49
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")
54                 if box == "dm7025":
55                         self.end = 256
56                 elif box[:5] == "dm800":
57                         self.end = 512
58                 self.args += param
59                 self.weighting = 95
60
61         def processOutput(self, data):
62                 print "[writeNand] " + data
63                 if data == "." or data.endswith(" ."):
64                         self.progress += 1
65                 elif data.find("*** done!") > 0:
66                         print "data.found done"
67                         self.setProgress(self.end)
68                 else:
69                         self.output_line = data
70
71 class NFIFlash(Screen):
72         skin = """
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" />
86         </screen>"""
87
88         def __init__(self, session, destdir=None):
89                 Screen.__init__(self, session)
90                 
91                 self.box = HardwareInfo().get_device_name()
92                 self.usbmountpoint = "/mnt/usb/"
93
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("")
101
102                 self["status"] = StaticText("currently installed image: %s" % (about.getImageVersionString()))
103                 self.job = None
104
105                 self["shortcuts"] = ActionMap(["OkCancelActions", "ColorActions", "ShortcutActions", "DirectionActions"],
106                 {
107                         "ok": self.keyOk,
108                         "green": self.keyOk,
109                         "up": self.keyUp,
110                         "upRepeated": self.keyUp,
111                         "downRepeated": self.keyDown,
112                         "down": self.keyDown,
113                         "left": self.keyLeft,
114                         "yellow": self.reboot,
115                         "right": self.keyRight
116                 }, -1)
117                 self.md5sum = ""
118
119         def keyUp(self):
120                 self["filelist"].up()
121                 self.check_for_NFO()
122
123         def keyDown(self):
124                 self["filelist"].down()
125                 self.check_for_NFO()
126         
127         def keyRight(self):
128                 self["filelist"].pageDown()
129                 self.check_for_NFO()
130
131         def keyLeft(self):
132                 self["filelist"].pageUp()
133                 self.check_for_NFO()
134
135         def keyOk(self):
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()
139                                 self.check_for_NFO()
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)
142
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 = ""
147
148                 if nfifile is None:
149                         if self["filelist"].getFilename() is None:
150                                 return
151                         if self["filelist"].getCurrentDirectory() is not None:
152                                 self.nfifile = self["filelist"].getCurrentDirectory()+self["filelist"].getFilename()
153                 else:
154                         self.nfifile = nfifile
155
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:")
165                                 if pos > 0:
166                                         self.md5sum = nfocontent[pos+5:pos+5+32] + "  " + self.nfifile
167                                 else:
168                                         self.md5sum = ""
169                         else:
170                                 self["infolabel"].text = _("No details for this image file") + (self["filelist"].getFilename() or "")
171                                 self.md5sum = ""
172
173         def queryCB(self, answer):
174                 if answer == True:
175                         self.createJob()
176
177         def createJob(self):
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)
187
188         def flashed(self, bg):
189                 print "[flashed]"
190                 self["key_yellow"].text = _("Reboot")
191
192         def reboot(self, ret=None):
193                 if self.job.status == self.job.FINISHED:
194                         self["status"].text = ("rebooting...")
195                         TryQuitMainloop(self.session,2)