source: home-eraser/trunk/fuentes/home-eraser-gui.install/usr/share/home-eraser/HomeEraser.py @ 7644

Last change on this file since 7644 was 7644, checked in by daduve, 14 months ago

Adding css

File size: 11.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
7
8import signal
9import gettext
10import sys
11import threading
12import copy
13import subprocess
14import os
15import N4dManager
16import xmlrpc.client
17import ssl
18import time
19import Dialog
20#import HomeEraserServer
21
22signal.signal(signal.SIGINT, signal.SIG_DFL)
23gettext.textdomain('home-eraser-gui')
24_ = gettext.gettext
25
26
27
28class Spinner:
29    busy = False
30    delay = 0.1
31
32    @staticmethod
33    def spinning_cursor():
34        while 1: 
35            for cursor in '|/-\\': yield cursor
36
37    def __init__(self, delay=None):
38        self.spinner_generator = self.spinning_cursor()
39        if delay and float(delay): self.delay = delay
40
41    def spinner_task(self):
42        while self.busy:
43            sys.stdout.write(next(self.spinner_generator))
44            sys.stdout.flush()
45            time.sleep(self.delay)
46            sys.stdout.write('\b')
47            sys.stdout.flush()
48
49    def start(self):
50        self.busy = True
51        threading.Thread(target=self.spinner_task).start()
52
53    def stop(self):
54        self.busy = False
55        time.sleep(self.delay)
56
57#class_spinner
58
59
60
61
62
63
64
65class HomeEraser:
66       
67        net="net"
68        home="home"
69        students="students"
70        teachers="teachers"
71        admins="admins"
72       
73        resume_home={}
74        resume_net=[]
75       
76        #log="/var/log/home_eraser.log"
77       
78        # ********HACKKKKKK
79        server="server"
80       
81        detect_connected_clients_cancelled=False
82       
83        DEBUG=True
84       
85        def dprint(self,arg):
86                self.n4d_man.lprint(self.user_val, "[HomeEraserGUI] %s"%arg)
87                if HomeEraser.DEBUG:
88                        print("[HomeEraserGUI] %s"%arg)
89               
90        #def dprint     
91       
92       
93        def __init__(self,args_dic):
94               
95                self.perfilreset_bin="/usr/sbin/home-eraser"
96               
97                self.n4d_man=N4dManager.N4dManager()
98                self.n4d_man.set_server(args_dic[self.server])
99               
100                if args_dic["gui"]:
101                       
102                        self.start_gui()
103                        GObject.threads_init()
104                        Gtk.main()
105               
106        #def __init__(self):
107       
108       
109        def start_gui(self):
110
111                builder=Gtk.Builder()
112                builder.set_translation_domain('home-eraser-gui')
113                builder.add_from_file("/usr/share/home-eraser/rsrc/home-eraser.ui")
114                self.main_window=builder.get_object("main_window")
115                self.main_window.set_icon_from_file('/usr/share/home-eraser/rsrc/home-eraser-icon.svg')
116
117                self.main_box=builder.get_object("main_box")
118                self.login_box=builder.get_object("login_box")
119                self.main_content_box=builder.get_object("main_content_box")
120               
121                self.stack=Gtk.Stack()
122                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
123                self.stack.set_transition_duration(500)
124                self.stack.add_titled(self.login_box,"login","login")
125                self.stack.add_titled(self.main_content_box,"main","main")
126               
127                self.stack.show_all()
128               
129                self.main_box.pack_start(self.stack,True,True,5)
130               
131                self.login_button=builder.get_object("login_button")
132                self.entry_user=builder.get_object("entry1")
133                self.entry_password=builder.get_object("entry2")
134                self.login_msg_label=builder.get_object("login_msg_label")
135               
136                #self.separator3 = builder.get_object("separator3")
137                #self.separator4 = builder.get_object("separator4")
138               
139                self.checkb1 = builder.get_object("checkbutton1")
140                self.checkb2 = builder.get_object("checkbutton2")
141                self.checkb3 = builder.get_object("checkbutton3")
142                self.checkb4 = builder.get_object("checkbutton4")
143                self.checkb5 = builder.get_object("checkbutton5")
144                self.checkb6 = builder.get_object("checkbutton6")
145                self.apply_button=builder.get_object("apply_button")
146                self.txt_apply=builder.get_object("txt_apply")
147                self.spinner=builder.get_object("spinner")
148               
149                self.num_clients_glade=builder.get_object("num_clients_glade")
150               
151                self.set_css_info()
152               
153                self.connect_signals()
154                self.main_window.show()
155               
156        #def start_gui
157       
158        def set_css_info(self):
159               
160                self.style_provider=Gtk.CssProvider()
161                f=Gio.File.new_for_path("/usr/share/home-eraser/HomeEraser.css")
162                self.style_provider.load_from_file(f)
163                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
164                self.main_window.set_name("WINDOW")
165               
166                self.apply_button.set_name("OPTION_BUTTON")
167                self.login_button.set_name("OPTION_BUTTON")
168               
169                #self.entry_user.set_name("OPTION_ENTRY")
170                #self.entry_password.set_name("OPTION_ENTRY")
171               
172                #self.separator3.set_name("OPTION_SEPARATOR")
173                #self.separator4.set_name("OPTION_SEPARATOR")
174               
175                '''self.checkb1.set_name("CHECKMARK")
176                self.checkb2.set_name("CHECKMARK")
177                self.checkb3.set_name("CHECKMARK")
178                self.checkb4.set_name("CHECKMARK")
179                self.checkb5.set_name("CHECKMARK")
180                self.checkb6.set_name("CHECKMARK")'''
181                       
182        #def set-css_info
183       
184       
185        def connect_signals(self):
186                       
187                self.main_window.connect("destroy",Gtk.main_quit)
188               
189                self.apply_button.connect("clicked",self.apply_button_clicked)
190               
191                self.login_button.connect("clicked",self.login_clicked)
192                self.entry_password.connect("activate",self.entries_press_event)
193               
194        #def connect_signals
195
196        # SIGNALS #######################################################       
197       
198        def entries_press_event(self,entry):
199               
200                self.login_clicked(None)
201               
202        #def entries_press_event
203       
204        def login_clicked(self,button):
205               
206                self.login_button.set_sensitive(False)
207                self.login_msg_label.set_text(_("Validating user..."))
208               
209                user=self.entry_user.get_text()
210                password=self.entry_password.get_text()
211                self.user_val=(user,password)
212                server="server"
213               
214                self.validate_user(user,password)
215               
216        #def login_clicked
217       
218        def validate_user(self,user,password):
219               
220                t=threading.Thread(target=self.n4d_man.validate_user,args=(user,password,))
221                t.daemon=True
222                t.start()
223                GLib.timeout_add(500,self.validate_user_listener,t)
224               
225        #def validate_user
226       
227        def validate_user_listener(self,thread):
228                       
229                if thread.is_alive():
230                        return True
231                               
232                self.login_button.set_sensitive(True)
233               
234                if not self.n4d_man.user_validated:
235                        self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user, please only admin users.")+"</span>")
236                else:
237                        group_found=False
238                        for g in ["adm","admins"]:
239                                if g in self.n4d_man.user_groups:
240                                        group_found=True
241                                        break
242                                       
243                        if group_found:
244                                self.n4d_man.get_client_list()
245                                # ***START LOG
246                                self.dprint("")
247                                self.dprint("** START HOME ERASER GUI **")
248                                self.dprint("   ---------------------")
249                                self.dprint("")
250                                # ##########
251                               
252                                self.stack.set_visible_child_name("main")
253                                self.dprint("Clients connected: %s"%self.n4d_man.detected_clients)
254                                self.num_clients_glade.set_text(str(self.n4d_man.detected_clients))
255                               
256                                t2=threading.Thread(target=self.n4d_man.update_client_list_thread)
257                                t2.daemon=True
258                                t2.start()
259                               
260                                GLib.timeout_add(5000,self.client_list_listener)
261                        else:
262                                self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user, please only admin users.")+"</span>")
263               
264       
265       
266        def client_list_listener(self):
267               
268                self.num_clients_glade.set_text(str(self.n4d_man.detected_clients))
269                return True
270               
271        #def  client_list_listener
272
273
274
275       
276        def apply_button_clicked(self,widget=True):
277               
278                try:                   
279                       
280                        delete={}
281                        delete[self.home]=[]
282                        delete[self.net]=[]
283                       
284                        info={}
285                        info[self.students]={}
286                       
287                       
288                        info[self.students][self.home]=self.checkb1.get_active()
289                        if info[self.students][self.home]:
290                                delete[self.home].append("students")
291                        info[self.students][self.net]=self.checkb4.get_active()
292                        if info[self.students][self.net]:
293                                delete[self.net].append("students")
294                        info[self.teachers]={}
295                        info[self.teachers][self.home]=self.checkb2.get_active()
296                        if info[self.teachers][self.home]:
297                                delete[self.home].append("teachers")
298                        info[self.teachers][self.net]=self.checkb5.get_active()
299                        if info[self.teachers][self.net]:
300                                delete[self.net].append("teachers")
301                        info[self.admins]={}
302                        info[self.admins][self.home]=self.checkb3.get_active()
303                        if info[self.admins][self.home]:
304                                delete[self.home].append("admins")
305                        info[self.admins][self.net]=self.checkb6.get_active()
306                        if info[self.admins][self.net]:
307                                delete[self.net].append("admins")
308                       
309                       
310                       
311                        for g in info:
312                                self.dprint(g)
313                                for d in info[g]:
314                                        self.dprint("\t %s : %s"%(d,info[g][d]))
315
316                        self.dprint("Summary to remove this elements: %s"%(delete))
317                       
318                        #Are you sure to delete????
319                       
320                        if ( len(delete[self.home]) >0 ) or ( len(delete[self.net]) >0 ):
321                               
322                                #dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "HOME ERASER")
323                                #dialog.format_secondary_text(_("Are you sure you want to delete?"))
324                               
325                                dialog=Dialog.QuestionDialog(self.main_window,_(u"HOME ERASER"),_(u"Are you sure you want to delete?"))
326                                response=dialog.run()
327                                dialog.destroy()
328                                #if response == Gtk.ResponseType.YES:
329                                if response == Gtk.ResponseType.OK:
330                                       
331                                        self.apply_button.set_sensitive(False)
332                                        self.checkb1.set_sensitive(False)
333                                        self.checkb2.set_sensitive(False)
334                                        self.checkb3.set_sensitive(False)
335                                        self.checkb4.set_sensitive(False)
336                                        self.checkb5.set_sensitive(False)
337                                        self.checkb6.set_sensitive(False)
338                                        self.txt_apply.set_text(_("Working........"))
339                                        self.apply_delete_methods_thread(delete)
340                        else:
341                                #dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "HOME ERASER")
342                                #dialog.format_secondary_text(_("You didn't select any option to delete."))
343                                dialog=Dialog.InfoDialog(self.main_window,_(u"HOME ERASER"),_(u"You didn't select any option to delete."))
344                                response=dialog.run()
345                                dialog.destroy()
346                       
347                       
348                except Exception as e:
349                        self.dprint(e)
350                        print ("[HomeEraserGUI] %s"%e)
351                        return [False,str(e)]
352               
353        #def check_changes
354       
355       
356       
357        def apply_delete_methods_thread(self,delete):
358               
359                t=threading.Thread(target=self.apply_delete_methods,args=(delete,))
360                t.daemon=True
361                t.start()
362                self.spinner.start()
363                GLib.timeout_add(500,self.sure_delete,t)
364               
365        #apply_delete_methods_thread
366       
367               
368        def sure_delete(self,thread):
369               
370                try:
371                        if thread.is_alive():
372                                return True
373                       
374                        self.detect_connected_clients_cancelled=True
375                        self.spinner.stop()
376                        self.txt_apply.set_markup("<span foreground='blue'>"+_("Finished. Log is found in /var/log/home-eraser.log ")+"</span>")
377                       
378                        #Gtk.main_quit()
379                        #sys.exit(0)
380                       
381                except Exception as e:
382                        self.dprint(e)
383                        print ("[HomeEraserGUI] %s"%e)
384                        return [False,str(e)]
385               
386        #def_sure_delete
387               
388       
389       
390        def apply_delete_methods(self,delete):
391               
392                try:
393                       
394                       
395                       
396                        #DELETE LOCAL HOMES IN FAT CLIENTS
397                        if ( len(delete[self.home] ) > 0 ):
398                                ips_detele=self.n4d_man.ips_connected
399                                self.dprint("Apply to clients: %s"%(ips_detele))
400                                r=self.n4d_man.delete_clients_homes(self.user_val,ips_detele, delete[self.home])
401                                if r[0]:
402                                        #shared in resume all ips and paths deleted
403                                        self.resume_home={**self.resume_home,**r[1]}
404                       
405                        #print resume home deleted in fat clients
406                        if (  len(self.resume_home) >0 ):
407                                self.dprint("")
408                                self.dprint("Summary for HOMES deleted")
409                                for i in self.resume_home:
410                                        self.dprint("%s : %s"%(i,self.resume_home[i]))
411                       
412                       
413                        #DELETE /NET DIRECTORIES
414                        if ( len(delete[self.net] ) > 0 ):
415                                rnet=self.n4d_man.delete_net_homes(self.user_val,delete[self.net])
416                                if rnet[0]:
417                                        self.resume_net=rnet[1]
418                                        self.dprint("")
419                                        self.dprint("Summary for paths in /NET deleted:")
420                                        for i in rnet[1]:
421                                                self.dprint(i)
422                       
423                       
424                       
425                        return[True,self.resume_home,self.resume_net]
426                                       
427                except Exception as e:
428                        self.dprint(e)
429                        print ("[HomeEraserGUI] %s"%e)
430                        return [False,str(e)]
431               
432               
433        #def_apply_delete_methods
434
435
436#class LliurexPerfilreset
437
438
439if __name__=="__main__":
440       
441        pass
442       
Note: See TracBrowser for help on using the repository browser.