cleanup some imports
[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="ok" position="10,255" size="100,40" pixmap="~/green.png" transparent="1" alphatest="on" />
37                         <widget name="oktext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
38                         <widget name="cancel" position="120,255" size="100,40" pixmap="~/red.png" transparent="1" alphatest="on" />
39                         <widget name="canceltext" 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 = [("full", _("full /etc directory")), ("settings", _("only /etc/enigma2 directory")), ("var", _("/var directory")), ("skin", _("/usr/share/enigma2 directory"))], default="settings")
108                 self.backup.location = ConfigSelection(choices = [("usb", _("USB Stick")), ("cf", _("CF Drive")), ("hdd", _("Harddisk"))])
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 == "full":
134                                         print "Backup Mode: Full"
135                                         self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + self.path + "/" + str(dt) + "_full_backup.tar.gz /etc/"])
136                                 elif self.backup.type.value == "settings":
137                                         print "Backup Mode: Settings"
138                                         self.session.open(Console, title = "Backup running", cmdlist = ["tar -czvf " + self.path + "/" + str(dt) + "_settings_backup.tar.gz /etc/enigma2/"])
139                                 elif self.backup.type.value == "var":
140                                         print "Backup Mode: var"
141                                         self.session.open(Console, title = "Backup running", cmdlist = [ "tar -czvf " + self.path + "/" + str(dt) + "_var_backup.tar.gz /var/"])
142                                 elif self.backup.type.value == "skin":
143                                         print "Backup Mode: skin"
144                                         self.session.open(Console, title ="Backup running", cmdlist = [ "tar -czvf " + self.path + "/" + str(dt) + "_skin_backup.tar.gz /usr/share/enigma2/"])
145                         else:
146                                 self.session.open(MessageBox, _("Sorry your Backup destination does not exist\n\nPlease choose an other one."), MessageBox.TYPE_INFO)
147
148 class RestoreMenu(Screen):
149         skin = """
150                 <screen position="135,144" size="450,300" title="Restore Backups" >
151                 <widget name="filelist" position="10,10" size="430,240" scrollbarMode="showOnDemand" />
152                 <widget name="cancel" position="120,255" size="100,40" pixmap="~/red.png" transparent="1" alphatest="on" />             
153                 <widget name="canceltext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" foregroundColor="black" />
154                 <widget name="restore" position="230,255" size="100,40" pixmap="~/yellow.png" transparent="1" alphatest="on" />
155                 <widget name="restoretext" position="0,0" size="0,0" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1"  foregroundColor="black" />
156                 </screen>"""
157
158         def __init__(self, session, backup):
159                 Screen.__init__(self, session)
160                 self.skin_path = plugin_path
161                 self.backup = backup
162
163                 self["canceltext"] = Label(_("Cancel"))
164                 self["restoretext"] = Label(_("Restore"))
165                 self["restore"] = Pixmap()
166                 self["cancel"] = Pixmap()
167
168                 self.sel = []
169                 self.val = []
170                 self.entry = False
171                 self.exe = False
172                 
173                 self.path = ""
174
175                 self["actions"] = NumberActionMap(["SetupActions"],
176                 {
177                         "ok": self.KeyOk,
178                         "cancel": self.keyCancel
179                 }, -1)
180
181                 self["shortcuts"] = ActionMap(["ShortcutActions"],
182                 {
183                         "red": self.keyCancel,
184                         "yellow": self.KeyOk,
185                 })
186                 self.flist = []
187                 self["filelist"] = MenuList(self.flist)
188                 self.fill_list()
189
190         def fill_list(self):
191                 self.flist = []
192                 self.path = BackupPath[self.backup.location.value]
193                 if (path.exists(self.path) == False):
194                         makedirs(self.path)
195                 for file in listdir(self.path):
196                         if (file.endswith(".tar.gz")):
197                                 self.flist.append((file))
198                                 self.entry = True
199                                 self["filelist"].l.setList(self.flist)
200
201         def KeyOk(self):
202                 if (self.exe == False) and (self.entry == True):
203                         self.sel = self["filelist"].getCurrent()
204                         self.val = self.path + self.sel
205                         self.session.openWithCallback(self.startRestore, MessageBox, _("are you sure you want to restore\nfollowing backup:\n" + self.sel + "\nEnigma2 will restart after the restore"))
206
207         def keyCancel(self):
208                 self.close()
209
210         def startRestore(self, ret = False):
211                 if (ret == True):
212                         self.exe = True
213                         self.session.open(Console, title = "Restore running", cmdlist = ["tar -xzvf " + self.path + "/" + self.sel + " -C /", "killall -9 enigma2"])
214
215         def Exit(self):
216                 self.close()
217
218 def BackupMain(session, **kwargs):
219         session.open(BackupSetup)
220
221 def Plugins(path, **kwargs):
222         global plugin_path
223         plugin_path = path
224         return PluginDescriptor(name="Backup/Restore", description="Backup and Restore your Settings", icon="backup.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=BackupMain)