7a918da6ea3daadb7c5af074e8c612e1043b6f0c
[enigma2.git] / lib / python / Plugins / SystemPlugins / ConfigurationBackup / plugin.py
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.MenuList import MenuList
8 from Components.config import ConfigSelection, ConfigSubsection, KEY_LEFT, KEY_RIGHT, KEY_0, getConfigListEntry
9 from Components.ConfigList import ConfigList
10 from Plugins.Plugin import PluginDescriptor
11
12 from Tools.Directories import *
13 from os import path, makedirs, listdir
14 from time import localtime
15 from datetime import date
16
17 plugin_path = ""
18
19 # FIXME: harddiskmanager has a better overview about available mointpoints!
20 BackupPath = {
21                 "hdd" : "/media/hdd/backup",
22                 "usb" : "/media/usb/backup",
23                 "cf" : "/media/cf/backup"
24         }
25
26 MountPoints = {
27                 "hdd" : "/media/hdd",
28                 "usb" : "/media/usb",
29                 "cf" : "/media/cf"
30         }
31
32 class BackupSetup(Screen):
33         skin = """
34                 <screen position="135,144" size="450,300" title="Backup and Restore" >
35                         <widget name="config" position="10,10" size="430,240" />
36                         <widget name="cancel" position="10,255" size="100,40" pixmap="~/red.png" transparent="1" alphatest="on" />
37                         <widget name="canceltext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" foregroundColor="black" />
38                         <widget name="ok" position="120,255" size="100,40" pixmap="~/green.png" transparent="1" alphatest="on" />
39                         <widget name="oktext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
40                         <widget name="restore" position="230,255" size="100,40" pixmap="~/yellow.png" transparent="1" alphatest="on" />
41                         <widget name="restoretext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
42                         <widget name="backup" position="340,255" size="100,40" pixmap="~/blue.png" transparent="1" alphatest="on" />
43                         <widget name="backuptext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
44                 </screen>"""
45                 
46         def keyLeft(self):
47                 self["config"].handleKey(KEY_LEFT)
48
49         def keyRight(self):
50                 self["config"].handleKey(KEY_RIGHT)
51
52         def keyNumberGlobal(self, number):
53                 print "You pressed number", number
54                 if (self["config"].getCurrent()[1].parent.enabled == True):
55                         self["config"].handleKey(KEY_0+number)
56
57         def keyCancel(self):
58                 for x in self["config"].list:
59                         x[1].cancel()
60                 self.close()
61
62         def keySave(self):
63                 for x in self["config"].list:
64                         x[1].save()
65                 self.close()
66
67         def __init__(self, session, args = None):
68                 Screen.__init__(self, session)
69                 self.skin_path = plugin_path
70                 
71                 self["oktext"] = Label(_("OK"))
72                 self["canceltext"] = Label(_("Cancel"))
73                 self["backuptext"] = Label(_("Backup"))
74                 self["restoretext"] = Label(_("Restore"))
75                 self["restore"] = Pixmap()
76                 self["backup"] = Pixmap()
77                 self["ok"] = Pixmap()
78                 self["cancel"] = Pixmap()
79                 
80                 self.path = ""
81                 self.list = []
82                 self["config"] = ConfigList(self.list)
83                 self.createSetup()
84                 
85                 self["actions"] = NumberActionMap(["SetupActions"],
86                 {
87                         "ok": self.keySave,
88                         "cancel": self.keyCancel,
89                         "left": self.keyLeft,
90                         "right": self.keyRight
91                 }, -1)
92                 
93                 self["shortcuts"] = ActionMap(["ShortcutActions"],
94                 {
95                         "red": self.keyCancel,
96                         "green": self.keySave,
97                         "blue": self.Backup,
98                         "yellow": self.Restore,
99                 })
100                 
101
102         def createSetup(self):
103                 print "Creating BackupSetup"
104                 self.list = [ ]
105                 self["config"] = ConfigList(self.list)
106                 self.backup = ConfigSubsection()
107                 self.backup.type = ConfigSelection(choices = [("settings", _("enigma2 and network")), ("var", _("/var directory")), ("skin", _("/usr/share/enigma2 directory"))], default="settings")
108                 self.backup.location = ConfigSelection(choices = [("hdd", _("Harddisk")), ("usb", _("USB Stick")), ("cf", _("CF Drive"))])
109                 self.list.append(getConfigListEntry(_("Backup Mode"), self.backup.type))
110                 self.list.append(getConfigListEntry(_("Backup Location"), self.backup.location))
111
112         def createBackupfolders(self):
113                 self.path = BackupPath[self.backup.location.value]
114                 print "Creating Backup Folder if not already there..."
115                 if (path.exists(self.path) == False):
116                         makedirs(self.path)
117
118         def Backup(self):
119                 print "this will start the backup now!"
120                 self.session.openWithCallback(self.runBackup, MessageBox, _("Do you want to backup now?\nAfter pressing OK, please wait!"))     
121
122         def Restore(self):
123                 print "this will start the restore now!"
124                 self.session.open(RestoreMenu, self.backup)
125
126         def runBackup(self, result):
127                 if result:
128                         if path.ismount(MountPoints[self.backup.location.value]):
129                                 self.createBackupfolders()
130                                 d = localtime()
131                                 dt = date(d.tm_year, d.tm_mon, d.tm_mday)
132                                 self.path = BackupPath[self.backup.location.value]
133                                 if self.backup.type.value == "settings":
134                                         print "Backup Mode: Settings"
135                                         self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + self.path + "/" + str(dt) + "_settings_backup.tar.gz /etc/enigma2/ /etc/network/interfaces /etc/wpa_supplicant.conf"])
136                                 elif self.backup.type.value == "var":
137                                         print "Backup Mode: var"
138                                         self.session.open(Console, title = "Backup running", cmdlist = [ "tar -czvf " + self.path + "/" + str(dt) + "_var_backup.tar.gz /var/"])
139                                 elif self.backup.type.value == "skin":
140                                         print "Backup Mode: skin"
141                                         self.session.open(Console, title ="Backup running", cmdlist = [ "tar -czvf " + self.path + "/" + str(dt) + "_skin_backup.tar.gz /usr/share/enigma2/"])
142                         else:
143                                 self.session.open(MessageBox, _("Sorry your Backup destination does not exist\n\nPlease choose an other one."), MessageBox.TYPE_INFO)
144
145 class RestoreMenu(Screen):
146         skin = """
147                 <screen position="135,144" size="450,300" title="Restore Backups" >
148                 <widget name="filelist" position="10,10" size="430,240" scrollbarMode="showOnDemand" />
149                 <widget name="cancel" position="120,255" size="100,40" pixmap="~/red.png" transparent="1" alphatest="on" />             
150                 <widget name="canceltext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" foregroundColor="black" />
151                 <widget name="restore" position="230,255" size="100,40" pixmap="~/yellow.png" transparent="1" alphatest="on" />
152                 <widget name="restoretext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
153                 </screen>"""
154
155         def __init__(self, session, backup):
156                 Screen.__init__(self, session)
157                 self.skin_path = plugin_path
158                 self.backup = backup
159
160                 self["canceltext"] = Label(_("Cancel"))
161                 self["restoretext"] = Label(_("Restore"))
162                 self["restore"] = Pixmap()
163                 self["cancel"] = Pixmap()
164
165                 self.sel = []
166                 self.val = []
167                 self.entry = False
168                 self.exe = False
169                 
170                 self.path = ""
171
172                 self["actions"] = NumberActionMap(["SetupActions"],
173                 {
174                         "ok": self.KeyOk,
175                         "cancel": self.keyCancel
176                 }, -1)
177
178                 self["shortcuts"] = ActionMap(["ShortcutActions"],
179                 {
180                         "red": self.keyCancel,
181                         "yellow": self.KeyOk,
182                 })
183                 self.flist = []
184                 self["filelist"] = MenuList(self.flist)
185                 self.fill_list()
186
187         def fill_list(self):
188                 self.flist = []
189                 self.path = BackupPath[self.backup.location.value]
190                 if (path.exists(self.path) == False):
191                         makedirs(self.path)
192                 for file in listdir(self.path):
193                         if (file.endswith(".tar.gz")):
194                                 self.flist.append((file))
195                                 self.entry = True
196                                 self["filelist"].l.setList(self.flist)
197
198         def KeyOk(self):
199                 if (self.exe == False) and (self.entry == True):
200                         self.sel = self["filelist"].getCurrent()
201                         self.val = self.path + self.sel
202                         self.session.openWithCallback(self.startRestore, MessageBox, _("are you sure you want to restore\nfollowing backup:\n" + self.sel + "\nEnigma2 will restart after the restore"))
203
204         def keyCancel(self):
205                 self.close()
206
207         def startRestore(self, ret = False):
208                 if (ret == True):
209                         self.exe = True
210                         self.session.open(Console, title = "Restore running", cmdlist = ["tar -xzvf " + self.path + "/" + self.sel + " -C /", "killall -9 enigma2"])
211
212         def Exit(self):
213                 self.close()
214
215 def BackupMain(session, **kwargs):
216         session.open(BackupSetup)
217
218 def Plugins(path, **kwargs):
219         global plugin_path
220         plugin_path = path
221         return PluginDescriptor(name="Backup/Restore", description="Backup and Restore your Settings", icon="backup.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=BackupMain)