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, eEnv
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
20 config.plugins.configurationbackup = ConfigSubsection()
21 config.plugins.configurationbackup.backuplocation = ConfigText(default = '/media/hdd/', visible_width = 50, fixed_size = False)
22 config.plugins.configurationbackup.backupdirs = ConfigLocations(default=[eEnv.resolve('${sysconfdir}/enigma2/'), '/etc/network/interfaces', '/etc/wpa_supplicant.conf', '/etc/wpa_supplicant.ath0.conf', '/etc/wpa_supplicant.wlan0.conf', '/etc/resolv.conf', '/etc/default_gw', '/etc/hostname'])
25 backuppath = config.plugins.configurationbackup.backuplocation.value
26 if backuppath.endswith('/'):
27 return backuppath + 'backup'
29 return backuppath + '/backup'
31 def getBackupFilename():
32 return "enigma2settingsbackup.tar.gz"
35 class BackupScreen(Screen, ConfigListScreen):
37 <screen position="135,144" size="350,310" title="Backup is running" >
38 <widget name="config" position="10,10" size="330,250" transparent="1" scrollbarMode="showOnDemand" />
41 def __init__(self, session, runBackup = False):
42 Screen.__init__(self, session)
43 self.session = session
44 self.runBackup = runBackup
45 self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
51 self.finished_cb = None
52 self.backuppath = getBackupPath()
53 self.backupfile = getBackupFilename()
54 self.fullbackupfilename = self.backuppath + "/" + self.backupfile
56 ConfigListScreen.__init__(self, self.list)
57 self.onLayoutFinish.append(self.layoutFinished)
59 self.onShown.append(self.doBackup)
61 def layoutFinished(self):
64 def setWindowTitle(self):
65 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()
254 self.val = self.path + "/" + self.sel
255 self.session.openWithCallback(self.startRestore, MessageBox, _("Are you sure you want to restore\nfollowing backup:\n") + self.sel + _("\nSystem will restart after the restore!"))
260 def startRestore(self, ret = False):
263 self.session.open(Console, title = _("Restore running"), cmdlist = ["tar -xzvf " + self.path + "/" + self.sel + " -C /", "killall -9 enigma2"])
265 def deleteFile(self):
266 if (self.exe == False) and (self.entry == True):
267 self.sel = self["filelist"].getCurrent()
269 self.val = self.path + "/" + self.sel
270 self.session.openWithCallback(self.startDelete, MessageBox, _("Are you sure you want to delete\nfollowing backup:\n") + self.sel)
272 def startDelete(self, ret = False):
275 print "removing:",self.val
276 if (path.exists(self.val) == True):
281 class RestoreScreen(Screen, ConfigListScreen):
283 <screen position="135,144" size="350,310" title="Restore is running..." >
284 <widget name="config" position="10,10" size="330,250" transparent="1" scrollbarMode="showOnDemand" />
287 def __init__(self, session, runRestore = False):
288 Screen.__init__(self, session)
289 self.session = session
290 self.runRestore = runRestore
291 self["actions"] = ActionMap(["WizardActions", "DirectionActions"],
295 "cancel": self.close,
297 self.finished_cb = None
298 self.backuppath = getBackupPath()
299 self.backupfile = getBackupFilename()
300 self.fullbackupfilename = self.backuppath + "/" + self.backupfile
302 ConfigListScreen.__init__(self, self.list)
303 self.onLayoutFinish.append(self.layoutFinished)
305 self.onShown.append(self.doRestore)
307 def layoutFinished(self):
308 self.setWindowTitle()
310 def setWindowTitle(self):
311 self.setTitle(_("Restore is running..."))
314 if path.exists("/proc/stb/vmpeg/0/dst_width"):
315 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"]
317 restorecmdlist = ["tar -xzvf " + self.fullbackupfilename + " -C /", "killall -9 enigma2"]
319 self.session.openWithCallback(self.finished_cb, Console, title = _("Restore is running..."), cmdlist = restorecmdlist)
321 self.session.open(Console, title = _("Restore is running..."), cmdlist = restorecmdlist)
323 def backupFinishedCB(self,retval = None):
326 def backupErrorCB(self,retval = None):
329 def runAsync(self, finished_cb):
330 self.finished_cb = finished_cb