X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/323ac4a566f7c1ea9006eaf58eae915fac00071b..cab018779de4f2f01e0fe651e71112754ebd0ef8:/lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py diff --git a/lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py b/lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py index 00f8e185..8127514c 100644 --- a/lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py +++ b/lib/python/Plugins/SystemPlugins/SoftwareUpdate/plugin.py @@ -1,16 +1,19 @@ -from enigma import * -from Screens.Screen import Screen -from Screens.MessageBox import MessageBox from Components.ActionMap import ActionMap, NumberActionMap -from Components.ScrollLabel import ScrollLabel -from Components.GUIComponent import * -from Components.MenuList import MenuList +from Components.GUIComponent import GUIComponent from Components.Input import Input -from Screens.Console import Console +from Components.Ipkg import IpkgComponent +from Components.Label import Label +from Components.MenuList import MenuList +from Components.Slider import Slider from Plugins.Plugin import PluginDescriptor +from Screens.Console import Console from Screens.ImageWizard import ImageWizard +from Screens.MessageBox import MessageBox +from Screens.MessageBox import MessageBox +from Screens.Screen import Screen +from enigma import eTimer, quitMainloop, RT_HALIGN_LEFT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont +from os import popen -import os class UpdatePluginMenu(Screen): skin = """ @@ -57,9 +60,19 @@ class UpdatePluginMenu(Screen): self.session.open(Ipkg) elif (self["menu"].l.getCurrentSelection()[1] == "setup"): self.session.open(MessageBox, _("Function not yet implemented"), MessageBox.TYPE_ERROR) + def runUpgrade(self, result): if result: - self.session.open(Console, ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"]) + self.session.open(Console, title = "Upgrade running...", cmdlist = ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"], finishedCallback = self.runFinished) + + def runFinished(self): + self.session.openWithCallback(self.reboot, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO) + + def reboot(self, result): + if result is None: + return + if result: + quitMainloop(3) class IPKGSource(Screen): skin = """ @@ -77,12 +90,16 @@ class IPKGSource(Screen): self["text"] = Input(sources[0], maxSize=False, type=Input.TEXT) - self["actions"] = NumberActionMap(["WizardActions", "InputActions"], + self["actions"] = NumberActionMap(["WizardActions", "InputActions", "TextEntryActions", "KeyboardInputActions"], { "ok": self.go, "back": self.close, "left": self.keyLeft, "right": self.keyRight, + "home": self.keyHome, + "end": self.keyEnd, + "deleteForward": self.deleteForward, + "deleteBackward": self.deleteBackward, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -107,19 +124,22 @@ class IPKGSource(Screen): def keyRight(self): self["text"].right() + def keyHome(self): + self["text"].home() + + def keyEnd(self): + self["text"].end() + + def keyDeleteForward(self): + self["text"].delete() + + def keyDeleteBackward(self): + self["text"].deleteBackward() + def keyNumberGlobal(self, number): print "pressed", number self["text"].number(number) -RT_HALIGN_LEFT = 0 -RT_HALIGN_RIGHT = 1 -RT_HALIGN_CENTER = 2 -RT_HALIGN_BLOCK = 4 - -RT_VALIGN_TOP = 0 -RT_VALIGN_CENTER = 8 -RT_VALIGN_BOTTOM = 16 - def PacketEntryComponent(packet): res = [ packet ] @@ -151,7 +171,7 @@ class PacketList(GUIComponent): def invalidate(self): self.l.invalidate() -class Ipkg(Screen): +class Ipkg2(Screen): skin = """ @@ -175,13 +195,13 @@ class Ipkg(Screen): def fillPacketList(self): - lines = os.popen("ipkg list", "r").readlines() + lines = popen("ipkg list", "r").readlines() packetlist = [] for x in lines: split = x.split(' - ') packetlist.append([split[0].strip(), split[1].strip()]) - lines = os.popen("ipkg list_installed", "r").readlines() + lines = popen("ipkg list_installed", "r").readlines() installedlist = {} for x in lines: @@ -204,7 +224,7 @@ class Ipkg(Screen): self.close() def doUpdateDelay(self): - lines = os.popen("ipkg update && ipkg upgrade", "r").readlines() + lines = popen("ipkg update && ipkg upgrade", "r").readlines() string = "" for x in lines: string += x @@ -218,9 +238,123 @@ class Ipkg(Screen): self.delayTimer.start(0, 1) else: self.close() + +class UpdatePlugin(Screen): + skin = """ + + + + + + """ + + def __init__(self, session, args = None): + self.skin = UpdatePlugin.skin + Screen.__init__(self, session) + + self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 } + + self.slider = Slider(0, 4) + self["slider"] = self.slider + self.activityslider = Slider(0, 100) + self["activityslider"] = self.activityslider + self.status = Label(_("Upgrading Dreambox... Please wait")) + self["status"] = self.status + self.package = Label() + self["package"] = self.package + + self.packages = 0 + self.error = 0 + + self.activity = 0 + self.activityTimer = eTimer() + self.activityTimer.callback.append(self.doActivityTimer) + self.activityTimer.start(100, False) + + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) + + self.updating = True + self.package.setText(_("Package list update")) + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + + self["actions"] = ActionMap(["WizardActions"], + { + "ok": self.exit, + "back": self.exit + }, -1) + + def doActivityTimer(self): + self.activity += 1 + if self.activity == 100: + self.activity = 0 + self.activityslider.setValue(self.activity) + + def ipkgCallback(self, event, param): + if event == IpkgComponent.EVENT_DOWNLOAD: + self.status.setText(_("Downloading")) + elif event == IpkgComponent.EVENT_UPGRADE: + if self.sliderPackages.has_key(param): + self.slider.setValue(self.sliderPackages[param]) + self.package.setText(param) + self.status.setText(_("Upgrading")) + self.packages += 1 + elif event == IpkgComponent.EVENT_INSTALL: + self.package.setText(param) + self.status.setText(_("Installing")) + self.packages += 1 + elif event == IpkgComponent.EVENT_CONFIGURING: + self.package.setText(param) + self.status.setText(_("Configuring")) + elif event == IpkgComponent.EVENT_MODIFIED: + self.session.openWithCallback( + self.modificationCallback, + MessageBox, + _("A configuration file (%s) was modified since Installation.\nDo you want to keep your version?") % (param) + ) + elif event == IpkgComponent.EVENT_ERROR: + self.error += 1 + elif event == IpkgComponent.EVENT_DONE: + if self.updating: + self.updating = False + self.ipkg.startCmd(IpkgComponent.CMD_UPGRADE, args = {'test_only': False}) + elif self.error == 0: + self.slider.setValue(4) + + self.activityTimer.stop() + self.activityslider.setValue(0) + + self.package.setText("") + self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages) + else: + self.activityTimer.stop() + self.activityslider.setValue(0) + error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.") + if self.packages == 0: + error = _("No packages were upgraded yet. So you can check your network and try again.") + if self.updating: + error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.") + self.status.setText(_("Error") + " - " + error) + #print event, "-", param + pass + + def modificationCallback(self, res): + self.ipkg.write(res and "N" or "Y") + + def exit(self): + if not self.ipkg.isRunning(): + if self.packages != 0 and self.error == 0: + self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?")) + else: + self.close() + + def exitAnswer(self, result): + if result is not None and result: + quitMainloop(2) + self.close() -def UpgradeMain(session): - session.open(UpdatePluginMenu) +def UpgradeMain(session, **kwargs): + session.open(UpdatePlugin) -def Plugins(): - return PluginDescriptor(name="Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain) +def Plugins(**kwargs): + return PluginDescriptor(name="Softwareupdate", description=_("Updates your receiver's software"), icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)