--- /dev/null
+from Screens.Wizard import wizardManager, WizardSummary
+from Screens.WizardLanguage import WizardLanguage
+from Screens.Rc import Rc
+from Screens.Console import Console
+from Screens.MessageBox import MessageBox
+from Components.Console import Console
+from Components.Ipkg import IpkgComponent
+from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap
+from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigLocations, ConfigBoolean
+from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from os import system, statvfs, stat
+
+
+def checkFreeSpaceAvailable():
+ try:
+ stat = statvfs('/')
+ except OSError:
+ return None
+ return (stat.f_bfree * stat.f_bsize)/1024 #return free space in kiloBytes
+
+
+class CleanupWizard(WizardLanguage, Rc):
+
+ skin = """
+ <screen name="CleanupWizard" position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
+ <widget name="text" position="153,40" size="380,330" font="Regular;22" />
+ <widget source="list" render="Listbox" position="43,300" size="460,220" scrollbarMode="showOnDemand" >
+ <convert type="StringList" />
+ </widget>
+ <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
+ <ePixmap pixmap="skin_default/buttons/button_red.png" position="40,225" zPosition="0" size="15,16" transparent="1" alphatest="on" />
+ <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" />
+ <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" alphatest="on" />
+ <widget name="rc" pixmaps="skin_default/rc.png,skin_default/rcold.png" position="530,50" zPosition="10" size="154,500" alphatest="on" />
+ <widget name="arrowdown" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowdown2" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowup" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ </screen>"""
+
+ def __init__(self, session):
+ self.xmlfile = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/CleanupWizard/cleanupwizard.xml")
+ WizardLanguage.__init__(self, session, showSteps = False, showStepSlider = False)
+ Rc.__init__(self)
+ self.session = session
+ self["wizard"] = Pixmap()
+ self.selectedAction = None
+ self.selectedPackage = None
+ self.NextStep = None
+ self.Text = None
+ self.buildListRef = None
+ self.RemoveRef = None
+ self.excluded_extensions = ('-skins', '-streamproxy', '-frontprocessorupgrade', '-crashlogautosubmit', '-hotplug', '-webinterface', '-mediascanner', '-genuinedreambox', '-mediaplayer', '-pictureplayer', '-dvdplayer', '-dvdburn', '-videotune', '-videomode', '-softwaremanager', '-skinselector', '-satfinder' )
+ self.Console = Console()
+ self.installed_packetlist = []
+ self.ipkg = IpkgComponent()
+ self.ipkg.addCallback(self.ipkgCallback)
+
+ def markDone(self):
+ pass
+
+ def listAction(self):
+ list = []
+ list.append((_("OK, remove some extensions"), "removeextensions"))
+ list.append((_("Exit the cleanup wizard"), "end"))
+ return list
+
+ def listAgainAction(self):
+ list = []
+ list.append((_("OK, remove another extensions"), "removeextensions"))
+ list.append((_("Exit the cleanup wizard"), "end"))
+ return list
+
+ def ActionSelectionMade(self, index):
+ self.selectedAction = index
+ self.ActionSelect(index)
+
+ def ActionSelect(self, index):
+ if index == 'end':
+ self.NextStep = 'end'
+ else:
+ self.NextStep = 'removeextensions'
+
+ def ActionSelectionMoved(self):
+ self.ActionSelect(self.selection)
+
+ def buildList(self,action):
+ if self.NextStep is not 'end':
+ if not self.Console:
+ self.Console = Console()
+ cmd = "ipkg list_installed | grep enigma2"
+ self.Console.ePopen(cmd, self.buildListInstalled_Finished)
+ self.buildListRef = self.session.openWithCallback(self.buildListfinishedCB, MessageBox, _("Please wait while searching for removable packages..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ else:
+ self.buildListfinishedCB(False)
+
+ def buildListInstalled_Finished(self, result, retval, extra_args = None):
+ if len(result):
+ self.installed_packetlist = []
+ for x in result.splitlines():
+ split = x.split(' - ')
+ if not any(split[0].strip().endswith(x) for x in self.excluded_extensions): #ignore some base plugins
+ if split[0].strip() != 'enigma2':
+ self.installed_packetlist.append((split[0].strip()))
+ self.buildListRef.close(True)
+
+ def buildListfinishedCB(self,data):
+ self.buildListRef = None
+ if data is True:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+ else:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+
+ def listInstalledPackages(self):
+ list = []
+ if self.installed_packetlist and len(self.installed_packetlist):
+ for x in self.installed_packetlist:
+ if x.startswith('enigma2-plugin-'):
+ pluginname = x.replace("enigma2-plugin-","")
+ elif x.startswith('enigma2-skin-'):
+ pluginname = x.replace("enigma2-","")
+ else:
+ pluginname = x
+ list.append( (pluginname,x) )
+ return list
+
+ def PackageSelectionMade(self, index):
+ self.PackageSelect(index)
+
+ def PackageSelectionMoved(self):
+ self.PackageSelect(self.selection)
+
+ def PackageSelect(self, package):
+ self.selectedPackage = package
+
+ def ipkgCallback(self, event, param):
+ if event == IpkgComponent.EVENT_ERROR:
+ freeSpace = checkFreeSpaceAvailable()
+ txt_line1 = _("There was an error. The package:") + "\n" + str(self.selectedPackage) + "\n" + _("could not be removed") + "\n"
+ txt_line2 = _("There are now ") + str(freeSpace) + " kB " + _("available") + "\n\n"
+ txt_line3 = _("Please select an option below.")
+ self.Text = txt_line1 + txt_line2 + txt_line3
+ self.NextStep = 'StatusRemoveERROR'
+ self.RemoveRef.close(True)
+ elif event == IpkgComponent.EVENT_DONE:
+ freeSpace = checkFreeSpaceAvailable()
+ txt_line1 = _("The package:") + "\n" + str(self.selectedPackage) + "\n" + _("was removed successfully") + "\n"
+ txt_line2 = _("There are now ") + str(freeSpace) + " kB " + _("available") + "\n\n"
+ txt_line3 = _("Please select an option below.")
+ self.Text = txt_line1 + txt_line2 + txt_line3
+ self.NextStep = 'StatusRemoveOK'
+ self.RemoveRef.close(True)
+ pass
+
+ def removeExtension(self,extension):
+ if self.NextStep is not 'end':
+ self.ipkg.startCmd(IpkgComponent.CMD_REMOVE, {'package': extension})
+ self.RemoveRef = self.session.openWithCallback(self.removeExtensionFinishedCB, MessageBox, _("Please wait while removing selected package..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ else:
+ self.buildListfinishedCB(False)
+
+ def removeExtensionFinishedCB(self,data):
+ self.RemoveRef = None
+ if data is True:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+ else:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+
--- /dev/null
+<wizard>
+ <step id="welcome">
+ <text value="Welcome to the cleanup wizard.\n\nWe have detected that your available internal memory has dropped below 2MB.\n\nTo ensure stable operation of your Dreambox, the internal memory should be cleaned up.\nYou can use this wizard to remove some extensions." />
+ <displaytext value="Cleanup Wizard" />
+ <list type="dynamic" source="listAction" evaluation="ActionSelectionMade" onselect="ActionSelectionMoved" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ <code pos="after" async="yes">
+self.buildList(self.selectedAction)
+ </code>
+ </step>
+
+ <step id="removeextensions">
+ <text value="Please select an extension to remove." />
+ <displaytext value="Select package" />
+ <list type="dynamic" source="listInstalledPackages" evaluation="PackageSelectionMade" onselect="PackageSelectionMoved" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+ </code>
+ <code pos="after" async="yes">
+self.removeExtension(self.selectedPackage)
+ </code>
+ </step>
+
+ <step id="StatusRemoveOK">
+ <text value="Package removed successfully.\n" />
+ <displaytext value="Removed successfully." />
+ <list type="dynamic" source="listAgainAction" evaluation="ActionSelectionMade" onselect="ActionSelectionMoved" />
+ <code>
+self["text"].setText(self.Text)
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ <code pos="after" async="yes">
+self.buildList(self.selectedAction)
+ </code>
+ </step>
+ <step id="StatusRemoveERROR">
+ <text value="Package removal failed.\n" />
+ <displaytext value="Remove failed." />
+ <list type="dynamic" source="listAgainAction" evaluation="ActionSelectionMade" onselect="ActionSelectionMoved" />
+ <code>
+self["text"].setText(self.Text)
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ <code pos="after" async="yes">
+self.buildList(self.selectedAction)
+ </code>
+ </step>
+ <step id="end">
+ <text value="The wizard is finished now." />
+ </step>
+</wizard>