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

Last change on this file since 7564 was 7564, checked in by daduve, 17 months ago

Debug false

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