1 from Screens.Screen import Screen
2 from Screens.MessageBox import MessageBox
3 from Screens.Console import Console
4 from Components.ActionMap import ActionMap, NumberActionMap
5 from Components.Pixmap import Pixmap
6 from Components.Label import Label
7 from Components.Sources.StaticText import StaticText
8 from Components.MenuList import MenuList
9 from Components.config import getConfigListEntry, configfile, ConfigSelection, ConfigSubsection, ConfigText, ConfigLocations
10 from Components.config import config
11 from Components.ConfigList import ConfigList,ConfigListScreen
12 from Components.FileList import MultiFileSelectList
13 from Plugins.Plugin import PluginDescriptor
14 from enigma import eTimer
15 from Tools.Directories import *
16 from os import popen, path, makedirs, listdir, access, stat, rename, remove, W_OK, R_OK
17 from time import gmtime, strftime, localtime
18 from datetime import date
21 config.plugins.configurationbackup = ConfigSubsection()
22 config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False)
23 config.plugins.configurationbackup.backupdirs = ConfigLocations(default=['/etc/enigma2/', '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname'])
26 backuppath = config.plugins.configurationbackup.backuplocation.value
27 if backuppath.endswith('/'):
28 return backuppath + 'backup'
30 return backuppath + '/backup'
32 def getBackupFilename():
33 return "enigma2settingsbackup.tar.gz"
36 class BackupScreen(Screen, ConfigListScreen):
38 <screen position="135,144" size="350,310" title="Backup is running" >
39 <widget name="config" position="10,10" size="330,250" transparent="1" scrollbarMode="showOnDemand" />
42 def __init__(self, session, runBackup = False):
43 Screen.__init__(self, session)
44 self.session = session
45 self.runBackup = runBackup
46 self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
52 self.finished_cb = None
53 self.backuppath = getBackupPath()
54 self.backupfile = getBackupFilename()
55 self.fullbackupfilename = self.backuppath + "/" + self.backupfile
57 ConfigListScreen.__init__(self, self.list)
58 self.onLayoutFinish.append(self.layoutFinished)
60 self.onShown.append(self.doBackup)
62 def layoutFinished(self):
65 def setWindowTitle(self):
66 self.setTitle(_("Backup is running..."))
70 if (path.exists(self.backuppath) == False):
71 makedirs(self.backuppath)
72 self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
73 if path.exists(self.fullbackupfilename):
74 dt = str(date.fromtimestamp(stat(self.fullbackupfilename).st_ctime))
75 self.newfilename = self.backuppath + "/" + dt + '-' + self.backupfile
76 if path.exists(self.newfilename):
77 remove(self.newfilename)
78 rename(self.fullbackupfilename,self.newfilename)
80 self.session.openWithCallback(self.finished_cb, Console, title = _("Backup is running..."), cmdlist = ["tar -czvf " + self.fullbackupfilename + " " + self.backupdirs],finishedCallback = self.backupFinishedCB,closeOnSuccess = True)
82 self.session.open(Console, title = _("Backup is running..."), cmdlist = ["tar -czvf " + self.fullbackupfilename + " " + self.backupdirs],finishedCallback = self.backupFinishedCB, closeOnSuccess = True)
85 self.session.openWithCallback(self.finished_cb, MessageBox, _("Sorry your backup destination is not writeable.\nPlease choose an other one."), MessageBox.TYPE_INFO, timeout = 10 )
87 self.session.openWithCallback(self.backupErrorCB,MessageBox, _("Sorry your backup destination is not writeable.\nPlease choose an other one."), MessageBox.TYPE_INFO, timeout = 10 )
89 def backupFinishedCB(self,retval = None):
92 def backupErrorCB(self,retval = None):
95 def runAsync(self, finished_cb):
96 self.finished_cb = finished_cb
100 class BackupSelection(Screen):
102 <screen name="BackupSelection" position="center,center" size="560,400" title="Select files/folders to backup">
103 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
104 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
105 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
106 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
107 <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
108 <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
109 <widget name="checkList" position="5,50" size="550,250" transparent="1" scrollbarMode="showOnDemand" />
112 def __init__(self, session):
113 Screen.__init__(self, session)
114 self["key_red"] = StaticText(_("Cancel"))
115 self["key_green"] = StaticText(_("Save"))
116 self["key_yellow"] = StaticText()
118 self.selectedFiles = config.plugins.configurationbackup.backupdirs.value
120 inhibitDirs = ["/bin", "/boot", "/dev", "/autofs", "/lib", "/proc", "/sbin", "/sys", "/hdd", "/tmp", "/mnt", "/media"]
121 self.filelist = MultiFileSelectList(self.selectedFiles, defaultDir, inhibitDirs = inhibitDirs )
122 self["checkList"] = self.filelist
124 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ShortcutActions"],
128 "yellow": self.changeSelectionState,
129 "green": self.saveSelection,
130 "ok": self.okClicked,
136 if not self.selectionChanged in self["checkList"].onSelectionChanged:
137 self["checkList"].onSelectionChanged.append(self.selectionChanged)
138 self.onLayoutFinish.append(self.layoutFinished)
140 def layoutFinished(self):
142 self["checkList"].moveToIndex(idx)
143 self.setWindowTitle()
144 self.selectionChanged()
146 def setWindowTitle(self):
147 self.setTitle(_("Select files/folders to backup"))
149 def selectionChanged(self):
150 current = self["checkList"].getCurrent()[0]
151 if current[2] is True:
152 self["key_yellow"].setText(_("Deselect"))
154 self["key_yellow"].setText(_("Select"))
157 self["checkList"].up()
160 self["checkList"].down()
163 self["checkList"].pageUp()
166 self["checkList"].pageDown()
168 def changeSelectionState(self):
169 self["checkList"].changeSelectionState()
170 self.selectedFiles = self["checkList"].getSelectedList()
172 def saveSelection(self):
173 self.selectedFiles = self["checkList"].getSelectedList()
174 config.plugins.configurationbackup.backupdirs.value = self.selectedFiles
175 config.plugins.configurationbackup.backupdirs.save()
176 config.plugins.configurationbackup.save()
184 if self.filelist.canDescent():
185 self.filelist.descent()
188 class RestoreMenu(Screen):
190 <screen name="RestoreMenu" position="center,center" size="560,400" title="Restore backups" >
191 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
192 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
193 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
194 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
195 <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
196 <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
197 <widget name="filelist" position="5,50" size="550,230" scrollbarMode="showOnDemand" />
200 def __init__(self, session, plugin_path):
201 Screen.__init__(self, session)
202 self.skin_path = plugin_path
204 self["key_red"] = StaticText(_("Cancel"))
205 self["key_green"] = StaticText(_("Restore"))
206 self["key_yellow"] = StaticText(_("Delete"))
215 self["actions"] = NumberActionMap(["SetupActions"],
218 "cancel": self.keyCancel
221 self["shortcuts"] = ActionMap(["ShortcutActions"],
223 "red": self.keyCancel,
225 "yellow": self.deleteFile,
228 self["filelist"] = MenuList(self.flist)
230 self.onLayoutFinish.append(self.layoutFinished)
232 def layoutFinished(self):
233 self.setWindowTitle()
235 def setWindowTitle(self):
236 self.setTitle(_("Restore backups"))
241 self.path = getBackupPath()
242 if (path.exists(self.path) == False):
244 for file in listdir(self.path):
245 if (file.endswith(".tar.gz")):
246 self.flist.append((file))
248 self["filelist"].l.setList(self.flist)
251 if (self.exe == False) and (self.entry == True):
252 self.sel = self["filelist"].getCurrent()
253 self.val = self.path + "/" + self.sel
254 self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n" + self.sel + "\nSystem will restart after the restore!"))
259 def startRestore(self, ret = False):
262 self.session.open(Console, title = _("Restore running"), cmdlist = ["tar -xzvf " + self.path + "/" + self.sel + " -C /", "killall -9 enigma2"])
264 def deleteFile(self):
265 if (self.exe == False) and (self.entry == True):
266 self.sel = self["filelist"].getCurrent()
267 self.val = self.path + "/" + self.sel
268 self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n" + self.sel ))
270 def startDelete(self, ret = False):
273 print "removing:",self.val
274 if (path.exists(self.val) == True):
279 class RestoreScreen(Screen, ConfigListScreen):
281 <screen position="135,144" size="350,310" title="Restore is running..." >
282 <widget name="config" position="10,10" size="330,250" transparent="1" scrollbarMode="showOnDemand" />
285 def __init__(self, session, runRestore = False):
286 Screen.__init__(self, session)
287 self.session = session
288 self.runRestore = runRestore
289 self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
293 "cancel": self.close,
295 self.finished_cb = None
296 self.backuppath = getBackupPath()
297 self.backupfile = getBackupFilename()
298 self.fullbackupfilename = self.backuppath + "/" + self.backupfile
300 ConfigListScreen.__init__(self, self.list)
301 self.onLayoutFinish.append(self.layoutFinished)
303 self.onShown.append(self.doRestore)
305 def layoutFinished(self):
306 self.setWindowTitle()
308 def setWindowTitle(self):
309 self.setTitle(_("Restore is running..."))
312 if path.exists("/proc/stb/vmpeg/0/dst_width"):
313 restorecmdlist = ["tar -xzvf " + self.fullbackupfilename + " -C /", "echo 0 > /proc/stb/vmpeg/0/dst_height", "echo 0 > /proc/stb/vmpeg/0/dst_left", "echo 0 > /proc/stb/vmpeg/0/dst_top", "echo 0 > /proc/stb/vmpeg/0/dst_width", "killall -9 enigma2"]
315 restorecmdlist = ["tar -xzvf " + self.fullbackupfilename + " -C /", "killall -9 enigma2"]
317 self.session.openWithCallback(self.finished_cb, Console, title = _("Restore is running..."), cmdlist = restorecmdlist)
319 self.session.open(Console, title = _("Restore is running..."), cmdlist = restorecmdlist)
321 def backupFinishedCB(self,retval = None):
324 def backupErrorCB(self,retval = None):
327 def runAsync(self, finished_cb):
328 self.finished_cb = finished_cb