1 from Components.ActionMap import ActionMap, NumberActionMap
2 from Components.GUIComponent import GUIComponent
3 from Components.Input import Input
4 from Components.Ipkg import IpkgComponent
5 from Components.Label import Label
6 from Components.MenuList import MenuList
7 from Components.ScrollLabel import ScrollLabel
8 from Components.Slider import Slider
9 from Plugins.Plugin import PluginDescriptor
10 from Screens.Console import Console
11 from Screens.ImageWizard import ImageWizard
12 from Screens.MessageBox import MessageBox
13 from Screens.MessageBox import MessageBox
14 from Screens.Screen import Screen
15 from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont
19 class UpdatePluginMenu(Screen):
21 <screen position="200,100" size="300,250" title="Update..." >
22 <widget name="menu" position="10,10" size="290,175" scrollbarMode="showOnDemand" />
25 def __init__(self, session, args = 0):
26 self.skin = UpdatePluginMenu.skin
27 Screen.__init__(self, session)
33 list.append((_("Image-Upgrade"), "image"))
34 list.append((_("Online-Upgrade"), "upgrade"))
35 list.append((_("Advanced"), "advanced"))
37 list.append((_("Choose source"), "source"))
38 list.append((_("Packet management"), "ipkg"))
39 list.append((_("Settings"), "setup"))
41 self["menu"] = MenuList(list)
43 self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
51 if (self["menu"].l.getCurrentSelection()[1] == "image"):
52 self.session.open(ImageWizard)
53 if (self["menu"].l.getCurrentSelection()[1] == "upgrade"):
54 self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))
55 if (self["menu"].l.getCurrentSelection()[1] == "advanced"):
56 self.session.open(UpdatePluginMenu, 1)
58 if (self["menu"].l.getCurrentSelection()[1] == "source"):
59 self.session.open(IPKGSource)
60 elif (self["menu"].l.getCurrentSelection()[1] == "ipkg"):
61 self.session.open(Ipkg)
62 elif (self["menu"].l.getCurrentSelection()[1] == "setup"):
63 self.session.open(MessageBox, _("Function not yet implemented"), MessageBox.TYPE_ERROR)
65 def runUpgrade(self, result):
67 self.session.open(Console, title = "Upgrade running...", cmdlist = ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"], finishedCallback = self.runFinished)
69 def runFinished(self):
70 self.session.openWithCallback(self.reboot, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
72 def reboot(self, result):
78 class IPKGSource(Screen):
80 <screen position="100,100" size="550,60" title="IPKG source" >
81 <widget name="text" position="0,0" size="550,25" font="Regular;20" />
84 def __init__(self, session, args = None):
85 self.skin = IPKGSource.skin
86 Screen.__init__(self, session)
88 fp = file('/etc/ipkg/official-feed.conf', 'r')
89 sources = fp.readlines()
92 self["text"] = Input(sources[0], maxSize=False, type=Input.TEXT)
94 self["actions"] = NumberActionMap(["WizardActions", "InputActions"],
99 "right": self.keyRight,
100 "1": self.keyNumberGlobal,
101 "2": self.keyNumberGlobal,
102 "3": self.keyNumberGlobal,
103 "4": self.keyNumberGlobal,
104 "5": self.keyNumberGlobal,
105 "6": self.keyNumberGlobal,
106 "7": self.keyNumberGlobal,
107 "8": self.keyNumberGlobal,
108 "9": self.keyNumberGlobal,
109 "0": self.keyNumberGlobal
113 fp = file('/etc/ipkg/official-feed.conf', 'w')
114 fp.write(self["text"].getText())
124 def keyNumberGlobal(self, number):
125 print "pressed", number
126 self["text"].number(number)
128 def PacketEntryComponent(packet):
131 res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0,250, 30, 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[0]))
132 res.append((eListboxPythonMultiContent.TYPE_TEXT, 250, 0, 200, 30, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[1]))
133 res.append((eListboxPythonMultiContent.TYPE_TEXT, 450, 0, 100, 30, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[2]))
136 class PacketList(GUIComponent):
137 def __init__(self, list):
138 GUIComponent.__init__(self)
139 self.l = eListboxPythonMultiContent()
141 self.l.setFont(0, gFont("Regular", 20))
142 self.l.setFont(1, gFont("Regular", 18))
144 def getCurrent(self):
145 return self.l.getCurrentSelection()
147 def GUIcreate(self, parent):
148 self.instance = eListbox(parent)
149 self.instance.setContent(self.l)
150 self.instance.setItemHeight(30)
153 self.instance.setContent(None)
156 def invalidate(self):
161 <screen position="100,100" size="550,400" title="IPKG upgrade..." >
162 <widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
165 def __init__(self, session, args = None):
166 self.skin = Ipkg.skin
167 Screen.__init__(self, session)
171 self.fillPacketList()
173 self["list"] = PacketList(self.list)
175 self["actions"] = ActionMap(["WizardActions"],
182 def fillPacketList(self):
183 lines = popen("ipkg list", "r").readlines()
186 split = x.split(' - ')
187 packetlist.append([split[0].strip(), split[1].strip()])
189 lines = popen("ipkg list_installed", "r").readlines()
193 split = x.split(' - ')
194 installedlist[split[0].strip()] = split[1].strip()
198 if installedlist.has_key(x[0]):
199 if installedlist[x[0]] == x[1]:
202 status = "upgradable"
203 self.list.append(PacketEntryComponent([x[0], x[1], status]))
207 self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))
211 def doUpdateDelay(self):
212 lines = popen("ipkg update && ipkg upgrade", "r").readlines()
216 self["text"].setText(_("Updating finished. Here is the result:") + "\n\n" + string)
220 def doUpdate(self, val = False):
222 self["text"].setText(_("Updating... Please wait... This can take some minutes..."))
223 self.delayTimer.start(0, 1)
227 class UpdatePlugin(Screen):
229 <screen position="100,100" size="550,200" title="Software Update..." >
230 <widget name="activityslider" position="0,0" size="550,5" />
231 <widget name="slider" position="0,100" size="550,30" />
232 <widget name="package" position="10,30" size="420,20" font="Regular;18"/>
233 <widget name="status" position="10,60" size="420,45" font="Regular;18"/>
236 def __init__(self, session, args = None):
237 self.skin = UpdatePlugin.skin
238 Screen.__init__(self, session)
240 self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
242 self.slider = Slider(0, 4)
243 self["slider"] = self.slider
244 self.activityslider = Slider(0, 100)
245 self["activityslider"] = self.activityslider
246 self.status = Label(_("Upgrading Dreambox... Please wait"))
247 self["status"] = self.status
248 self.package = Label()
249 self["package"] = self.package
255 self.activityTimer = eTimer()
256 self.activityTimer.timeout.get().append(self.doActivityTimer)
257 self.activityTimer.start(100, False)
259 self.ipkg = IpkgComponent()
260 self.ipkg.addCallback(self.ipkgCallback)
263 self.package.setText(_("Package list update"))
264 self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
266 self["actions"] = ActionMap(["WizardActions"],
272 def doActivityTimer(self):
274 if self.activity == 100:
276 self.activityslider.setValue(self.activity)
278 def ipkgCallback(self, event, param):
279 if event == IpkgComponent.EVENT_DOWNLOAD:
280 self.status.setText(_("Downloading"))
281 elif event == IpkgComponent.EVENT_UPGRADE:
282 if self.sliderPackages.has_key(param):
283 self.slider.setValue(self.sliderPackages[param])
284 self.package.setText(param)
285 self.status.setText(_("Upgrading"))
287 elif event == IpkgComponent.EVENT_INSTALL:
288 self.package.setText(param)
289 self.status.setText(_("Installing"))
291 elif event == IpkgComponent.EVENT_CONFIGURING:
292 self.package.setText(param)
293 self.status.setText(_("Configuring"))
294 elif event == IpkgComponent.EVENT_ERROR:
296 elif event == IpkgComponent.EVENT_DONE:
298 self.updating = False
299 self.ipkg.startCmd(Ipkg.CMD_UPGRADE, args = {'test_only': False})
300 elif self.error == 0:
301 self.slider.setValue(4)
303 self.activityTimer.stop()
304 self.activityslider.setValue(0)
306 self.package.setText("")
307 self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
309 self.activityTimer.stop()
310 self.activityslider.setValue(0)
311 error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
312 if self.packages == 0:
313 error = _("No packages were upgraded yet. So you can check your network and try again.")
315 error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
316 self.status.setText(_("Error") + " - " + error)
317 #print event, "-", param
321 if not self.ipkg.isRunning():
322 if self.packages != 0 and self.error == 0:
323 self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"))
327 def exitAnswer(self, result):
328 if result is not None and result:
332 def UpgradeMain(session, **kwargs):
333 session.open(UpdatePlugin)
335 def Plugins(**kwargs):
336 return PluginDescriptor(name="Softwareupdate", description=_("Updates your receiver's software"), icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)