source: lliurex-backup/trunk/fuentes/install-files/usr/sbin/lliurex-backup @ 2156

Last change on this file since 2156 was 2156, checked in by Juanma, 5 years ago

Added Moodle and Pmb

  • Property svn:executable set to *
File size: 10.6 KB
Line 
1#!/usr/bin/env python
2import gi
3gi.require_version('Gtk','3.0')
4from gi.repository import Gtk, Gdk, GObject,GLib
5import os
6import xmlrpclib
7import sys
8import signal
9import time
10import threading
11
12signal.signal(signal.SIGINT, signal.SIG_DFL)
13
14import gettext
15_=gettext.gettext
16gettext.textdomain('lliurex-backup')
17
18
19class LliurexBackup:
20       
21        def __init__(self):
22               
23                self.services=[(_("LliureX Server basic services"),"Hostname, Network, DNSmasq,\nProxy, LDAP, Samba",True,-1,"ServerBackupManager"),
24                ("Apache",_("HTTP Server"),False,0,"ApacheManager"),
25                ("CUPS",_("Printing service"),False,0,"CupsManager"),
26                ("MySQL",_("MySQL Database"),False,0,"MysqlManager"),
27                ("Moodle",_("Moodle"),False,0,"MoodleManager"),
28                ("PMB",_("Pmb"),False,0,"PmbManager")]
29               
30                #self.n4d_key=self.get_n4d_key()
31                self.n4d=xmlrpclib.ServerProxy("https://localhost:9779",allow_none=True)
32
33                self.pulsating=False
34                self.backup_thread=threading.Thread()
35                self.backup_ret=None
36                self.restore_thread=threading.Thread()
37                self.restore_thread=None
38                self.last_action=-1
39               
40                self.user=None
41                self.password=None
42               
43               
44        #def init
45       
46        def get_n4d_key(self):
47               
48                try:
49                        f=open("/etc/n4d/key")
50                        key=f.readline().strip("\n")
51                        f.close()
52                        return key
53                except:
54                        return None
55               
56        #def get_n4d_key
57               
58       
59        def start_gui(self):
60               
61                builder=Gtk.Builder()
62                builder.set_translation_domain("lliurex-backup")
63                if os.path.exists("install-files/usr/share/lliurex-backup/rsrc/lliurex-backup.glade"):
64                        builder.add_from_file("install-files/usr/share/lliurex-backup/rsrc/lliurex-backup.glade")
65                else:
66                        builder.add_from_file("/usr/share/lliurex-backup/rsrc/lliurex-backup.glade")
67               
68                self.window=builder.get_object("window1")
69                self.window.connect("destroy",self.destroy)
70               
71                self.add_button=builder.get_object("add_button")
72                self.add_button.connect("clicked",self.add_clicked)
73       
74                self.remove_button=builder.get_object("remove_button")
75                self.remove_button.connect("clicked",self.remove_clicked)
76               
77                self.backup_button=builder.get_object("backup_button")
78                self.backup_button.connect("clicked",self.backup_clicked)
79               
80                self.restore_button=builder.get_object("restore_button")
81                self.restore_button.connect("clicked",self.restore_clicked)
82               
83                self.backup_file=builder.get_object("backupfile_chooserbutton")
84                self.backup_dir=builder.get_object("backup_dir_chooserbutton")
85               
86                self.restore_file=builder.get_object("restorefile_chooserbutton")
87               
88                self.treeview=builder.get_object("backup_treeview")
89                self.selection=self.treeview.get_selection()
90                self.selection.connect("changed",self.service_selected)
91                self.build_treeview()
92               
93                self.msg_label=builder.get_object("msg_label")
94                self.msg_folder_label=builder.get_object("msg_folder_label")
95               
96               
97               
98                self.add_folder_window=builder.get_object("window2")
99                self.add_folder_button=builder.get_object("add_folder_button")
100                self.add_folder_button.connect("clicked",self.add_folder_clicked)
101                self.add_folder_window.connect("delete-event",self.on_delete_event)
102               
103                self.cancel_folder_button=builder.get_object("cancel_folder_button")
104                self.cancel_folder_button.connect("clicked",self.cancel_folder_clicked)
105                self.add_folder_window.hide()
106               
107                self.progress_window=builder.get_object("window3")
108                self.progress_label=builder.get_object("progress_label")
109                self.progress_window.connect("delete-event",self.on_delete_event)
110                self.progress_bar=builder.get_object("progressbar")
111               
112                self.login_window=builder.get_object("window4")
113
114                self.login_window.connect("destroy",self.destroy)
115                self.accept_login_button=builder.get_object("accept_login_button")
116                self.accept_login_button.connect("clicked",self.validate_user)
117                self.cancel_login_button=builder.get_object("cancel_login_button")
118                self.cancel_login_button.connect("clicked",self.destroy)
119                self.login_label=builder.get_object("login_label")
120               
121                self.user_entry=builder.get_object("user_entry")
122                self.user_entry.set_text(os.environ["USER"])
123                self.user_entry.set_sensitive(False)
124                self.pass_entry=builder.get_object("password_entry")
125                self.pass_entry.connect("activate",self.validate_user)
126               
127                self.login_window.show_all()
128               
129                Gtk.main()
130               
131        #def start_gui
132       
133        def validate_user(self,widget):
134               
135                self.user=self.user_entry.get_text()
136                self.password=self.pass_entry.get_text()
137                self.n4d_key=(self.user,self.password)
138               
139                if self.n4d.validate_user(self.user,self.password)[0]:
140                        self.login_window.hide()
141                        self.window.show_all()
142                else:
143                        self.login_label.set_markup("<span foreground='red'>%s</span>"%(_("Authentication error")))
144               
145        #def validate_user
146       
147        def on_delete_event(self,widget,data):
148               
149                return True
150               
151        #def on_delete_event
152       
153        def build_treeview(self):
154               
155                self.backup_store=Gtk.ListStore(str,str,bool,int,str)
156                self.treeview.set_model(self.backup_store)
157               
158                column=Gtk.TreeViewColumn(_("Service"))
159                renderer=Gtk.CellRendererText()
160                column.pack_start(renderer,True)
161                column.add_attribute(renderer,"text",0)
162                self.treeview.append_column(column)
163               
164                column=Gtk.TreeViewColumn(_("Description"))
165                renderer=Gtk.CellRendererText()
166                column.pack_start(renderer,True)
167                column.add_attribute(renderer,"text",1)
168                self.treeview.append_column(column)
169               
170                column=Gtk.TreeViewColumn(_("Backup"))
171                renderer=Gtk.CellRendererToggle()
172                renderer.connect("toggled",self.service_toggled)
173                column.pack_start(renderer,True)
174                column.add_attribute(renderer,"active",2)
175                self.treeview.append_column(column)
176               
177                for service in self.services:
178                        self.backup_store.append(service)
179               
180               
181        #def set_values
182       
183        def service_selected(self,selection):
184               
185                model,treeiter=selection.get_selected()
186               
187                if treeiter!=None:
188                        pass
189                        #print model[treeiter][0],model[treeiter][1]
190               
191        #def service_selected
192       
193        def service_toggled(self,widget,path):
194               
195                self.backup_store[path][2]=not self.backup_store[path][2]
196               
197        #def service-toggled
198       
199        def add_clicked(self,widget):
200               
201                self.msg_label.set_markup("")
202                self.add_folder_window.show_all()
203               
204        #def add_clicked
205       
206        def add_folder_clicked(self,widget):
207               
208                if self.backup_dir.get_filename()!=None:
209                        for item in self.backup_store:
210                                if self.backup_dir.get_filename().startswith(item[0]):
211                                        self.msg_folder_label.set_markup("<span foreground='red'>"+_("%s or its parent path is already in the backup list")%(self.backup_dir.get_filename())+"</span>")
212                                        return
213                       
214                        self.backup_store.append([self.backup_dir.get_filename(),_("Custom directory"),True,1,"NetFoldersManager"])             
215                        self.msg_folder_label.set_markup("")
216                        self.add_folder_window.hide()
217               
218        #def add_folder_clicked
219       
220        def cancel_folder_clicked(self,widget):
221               
222                self.add_folder_window.hide()
223               
224        #def cancel_folder_button
225       
226       
227        def remove_clicked(self,widget):
228               
229                self.msg_label.set_markup("")
230                selection=self.treeview.get_selection()
231                if selection!=None:
232                        model,treeiter=selection.get_selected()
233                        if treeiter!=None:
234                                if model[treeiter][3]==1:
235                                        self.backup_store.remove(treeiter)
236                                        self.msg_label.set_markup("")
237                                else:
238                                        self.msg_label.set_markup("<span foreground='red'>%s</span>"%_("Select a 'Custom directory' entry from the data table to remove it"))
239               
240        #def remove-clicked
241
242       
243        def backup_clicked(self,widget):
244               
245                path=self.backup_file.get_filename()
246                if path==None:
247                        self.msg_label.set_markup("<span foreground='red'>%s</span>"%_("Select a backup file path first"))
248                        return
249               
250                folder_list=[]
251                service_list=[]
252                use_basics=False
253                for item in self.backup_store:
254                        if item[2]:
255                                class_name=item[4]
256                                if class_name=="ServerBackupManager":
257                                        use_basics=True
258                                else:
259                                        service_list.append(class_name)
260                                if item[3]!=1:
261                                        print "n4d.backup %s"%class_name
262                                       
263                                        #print self.n4d.backup(self.n4d_key,class_name,path)
264                                else:
265                                        folder_list.append(item[0])
266                               
267                if use_basics:
268                        try:
269                                server_basics=self.n4d.get_basic_services_list("","ServerBackupManager")
270                        except:
271                                server_basics=[]
272                        for service in service_list:
273                                if service not in server_basics:
274                                        server_basics.append(service)
275                                       
276                        service_list=server_basics
277                               
278                if len(folder_list)>0:
279                        if "NetFoldersManager" not in service_list:
280                                service_list.append("NetFoldersManager")
281                else:
282                        folder_list=None
283               
284                self.last_action=0
285                self.pulsating=True
286                GLib.timeout_add(250,self.pulse_bar)
287                self.progress_label.set_text(_("Creating backup file..."))
288                self.progress_window.show()
289                self.backup_thread=threading.Thread(target=self.backup,args=(path,service_list,folder_list))
290                self.backup_thread.start()
291               
292               
293        #def remove-clicked
294       
295        def backup(self,path,services,folders):
296
297                try:
298                        self.last_action=0
299                        self.backup_ret=self.n4d.backup(self.n4d_key,"ServerBackupManager",path,services,folders)
300                        self.backup_ret=[True,self.backup_ret[2]]
301               
302                except Exception as e:
303                        self.backup_ret=[False,str(e)]
304                       
305                #self.pulsating=False
306               
307                return False
308               
309        #def backup
310       
311       
312        def restore(self,path):
313
314                try:
315                        self.last_action=1
316                        self.restore_ret=self.n4d.restore(self.n4d_key,"ServerBackupManager",path)
317
318                except Exception as e:
319                        self.restore_ret=[False,str(e)]
320                       
321                #self.pulsating=False
322                return False
323               
324        #def backup     
325       
326       
327        def pulse_bar(self):
328               
329               
330                self.progress_bar.pulse()
331                #print "pulsating"
332               
333                if self.last_action==0:
334                       
335                        if self.backup_thread.is_alive():
336                                return True
337                       
338                        elif self.backup_ret!=None:
339                                if self.backup_ret[0]:
340                                        self.msg_label.set_markup("<b>"+_("Backup file created")+":</b> %s"%self.backup_ret[1])
341                                else:
342                                        self.msg_label.set_markup("<span foreground='red'>"+_("Creation of backup file failed:")+"\n%s</span>"%( self.backup_ret[1] ))
343                                               
344                                self.progress_window.hide()
345                                self.pulsating=False
346                                return False
347                                               
348                if self.last_action==1:
349                               
350                        if self.restore_thread.is_alive():
351                                       
352                                return True
353                               
354                        elif self.restore_ret!=None:
355                                               
356                                if self.restore_ret[0]:
357                                        self.msg_label.set_markup(_("<b>Restoration complete</b>"))
358                                else:
359                                        self.msg_label.set_markup("<span foreground='red'>"+_("Restoration failed:")+"\n%s</span>"%( self.restore_ret[1] ))
360                               
361                                self.progress_window.hide()
362                                self.pulsating=False
363                                return False
364                       
365                return self.pulsating
366               
367        #def pulse_bar
368       
369        def restore_clicked(self,widget):
370               
371                self.msg_label.set_markup("")
372                path=self.restore_file.get_filename()
373                if path==None:
374                        self.msg_label.set_markup("<span foreground='red'>%s</span>"%_("Select a restoration file first"))
375                        return
376                       
377                self.last_action=1
378                self.pulsating=True
379                GLib.timeout_add(250,self.pulse_bar)
380                self.progress_label.set_text(_("Restoring services..."))
381                self.progress_window.show()
382                self.restore_thread=threading.Thread(target=self.restore,args=(path,))
383                self.restore_thread.start()
384               
385               
386        #def remove-clicked
387       
388       
389       
390        def destroy(self,widget):
391                #sys.exit(0)
392                Gtk.main_quit()
393               
394        #def destroy
395       
396       
397#class LliurexBackup
398
399
400
401if __name__=="__main__":
402       
403       
404        lb=LliurexBackup()
405        lb.start_gui()
Note: See TracBrowser for help on using the repository browser.