1 | #!/usr/bin/env python |
---|
2 | # -*- coding: utf-8 -* |
---|
3 | |
---|
4 | import gi |
---|
5 | gi.require_version('Gtk', '3.0') |
---|
6 | from gi.repository import Gtk,GObject, GLib |
---|
7 | |
---|
8 | import signal |
---|
9 | import gettext |
---|
10 | import sys |
---|
11 | import threading |
---|
12 | import copy |
---|
13 | import subprocess |
---|
14 | import os |
---|
15 | import N4dManager |
---|
16 | import xmlrpc.client |
---|
17 | import ssl |
---|
18 | import time |
---|
19 | #import HomeEraserServer |
---|
20 | |
---|
21 | signal.signal(signal.SIGINT, signal.SIG_DFL) |
---|
22 | gettext.textdomain('lliurex-pefilreset') |
---|
23 | _ = gettext.gettext |
---|
24 | |
---|
25 | |
---|
26 | |
---|
27 | class 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 | |
---|
62 | class 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 | detect_connected_clients_cancelled=False |
---|
72 | |
---|
73 | DEBUG=True |
---|
74 | |
---|
75 | def dprint(self,arg): |
---|
76 | self.n4d_man.lprint(self.user_val, "[HomeEraserGUI] %s"%arg) |
---|
77 | if HomeEraser.DEBUG: |
---|
78 | print("[HomeEraserGUI] %s"%arg) |
---|
79 | |
---|
80 | #def dprint |
---|
81 | |
---|
82 | |
---|
83 | def __init__(self,args_dic): |
---|
84 | |
---|
85 | self.perfilreset_bin="/usr/sbin/home-eraser" |
---|
86 | |
---|
87 | self.n4d_man=N4dManager.N4dManager() |
---|
88 | self.n4d_man.set_server(args_dic["server"]) |
---|
89 | |
---|
90 | if args_dic["gui"]: |
---|
91 | |
---|
92 | self.start_gui() |
---|
93 | GObject.threads_init() |
---|
94 | Gtk.main() |
---|
95 | |
---|
96 | #def __init__(self): |
---|
97 | |
---|
98 | |
---|
99 | def start_gui(self): |
---|
100 | |
---|
101 | builder=Gtk.Builder() |
---|
102 | builder.set_translation_domain('home-eraser') |
---|
103 | builder.add_from_file("/usr/share/home-eraser/rsrc/home-eraser.ui") |
---|
104 | self.main_window=builder.get_object("main_window") |
---|
105 | self.main_window.set_icon_from_file('/usr/share/home-eraser/rsrc/home-eraser-icon.svg') |
---|
106 | |
---|
107 | self.main_box=builder.get_object("main_box") |
---|
108 | |
---|
109 | self.apply_button=builder.get_object("apply_button") |
---|
110 | self.checkb1 = builder.get_object("checkbutton1") |
---|
111 | self.checkb2 = builder.get_object("checkbutton2") |
---|
112 | self.checkb3 = builder.get_object("checkbutton3") |
---|
113 | self.checkb4 = builder.get_object("checkbutton4") |
---|
114 | self.checkb5 = builder.get_object("checkbutton5") |
---|
115 | self.checkb6 = builder.get_object("checkbutton6") |
---|
116 | self.num_clients_glade=builder.get_object("num_clients_glade") |
---|
117 | |
---|
118 | self.connect_signals() |
---|
119 | self.main_window.show() |
---|
120 | |
---|
121 | #def start_gui |
---|
122 | |
---|
123 | |
---|
124 | def connect_signals(self): |
---|
125 | |
---|
126 | # #################### |
---|
127 | #HACKED TESTING GUI |
---|
128 | self.login_clicked() |
---|
129 | # ###### |
---|
130 | |
---|
131 | self.main_window.connect("destroy",Gtk.main_quit) |
---|
132 | |
---|
133 | self.apply_button.connect("clicked",self.apply_button_clicked) |
---|
134 | |
---|
135 | |
---|
136 | #def connect_signals |
---|
137 | |
---|
138 | |
---|
139 | # SIGNALS ######################################################## |
---|
140 | |
---|
141 | #def login_clicked(self,widget): |
---|
142 | |
---|
143 | def login_clicked(self): |
---|
144 | # HACK |
---|
145 | |
---|
146 | user="lliurex" |
---|
147 | password="lliurex" |
---|
148 | server="localhost" |
---|
149 | |
---|
150 | self.user_val=[user,password] |
---|
151 | self.n4d_man.user_val=self.user_val |
---|
152 | |
---|
153 | self.n4d_man.get_client_list() |
---|
154 | |
---|
155 | |
---|
156 | |
---|
157 | self.dprint("Clients connected: %s"%self.n4d_man.detected_clients) |
---|
158 | self.num_clients_glade.set_text(str(self.n4d_man.detected_clients)) |
---|
159 | |
---|
160 | t2=threading.Thread(target=self.n4d_man.update_client_list_thread) |
---|
161 | t2.daemon=True |
---|
162 | t2.start() |
---|
163 | |
---|
164 | GLib.timeout_add(5000,self.client_list_listener) |
---|
165 | |
---|
166 | '''user=self.user_entry.get_text() |
---|
167 | password=self.password_entry.get_text() |
---|
168 | server=self.server_ip_entry.get_text() |
---|
169 | |
---|
170 | if server!="": |
---|
171 | self.n4d_man.set_server(server) |
---|
172 | |
---|
173 | |
---|
174 | self.login_msg_label.set_text(_("Validating user...")) |
---|
175 | |
---|
176 | self.login_button.set_sensitive(False)''' |
---|
177 | #self.validate_user(user,password) |
---|
178 | |
---|
179 | #def login_clicked |
---|
180 | |
---|
181 | |
---|
182 | |
---|
183 | def client_list_listener(self): |
---|
184 | |
---|
185 | self.num_clients_glade.set_text(str(self.n4d_man.detected_clients)) |
---|
186 | return True |
---|
187 | |
---|
188 | #def client_list_listener |
---|
189 | |
---|
190 | |
---|
191 | |
---|
192 | |
---|
193 | def apply_button_clicked(self,widget=True): |
---|
194 | |
---|
195 | try: |
---|
196 | |
---|
197 | delete={} |
---|
198 | delete[self.home]=[] |
---|
199 | delete[self.net]=[] |
---|
200 | |
---|
201 | info={} |
---|
202 | info[self.students]={} |
---|
203 | |
---|
204 | |
---|
205 | info[self.students][self.home]=self.checkb1.get_active() |
---|
206 | if info[self.students][self.home]: |
---|
207 | delete[self.home].append("students") |
---|
208 | info[self.students][self.net]=self.checkb4.get_active() |
---|
209 | if info[self.students][self.net]: |
---|
210 | delete[self.net].append("students") |
---|
211 | info[self.teachers]={} |
---|
212 | info[self.teachers][self.home]=self.checkb2.get_active() |
---|
213 | if info[self.teachers][self.home]: |
---|
214 | delete[self.home].append("teachers") |
---|
215 | info[self.teachers][self.net]=self.checkb5.get_active() |
---|
216 | if info[self.teachers][self.net]: |
---|
217 | delete[self.net].append("teachers") |
---|
218 | info[self.admins]={} |
---|
219 | info[self.admins][self.home]=self.checkb3.get_active() |
---|
220 | if info[self.admins][self.home]: |
---|
221 | delete[self.home].append("admins") |
---|
222 | info[self.admins][self.net]=self.checkb6.get_active() |
---|
223 | if info[self.admins][self.net]: |
---|
224 | delete[self.net].append("admins") |
---|
225 | |
---|
226 | |
---|
227 | |
---|
228 | for g in info: |
---|
229 | print(g) |
---|
230 | for d in info[g]: |
---|
231 | print("\t %s : %s"%(d,info[g][d])) |
---|
232 | |
---|
233 | self.dprint("Summary to remove this elements: %s"%(delete)) |
---|
234 | |
---|
235 | #Are you sure to delete???? |
---|
236 | |
---|
237 | if ( len(delete[self.home]) >0 ) or ( len(delete[self.net]) >0 ): |
---|
238 | |
---|
239 | dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "HOME ERASER") |
---|
240 | dialog.format_secondary_text(_("Are you sure to delete?")) |
---|
241 | response=dialog.run() |
---|
242 | dialog.destroy() |
---|
243 | if response == Gtk.ResponseType.YES: |
---|
244 | |
---|
245 | self.apply_delete_methods(delete) |
---|
246 | self.detect_connected_clients_cancelled=True |
---|
247 | Gtk.main_quit() |
---|
248 | sys.exit(0) |
---|
249 | else: |
---|
250 | dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "HOME ERASER") |
---|
251 | dialog.format_secondary_text(_("You don't select any option to delete.")) |
---|
252 | response=dialog.run() |
---|
253 | dialog.destroy() |
---|
254 | |
---|
255 | |
---|
256 | |
---|
257 | |
---|
258 | |
---|
259 | except Exception as e: |
---|
260 | print ("[HomeEraserGUI] %s"%e) |
---|
261 | return [False,str(e)] |
---|
262 | |
---|
263 | #def check_changes |
---|
264 | |
---|
265 | |
---|
266 | |
---|
267 | |
---|
268 | |
---|
269 | def apply_delete_methods(self,delete): |
---|
270 | |
---|
271 | try: |
---|
272 | resume_home={} |
---|
273 | resume_net=[] |
---|
274 | |
---|
275 | #DELETE LOCAL HOMES IN FAT CLIENTS |
---|
276 | if ( len(delete[self.home] ) > 0 ): |
---|
277 | ips_detele=self.n4d_man.ips_connected |
---|
278 | self.dprint("Apply to clients: %s"%(ips_detele)) |
---|
279 | r=self.n4d_man.delete_clients_homes(self.user_val,ips_detele, delete[self.home]) |
---|
280 | if r[0]: |
---|
281 | #shared in resume all ips and paths deleted |
---|
282 | resume_home={**resume_home,**r[1]} |
---|
283 | |
---|
284 | #print resume home deleted in fat clients |
---|
285 | if ( len(resume_home) >0 ): |
---|
286 | self.dprint("") |
---|
287 | self.dprint("Summary for HOMES deleted") |
---|
288 | for i in resume_home: |
---|
289 | self.dprint("%s : %s"%(i,resume_home[i])) |
---|
290 | |
---|
291 | |
---|
292 | #DELETE /NET DIRECTORIES |
---|
293 | if ( len(delete[self.net] ) > 0 ): |
---|
294 | rnet=self.n4d_man.delete_net_homes(self.user_val,delete[self.net]) |
---|
295 | if rnet[0]: |
---|
296 | resume_net=rnet[1] |
---|
297 | self.dprint("") |
---|
298 | self.dprint("Summary for paths in /NET deleted:") |
---|
299 | for i in rnet[1]: |
---|
300 | self.dprint(i) |
---|
301 | |
---|
302 | return[True,resume_home,resume_net] |
---|
303 | |
---|
304 | except Exception as e: |
---|
305 | print ("[HomeEraserGUI] %s"%e) |
---|
306 | return [False,str(e)] |
---|
307 | |
---|
308 | |
---|
309 | #def_apply_delete_methods |
---|
310 | |
---|
311 | |
---|
312 | #class LliurexPerfilreset |
---|
313 | |
---|
314 | |
---|
315 | if __name__=="__main__": |
---|
316 | |
---|
317 | pass |
---|
318 | |
---|