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

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

adding sh files

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