X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ba1b105a176e5f62faf9d6d1f4c1a4c19764a2e4..4c1d3d2f5cf39f72bf85041a6ba6665350ea742e:/lib/python/Components/Ipkg.py diff --git a/lib/python/Components/Ipkg.py b/lib/python/Components/Ipkg.py old mode 100644 new mode 100755 index 25e19797..71447775 --- a/lib/python/Components/Ipkg.py +++ b/lib/python/Components/Ipkg.py @@ -1,6 +1,7 @@ from enigma import eConsoleAppContainer +from Tools.Directories import fileExists -class Ipkg: +class IpkgComponent: EVENT_INSTALL = 0 EVENT_DOWNLOAD = 1 EVENT_INFLATING = 2 @@ -10,6 +11,7 @@ class Ipkg: EVENT_LISTITEM = 9 EVENT_DONE = 10 EVENT_ERROR = 11 + EVENT_MODIFIED = 12 CMD_INSTALL = 0 CMD_LIST = 1 @@ -19,12 +21,9 @@ class Ipkg: def __init__(self, ipkg = '/usr/bin/ipkg'): self.ipkg = ipkg - + self.opkgAvail = fileExists('/usr/bin/opkg') self.cmd = eConsoleAppContainer() - self.cmd.appClosed.get().append(self.cmdFinished) - self.cmd.dataAvail.get().append(self.cmdData) self.cache = None - self.callbackList = [] self.setCurrentCommand() @@ -33,30 +32,36 @@ class Ipkg: 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) - + self.cmd.appClosed.append(self.cmdFinished) + self.cmd.dataAvail.append(self.cmdData) + if self.cmd.execute(self.ipkg + " " + cmd): + self.cmdFinished(-1) + + def startCmd(self, cmd, args = None): + if cmd == self.CMD_UPDATE: + self.runCmd("update") + elif cmd == self.CMD_UPGRADE: + append = "" + if args["test_only"]: + append = " -test" + self.runCmd("upgrade" + append) + elif cmd == self.CMD_LIST: + self.fetchedList = [] + if args['installed_only']: + self.runCmd("list_installed") + else: + self.runCmd("list") + elif cmd == self.CMD_INSTALL: + self.runCmd("install " + args['package']) + elif cmd == self.CMD_REMOVE: + self.runCmd("remove " + args['package']) + self.setCurrentCommand(cmd) + def cmdFinished(self, retval): self.callCallbacks(self.EVENT_DONE) - + self.cmd.appClosed.remove(self.cmdFinished) + self.cmd.dataAvail.remove(self.cmdData) + def cmdData(self, data): print "data:", data if self.cache is None: @@ -85,9 +90,14 @@ class Ipkg: 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]) + if self.opkgAvail: + self.callCallbacks(self.EVENT_UPGRADE, data.split(' ', 1)[1].split(' ')[0]) + else: + 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('Removing') == 0: + self.callCallbacks(self.EVENT_REMOVE, data.split(' ', 1)[1].split(' ')[1]) elif data.find('Configuring') == 0: self.callCallbacks(self.EVENT_CONFIGURING, data.split(' ', 1)[1].split(' ')[0]) elif data.find('An error occurred') == 0: @@ -96,6 +106,12 @@ class Ipkg: self.callCallbacks(self.EVENT_ERROR, None) elif data.find('ipkg_download: ERROR:') == 0: self.callCallbacks(self.EVENT_ERROR, None) + elif data.find(' Configuration file \'') >= 0: + # Note: the config file update question doesn't end with a newline, so + # if we get multiple config file update questions, the next ones + # don't necessarily start at the beginning of a line + self.callCallbacks(self.EVENT_MODIFIED, data.split(' \'', 1)[1][:-1]) + def callCallbacks(self, event, param = None): for callback in self.callbackList: callback(event, param) @@ -104,4 +120,16 @@ class Ipkg: self.callbackList.append(callback) def getFetchedList(self): - return self.fetchedList \ No newline at end of file + return self.fetchedList + + def stop(self): + self.cmd.kill() + + def isRunning(self): + return self.cmd.running() + + def write(self, what): + if what: + # We except unterminated commands + what += "\n" + self.cmd.write(what, len(what))