1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
from enigma import eConsoleAppContainer
class IpkgComponent:
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 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'])
self.setCurrentCommand(cmd)
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
def stop(self):
self.cmd.kill()
def isRunning(self):
return self.cmd.running()
|