Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
[enigma2.git] / lib / python / Plugins / SystemPlugins / NFIFlash / downloader.py
index 7e34d2bba866bc7d8691bdd073db710bd676504f..c91c85888b91a73a31b97e66b9f26b360c74bae0 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 from Components.MenuList import MenuList
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
 from Components.MenuList import MenuList
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
@@ -120,10 +121,10 @@ class NFIDownload(Screen):
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
                        <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" zPosition="0" size="140,40" transparent="1" alphatest="on" />
-                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
-                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
-                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
-                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;19" valign="center" halign="center" backgroundColor="#18188b" transparent="1" />
                        
                        <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" />
                        <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" />
                        
                        <widget source="label_top" render="Label" position="10,44" size="240,20" font="Regular;16" />
                        <widget name="feedlist" position="10,66" size="250,222" scrollbarMode="showOnDemand" />
@@ -170,6 +171,7 @@ class NFIDownload(Screen):
                self.box = HardwareInfo().get_device_name()
                self.feed_base = "http://www.dreamboxupdate.com/opendreambox/1.5/%s/images/" % self.box
                self.nfi_filter = "" # "release" # only show NFIs containing this string, or all if ""
                self.box = HardwareInfo().get_device_name()
                self.feed_base = "http://www.dreamboxupdate.com/opendreambox/1.5/%s/images/" % self.box
                self.nfi_filter = "" # "release" # only show NFIs containing this string, or all if ""
+               self.wizard_mode = False
 
                self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "EPGSelectActions"],
                {
 
                self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "EPGSelectActions"],
                {
@@ -206,7 +208,7 @@ class NFIDownload(Screen):
                                        self["key_yellow"].text = (_("Change dir."))
                                else:
                                        self["key_yellow"].text = (_("Select image"))
                                        self["key_yellow"].text = (_("Change dir."))
                                else:
                                        self["key_yellow"].text = (_("Select image"))
-                       self["key_blue"].text = (_("Fix USB stick"))
+                       self["key_blue"].text = (_("USB stick wizard"))
 
        def switchList(self,to_where=None):
                if self.download or not self["feedlist"].isValid():
 
        def switchList(self,to_where=None):
                if self.download or not self["feedlist"].isValid():
@@ -400,7 +402,7 @@ class NFIDownload(Screen):
                                print "couldn't save nfo file " + self.nfofilename
 
                        pos = self.nfo.find("MD5:")
                                print "couldn't save nfo file " + self.nfofilename
 
                        pos = self.nfo.find("MD5:")
-                       if pos > 0 and len(self.nfo) >= pos+5+32:                                       
+                       if pos > 0 and len(self.nfo) >= pos+5+32:
                                self["statusbar"].text = ("Please wait for md5 signature verification...")
                                cmd = "md5sum -c -"
                                md5 = self.nfo[pos+5:pos+5+32] + "  " + self.nfilocal
                                self["statusbar"].text = ("Please wait for md5 signature verification...")
                                cmd = "md5sum -c -"
                                md5 = self.nfo[pos+5:pos+5+32] + "  " + self.nfilocal
@@ -416,6 +418,8 @@ class NFIDownload(Screen):
                else:
                        self["statusbar"].text = "Download completed."
                        self.downloading(False)
                else:
                        self["statusbar"].text = "Download completed."
                        self.downloading(False)
+                       if self.wizard_mode:
+                               self.configBackup()
 
        def md5ready(self, retval):
                self.download_container.sendEOF()
 
        def md5ready(self, retval):
                self.download_container.sendEOF()
@@ -424,9 +428,12 @@ class NFIDownload(Screen):
                print "[md5finished]: " + str(retval)
                self.download_container.appClosed.remove(self.md5finished)
                if retval==0:
                print "[md5finished]: " + str(retval)
                self.download_container.appClosed.remove(self.md5finished)
                if retval==0:
-                       self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!")
-                       self.switchList(self.LIST_SOURCE)
                        self.downloading(False)
                        self.downloading(False)
+                       if self.wizard_mode:
+                               self.configBackup()
+                       else:
+                               self["statusbar"].text = _(".NFI file passed md5sum signature check. You can safely flash this image!")
+                               self.switchList(self.LIST_SOURCE)
                else:
                        self.session.openWithCallback(self.nfi_remove, MessageBox, (_("The md5sum validation failed, the file may be downloaded incompletely or be corrupted!") + "\n" + _("Remove the broken .NFI file?")), MessageBox.TYPE_YESNO)
 
                else:
                        self.session.openWithCallback(self.nfi_remove, MessageBox, (_("The md5sum validation failed, the file may be downloaded incompletely or be corrupted!") + "\n" + _("Remove the broken .NFI file?")), MessageBox.TYPE_YESNO)
 
@@ -613,10 +620,11 @@ class NFIDownload(Screen):
                        self["job_progressbar"].value = 1000
                        self["job_progresslabel"].text = "100.00%"
                        self["statusbar"].text = (".NFI Flasher bootable USB stick successfully created.")
                        self["job_progressbar"].value = 1000
                        self["job_progresslabel"].text = "100.00%"
                        self["statusbar"].text = (".NFI Flasher bootable USB stick successfully created.")
-                       self.session.openWithCallback(self.remove_img, MessageBox, _("The .NFI Image flasher USB stick is now ready to use. Please download an .NFI image file from the feed server and save it on the stick. Then reboot and hold the 'Down' key on the front panel to boot the .NFI flasher from the stick!"), MessageBox.TYPE_INFO)
+                       self.session.openWithCallback(self.flasherFinishedCB, MessageBox, _("The USB stick is now bootable. Do you want to download the latest image from the feed server and save it on the stick?"), type = MessageBox.TYPE_YESNO)
                        self["destlist"].changeDir("/mnt/usb")
                else:
                        self["destlist"].changeDir("/mnt/usb")
                else:
-                       self.session.openWithCallback(self.remove_img, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR)
+                       self.session.openWithCallback(self.flasherFinishedCB, MessageBox, (self.cmd + " " + _("failed") + ":\n" + str(self.taskstring)), MessageBox.TYPE_ERROR)
+                       self.remove_img(True)
 
        def remove_img(self, answer):
                if fileExists("/tmp/nfiflasher_image.tar.bz2"):
 
        def remove_img(self, answer):
                if fileExists("/tmp/nfiflasher_image.tar.bz2"):
@@ -626,6 +634,43 @@ class NFIDownload(Screen):
                self.downloading(False)
                self.switchList(self.LIST_SOURCE)
 
                self.downloading(False)
                self.switchList(self.LIST_SOURCE)
 
+       def flasherFinishedCB(self, answer):
+               if answer == True:
+                       self.wizard_mode = True
+                       self["feedlist"].moveSelection(0)
+                       self["path_bottom"].text = str(self["destlist"].getCurrentDirectory())
+                       self.nfo_download()
+                       self.nfi_download()
+
+       def configBackup(self):
+               self.session.openWithCallback(self.runBackup, MessageBox, _("The wizard can backup your current settings. Do you want to do a backup now?"))
+
+       def runBackup(self, result=None):
+               from Tools.Directories import createDir, isMount, pathExists
+               from time import localtime
+               from datetime import date
+               from Screens.Console import Console
+               if result:
+                       if isMount("/mnt/usb/"):
+                               if (pathExists("/mnt/usb/backup") == False):
+                                       createDir("/mnt/usb/backup", True)
+                               d = localtime()
+                               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)
+               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:
                        self.download.stop()
        def closeCB(self):
                if self.download:
                        self.download.stop()