+# -*- coding: utf-8 -*-
from Components.MenuList import MenuList
from Screens.Screen import Screen
from Screens.MessageBox import MessageBox
from Components.Label import Label
from Components.FileList import FileList
from Components.MultiContent import MultiContentEntryText
+from Components.ScrollLabel import ScrollLabel
from Tools.Directories import fileExists
from Tools.HardwareInfo import HardwareInfo
from enigma import eConsoleAppContainer, eListbox, gFont, eListboxPythonMultiContent, \
from os import system, remove
import re
import urllib
+from Tools.Downloader import downloadWithProgress
from twisted.web import client
from twisted.internet import reactor, defer
from twisted.python import failure
class UserRequestedCancel(Exception):
pass
-class HTTPProgressDownloader(client.HTTPDownloader):
- def __init__(self, url, outfile, headers=None):
- client.HTTPDownloader.__init__(self, url, outfile, headers=headers, agent="Dreambox .NFI Download Plugin")
- self.status = None
- self.progress_callback = None
- self.deferred = defer.Deferred()
-
- def noPage(self, reason):
- if self.status == "304":
- print reason.getErrorMessage()
- client.HTTPDownloader.page(self, "")
- else:
- client.HTTPDownloader.noPage(self, reason)
-
- def gotHeaders(self, headers):
- if self.status == "200":
- if headers.has_key("content-length"):
- self.totalbytes = int(headers["content-length"][0])
- else:
- self.totalbytes = 0
- self.currentbytes = 0.0
- return client.HTTPDownloader.gotHeaders(self, headers)
-
- def pagePart(self, packet):
- if self.status == "200":
- self.currentbytes += len(packet)
- if self.totalbytes and self.progress_callback:
- self.progress_callback(self.currentbytes, self.totalbytes)
- return client.HTTPDownloader.pagePart(self, packet)
-
- def pageEnd(self):
- return client.HTTPDownloader.pageEnd(self)
-
-class downloadWithProgress:
- def __init__(self, url, outputfile, contextFactory=None, *args, **kwargs):
- scheme, host, port, path = client._parse(url)
- self.factory = HTTPProgressDownloader(url, outputfile, *args, **kwargs)
- self.connection = reactor.connectTCP(host, port, self.factory)
-
- def start(self):
- return self.factory.deferred
-
- def stop(self):
- print "[stop]"
- self.connection.disconnect()
- #self.factory.deferred.errback(failure.Failure(UserRequestedCancel))
-
- def addProgress(self, progress_callback):
- print "[addProgress]"
- self.factory.progress_callback = progress_callback
-
class Feedlist(MenuList):
def __init__(self, list=[], enableWrapAround = False):
MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
def isValid(self):
l = self.l.getCurrentSelection()
- if l[0] == 0:
+ if not l or l[0] == 0:
return False
else:
return True
if self.instance is not None:
self.instance.moveSelectionTo(idx)
+class NFOViewer(Screen):
+ skin = """
+ <screen name="NFOViewer" position="110,115" size="540,400" title="Changelog viewer" >
+ <widget name="changelog" position="10,10" size="520,380" font="Regular;16" />
+ </screen>"""
+
+ def __init__(self, session, nfo):
+ Screen.__init__(self, session)
+ self["changelog"] = ScrollLabel(nfo)
+
+ self["ViewerActions"] = ActionMap(["SetupActions", "ColorActions", "DirectionActions"],
+ {
+ "green": self.exit,
+ "red": self.exit,
+ "ok": self.exit,
+ "cancel": self.exit,
+ "down": self.pageDown,
+ "up": self.pageUp
+ })
+ def pageUp(self):
+ self["changelog"].pageUp()
+
+ def pageDown(self):
+ self["changelog"].pageDown()
+
+ def exit(self):
+ self.close(False)
+
class NFIDownload(Screen):
LIST_SOURCE = 1
LIST_DEST = 2
self["destlist"].pageDown()
def ok(self):
+ if self.focus is self.LIST_SOURCE and self.nfo:
+ self.session.open(NFOViewer, self.nfo)
if self.download:
return
if self.focus is self.LIST_DEST:
def feed_finished(self, feedhtml):
print "[feed_finished] " + str(feedhtml)
self.downloading(False)
- fileresultmask = re.compile("<a href=[\'\"](?P<url>.*?)[\'\"]>(?P<name>.*?.nfi)</a>", re.DOTALL)
+ fileresultmask = re.compile("<a class=[\'\"]nfi[\'\"] href=[\'\"](?P<url>.*?)[\'\"]>(?P<name>.*?.nfi)</a>", re.DOTALL)
searchresults = fileresultmask.finditer(feedhtml)
fileresultlist = []
if searchresults:
else:
self.nfofilename = ""
self["infolabel"].text = _("No details for this image file")
- self["statusbar"].text = ""
+ self["statusbar"].text = _("Press OK to view full changelog")
def nfi_download(self):
if self["destlist"].getCurrentDirectory() is None:
self.taskstring = ""
self.container.appClosed.append(self.fdisk_finished)
self.container.execute("fdisk " + self.stickdevice + "/disc")
- self.container.write("d\nn\np\n1\n\n\nt\n6\nw\n")
+ self.container.write("d\n4\nd\n3\nd\n2\nd\nn\np\n1\n\n\nt\n6\nw\n")
self.delayTimer = eTimer()
self.delayTimer.callback.append(self.progress_increment)
self.delayTimer.start(105, False)
dt = date(d.tm_year, d.tm_mon, d.tm_mday)
self.backup_file = "backup/" + str(dt) + "_settings_backup.tar.gz"
self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + "/mnt/usb/" + self.backup_file + " /etc/enigma2/ /etc/network/interfaces /etc/wpa_supplicant.conf"], finishedCallback = self.backup_finished, closeOnSuccess = True)
-
- def backup_finished(self):
- wizardfd = open("/mnt/usb/wizard.nfo", "w")
- if wizardfd:
- wizardfd.write("image: "+self["feedlist"].getNFIname()+'\n')
- wizardfd.write("configuration: "+self.backup_file+'\n')
- wizardfd.close()
+ else:
+ self.backup_file = None
+ self.backup_finished(skipped=True)
+
+ def backup_finished(self, skipped=False):
+ if not skipped:
+ wizardfd = open("/mnt/usb/wizard.nfo", "w")
+ if wizardfd:
+ wizardfd.write("image: "+self["feedlist"].getNFIname()+'\n')
+ wizardfd.write("configuration: "+self.backup_file+'\n')
+ wizardfd.close()
self.session.open(MessageBox, _("To update your Dreambox firmware, please follow these steps:\n1) Turn off your box with the rear power switch and plug in the bootable USB stick.\n2) Turn mains back on and hold the DOWN button on the front panel pressed for 10 seconds.\n3) Wait for bootup and follow instructions of the wizard."), type = MessageBox.TYPE_INFO)
def closeCB(self):
- if self.download:
+ try:
self.download.stop()
#self.nfi_failed(None, "Cancelled by user request")
self.downloading(False)
- else:
+ except AttributeError:
self.close()
def main(session, **kwargs):