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

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

Log

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