1 from enigma import eConsoleAppContainer
2 from Components.Console import Console
3 from Components.About import about
4 from Components.DreamInfoHandler import DreamInfoHandler
5 from Components.Language import language
6 from Components.Sources.List import List
7 from Components.Ipkg import IpkgComponent
8 from Components.Network import iNetwork
9 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR
10 from Tools.HardwareInfo import HardwareInfo
14 class SoftwareTools(DreamInfoHandler):
15 lastDownloadDate = None
16 NetworkConnectionAvailable = None
19 available_updatelist = []
20 available_packetlist = []
21 installed_packetlist = {}
25 aboutInfo = about.getImageVersionString()
26 if aboutInfo.startswith("dev-"):
27 self.ImageVersion = 'Experimental'
29 self.ImageVersion = 'Stable'
30 self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
31 DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language)
32 self.directory = resolveFilename(SCOPE_METADIR)
34 self.NotifierCallback = None
35 self.Console = Console()
36 self.UpdateConsole = Console()
38 self.unwanted_extensions = ('-dbg', '-dev', '-doc')
39 self.ipkg = IpkgComponent()
40 self.ipkg.addCallback(self.ipkgCallback)
42 def statusCallback(self, status, progress):
45 def startSoftwareTools(self, callback = None):
46 if callback is not None:
47 self.NotifierCallback = callback
48 iNetwork.checkNetworkState(self.checkNetworkCB)
50 def checkNetworkCB(self,data):
53 SoftwareTools.NetworkConnectionAvailable = True
56 SoftwareTools.NetworkConnectionAvailable = False
59 def getUpdates(self, callback = None):
60 if SoftwareTools.NetworkConnectionAvailable == True:
61 SoftwareTools.lastDownloadDate = time()
62 if SoftwareTools.list_updating is False and callback is None:
63 SoftwareTools.list_updating = True
64 self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
65 elif SoftwareTools.list_updating is False and callback is not None:
66 SoftwareTools.list_updating = True
67 self.NotifierCallback = callback
68 self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
69 elif SoftwareTools.list_updating is True and callback is not None:
70 #update info collecting already in progress
71 self.NotifierCallback = callback
73 SoftwareTools.list_updating = False
74 if callback is not None:
76 elif self.NotifierCallback is not None:
77 self.NotifierCallback(False)
79 def ipkgCallback(self, event, param):
80 if event == IpkgComponent.EVENT_ERROR:
81 SoftwareTools.list_updating = False
82 if self.NotifierCallback is not None:
83 self.NotifierCallback(False)
84 elif event == IpkgComponent.EVENT_DONE:
85 if SoftwareTools.list_updating:
86 self.startIpkgListAvailable()
87 #print event, "-", param
90 def startIpkgListAvailable(self, callback = None):
91 if callback is not None:
92 SoftwareTools.list_updating = True
93 if SoftwareTools.list_updating:
94 if not self.UpdateConsole:
95 self.UpdateConsole = Console()
97 self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback)
99 def IpkgListAvailableCB(self, result, retval, extra_args = None):
100 (callback) = extra_args
102 if SoftwareTools.list_updating:
103 SoftwareTools.available_packetlist = []
104 for x in result.splitlines():
105 tokens = x.split(' - ')
106 name = tokens[0].strip()
107 if not any(name.endswith(x) for x in self.unwanted_extensions):
109 version = l > 1 and tokens[1].strip() or ""
110 descr = l > 2 and tokens[2].strip() or ""
111 SoftwareTools.available_packetlist.append([name, version, descr])
113 self.startInstallMetaPackage()
115 if self.UpdateConsole:
116 if len(self.UpdateConsole.appContainers) == 0:
119 SoftwareTools.list_updating = False
120 if self.UpdateConsole:
121 if len(self.UpdateConsole.appContainers) == 0:
122 if callback is not None:
125 def startInstallMetaPackage(self, callback = None):
126 if callback is not None:
127 SoftwareTools.list_updating = True
128 if SoftwareTools.list_updating:
129 if not self.UpdateConsole:
130 self.UpdateConsole = Console()
131 cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
132 self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback)
134 def InstallMetaPackageCB(self, result, retval, extra_args = None):
135 (callback) = extra_args
137 self.fillPackagesIndexList()
139 self.startIpkgListInstalled()
141 if self.UpdateConsole:
142 if len(self.UpdateConsole.appContainers) == 0:
145 SoftwareTools.list_updating = False
146 if self.UpdateConsole:
147 if len(self.UpdateConsole.appContainers) == 0:
148 if callback is not None:
151 def startIpkgListInstalled(self, callback = None):
152 if callback is not None:
153 SoftwareTools.list_updating = True
154 if SoftwareTools.list_updating:
155 if not self.UpdateConsole:
156 self.UpdateConsole = Console()
157 cmd = "ipkg list_installed"
158 self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback)
160 def IpkgListInstalledCB(self, result, retval, extra_args = None):
161 (callback) = extra_args
163 SoftwareTools.installed_packetlist = {}
164 for x in result.splitlines():
165 tokens = x.split(' - ')
166 name = tokens[0].strip()
167 if not any(name.endswith(x) for x in self.unwanted_extensions):
169 version = l > 1 and tokens[1].strip() or ""
170 SoftwareTools.installed_packetlist[name] = version
171 for package in self.packagesIndexlist[:]:
172 if not self.verifyPrerequisites(package[0]["prerequisites"]):
173 self.packagesIndexlist.remove(package)
174 for package in self.packagesIndexlist[:]:
175 attributes = package[0]["attributes"]
176 if attributes.has_key("packagetype"):
177 if attributes["packagetype"] == "internal":
178 self.packagesIndexlist.remove(package)
182 if self.UpdateConsole:
183 if len(self.UpdateConsole.appContainers) == 0:
186 SoftwareTools.list_updating = False
187 if self.UpdateConsole:
188 if len(self.UpdateConsole.appContainers) == 0:
189 if callback is not None:
192 def countUpdates(self, callback = None):
193 SoftwareTools.available_updates = 0
194 SoftwareTools.available_updatelist = []
195 for package in self.packagesIndexlist[:]:
196 attributes = package[0]["attributes"]
197 packagename = attributes["packagename"]
198 for x in SoftwareTools.available_packetlist:
199 if x[0] == packagename:
200 if SoftwareTools.installed_packetlist.has_key(packagename):
201 if SoftwareTools.installed_packetlist[packagename] != x[1]:
202 SoftwareTools.available_updates +=1
203 SoftwareTools.available_updatelist.append([packagename])
205 SoftwareTools.list_updating = False
206 if self.UpdateConsole:
207 if len(self.UpdateConsole.appContainers) == 0:
208 if callback is not None:
211 elif self.NotifierCallback is not None:
212 self.NotifierCallback(True)
213 self.NotifierCallback = None
215 def startIpkgUpdate(self, callback = None):
217 self.Console = Console()
219 self.Console.ePopen(cmd, self.IpkgUpdateCB, callback)
221 def IpkgUpdateCB(self, result, retval, extra_args = None):
222 (callback) = extra_args
225 if len(self.Console.appContainers) == 0:
226 if callback is not None:
230 def cleanupSoftwareTools(self):
231 if self.NotifierCallback is not None:
232 self.NotifierCallback = None
234 if self.Console is not None:
235 if len(self.Console.appContainers):
236 for name in self.Console.appContainers.keys():
237 self.Console.kill(name)
238 if self.UpdateConsole is not None:
239 if len(self.UpdateConsole.appContainers):
240 for name in self.UpdateConsole.appContainers.keys():
241 self.UpdateConsole.kill(name)
243 def verifyPrerequisites(self, prerequisites):
244 if prerequisites.has_key("hardware"):
245 hardware_found = False
246 for hardware in prerequisites["hardware"]:
247 if hardware == self.hardware_info.device_name:
248 hardware_found = True
249 if not hardware_found:
253 iSoftwareTools = SoftwareTools()