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

Last change on this file since 7584 was 7584, checked in by daduve, 20 months ago

translation py

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