e12729b5bc5a0c640f55ae1f87cdf9bb34d2b8b4
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / SoftwareUpdate / plugin.py
1 from enigma import *
2 from Screens.Screen import Screen
3 from Screens.MessageBox import MessageBox
4 from Components.ActionMap import ActionMap, NumberActionMap
5 from Components.ScrollLabel import ScrollLabel
6 from Components.GUIComponent import *
7 from Components.MenuList import MenuList
8 from Components.Input import Input
9 from Screens.Console import Console
10 from Screens.MessageBox import MessageBox
11 from Plugins.Plugin import PluginDescriptor
12 from Screens.ImageWizard import ImageWizard
13
14 import os
15
16 class UpdatePluginMenu(Screen):
17         skin = """
18                 <screen position="200,100" size="300,250" title="Update..." >
19                         <widget name="menu" position="10,10" size="290,175" scrollbarMode="showOnDemand" />
20                 </screen>"""
21                 
22         def __init__(self, session, args = 0):
23                 self.skin = UpdatePluginMenu.skin
24                 Screen.__init__(self, session)
25                 
26                 self.menu = args
27                 
28                 list = []
29                 if self.menu == 0:
30                         list.append((_("Image-Upgrade"), "image"))
31                         list.append((_("Online-Upgrade"), "upgrade"))
32                         list.append((_("Advanced"), "advanced"))
33                 elif self.menu == 1:
34                         list.append((_("Choose source"), "source"))
35                         list.append((_("Packet management"), "ipkg"))
36                         list.append((_("Settings"), "setup"))
37                 
38                 self["menu"] = MenuList(list)
39                                 
40                 self["actions"] = ActionMap(["WizardActions", "DirectionActions"], 
41                 {
42                         "ok": self.go,
43                         "back": self.close,
44                 }, -1)
45                 
46         def go(self):
47                 if self.menu == 0:
48                         if (self["menu"].l.getCurrentSelection()[1] == "image"):
49                                 self.session.open(ImageWizard)
50                         if (self["menu"].l.getCurrentSelection()[1] == "upgrade"):
51                                 self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))
52                         if (self["menu"].l.getCurrentSelection()[1] == "advanced"):
53                                 self.session.open(UpdatePluginMenu, 1)
54                 if self.menu == 1:
55                         if (self["menu"].l.getCurrentSelection()[1] == "source"):
56                                 self.session.open(IPKGSource)
57                         elif (self["menu"].l.getCurrentSelection()[1] == "ipkg"):
58                                 self.session.open(Ipkg)
59                         elif (self["menu"].l.getCurrentSelection()[1] == "setup"):
60                                 self.session.open(MessageBox, _("Function not yet implemented"), MessageBox.TYPE_ERROR)
61         
62         def runUpgrade(self, result):
63                 if result:
64                         self.session.open(Console, title = "Upgrade running...", cmdlist = ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"], finishedCallback = self.runFinished)
65
66         def runFinished(self):
67                 self.session.openWithCallback(self.reboot, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
68                 
69         def reboot(self, result):
70                 if result is None:
71                         return
72                 if result:
73                         quitMainloop(3)
74
75 class IPKGSource(Screen):
76         skin = """
77                 <screen position="100,100" size="550,60" title="IPKG source" >
78                         <widget name="text" position="0,0" size="550,25" font="Regular;20" />
79                 </screen>"""
80                 
81         def __init__(self, session, args = None):
82                 self.skin = IPKGSource.skin
83                 Screen.__init__(self, session)
84                 
85                 fp = file('/etc/ipkg/official-feed.conf', 'r')
86                 sources = fp.readlines()
87                 fp.close()
88                 
89                 self["text"] = Input(sources[0], maxSize=False, type=Input.TEXT)
90                                 
91                 self["actions"] = NumberActionMap(["WizardActions", "InputActions"], 
92                 {
93                         "ok": self.go,
94                         "back": self.close,
95                         "left": self.keyLeft,
96                         "right": self.keyRight,
97                         "1": self.keyNumberGlobal,
98                         "2": self.keyNumberGlobal,
99                         "3": self.keyNumberGlobal,
100                         "4": self.keyNumberGlobal,
101                         "5": self.keyNumberGlobal,
102                         "6": self.keyNumberGlobal,
103                         "7": self.keyNumberGlobal,
104                         "8": self.keyNumberGlobal,
105                         "9": self.keyNumberGlobal,
106                         "0": self.keyNumberGlobal
107                 }, -1)
108                 
109         def go(self):
110                 fp = file('/etc/ipkg/official-feed.conf', 'w')
111                 fp.write(self["text"].getText())
112                 fp.close()
113                 self.close()
114                 
115         def keyLeft(self):
116                 self["text"].left()
117         
118         def keyRight(self):
119                 self["text"].right()
120         
121         def keyNumberGlobal(self, number):
122                 print "pressed", number
123                 self["text"].number(number)
124
125 RT_HALIGN_LEFT = 0
126 RT_HALIGN_RIGHT = 1
127 RT_HALIGN_CENTER = 2
128 RT_HALIGN_BLOCK = 4
129
130 RT_VALIGN_TOP = 0
131 RT_VALIGN_CENTER = 8
132 RT_VALIGN_BOTTOM = 16
133
134 def PacketEntryComponent(packet):
135         res = [ packet ]
136         
137         res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0,250, 30, 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[0]))
138         res.append((eListboxPythonMultiContent.TYPE_TEXT, 250, 0, 200, 30, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[1]))
139         res.append((eListboxPythonMultiContent.TYPE_TEXT, 450, 0, 100, 30, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, packet[2]))
140         return res
141
142 class PacketList(GUIComponent):
143         def __init__(self, list):
144                 GUIComponent.__init__(self)
145                 self.l = eListboxPythonMultiContent()
146                 self.l.setList(list)
147                 self.l.setFont(0, gFont("Regular", 20))
148                 self.l.setFont(1, gFont("Regular", 18))
149         
150         def getCurrent(self):
151                 return self.l.getCurrentSelection()
152         
153         def GUIcreate(self, parent):
154                 self.instance = eListbox(parent)
155                 self.instance.setContent(self.l)
156                 self.instance.setItemHeight(30)
157         
158         def GUIdelete(self):
159                 self.instance.setContent(None)
160                 self.instance = None
161
162         def invalidate(self):
163                 self.l.invalidate()
164
165 class Ipkg(Screen):
166         skin = """
167                 <screen position="100,100" size="550,400" title="IPKG upgrade..." >
168                         <widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
169                 </screen>"""
170                 
171         def __init__(self, session, args = None):
172                 self.skin = Ipkg.skin
173                 Screen.__init__(self, session)
174         
175                 list = []
176                 self.list = list
177                 self.fillPacketList()
178
179                 self["list"] = PacketList(self.list)
180                                 
181                 self["actions"] = ActionMap(["WizardActions"], 
182                 {
183                         "ok": self.close,
184                         "back": self.close
185                 }, -1)
186                 
187
188         def fillPacketList(self):
189                 lines = os.popen("ipkg list", "r").readlines()
190                 packetlist = []
191                 for x in lines:
192                         split = x.split(' - ')
193                         packetlist.append([split[0].strip(), split[1].strip()])
194                 
195                 lines = os.popen("ipkg list_installed", "r").readlines()
196                 
197                 installedlist = {}
198                 for x in lines:
199                         split = x.split(' - ')
200                         installedlist[split[0].strip()] = split[1].strip()
201                 
202                 for x in packetlist:
203                         status = ""
204                         if installedlist.has_key(x[0]):
205                                 if installedlist[x[0]] == x[1]:
206                                         status = "installed"
207                                 else:
208                                         status = "upgradable"
209                         self.list.append(PacketEntryComponent([x[0], x[1], status]))
210                 
211         def go(self):
212                 if self.update:
213                         self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))            
214                 else:
215                         self.close()
216         
217         def doUpdateDelay(self):
218                 lines = os.popen("ipkg update && ipkg upgrade", "r").readlines()
219                 string = ""
220                 for x in lines:
221                         string += x
222                 self["text"].setText(_("Updating finished. Here is the result:") + "\n\n" + string)
223                 self.update = False
224                         
225         
226         def doUpdate(self, val = False):
227                 if val == True:
228                         self["text"].setText(_("Updating... Please wait... This can take some minutes..."))
229                         self.delayTimer.start(0, 1)
230                 else:
231                         self.close()
232
233 def UpgradeMain(session, **kwargs):
234         session.open(UpdatePluginMenu)
235
236 def Plugins(**kwargs):
237         return PluginDescriptor(name="Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)