source: first-aid-kit/trunk/fuentes/first-aid-kit.install/usr/share/first-aid-kit/NetfilesBox.py

Last change on this file was 8685, checked in by daduve, 2 weeks ago

New colour in messages

File size: 13.3 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5import copy
6import gettext
7import Core
8
9#import Dialog
10import time
11import threading
12import sys
13import os
14import xmlrpclib
15import datetime
16from dateutil import parser
17
18gettext.textdomain('first-aid-kit')
19_=gettext.gettext
20
21
22RSRC="./rsrc/"
23
24
25class NetfilesBox(Gtk.VBox):
26       
27       
28        def __init__(self):
29               
30                Gtk.VBox.__init__(self)
31               
32                self.core=Core.Core.get_core()
33               
34                builder=Gtk.Builder()
35                builder.set_translation_domain('first-aid-kit')
36                ui_path=RSRC + "first-aid-kit.ui"
37                builder.add_from_file(ui_path)
38                self.acl_time_path="/tmp/.fak_acl_timepath"
39               
40               
41                self.netfiles_box=builder.get_object("netfiles_box")
42                self.acl_box=builder.get_object("acl_box")
43                self.acl_button=builder.get_object("acl_button")
44                self.acl_spinner=builder.get_object("acl_spinner")
45                self.regenerate_button=builder.get_object("regenerate_button")
46                self.regenerate_spinner=builder.get_object("regenerate_spinner")
47                self.txt_check_netfiles=builder.get_object("txt_check_netfiles")
48                self.spinner_netfiles=builder.get_object("spinner_netfiles")
49                self.label10=builder.get_object("label10")
50                self.label7=builder.get_object("label7")
51                self.section_label_1=builder.get_object("section_label_1")
52                self.box11=builder.get_object("box11")
53                self.separator2=builder.get_object("separator2")
54
55                self.info_netfiles=builder.get_object("info_netfiles")
56                self.info_netfiles_into=builder.get_object("info_netfiles_into")
57                self.info_netfiles_txt=builder.get_object("info_netfiles_txt")
58                self.info_netfiles_spinner=builder.get_object("info_netfiles_spinner")
59               
60
61                self.add(self.netfiles_box)
62               
63                self.info_netfiles_stack=Gtk.Stack()
64                self.info_netfiles_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
65                self.info_netfiles_stack.set_transition_duration(500)
66                hbox=Gtk.HBox()
67                hbox.show()
68                self.info_netfiles_stack.add_titled(hbox,"empty_box_netfiles","Empty Box")
69                self.info_netfiles_stack.add_titled(self.info_netfiles,"info_netfiles","InfoNetfiles")
70
71                self.wawabox=Gtk.HBox()
72                self.wawabox.pack_start(self.info_netfiles_stack,True,True,0)
73
74                self.netfiles_box.pack_start(self.wawabox,False,False,5)
75
76
77                self.info_netfiles.set_margin_bottom(20)
78                self.info_netfiles.set_margin_left(5)
79                self.info_netfiles.set_margin_right(5)
80
81                self.info_netfiles_stack.set_visible_child_name("empty_box_netfiles")
82                self.acl_executed=False
83                self.regenerate_executed=False
84
85                proxy="https://localhost:9779"
86                self.client=xmlrpclib.ServerProxy(proxy)
87
88                self.acl_error=[False,"True"]
89                self.regenerate_error=[False,"True"]
90               
91                self.connect_signals()
92                self.set_css_info()
93
94
95        #def __init__
96       
97
98        def check_thread_on_startup(self):
99
100                try:
101                        #thread is alive, because was started before.....
102                        if self.client.is_acl_thread_alive(self.core.n4d_key,"NetFoldersManager"):
103                                self.regenerate_button.set_sensitive(False)
104                                self.acl_button.set_sensitive(False)
105                               
106                                if os.path.isfile(self.acl_time_path):
107                                        f=open(self.acl_time_path)
108                                        line=f.readline()
109                                        f.close()
110                                        self.acl_time_start=parser.parse(line)
111
112                                else:
113                                        self.acl_time_start=datetime.datetime.now()
114
115                                allocation=self.acl_button.get_allocation()
116                                w=allocation.width
117                                h=allocation.height
118
119                                self.acl_button.hide()
120                                self.acl_spinner.start()
121                                self.acl_spinner.set_size_request(w,h)
122                                self.acl_spinner.show()
123                                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
124                                self.acl_elapsed=datetime.datetime.now() - self.acl_time_start
125                                self.acl_elapsed=self.time_formated(self.acl_elapsed)
126                                self.info_netfiles_txt.set_name("INFO_LABEL")
127                                self.info_netfiles_txt.set_text(_("ACLs are still regenerating, time elapsed: %s "%self.acl_elapsed))
128                                self.core.dprint("ACLs are still regenerating, time elapsed: %s "%self.acl_elapsed)
129                                GLib.timeout_add(10000,self.check_acl_thread)
130                except Exception as e:
131                        self.core.dprint("(check_thread_on_startup)Error: %s"%e,"[NetfilesBox]")
132
133        #def check_thread
134
135
136        def set_css_info(self):
137               
138                self.style_provider=Gtk.CssProvider()
139                f=Gio.File.new_for_path("first-aid-kit.css")
140                self.style_provider.load_from_file(f)
141                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
142               
143                self.box11.set_name("PKG_BOX")
144                self.acl_button.set_name("EXECUTE_BUTTON")
145                self.regenerate_button.set_name("EXECUTE_BUTTON")
146                self.label10.set_name("OPTION_LABEL")
147                self.label7.set_name("OPTION_LABEL")
148                self.section_label_1.set_name("SECTION_LABEL")
149                self.separator2.set_name("SEPARATOR_MAIN")
150
151                self.info_netfiles_txt.set_name("INFO_LABEL")
152                self.info_netfiles.set_name("PKG_BOX")
153                       
154        #def set-css_info
155
156
157
158
159
160
161        def connect_signals(self):
162               
163                self.acl_button.connect("clicked",self.acl_button_clicked)
164                self.regenerate_button.connect("clicked",self.regenerate_button_clicked)
165               
166        #def connect_signals
167
168
169
170
171
172        def acl_button_clicked(self,widget):
173
174                self.thread=threading.Thread(target=self.acl_button_thread)
175                self.regenerate_button.set_sensitive(False)
176                self.acl_button.set_sensitive(False)
177                self.info_netfiles_stack.set_visible_child_name("empty_box_netfiles")
178                self.thread.daemon=True
179                self.thread.start()
180               
181                allocation=self.acl_button.get_allocation()
182                w=allocation.width
183                h=allocation.height
184
185                self.acl_button.hide()
186                self.acl_spinner.start()
187                self.acl_spinner.set_size_request(w,h)
188                self.acl_spinner.show()
189                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
190
191                self.acl_time_start=datetime.datetime.now()
192
193                if os.path.isfile(self.acl_time_path):
194                        os.remove(self.acl_time_path)
195                f=open(self.acl_time_path,'w')
196                f.write(self.acl_time_start.ctime())
197                f.close()
198                self.info_netfiles_txt.set_name("INFO_LABEL")
199                self.info_netfiles_txt.set_text(_("ACLs are still regenerating...... please, wait."))
200
201                GLib.timeout_add(10000,self.check_acl_thread)
202       
203        #def acl_button_clicked
204
205
206
207
208
209
210        def acl_button_thread(self):
211       
212                try:
213                        self.core.working=True
214                        self.core.dprint("ACL regenerating in /net....","[NetfilesBox]")
215
216                        self.client.restore_acls_via_thread(self.core.n4d_key,"NetFoldersManager")
217
218                        self.thread_ret={"status":True,"msg":"BROKEN"}
219                       
220                except Exception as e:
221                        self.core.dprint("(acl_button_thread)Error: %s"%e,"[NetfilesBox]")
222                        return False
223                       
224        #def acl_button_thread
225
226
227
228
229
230
231        def check_acl_thread(self):
232               
233                try:
234                       
235                        if self.client.is_acl_thread_alive(self.core.n4d_key,"NetFoldersManager"):
236                                self.acl_elapsed=datetime.datetime.now() - self.acl_time_start
237                                self.acl_elapsed=self.time_formated(self.acl_elapsed)
238                                self.info_netfiles_txt.set_name("INFO_LABEL")
239                                self.info_netfiles_txt.set_text(_("ACLs are still regenerating, time elapsed: %s "%self.acl_elapsed))
240                                self.core.dprint("ACLs are still regenerating, time elapsed %s "%self.acl_elapsed,"[NetfilesBox]")
241
242                                return True
243
244                        self.core.dprint("ACLs have been regenerated.","[NetfilesBox]")
245                        self.core.working=False
246
247                        self.acl_elapsed=datetime.datetime.now() - self.acl_time_start
248                        self.acl_elapsed=self.time_formated(self.acl_elapsed)
249                        self.acl_spinner.hide()
250                        self.acl_button.show()
251                        self.regenerate_button.set_sensitive(True)
252                        self.acl_button.set_sensitive(True)
253                        self.acl_error=[False,"Perfect"]
254
255                        self.acl_executed=True
256                        self.show_info()
257
258                except Exception as e:
259                        self.core.dprint("ACL check thread execution Exception: %s"%e,"[NetfilesBox]")
260                        self.acl_spinner.hide()
261                        self.acl_button.show()
262                        self.regenerate_button.set_sensitive(True)
263                        self.acl_button.set_sensitive(True)
264                        self.acl_error=[True,e]
265                        return False
266               
267        #check_acl_thread
268
269
270
271
272
273
274
275        def regenerate_button_clicked(self,widget):
276               
277                self.thread=threading.Thread(target=self.regenerate_button_thread)
278                self.regenerate_button.set_sensitive(False)
279                self.acl_button.set_sensitive(False)
280                self.info_netfiles_stack.set_visible_child_name("empty_box_netfiles")
281                self.thread.daemon=True
282                self.thread.start()
283               
284                allocation=self.regenerate_button.get_allocation()
285                w=allocation.width
286                h=allocation.height
287
288                self.regenerate_button.hide()
289                self.regenerate_spinner.start()
290                self.regenerate_spinner.set_size_request(w,h)
291                self.regenerate_spinner.show()
292                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
293                self.regenerate_time_start=datetime.datetime.now()
294                self.info_netfiles_txt.set_name("INFO_LABEL")
295                self.info_netfiles_txt.set_text(_("User folders are still regenerating...... please, wait."))
296
297                GLib.timeout_add(500,self.check_regenerate_thread)
298       
299        #def_regenerate_button_clicked
300
301
302
303
304
305
306        def regenerate_button_thread(self):
307       
308                try:
309                        self.core.dprint("Regenerating folders /net....","[NetfilesBox]")
310                        self.core.working=True
311
312                        users=self.client.light_get_user_list(self.core.n4d_key,"Golem")
313                        for user in users:
314                                user_properties={}
315                                user_properties["profile"]=user[5]
316                                user_properties["uid"]=user[1]
317                                user_properties["uidNumber"]=user[2]
318                                self.core.dprint("User: %s"%user,"[NetfilesBox]")
319                                self.core.dprint("user_properties: %s"%user_properties,"[NetfilesBox]")
320                                self.core.dprint("Testing folders in /net, N4D service.....","[NetfilesBox]")
321                                self.client.exist_home_or_create(self.core.n4d_key,"Golem",user_properties)
322
323                        self.core.dprint("Restore GROUP folders /net, N4D service.....","[NetfilesBox]")
324                        self.client.restore_groups_folders(self.core.n4d_key,"Golem")
325                        self.core.dprint("End of all process","[NetfilesBox]")
326
327                        self.thread_ret={"status":True,"msg":"BROKEN"}
328                       
329                except Exception as e:
330                        self.core.dprint("(regenerate_button_thread)Error: %s"%e,"[NetfilesBox]")
331                        return False
332                       
333        #def regenerate_button_thread
334
335
336
337
338
339
340
341        def check_regenerate_thread(self):
342               
343                try:
344                        if self.thread.is_alive():
345                                self.regenerate_elapsed=datetime.datetime.now() - self.regenerate_time_start
346                                self.regenerate_elapsed=self.time_formated(self.regenerate_elapsed)
347                                self.info_netfiles_txt.set_name("INFO_LABEL")
348                                self.info_netfiles_txt.set_text(_("User folders are still regenerating, time elapsed: %s "%self.regenerate_elapsed))
349                                self.core.dprint("User folders are still regenerating, time elapsed: %s "%self.regenerate_elapsed,"[NetfilesBox]")
350                                return True
351
352                        self.core.working=False
353                       
354                        self.regenerate_elapsed=datetime.datetime.now() - self.regenerate_time_start
355                        self.regenerate_elapsed=self.time_formated(self.regenerate_elapsed)
356                        self.regenerate_spinner.hide()
357                        self.regenerate_button.show()
358                        self.regenerate_button.set_sensitive(True)
359                        self.acl_button.set_sensitive(True)
360
361                        self.regenerate_executed=True
362                        self.show_info()
363
364                except Exception as e:
365                        self.core.dprint("(check_regenerate_thread)Error: %s"%e,"[NetfilesBox]")
366                        self.regenerate_spinner.hide()
367                        self.regenerate_button.show()
368                        self.regenerate_button.set_sensitive(True)
369                        self.acl_button.set_sensitive(True)
370                        self.regenerate_error=[True,e]
371                        return False
372               
373        #check_regenerate_thread
374
375
376
377
378
379
380
381        def show_info(self):
382
383                if self.acl_error[0]== True:
384                        self.info_netfiles_stack.set_visible_child_name("info_netfiles")
385                        self.info_netfiles_txt.set_name("INFO_LABEL_ERROR")
386                        self.info_netfiles_txt.set_text(_("ACLs error: %s")%self.acl_error[1])
387                        if self.regenerate_error[0]==True:
388                                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
389                                self.info_netfiles_txt.set_name("INFO_LABEL_ERROR")
390                                self.info_netfiles_txt.set_text(_("ACLs error: %s\nRegenerate error:%s")%(self.acl_error[1],self.regenerate_error[1]))
391                        return True
392                if self.regenerate_error[0]==True:
393                        self.info_netfiles_stack.set_visible_child_name("info_netfiles")
394                        self.info_netfiles_txt.set_name("INFO_LABEL_ERROR")
395                        self.info_netfiles_txt.set_text(_("Regenerate error:%s")%self.regenerate_error[1])
396                        return True
397
398                if self.acl_executed == True:
399                        if self.regenerate_executed == False:
400                                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
401                                self.info_netfiles_txt.set_name("INFO_LABEL")
402                                self.info_netfiles_txt.set_text(_("Finished!!!\nACLs of the files have been reviewed. Time elapsed to do %s"%self.acl_elapsed))
403                        else:
404                                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
405                                self.info_netfiles_txt.set_name("INFO_LABEL")
406                                self.info_netfiles_txt.set_text(_("Finished!!!\nACLs of the files have been reviewed, in %s.\nAll user folders have been regenerated if it's necessary in %s"%(self.acl_elapsed,self.regenerate_elapsed)))
407                else:
408                        if self.regenerate_executed == True:
409                                self.info_netfiles_stack.set_visible_child_name("info_netfiles")
410                                self.info_netfiles_txt.set_name("INFO_LABEL")
411                                self.info_netfiles_txt.set_text(_("Finished!!!\nAll user folders have been regenerated if it's necessary. Time elapsed to do %s")%self.regenerate_elapsed)
412
413        #def show_info
414
415
416
417
418
419
420        def time_formated(self,time_timedelta):
421                try:
422
423                        hours=time_timedelta.seconds//3600
424                        minutes=time_timedelta.seconds//60
425                        seconds=time_timedelta.seconds-(minutes*60)
426
427                        if hours == 0:
428                                if minutes == 0:
429                                        return("%s seconds"%seconds)
430                                else:
431                                        if seconds == 0:
432                                                return("%s min"%minutes)
433                                        else:
434                                                if seconds<10:
435                                                        return("%s:%02d min"%(minutes,seconds))
436                                                else:
437                                                        return("%s:%s min"%(minutes,seconds))
438                        else:
439                                if minutes<10:
440                                        if seconds<10:
441                                                return("%s hours and %02d:%02d minutes"%(hours,minutes,seconds))
442                                        else:
443                                                return("%s hours and %02d:%s minutes"%(hours,minutes,seconds))
444                                else:
445                                        if seconds<10:
446                                                return("%s hours and %0s:%02d minutes"%(hours,minutes,seconds))
447                                        else:
448                                                return("%s hours and %0s:%s minutes"%(hours,minutes,seconds))
449
450                except Exception as e:
451                        self.core.dprint("(time_formated)Error: %s"%e,"[NetfilesBox]")
452
453        #def time_formated
Note: See TracBrowser for help on using the repository browser.