--- /dev/null
+from enigma import eConsoleAppContainer
+
+class Ipkg:
+ EVENT_INSTALL = 0
+ EVENT_DOWNLOAD = 1
+ EVENT_INFLATING = 2
+ EVENT_CONFIGURING = 3
+ EVENT_REMOVE = 4
+ EVENT_UPGRADE = 5
+ EVENT_LISTITEM = 9
+ EVENT_DONE = 10
+ EVENT_ERROR = 11
+
+ CMD_INSTALL = 0
+ CMD_LIST = 1
+ CMD_REMOVE = 2
+ CMD_UPDATE = 3
+ CMD_UPGRADE = 4
+
+ def __init__(self, ipkg = '/usr/bin/ipkg'):
+ self.ipkg = ipkg
+
+ self.cmd = eConsoleAppContainer()
+ self.cmd.appClosed.get().append(self.cmdFinished)
+ self.cmd.dataAvail.get().append(self.cmdData)
+ self.cache = None
+
+ self.callbackList = []
+ self.setCurrentCommand()
+
+ def setCurrentCommand(self, command = None):
+ self.currentCommand = command
+
+ def runCmd(self, cmd):
+ print "executing", self.ipkg, cmd
+ self.cmd.execute(self.ipkg + " " + cmd)
+
+ def cmdFetchList(self, installed_only = False):
+ self.fetchedList = []
+ if installed_only:
+ self.runCmd("list_installed")
+ else:
+ self.runCmd("list")
+ self.setCurrentCommand(self.CMD_LIST)
+
+ def cmdUpgrade(self, test_only = False):
+ append = ""
+ if test_only:
+ append = " -test"
+ self.runCmd("upgrade" + append)
+ self.setCurrentCommand(self.CMD_UPGRADE)
+
+ def cmdUpdate(self):
+ self.runCmd("update")
+ self.setCurrentCommand(self.CMD_UPDATE)
+
+ def cmdFinished(self, retval):
+ self.callCallbacks(self.EVENT_DONE)
+
+ def cmdData(self, data):
+ print "data:", data
+ if self.cache is None:
+ self.cache = data
+ else:
+ self.cache += data
+
+ if '\n' in data:
+ splitcache = self.cache.split('\n')
+ if self.cache[-1] == '\n':
+ iteration = splitcache
+ self.cache = None
+ else:
+ iteration = splitcache[:-1]
+ self.cache = splitcache[-1]
+ for mydata in iteration:
+ if mydata != '':
+ self.parseLine(mydata)
+
+ def parseLine(self, data):
+ if self.currentCommand == self.CMD_LIST:
+ item = data.split(' - ', 2)
+ self.fetchedList.append(item)
+ self.callCallbacks(self.EVENT_LISTITEM, item)
+ else:
+ if data.find('Downloading') == 0:
+ self.callCallbacks(self.EVENT_DOWNLOAD, data.split(' ', 5)[1].strip())
+ elif data.find('Upgrading') == 0:
+ self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0])
+ elif data.find('Installing') == 0:
+ self.callCallbacks(self.EVENT_INSTALL, data.split(' ', 1)[1].split(' ')[0])
+ elif data.find('Configuring') == 0:
+ self.callCallbacks(self.EVENT_CONFIGURING, data.split(' ', 1)[1].split(' ')[0])
+ elif data.find('An error occurred') == 0:
+ self.callCallbacks(self.EVENT_ERROR, None)
+ elif data.find('Failed to download') == 0:
+ self.callCallbacks(self.EVENT_ERROR, None)
+ elif data.find('ipkg_download: ERROR:') == 0:
+ self.callCallbacks(self.EVENT_ERROR, None)
+ def callCallbacks(self, event, param = None):
+ for callback in self.callbackList:
+ callback(event, param)
+
+ def addCallback(self, callback):
+ self.callbackList.append(callback)
+
+ def getFetchedList(self):
+ return self.fetchedList
\ No newline at end of file
-from enigma import *
+from enigma import eTimer, quitMainloop
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.ActionMap import ActionMap, NumberActionMap
from Screens.MessageBox import MessageBox
from Plugins.Plugin import PluginDescriptor
from Screens.ImageWizard import ImageWizard
+from Components.Ipkg import Ipkg
+from Components.Slider import Slider
+from Components.Label import Label
import os
def invalidate(self):
self.l.invalidate()
-class Ipkg(Screen):
+class Ipkg2(Screen):
skin = """
<screen position="100,100" size="550,400" title="IPKG upgrade..." >
<widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
self.delayTimer.start(0, 1)
else:
self.close()
+
+class UpdatePlugin(Screen):
+ skin = """
+ <screen position="100,100" size="550,200" title="Software Update..." >
+ <widget name="activityslider" position="0,0" size="550,5" />
+ <widget name="slider" position="0,100" size="550,30" />
+ <widget name="package" position="10,30" size="420,20" font="Regular;18"/>
+ <widget name="status" position="10,60" size="420,45" font="Regular;18"/>
+ </screen>"""
+
+ 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.timeout.get().append(self.doActivityTimer)
+ self.activityTimer.start(100, False)
+
+ self.ipkg = Ipkg()
+ self.ipkg.addCallback(self.ipkgCallback)
+
+ self.updating = True
+ self.package.setText("Package list update")
+ self.ipkg.cmdUpdate()
+
+ 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 == Ipkg.EVENT_DOWNLOAD:
+ self.status.setText(_("Downloading"))
+ elif event == Ipkg.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 == Ipkg.EVENT_INSTALL:
+ self.package.setText(param)
+ self.status.setText(_("Installing"))
+ self.packages += 1
+ elif event == Ipkg.EVENT_CONFIGURING:
+ self.package.setText(param)
+ self.status.setText(_("Configuring"))
+ elif event == Ipkg.EVENT_ERROR:
+ self.error += 1
+ elif event == Ipkg.EVENT_DONE:
+ if self.updating:
+ self.updating = False
+ self.ipkg.cmdUpgrade(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 exit(self):
+ 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, **kwargs):
- session.open(UpdatePluginMenu)
+ session.open(UpdatePlugin)
def Plugins(**kwargs):
- return PluginDescriptor(name="Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)
+ return PluginDescriptor(name="Softwareupdate", description=_("Updates your receiver's software"), icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)