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

Last change on this file since 3863 was 3863, checked in by daduve, 3 years ago

Enter test for debs in deb_list

File size: 12.1 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 DebBox(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("deb_data_box")
34                self.add_deb_button=builder.get_object("add_deb_button")
35                self.package_label=builder.get_object("package_label_deb")
36                self.package_list_box=builder.get_object("deb_list_box")
37                self.package_list=builder.get_object("deb_list_box")
38                self.data_vp=builder.get_object("deb_list_viewport")
39                self.apply_deb_button=builder.get_object("apply_deb_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["deb"]["packages"]:
80                        self.new_package_button("%s"%x)
81                       
82                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
83
84        #def set_info
85       
86       
87        def connect_signals(self):
88               
89               
90                self.add_deb_button.connect("clicked",self.add_deb_button_clicked)
91                self.apply_deb_button.connect("clicked",self.apply_deb_button_clicked)
92                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
93               
94        #def connect_signals
95       
96       
97        def deb_list_init(self):
98               
99                try:
100                        self.new_debs
101                        return True
102                except Exception as e:
103                        #print "inicializando variables de listas"
104                        self.new_debs=[]
105                        self.list_new_debs=[]
106                        return True
107               
108        #def deb_list_init
109       
110       
111        def add_deb_button_clicked(self,widget):
112               
113               
114               
115                fcb=Dialog.FileDialog(self.core.lri.main_window,"Please choose a file")
116                response=fcb.run()
117               
118                self.deb_list_init()
119               
120                if response==Gtk.ResponseType.OK:
121                        deb_url=fcb.get_filename()
122                        fcb.destroy()
123                        pkg=os.path.basename(deb_url)
124                        extension=os.path.splitext(pkg)[1]
125                        if extension not in [".deb",".DEB"]:
126                                self.error_extension_dialog(pkg)
127                                fcb.destroy()
128                                return False
129                        #Compruebo si es un paquete nuevo de la lista
130                        if pkg not in self.core.current_var["deb"]["packages"]:
131                                self.core.current_var["deb"]["packages"].append(pkg)
132                                self.new_package_button(pkg)
133                                #print "paquete nuevo en lista, esta subido??"
134                                #Compruebo que es accesible via apache, sino lo apunto para copiar cuando aplique.
135                                exist_in_server=self.core.n4d.app_deb_exist(pkg, self.core.current_var["deb"]["url"])
136                                if not exist_in_server[0]:
137                                        #print "No existe este deb lo debo de subir"
138                                        self.new_debs.append([pkg,deb_url])
139                                        self.list_new_debs.append(pkg)
140                                       
141
142                        # ###### #
143                       
144                        return True
145                else:
146                        fcb.destroy()
147                        return False
148                       
149        #def add-deb_button_clicked
150       
151       
152        def hide_window(self,widget,event):
153               
154                widget.hide()
155                return True
156               
157        #def new_package_window
158
159
160        def check_changes(self,widget=True,event=True,manage_dialog=False):
161               
162               
163                if not manage_dialog:
164                        if self.core.current_var==None:
165                                return False
166                        return self.core.current_var != self.core.var
167               
168                               
169                if self.core.current_var!=None and self.core.current_var != self.core.var:
170                        if not self.changes_detected_dialog(False):
171                                return True
172               
173                sys.exit(0)
174                       
175
176        #def check_changes
177               
178       
179
180       
181        def new_package_button(self,pkg_name):
182               
183                hbox=Gtk.HBox()
184                label=Gtk.Label(pkg_name)
185                b=Gtk.Button()
186                i=Gtk.Image.new_from_file("trash.svg")
187                b.add(i)
188                b.set_halign(Gtk.Align.CENTER)
189                b.set_valign(Gtk.Align.CENTER)
190                b.set_name("DELETE_ITEM_BUTTON")
191                b.connect("clicked",self.delete_package_clicked,hbox)
192                hbox.pack_start(label,False,False,0)
193                hbox.pack_end(b,False,False,10)
194                hbox.show_all()
195                label.set_margin_right(20)
196                label.set_margin_left(20)
197                label.set_margin_top(20)
198                label.set_margin_bottom(20)
199                hbox.set_name("PKG_BOX")
200                self.package_list_box.pack_start(hbox,False,False,5)
201                self.package_list_box.queue_draw()
202                hbox.queue_draw()
203               
204        #def new_package_button
205       
206       
207       
208        # #### PACKAGE CHANGES ################### #
209       
210       
211        def delete_package_clicked(self,button,hbox):
212               
213                pkg=hbox.get_children()[0].get_text()
214               
215                if self.delete_package_dialog(pkg):
216               
217                        self.package_list_box.remove(hbox)
218                       
219                        for p in range(len(self.core.current_var["deb"]["packages"])-1,-1,-1):
220                                if self.core.current_var["deb"]["packages"][p]==pkg:
221                                        self.core.current_var["deb"]["packages"].pop(p)
222                        #Compruebo que es accesible via apache, y pregunto si lo borro tambien del servidor
223                        exist_in_server=self.core.n4d.app_deb_exist(pkg, self.core.current_var["deb"]["url"])
224                        if exist_in_server[0]:
225                                if self.remove_file_dialog(pkg):
226                                        self.thread=threading.Thread(target=self.delete_package_thread(pkg))
227                                        self.thread.daemon=True
228                                        self.thread.start()
229                                       
230                                        main_window=self.core.lri.main_window
231                                        dialog=Dialog.ApplyingChangesDialog(main_window,title="Lliurex Remote Installer",msg="Deleting files.......")
232                                        dialog.show()
233                                        GLib.timeout_add(500,self.check_delete_thread,dialog)
234                       
235                        # ######### #
236       
237       
238        #def delete_package_clicked
239       
240        def delete_package_thread(self,pkg):
241       
242                try:
243                        self.core.dprint("Deleting file...")
244       
245                        url_dest="/var/www/llx-remote/"+str(pkg)
246                        self.deleted=self.core.n4d.remove_file(url_dest)
247                        if not self.deleted[0]:
248                                comment="The file %s cannot be deleted"%pkg
249                                self.remove_file_info_dialog(comment)
250                               
251                        self.thread_ret={"status":True,"msg":"SE HA ROTO"}
252                       
253                except Exception as e:
254                        print e
255                        return False
256                       
257        #def delete_package_thread
258       
259        def check_delete_thread(self,dialog):
260               
261                if self.thread.is_alive():
262                        return True
263               
264                dialog.destroy()
265               
266                for c in self.package_list_box.get_children():
267                        self.package_list_box.remove(c)
268                       
269                for x in self.core.current_var["deb"]["packages"]:
270                        self.new_package_button("%s"%x)
271                if self.deleted[0]:
272                        self.core.var=copy.deepcopy(self.core.current_var)
273                        self.core.n4d.set_variable(self.core.var)
274                       
275                       
276               
277        #check_delete_thread
278       
279       
280        def apply_deb_button_clicked(self,widget):
281               
282                self.deb_list_init()
283                self.thread=threading.Thread(target=self.apply_changes_thread)
284                self.thread.daemon=True
285                self.thread.start()
286               
287                #Se crea el mensaje de Apply segun si sse suben ficheros o no.
288                self.msg1="Applying changes......."
289                if  self.new_debs not in [None,"",[]]:
290                        self.msg1="Updating files and applying changes......."
291                else:
292                        self.msg1="Applying changes......."
293               
294                main_window=self.core.lri.main_window
295                dialog=Dialog.ApplyingChangesDialog(main_window,title="Lliurex Remote Installer",msg=self.msg1)
296                dialog.show()
297                GLib.timeout_add(500,self.check_apply_thread,dialog)
298               
299        #def apply_changes_button_clicked
300       
301               
302       
303        def apply_changes_thread(self):
304               
305                try:
306                       
307                        print "Testing....."
308                        if  self.new_debs not in [None,"",[]]:
309                                self.core.dprint("Sending files to server...")
310                                for deb in self.new_debs:
311                                        pkg=deb[0]
312                                        deb_url=deb[1]
313                                        if self.core.current_var["deb"]["url"] in [None,"",[]]:
314                                                self.core.current_var["deb"]["url"]="http://server/llx-remote/"
315                                        url_dest=self.core.current_var["deb"]["url"].split('http://server/')[1]
316                                        url_dest="/var/www/"+str(url_dest)
317                                        self.core.n4d.send_file("server",deb_url,url_dest)
318                                #Inicializo de nuevo la lista de paquetes, ya esta subido todo lo que se queria.
319                                self.new_debs=[]
320                                self.list_new_debs=[]
321                        self.core.dprint("Applying changes...")
322                        self.core.var=copy.deepcopy(self.core.current_var)
323                        self.test_deb=self.core.n4d.test_deb_list(self.core.var)
324                        self.thread_ret={"status":True,"msg":"SE HA ROTO"}
325
326                       
327                except Exception as e:
328                        print e
329                        return False
330               
331               
332        #def apply_changes_thread
333       
334        def check_apply_thread(self,dialog):
335               
336               
337                if self.thread.is_alive():
338                        return True
339               
340                dialog.destroy()
341                #Se pudo testear la lista de debs, es un  [True,dict,list_debs_ok,list_debs_fail]
342                if self.test_deb[0]:
343                        if self.test_deb[3] not in [None,"","[]",[]]:
344                                if self.delete_test_deb_dialog(self.test_deb[3]):
345                                        self.core.n4d.set_variable(self.test_deb[1])
346                                        self.core.var=copy.deepcopy(self.test_deb[1])
347                                        self.core.current_var=copy.deepcopy(self.test_deb[1])
348                                else:
349                                        self.core.var["deb"]["url"]="http://server/llx-remote/"
350                                        self.core.n4d.set_variable(self.core.var)
351                        else:
352                                        self.core.var["deb"]["url"]="http://server/llx-remote/"
353                                        self.core.n4d.set_variable(self.core.var)
354                       
355                else:
356                        self.core.dprint("Error en el test, no se guarda la variable")
357               
358                self.set_info(self.core.var)
359                self.core.dprint("Done")
360               
361                if not self.thread_ret["status"]:
362                        mw=self.core.lri.main_window
363                        d=Dialog.ErrorDialog(mw,"asdasd",self.thread_ret["msg"])
364                        d.run()
365                        d.destroy()
366               
367
368                return False
369               
370        #def check_thread
371       
372       
373        # ######################################################### #
374       
375       
376        # #### DIALOGS ################### #
377       
378        def error_extension_dialog(self,pkg_name):
379               
380                main_window=self.core.lri.main_window
381                dialog=Dialog.ErrorDialog(main_window,"Error in Extension","This %s package has not the extension required.\nPlease only DEB packages in this list."%pkg_name)
382                response=dialog.run()
383                dialog.destroy()
384               
385               
386                return True
387               
388        #def delete_package_dialog
389       
390       
391        def delete_package_dialog(self,pkg_name):
392               
393                main_window=self.core.lri.main_window
394                dialog=Dialog.QuestionDialog(main_window,"Delete package","Do you want to delete '%s'?"%pkg_name)
395                response=dialog.run()
396                dialog.destroy()
397               
398                if response== Gtk.ResponseType.OK:
399                        return True
400               
401                return False
402               
403        #def delete_package_dialog
404       
405        def remove_file_dialog(self,pkg_name):
406               
407                main_window=self.core.lri.main_window
408                dialog=Dialog.QuestionDialog(main_window,"Delete package","IMPORTANT\nDo you want to delete this DEB from your server?\n'%s'"%pkg_name)
409                response=dialog.run()
410                dialog.destroy()
411               
412                if response== Gtk.ResponseType.OK:
413                        return True
414               
415                return False
416               
417        #def remove_file_dialog
418       
419        def remove_file_info_dialog(self,comment):
420               
421                main_window=self.core.lri.main_window
422                dialog=Dialog.ErrorDialog(main_window,"Delete package",comment)
423                response=dialog.run()
424                dialog.destroy()
425                               
426                return True
427               
428        #def remove_file_info_dialog
429       
430        def send_file_dialog(self,pkg_name):
431               
432                main_window=self.core.lri.main_window
433                dialog=Dialog.QuestionDialog(main_window,"DEB not in Server","Do you want to send to the server this DEB '%s' ?"%pkg_name)
434                response=dialog.run()
435                dialog.destroy()
436               
437                if response== Gtk.ResponseType.OK:
438                        return True
439               
440                return False
441               
442        #def delete_package_dialog
443       
444        def send_list_dialog(self,pkg_name_orig):
445                main_window=self.core.lri.main_window
446                pkg_name='\n'.join(pkg_name_orig)
447                dialog=Dialog.QuestionDialog(main_window,"DEB not in Server","Do you want to send to the server this DEB list?\n%s\n"%pkg_name)
448                response=dialog.run()
449                dialog.destroy()
450               
451                if response== Gtk.ResponseType.OK:
452                        return True
453               
454                return False
455               
456        #def send_list_dialog
457       
458       
459        def changes_detected_dialog(self,force_exit=False):
460               
461                main_window=self.core.lri.main_window
462               
463                dialog=Dialog.QuestionDialog(main_window,"Changes detected","There are unsaved changes. Do you want to discard them?")
464                response=dialog.run()
465                dialog.destroy()
466               
467                if response== Gtk.ResponseType.OK:
468                        if force_exit:
469                                sys.exit(0)
470                               
471                        return True
472               
473                return False
474               
475        #def changes_detected_dialog
476       
477       
478       
479        def delete_test_deb_dialog(self,pkg_name_orig):
480               
481                main_window=self.core.lri.main_window
482                pkg_name='\n'.join(pkg_name_orig)
483                dialog=Dialog.QuestionDialog(main_window,"Delete deb list","This DEB list is unavaiable from your server:\n%s\nDo you want delete it?"%pkg_name)
484                response=dialog.run()
485                dialog.destroy()
486               
487                if response== Gtk.ResponseType.OK:
488                        return True
489               
490                return False
491               
492        #def delete_package_dialog
493       
494       
495#class debbox
Note: See TracBrowser for help on using the repository browser.