source: lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/ExecBox.py @ 3853

Last change on this file since 3853 was 3853, checked in by daduve, 2 years ago

Exit aplly changes, new current.core.var

File size: 12.5 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
9import Dialog
10import time
11import threading
12import sys
13import os
14
15_=gettext.gettext
16
17
18RSRC="./"
19
20
21class ExecBox(Gtk.VBox):
22       
23       
24        def __init__(self):
25               
26                Gtk.VBox.__init__(self)
27               
28                self.core=Core.Core.get_core()
29               
30                builder=Gtk.Builder()
31                ui_path=RSRC + "lliurex-remote-installer.ui"
32                builder.add_from_file(ui_path)
33                self.main_box=builder.get_object("exec_data_box")
34                self.add_exec_button=builder.get_object("add_exec_button")
35                self.package_label=builder.get_object("package_label_exec")
36                self.package_list_box=builder.get_object("exec_list_box")
37                self.package_list=builder.get_object("exec_list_box")
38                self.data_vp=builder.get_object("exec_list_viewport")
39                self.apply_exec_button=builder.get_object("apply_exec_button")
40               
41               
42
43                self.add(self.main_box)
44               
45                self.connect_signals()
46                self.set_css_info()
47               
48                self.core.current_var=None
49                self.current_id=None
50               
51                self.thread=threading.Thread()
52                self.thread_ret=None
53               
54               
55               
56        #def __init__
57       
58       
59        def set_css_info(self):
60               
61                self.style_provider=Gtk.CssProvider()
62                f=Gio.File.new_for_path("lliurex-remote-installer.css")
63                self.style_provider.load_from_file(f)
64                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
65                self.package_label.set_name("OPTION_LABEL")
66               
67                       
68        #def set-css_info
69       
70       
71        def set_info(self,info):
72               
73                #Empty list
74                for c in self.package_list_box.get_children():
75                        self.package_list_box.remove(c)
76                       
77                self.core.var=info
78                self.core.current_var=copy.deepcopy(self.core.var)
79                for x in self.core.var["sh"]["packages"]:
80                        self.new_package_button("%s"%x)
81                       
82               
83        #def set_info
84       
85       
86        def connect_signals(self):
87               
88               
89                self.add_exec_button.connect("clicked",self.add_exec_button_clicked)
90                self.apply_exec_button.connect("clicked",self.apply_exec_button_clicked)
91               
92               
93        #def connect_signals
94       
95       
96        def exec_list_init(self):
97               
98                try:
99                        self.new_execs
100                        return True
101                except Exception as e:
102                        #print "inicializando variables de listas"
103                        self.new_execs=[]
104                        self.list_new_execs=[]
105                        return True
106               
107        #def exec_list_init
108       
109       
110        def add_exec_button_clicked(self,widget):
111               
112               
113               
114                fcb=Dialog.FileDialog(self.core.lri.main_window,"Please choose a file")
115                response=fcb.run()
116                #Creo las listas de ayuda para anyadir paquetes si no existen antes
117                self.exec_list_init()
118               
119                if response==Gtk.ResponseType.OK:
120                        exec_url=fcb.get_filename()
121                        fcb.destroy()
122                        pkg=os.path.basename(exec_url)
123                        #Compruebo si es un paquete nuevo de la lista
124                        if pkg not in self.core.current_var["sh"]["packages"]:
125                                self.core.current_var["sh"]["packages"].append(pkg)
126                                self.new_package_button(pkg)
127                                #print "paquete nuevo en lista, esta subido??"
128                                #Compruebo que es accesible via apache, sino lo apunto para copiar cuando aplique.
129                                exist_in_server=self.core.n4d.app_deb_exist(pkg, self.core.current_var["sh"]["url"])
130                                if not exist_in_server[0]:
131                                        #print "No existe este exec lo debo de subir"
132                                        self.new_execs.append([pkg,exec_url])
133                                        self.list_new_execs.append(pkg)
134                                       
135
136                        # ###### #
137                        #print self.core.current_var
138                        #print self.core.var
139                        return True
140                else:
141                        fcb.destroy()
142                        return False
143                       
144        #def add-exec_button_clicked
145       
146       
147        def hide_window(self,widget,event):
148               
149                widget.hide()
150                return True
151               
152        #def new_package_window
153
154
155       
156        def check_changes(self,widget=True,event=True,manage_dialog=False):
157               
158               
159                if not manage_dialog:
160                        if self.core.current_var==None:
161                                return False
162                        return self.core.current_var != self.core.var
163               
164                               
165                if self.core.current_var!=None and self.core.current_var != self.core.var:
166                        if not self.changes_detected_dialog(False):
167                                return True
168               
169                sys.exit(0)
170                       
171
172        #def check_changes
173               
174       
175
176       
177        def new_package_button(self,pkg_name):
178               
179                hbox=Gtk.HBox()
180                label=Gtk.Label(pkg_name)
181                b=Gtk.Button()
182                i=Gtk.Image.new_from_file("trash.svg")
183                b.add(i)
184                b.set_halign(Gtk.Align.CENTER)
185                b.set_valign(Gtk.Align.CENTER)
186                b.set_name("DELETE_ITEM_BUTTON")
187                b.connect("clicked",self.delete_package_clicked,hbox)
188                hbox.pack_start(label,False,False,0)
189                hbox.pack_end(b,False,False,10)
190                hbox.show_all()
191                label.set_margin_right(20)
192                label.set_margin_left(20)
193                label.set_margin_top(20)
194                label.set_margin_bottom(20)
195                hbox.set_name("PKG_BOX")
196                self.package_list_box.pack_start(hbox,False,False,5)
197                self.package_list_box.queue_draw()
198                hbox.queue_draw()
199               
200        #def new_package_button
201       
202       
203       
204        # #### PACKAGE CHANGES ################### #
205       
206       
207        def delete_package_clicked(self,button,hbox):
208               
209                pkg=hbox.get_children()[0].get_text()
210               
211                if self.delete_package_dialog(pkg):
212               
213                        self.package_list_box.remove(hbox)
214                       
215                        for p in range(len(self.core.current_var["sh"]["packages"])-1,-1,-1):
216                                if self.core.current_var["sh"]["packages"][p]==pkg:
217                                        self.core.current_var["sh"]["packages"].pop(p)
218                        #Compruebo que es accesible via apache, y pregunto si lo borro tambien del servidor
219                        exist_in_server=self.core.n4d.app_deb_exist(pkg, self.core.current_var["sh"]["url"])
220                        if exist_in_server[0]:
221                                if self.remove_file_dialog(pkg):
222                                        self.thread=threading.Thread(target=self.delete_package_thread(pkg))
223                                        self.thread.daemon=True
224                                        self.thread.start()
225                                       
226                                        main_window=self.core.lri.main_window
227                                        dialog=Dialog.ApplyingChangesDialog(main_window,title="Lliurex Remote Installer",msg="Deleting files.......")
228                                        dialog.show()
229                                        GLib.timeout_add(500,self.check_delete_thread,dialog)
230                       
231                        # ######### #
232       
233       
234        #def delete_package_clicked
235       
236        def delete_package_thread(self,pkg):
237       
238                try:
239                        self.core.dprint("Deleting file...")
240       
241                        url_dest="/var/www/llx-remote/"+str(pkg)
242                        self.deleted=self.core.n4d.remove_file(url_dest)
243                        if not self.deleted[0]:
244                                comment="The file %s cannot be deleted"%pkg
245                                self.remove_file_info_dialog(comment)
246                               
247                        self.thread_ret={"status":True,"msg":"SE HA ROTO"}
248                       
249                except Exception as e:
250                        print e
251                        return False
252                       
253        #def delete_package_thread
254       
255        def check_delete_thread(self,dialog):
256               
257                if self.thread.is_alive():
258                        return True
259               
260                dialog.destroy()
261               
262                for c in self.package_list_box.get_children():
263                        self.package_list_box.remove(c)
264                       
265                for x in self.core.current_var["sh"]["packages"]:
266                        self.new_package_button("%s"%x)
267                if self.deleted[0]:
268                        self.core.var=copy.deepcopy(self.core.current_var)
269                        self.core.n4d.set_variable(self.core.var)
270                       
271                       
272               
273        #check_delete_thread
274       
275       
276        def apply_exec_button_clicked(self,widget):
277               
278                self.exec_list_init()
279                self.thread=threading.Thread(target=self.apply_changes_thread)
280                self.thread.daemon=True
281                self.thread.start()
282               
283                #Se crea el mensaje de Apply segun si sse suben ficheros o no.
284                self.msg1="Applying changes......."
285                if  self.new_execs not in [None,"",[]]:
286                        self.msg1="Updating files and applying changes......."
287                else:
288                        self.msg1="Applying changes......."
289               
290                main_window=self.core.lri.main_window
291                dialog=Dialog.ApplyingChangesDialog(main_window,title="Lliurex Remote Installer",msg=self.msg1)
292                dialog.show()
293                GLib.timeout_add(500,self.check_apply_thread,dialog)
294               
295        #def apply_changes_button_clicked
296       
297               
298       
299        def apply_changes_thread(self):
300               
301                try:
302                       
303                        print "Testing....."
304                        self.not_sended_execs=[]
305
306                        if  self.new_execs not in [None,"",[]]:
307                                self.core.dprint("Sending files to server...")
308                                for sh in self.new_execs:
309                                        pkg=sh[0]
310                                        exec_url=sh[1]
311                                        if self.core.current_var["sh"]["url"] in [None,"",[]]:
312                                                self.core.current_var["sh"]["url"]="http://server/llx-remote/"
313                                        url_dest=self.core.current_var["sh"]["url"].split('http://server/')[1]
314                                        url_dest="/var/www/"+str(url_dest)
315                                        response=self.core.n4d.send_file("server",exec_url,url_dest)
316                                        #Ha fallado la subida del fichero
317                                        if not response:
318                                                self.not_sended_execs.append(pkg)
319                                                self.core.current_var["sh"]["packages"].remove(pkg)
320
321                                #Inicializo de nuevo la lista de paquetes, ya esta subido todo lo que se queria.
322                                self.new_execs=[]
323                                self.list_new_execs=[]
324                       
325                        self.core.dprint("Applying changes...")
326                        self.test_exec=self.core.n4d.test_list(self.core.current_var,'sh')
327                        self.core.var=copy.deepcopy(self.core.current_var)
328                        self.thread_ret={"status":True,"msg":"SE HA ROTO"}
329
330                       
331                except Exception as e:
332                        print e
333                        return False
334               
335               
336        #def apply_changes_thread
337       
338        def check_apply_thread(self,dialog):
339               
340               
341                if self.thread.is_alive():
342                        return True
343               
344                dialog.destroy()
345                #Se pudo testear la lista de execs, es un  [True,dict,list_execs_ok,list_execs_fail]
346                if self.test_exec[0]:
347                        if self.test_exec[3] not in [None,"","[]",[]]:
348                                if self.delete_test_exec_dialog(self.test_exec[3]):
349                                        self.core.n4d.set_variable(self.test_exec[1])
350                                        self.core.var=copy.deepcopy(self.test_exec[1])
351                                        self.core.current_var=copy.deepcopy(self.test_exec[1])
352                                else:
353                                        self.core.var["sh"]["url"]="http://server/llx-remote/"
354                                        self.core.n4d.set_variable(self.core.var)
355                        else:
356                                        self.core.var["sh"]["url"]="http://server/llx-remote/"
357                                        self.core.n4d.set_variable(self.core.var)
358                       
359                else:
360                        self.core.dprint("Error en el test, no se guarda la variable")
361                       
362                self.set_info(self.core.var)
363                self.core.dprint("Done")
364               
365                if not self.thread_ret["status"]:
366                        mw=self.core.lri.main_window
367                        d=Dialog.ErrorDialog(mw,"asdasd",self.thread_ret["msg"])
368                        d.run()
369                        d.destroy()
370               
371                if self.not_sended_execs not in [None,"",[]]:
372                        self.error_send_dialog(self.not_sended_execs)
373               
374                print "1111111"
375                print self.core.current_var
376                print self.core.var
377                if self.core.var!=self.core.current_var:
378                        print "distintos"
379                else:
380                        print "iguales"
381                       
382                return False
383               
384        #def check_thread
385       
386       
387        # ######################################################### #
388       
389       
390        # #### DIALOGS ################### #
391       
392        def error_send_dialog(self,pkg_name):
393               
394                main_window=self.core.lri.main_window
395                dialog=Dialog.ErrorDialog(main_window,"Sending package","This list %s cannot be sended to server\nPlease review your share directory\n/var/www/llx-remote"%pkg_name)
396                response=dialog.run()
397                dialog.destroy()
398               
399               
400                return True
401               
402        #def delete_package_dialog
403       
404       
405       
406        def delete_package_dialog(self,pkg_name):
407               
408                main_window=self.core.lri.main_window
409                dialog=Dialog.QuestionDialog(main_window,"Delete package","Do you want to delete '%s'?"%pkg_name)
410                response=dialog.run()
411                dialog.destroy()
412               
413                if response== Gtk.ResponseType.OK:
414                        return True
415               
416                return False
417               
418        #def delete_package_dialog
419       
420        def remove_file_dialog(self,pkg_name):
421               
422                main_window=self.core.lri.main_window
423                dialog=Dialog.QuestionDialog(main_window,"Delete package","IMPORTANT\nDo you want to delete this Executable from your server?\n'%s'"%pkg_name)
424                response=dialog.run()
425                dialog.destroy()
426               
427                if response== Gtk.ResponseType.OK:
428                        return True
429               
430                return False
431               
432        #def remove_file_dialog
433       
434        def remove_file_info_dialog(self,comment):
435               
436                main_window=self.core.lri.main_window
437                dialog=Dialog.ErrorDialog(main_window,"Delete package",comment)
438                response=dialog.run()
439                dialog.destroy()
440                               
441                return True
442               
443        #def remove_file_info_dialog
444       
445        def send_file_dialog(self,pkg_name):
446               
447                main_window=self.core.lri.main_window
448                dialog=Dialog.QuestionDialog(main_window,"Executable not in Server","Do you want to send to the server this Executable '%s' ?"%pkg_name)
449                response=dialog.run()
450                dialog.destroy()
451               
452                if response== Gtk.ResponseType.OK:
453                        return True
454               
455                return False
456               
457        #def delete_package_dialog
458       
459        def send_list_dialog(self,pkg_name_orig):
460                main_window=self.core.lri.main_window
461                pkg_name='\n'.join(pkg_name_orig)
462                dialog=Dialog.QuestionDialog(main_window,"Executable not in Server","Do you want to send to the server this Executable list?\n%s\n"%pkg_name)
463                response=dialog.run()
464                dialog.destroy()
465               
466                if response== Gtk.ResponseType.OK:
467                        return True
468               
469                return False
470               
471        #def send_list_dialog
472       
473       
474        def changes_detected_dialog(self,force_exit=False):
475               
476                main_window=self.core.lri.main_window
477               
478                dialog=Dialog.QuestionDialog(main_window,"Changes detected","There are unsaved changes. Do you want to discard them?")
479                response=dialog.run()
480                dialog.destroy()
481               
482                if response== Gtk.ResponseType.OK:
483                        if force_exit:
484                                sys.exit(0)
485                               
486                        return True
487               
488                return False
489               
490        #def changes_detected_dialog
491       
492       
493       
494        def delete_test_exec_dialog(self,pkg_name_orig):
495               
496                main_window=self.core.lri.main_window
497                pkg_name='\n'.join(pkg_name_orig)
498                dialog=Dialog.QuestionDialog(main_window,"Delete Executable list","This Executable list is unavaiable from your server:\n%s\nDo you want delete it?"%pkg_name)
499                response=dialog.run()
500                dialog.destroy()
501               
502                if response== Gtk.ResponseType.OK:
503                        return True
504               
505                return False
506               
507        #def delete_package_dialog
508       
509       
510#class execbox
Note: See TracBrowser for help on using the repository browser.