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