source: lliurex-up/trunk/fuentes/lliurex-up-gui/lliurex-up.py @ 2913

Last change on this file since 2913 was 2913, checked in by jrpelegrina, 4 years ago

WIP in new gui

File size: 26.9 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3gi.require_version('PangoCairo', '1.0')
4gi.require_version('Vte', '2.91')
5
6import cairo
7import os
8import threading
9import ConfigParser
10import platform
11import subprocess
12import sys
13import time
14import commands
15from gi.repository import Gtk, Gdk, GdkPixbuf, GObject, GLib, PangoCairo, Pango, Vte
16
17import LliurexUpConnect
18
19
20import signal
21signal.signal(signal.SIGINT, signal.SIG_DFL)
22
23import gettext
24gettext.textdomain('lliurex-up')
25_ = gettext.gettext
26
27
28
29RSRC_DIR="rsrc/"
30CACHED_ICON="rsrc/cached.png"
31DONE_ICON="rsrc/done.png"
32ERROR_ICON="rsrc/error.png"
33
34class Package:
35
36        def __init__(self,name,version,size,desktop_file,changelog_file):
37
38                self.name=name
39                self.version=version
40                self.size=size
41                self.parse_desktop(desktop_file)
42                self.parse_changelog(changelog_file)
43                self.parse_installed_icon(CACHED_ICON)
44
45        #def__init__
46       
47        def parse_desktop(self,desktop_file):
48               
49                try:
50                        config = ConfigParser.ConfigParser()
51                        config.optionxform=str
52                        config.read(desktop_file)
53                       
54                        if config.has_section("Desktop Entry") and config.has_option("Desktop Entry","Icon"):
55                                self.icon=config.get("Desktop Entry","Icon")
56                        else:
57                                self.icon="package"
58                               
59                except Exception as e:
60                       
61                        self.icon="package"
62                       
63        #def parse_desktop
64       
65        def parse_changelog(self,changelog_file):
66               
67                try:
68                       
69                        f=open(changelog_file,"r")
70                        self.changelog=f.readlines()
71                        f.close()
72                                               
73                except Exception as e:
74                       
75                        self.changelog="Changelog not found"
76
77        #def parse_changelog
78       
79        def parse_installed_icon(self, icon_file):
80               
81                        image=Gtk.Image()
82                        image.set_from_file(icon_file)         
83                        self.installed=image.get_pixbuf()
84                       
85        #def parse_installed_icon
86
87class LliurexUp:
88
89        def __init__(self):
90                self.check_root()
91                self.llxup_connect=LliurexUpConnect.LliurexUpConnect()
92                self.start_gui()
93
94                       
95        #def __init__           
96
97       
98        def check_root(self):
99               
100                try:
101                        print "checking root"
102                        f=open("/etc/lliurex-up.token","w")
103                        f.close()
104                        os.remove("/etc/lliurex-up.token")
105                except:
106                        print "No administration privileges"
107                        dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Lliurex UP")
108                        dialog.format_secondary_text("You need administration privileges to run this application.")
109                        dialog.run()
110                        sys.exit(1)
111               
112        #def check_root
113
114        def start_gui(self):
115               
116                builder=Gtk.Builder()
117               
118                glade_path=RSRC_DIR+"lliurex-up.ui"
119                builder.add_from_file(glade_path)
120
121                self.stack = Gtk.Stack()
122                self.stack.set_transition_duration(1000)
123                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
124
125
126                self.window=builder.get_object("main_window")
127                self.main_box=builder.get_object("main_box")
128                self.pbar=builder.get_object("progressbar")
129                self.pbar_label=builder.get_object("progressbar_label")
130               
131
132                self.cancel_button_box=builder.get_object("cancel_button_box")
133                self.cancel_button_eb=builder.get_object("cancel_button_eventbox")
134                self.cancel_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
135                self.cancel_button_eb.connect("button-press-event", self.quit)
136                self.cancel_button_eb.connect("motion-notify-event", self.mouse_over_cancel)
137                self.cancel_button_eb.connect("leave-notify-event", self.mouse_exit_cancel)
138                self.cancel_button_label=builder.get_object("cancel_button_label")
139
140
141                self.gather_box=builder.get_object("gather_box")
142                self.yes_button_box=builder.get_object("yes_button_box")
143                self.yes_button_eb=builder.get_object("yes_button_eventbox")
144                self.yes_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
145                self.yes_button_eb.connect("button-release-event", self.yes_button_clicked)
146                self.yes_button_eb.connect("motion-notify-event", self.mouse_over_yes)
147                self.yes_button_eb.connect("leave-notify-event", self.mouse_exit_yes)
148                self.yes_button_label=builder.get_object("yes_button_label")
149
150                self.no_button_box=builder.get_object("no_button_box")
151                self.no_button_eb=builder.get_object("no_button_eventbox")
152                self.no_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
153                self.no_button_eb.connect("button-release-event", self.no_button_clicked)
154                self.no_button_eb.connect("motion-notify-event", self.mouse_over_no)
155                self.no_button_eb.connect("leave-notify-event",self.mouse_exit_no)
156                self.no_button_label=builder.get_object("no_button_label")
157                self.gather_logo_box=builder.get_object("gather_logo_box")
158                self.gather_label=builder.get_object("gather_label")
159                self.spinner=builder.get_object("spinner")
160
161                self.update_box=builder.get_object("update_box")
162                self.version_available_label=builder.get_object("version_available_label")
163                self.version_update_label=builder.get_object("version_update_label")
164                self.number_packages_label=builder.get_object("number_packages_label")
165                self.size_update_label=builder.get_object("size_update_label")
166                self.view_packages_button_box=builder.get_object("view_packages_button_box")
167                self.view_packages_eb=builder.get_object("view_packages_eventbox")
168                self.view_packages_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
169                self.view_packages_eb.connect("button-release-event", self.view_packages_clicked)
170                self.view_packages_eb.connect("motion-notify-event", self.mouse_over_view_packages)
171                self.view_packages_eb.connect("leave-notify-event", self.mouse_exit_view_packages)
172
173                self.view_packages_label=builder.get_object("view_packages_label")
174
175                self.update_button_box=builder.get_object("update_button_box")
176                self.update_button_eb=builder.get_object("update_button_eventbox")
177                self.update_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
178                self.update_button_eb.connect("button-release-event", self.upgrade_process)
179                self.update_button_eb.connect("motion-notify-event", self.mouse_over_update_button)
180                self.update_button_eb.connect("leave-notify-event", self.mouse_exit_update_button)
181
182                self.update_button_label=builder.get_object("update_button_label")
183                self.terminal_label=builder.get_object("terminal_label")
184                self.viewport=builder.get_object("viewport")
185                self.terminal_scrolled=builder.get_object("terminalScrolledWindow")
186                self.vterminal=Vte.Terminal()
187                font_terminal = Pango.FontDescription("monospace normal 10")
188                self.vterminal.set_font(font_terminal)
189                self.terminal_scrolled.add(self.vterminal)
190               
191
192                self.packages_box=builder.get_object("packages_box")
193                self.return_arrow_box=builder.get_object("return_arrow_box")
194                self.return_arrow_eb=builder.get_object("return_arrow_eventbox")
195                self.return_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
196                self.return_arrow_eb.connect("button-release-event", self.arrow_clicked)
197                self.return_arrow_eb.connect("motion-notify-event",self.mouse_over_return_arrow)
198                self.return_arrow_eb.connect("leave-notify-event",self.mouse_exit_return_arrow)
199                self.packages_label=builder.get_object("packages_label")
200                self.packages_tv=builder.get_object("packages_treeview")
201                self.changelog_texview=builder.get_object("changelog_textview")
202
203                self.packages_store=Gtk.ListStore(str,str,str,GdkPixbuf.Pixbuf)
204                self.packages_tv.set_model(self.packages_store)
205                column=Gtk.TreeViewColumn("")
206                cell=Gtk.CellRendererPixbuf()
207                cell.set_property("stock-size",Gtk.IconSize.DIALOG)
208                column.pack_start(cell,True)
209                column.add_attribute(cell,"icon-name",0)
210                self.packages_tv.append_column(column)
211               
212                column=Gtk.TreeViewColumn("Package")
213                cell=Gtk.CellRendererText()
214                column.pack_start(cell,True)
215                column.add_attribute(cell,"markup",1)
216                column.set_expand(True)
217
218               
219                self.packages_tv.append_column(column)
220               
221                self.packages_tv.connect("button-release-event",self.package_clicked)
222               
223                column=Gtk.TreeViewColumn("Size")
224                cell=Gtk.CellRendererText()
225                cell.set_property("alignment",Pango.Alignment.CENTER)
226                column.pack_start(cell,False)
227                column.add_attribute(cell,"markup",2)
228                self.packages_tv.append_column(column)         
229
230
231                done_icon=Gtk.Image()
232                done_icon.set_from_file(CACHED_ICON)
233                pixbuf=done_icon.get_pixbuf()
234                column=Gtk.TreeViewColumn("Installed")
235                cell=Gtk.CellRendererPixbuf()
236                column.pack_start(cell,True)
237                column.add_attribute(cell,"pixbuf",3)
238                self.packages_tv.append_column(column)
239               
240                self.changelog_textview=builder.get_object("changelog_textview")
241                self.changelog_label=builder.get_object("changelog_label")
242
243
244                self.stack.add_titled(self.gather_box,"gather","Gather")
245                self.stack.add_titled(self.update_box,"update", "Update")
246                self.stack.add_titled(self.packages_box, "packages", "Packages")
247
248                self.main_box.pack_start(self.stack,True,False,5)
249
250                self.window.show_all()
251                self.terminal_scrolled.hide()
252                self.viewport.hide()
253                self.terminal_label.hide()
254                self.cancel_button_box.hide()
255                self.yes_button_box.hide()
256                self.no_button_box.hide()
257
258                self.pbar_label.show()
259                self.pbar.show()
260               
261                self.window.connect("destroy",self.quit)
262               
263                self.set_css_info()
264
265                msg_gather="<span><b>"+_("Checking for new version of lliurex-up")+"</b></span>"
266                self.gather_label.set_markup(msg_gather)
267                self.updated_percentage(0.15)
268                GLib.timeout_add(100,self.pulsate_gatherinfo)
269               
270                self.check_lliurexup_t=threading.Thread(target=self.check_lliurexup_version)
271                self.install_lliurexup_t=threading.Thread(target=self.install_lliurexup)
272                self.check_mirror_t=threading.Thread(target=self.check_mirror)
273                #self.update_mirror_t=threading.Thread(target=self.update_mirror)
274                self.gather_packages_t=threading.Thread(target=self.gather_packages)
275
276                self.check_lliurexup_t.daemon=True
277                self.install_lliurexup_t.daemon=True
278                self.check_mirror_t.daemon=True
279                #self.update_mirror_t.daemon=True
280                self.gather_packages_t.daemon=True
281
282                self.check_lliurexup_t.done=False
283                self.install_lliurexup_t.done=False
284                self.check_mirror_t.done=False
285                #self.update_mirror_t.done=False
286                self.gather_packages_t.done=False
287
288                self.check_lliurexup_t.launched=False
289                self.install_lliurexup_t.launched=False
290                self.check_mirror_t.launched=False
291                #self.update_mirror_t.launched=False
292                self.gather_packages_t.launched=False
293
294
295                self.spinner.start()
296               
297                self.package_list=[]
298
299                GObject.threads_init()
300                Gtk.main()
301
302        #def start_gui
303       
304        def set_css_info(self):
305       
306                css = """
307
308
309                #WHITE_BACKGROUND {
310                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
311               
312                }
313
314                #BUTTON_LABEL{
315                        color:white;
316                        font: Roboto 10;
317                }
318
319                #DISABLED_BUTTON_OVER{
320                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
321                }
322               
323                #DISABLED_BUTTON{
324                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
325                }
326               
327                #CANCEL_BUTTON{
328                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
329                }
330               
331                #CANCEL_BUTTON_OVER{
332                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
333                }
334
335                #BUTTON_COLOR {
336                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
337               
338                }
339               
340                #BUTTON_OVER_COLOR {
341                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
342                       
343               
344                }
345
346                #UPDATE_BUTTON_LABEL{
347                        color:white;
348                        font: Roboto 11;
349                }
350               
351                #UPDATE_BUTTON_COLOR {
352                        background-image:-gtk-gradient (linear, left top, left bottom, from (#43A047),  to (#43A047));;
353               
354                }
355
356                #UPDATE_OVER_COLOR {
357                        background-image:-gtk-gradient (linear, left top, left bottom, from (#53b757),  to (#53b757));;
358               
359                }
360
361                               
362                #GATHER_ICON_COLOR {
363                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
364               
365                }
366               
367               
368                #BLUE_FONT {
369                        color: #3366cc;
370                        font: Roboto 10;
371                       
372                }       
373               
374
375                #CHANGELOG_FONT {
376                        color: #3366cc;
377                        font: Roboto 11;
378                       
379                }
380
381                #LABEL_OPTION{
382               
383                        color: #808080;
384                        font: Roboto 11;
385                }
386               
387                #DISABLED_BUTTON{
388                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
389                }
390                """
391
392                self.style_provider=Gtk.CssProvider()
393                self.style_provider.load_from_data(css)
394                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
395               
396                self.window.set_name("WHITE_BACKGROUND")
397                self.update_box.set_name("WHITE_BACKGROUND")
398                self.gather_box.set_name("WHITE_BACKGROUND")
399                self.packages_box.set_name("WHITE_BACKGROUND")
400                self.gather_label.set_name("CHANGELOG_FONT")
401                self.pbar_label.set_name("CHANGELOG_FONT")
402
403                self.yes_button_box.set_name("BUTTON_COLOR")
404                self.yes_button_label.set_name("BUTTON_LABEL")
405
406                self.no_button_box.set_name("BUTTON_COLOR")
407                self.no_button_label.set_name("BUTTON_LABEL")
408
409                self.view_packages_button_box.set_name("BUTTON_COLOR")
410                self.view_packages_label.set_name("BUTTON_LABEL")
411
412                self.cancel_button_box.set_name("BUTTON_COLOR")
413                self.cancel_button_label.set_name("BUTTON_LABEL")       
414
415                self.version_available_label.set_name("LABEL_OPTION")
416                self.version_update_label.set_name("LABEL_OPTION")     
417                self.number_packages_label.set_name("LABEL_OPTION")
418                self.size_update_label.set_name("LABEL_OPTION")
419                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
420                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
421                self.terminal_label.set_name("LABEL_OPTION")
422
423
424                self.packages_label.set_name("LABEL_OPTION")
425                self.changelog_label.set_name("LABEL_OPTION")
426                self.changelog_texview.set_name("CHANGELOG_FONT")
427                self.return_arrow_box.set_name("BUTTON_COLOR")
428               
429        #def set_css_info       
430
431
432        def pulsate_gatherinfo(self):
433
434                if not self.check_lliurexup_t.launched:
435                        self.check_lliurexup_t.start()
436                        self.check_lliurexup_t.launched=True
437
438                if  self.check_lliurexup_t.done:
439                        if  self.is_lliurexup_update and not self.install_lliurexup_t.is_alive():
440                                if not self.install_lliurexup_t.launched:
441                                        print "Updating lliurex-up"
442                                        msg_gather="<span><b>"+_("Updating lliurex-up")+"</b></span>"
443                                        self.gather_label.set_markup(msg_gather)
444                                        self.install_lliurexup_t.start()
445                                        self.install_lliurexup_t.launched=True
446                                else:
447                                        if self.install_lliurexup_t.done:
448                                                print "Reboot lliurex-up"
449                                                msg_gather="<span><b>"+_("Lliurex-up is now updated and will be reboot")+"</b></span>"
450                                                self.gather_label.set_markup(msg_gather)
451                                                self.updated_percentage(1.0)
452                                                       
453                        else:
454                                if  not self.is_lliurexup_update:
455
456                                        # if not self.check_mirror_t.is_alive():
457                                       
458                                        #       if not self.check_mirror_t.launched:
459                                        #               print "Checking if mirror exist"
460                                        #               msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
461                                        #               self.gather_label.set_markup(msg_gather)
462                                        #               self.check_mirror_t.start()
463                                        #               self.check_mirror_t.launched=True
464                                        #       else:
465                                        #               if self.check_mirrot_t.done:
466                                        #                       print "Mirror check"
467
468                                        if not self.gather_packages_t.is_alive():
469                                                if not self.gather_packages_t.launched:
470                                                        print "Gather packages"
471                                                        msg_gather="<span><b>"+_("Checking for new updates")+"</b></span>"
472                                                        self.gather_label.set_markup(msg_gather)
473                                                        self.gather_packages_t.start()
474                                                        self.gather_packages_t.launched=True
475
476
477                               
478                if  self.check_lliurexup_t.is_alive():
479                        print "checking lliurex up"
480                        return True
481
482                if self.install_lliurexup_t.launched: 
483                        if self.install_lliurexup_t.is_alive():
484                                print "Installing lliurex up"
485                                return True     
486                       
487                       
488                # if self.check_mirror_t.launched:
489                #       if self.check_mirror_t.is_alive():
490                #               print "Checking mirror"
491                #               return True
492                               
493                if self.gather_packages_t.launched:
494                        if self.gather_packages_t.is_alive():
495                                #print "Recopilando info"
496                                return True
497                       
498                                       
499                print "TERMINANDO"     
500                self.pbar.hide()
501                self.pbar_label.hide()
502                self.spinner.stop()
503                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
504                self.stack.set_visible_child_name("update")     
505                self.cancel_button_box.show()
506
507                return False           
508                       
509
510        def reboot(self):
511                msg_gather="<span><b>"+_("Lliurex-up is now updated and will be reboot")+"</b></span>"
512                self.gather_label.set_markup(msg_gather)
513                self.updated_percentage(1.0)
514                os.execl(sys.executable, sys.executable, *sys.argv)     
515
516
517        def check_lliurexup_version(self):
518
519                print "Checking lliurex-up version"
520               
521                self.is_lliurexup_update=self.llxup_connect.isLliurexUpIsUpdated() #Call to the function to get the version of lliurex-up
522                print "##########"
523                print self.check_lliurexup_t.done
524                self.check_lliurexup_t.done=True
525                print "//////////////"
526                print self.check_lliurexup_t.done
527               
528       
529        #def check_lliurexup_version
530        def pulsate_checklliurexup(self):
531
532                if not self.t.is_alive():
533                        if not self.is_lliurexup_update:
534                                print self.is_lliurexup_update
535                                msg_gather="<span><b>"+_("Updating lliurex-up")+"</b></span>"
536                                self.gather_label.set_markup(msg_gather)
537                                self.updated_percentage(0.5)
538                                GLib.timeout_add(100,self.pulsate_update_lliurexup)
539                                self.t=threading.Thread(target=self.install_lliurexup)
540                                self.t.daemon=True
541                                self.t.start()
542
543                        else:
544                                self.response=-1
545                                msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
546                                self.gather_label.set_markup(msg_gather)
547                                self.updated_percentage(0.5)
548                                GLib.timeout_add(100,self.pulsate_check_mirror)
549                                self.t=threading.Thread(target=self.check_mirror)
550                                self.t.daemon=True
551                                self.t.start()
552
553               
554                return self.t.is_alive()
555
556
557
558        def install_lliurexup(self):
559
560                # print "Updating lliurex-up"
561                # msg_gather="<span><b>"+_("Updating lliurex-up")+"</b></span>"
562                # self.gather_label.set_markup(msg_gather)
563                # self.updated_percentage(0.5)
564                # time.sleep(1)
565                print "Updating Lliurex-up"
566                self.install=self.llxup_connect.installLliurexUp()
567                self.install_lliurexup_t.done=True
568
569                # state=self.llxup_connect.check_installing()
570                # # Bucle para averigurar si ya se ha instalado o no lliurex up
571                # while state:
572                #       state=self.llxup_connect.check_installing()
573                #       self.per=self.per+0.05
574                #       self.updated_percentage(self.per)
575
576                # print "Finish"       
577
578                # return True   
579
580        def check_mirror(self):
581
582                #~ print "Check mirror"
583
584                #~ self.response=-1
585                #~ msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
586                #~ self.gather_label.set_markup(msg_gather)
587                #~ self.updated_percentage(0.5)
588               
589                self.is_mirror_update=self.llxup_connect.check_mirror()
590                self.check_mirror_t.done=True
591                #Call to the function to check mirror
592                #~ time.sleep(1)
593                #~ if not exist_mirror:
594                        #~ self.yes_button_box.show()
595                        #~ self.no_button_box.show()
596                        #~ msg_gather="<span><b>"+_("Do you want to create or update your mirror?")+"</b></span>"
597                        #~ self.gather_label.set_markup(msg_gather)
598               
599                        #~ while self.response==-1:
600                                #~ pass
601
602                        #~ self.yes_button_box.hide()
603                        #~ self.no_button_box.hide()   
604
605                        #~ if self.response==0:
606                                #~ self.updated_percentage(1.0)
607                                #~ time.sleep(1)
608                                #~ return True
609
610                        #~ elif self.response==1:
611                                #~ msg_gather="<span><b>"+_("Updating mirror")+"</b></span>"
612                                #~ self.gather_label.set_markup(msg_gather)
613                                #~ self.updated_percentage(0.75)
614                                #~ is_mirror_updated=True # Call to the function to update mirror
615                                #~ time.sleep(1)
616
617                                #~ while is_mirror_updated==False:
618                                        #~ pass
619                                       
620                #~ self.updated_percentage(1.0)                 
621                 
622                #~ return True
623
624        #def check_mirror
625
626        def pulsage_check_mirror(self):
627
628                if not self.t.is_alive():
629                        if not self.is_mirror_update:
630                                self.yes_button_box.show()
631                                self.no_button_box.show()
632                                msg_gather="<span><b>"+_("Do you want to create or update your mirror?")+"</b></span>"
633                                self.gather_label.set_markup(msg_gather) 
634
635                                while self.response==-1:
636                                        pass
637
638                                self.yes_button_box.hide()
639                                self.no_button_box.hide()       
640
641                                if self.response==0:
642                                        self.updated_percentage(1.0)
643                                        time.sleep(1)
644                                        return True
645
646                                elif self.response==1:
647                                        msg_gather="<span><b>"+_("Updating mirror")+"</b></span>"
648                                        self.gather_label.set_markup(msg_gather)
649                                        self.updated_percentage(0.75)
650                                        is_mirror_updated=True # Call to the function to update mirror
651                                        time.sleep(1)
652
653       
654        def gather_packages(self):
655                print "ADIOS"
656                self.gather=self.llxup_connect.getPackagesToUpdate()
657                self.gather_packages_t.done=True
658                # self.total_progress=0.0
659                # self.pbar_rang=1.0
660                # self.percentage=0.0
661                # self.ending_process=0.0
662                #self.updated_percentage(0.0)
663#               self.llxconnect=LliurexUpConnect.LliurexUpConnect()
664
665                #check_lliurexup=self.check_lliurexup_version()
666                #check_mirror=self.check_mirror()
667               
668        #       while  (not check_lliurexup) & (not check_mirror):             
669        #               pass
670
671                #msg_gather="<span><b>"+_("Checking for new updates")+"</b></span>"
672                # self.gather_label.set_markup(msg_gather)
673               
674                # try:
675                #       print ("Checking info")
676                #       self.updated_percentage(0.5)
677                #       p1=subprocess.Popen(["llxcfg-upgrade-version-scripts","details"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
678                #       output=p1.communicate()[0]
679                #       f=open("/tmp/.lliurex_up_log","w")
680                #       if output!=None:
681                #               f.write(output)
682                #       f.close()
683                       
684                # except:
685                #       pass
686
687        #def gather_info
688
689
690        def pulsate_gathering_info(self):
691
692                       
693                if not self.t.is_alive():
694                       
695                        self.parse_simulate_output("/tmp/.lliurex_up_log")
696                        self.populate_packages_tv()     
697                        self.get_update_info()
698                        self.pbar.hide()
699                        self.pbar_label.hide()
700                        self.spinner.stop()
701                        if len(self.package_list)==0:
702                                msg_gather="<span><b>"+_("Your system is update")+"</b></span>"
703                                self.gather_label.set_markup(msg_gather)
704
705                        else:
706                               
707                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
708                                self.stack.set_visible_child_name("update")     
709                       
710                        self.cancel_button_box.show()
711
712                return self.t.is_alive()       
713       
714        #def pulsate_gathering         
715       
716        def get_update_info(self):
717
718                self.version_available="16.160916"
719                self.version_update="16.160915"
720                self.number_pkg="15"
721                self.size_update="100 Mb"
722               
723                msg_version_available=_("Version available: ")+"<span foreground='#3366cc'><b>"+self.version_available+"</b></span>"
724                msg_version_update=_("Version to update: ")+"<span foreground='#3366cc'><b>"+self.version_update+"</b></span>"
725
726                msg_number=_("Number packages: ")+"<span foreground='#3366cc'><b>"+self.number_pkg+"</b></span>"
727                msg_size=_("Size of update: ")+"<span foreground='#3366cc'><b>"+self.size_update+"</b></span>"
728               
729                self.version_available_label.set_markup(msg_version_available)
730                self.version_update_label.set_markup(msg_version_update)
731                self.number_packages_label.set_markup(msg_number)
732                self.size_update_label.set_markup(msg_size)
733               
734        #def get_update_info   
735               
736        def updated_percentage(self,completed):
737               
738                #self.process_block=(self.pbar_rang/self.total_process)
739                #self.percentage=self.process_block*completed
740               
741                # if self.percentage==self.process_block:
742                #       self.ending_process=self.ending_process+1
743                #       self.total_progress=self.process_block*self.ending_process
744                # else:
745                #       self.total_progress=self.total_progress+self.percentage
746
747                               
748                self.pbar.set_fraction(completed)
749                self.per=completed
750               
751                value=completed*100
752                value=format(value,'.2f')
753               
754                msg_percentage="<span><b>"+value+"%"+"</b></span>"
755                self.pbar_label.set_markup(msg_percentage)
756               
757               
758        #def updated_percentage
759               
760        def populate_packages_tv(self):
761               
762                for package in self.package_list:
763                        print package
764                        self.packages_store.append((package.icon,"<span font='Roboto'><b>"+package.name+"</b></span>\n"+"<span font='Roboto' size='small'>"+package.version+"</span>","<span font='Roboto' size='large'><b>"+package.size+"</b></span>",package.installed))
765                       
766                       
767                print len(self.packages_store) 
768               
769        #def populate_packages_tv
770       
771        def parse_simulate_output(self,test_file=None):
772               
773                if test_file!=None:
774                        f=open(test_file,"r")
775                       
776                        for line in f:
777                                if line.find("#")==0:
778                                        pass
779                                else:
780                                        tmp=line.split(";")
781                                        if len(tmp)>4:
782                                                package=Package(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4])
783                                                self.package_list.append(package)
784
785                       
786                else:
787                       
788                        pass   
789
790        #def parse_simulate_output
791       
792        def package_clicked(self,x,y):
793               
794                selection=self.packages_tv.get_selection()
795                model,iter=selection.get_selected()
796                name=self.packages_store.get_value(iter,1)
797                name=name[name.find("<b>")+3:name.find("</b>")]
798                               
799                for package in self.package_list:
800                       
801                        if package.name==name:
802                                self.changelog_textview.get_buffer().set_text("".join(package.changelog))
803                               
804                                break
805       
806        #def package_clicked                   
807
808        def execute_scripts(self):
809               
810                self.vterminal.spawn_sync(
811                        Vte.PtyFlags.DEFAULT,
812                        os.environ['HOME'],
813                        ["/usr/sbin/dpkg-reconfigure", "xdm"],
814                        [],
815                        GLib.SpawnFlags.DO_NOT_REAP_CHILD,
816                        None,
817                        None,
818                )
819
820                self.update_installed_icon("epoptes-client")
821       
822        #def execute           
823                               
824        def upgrade_process(self,widget, event=None):
825       
826                self.total_process=1.0
827                self.total_progress=0.0
828                self.pbar_rang=1.0
829                self.percentage=0.0
830                self.ending_process=0.0
831                self.updated_percentage(0.0)
832
833                self.t=threading.Thread(target=self.execute_scripts,args=())
834                self.t.daemon=True
835                self.t.start()
836                GLib.timeout_add(100,self.pulsate_pbar)
837                self.pbar.show()
838                self.pbar_label.show()
839                self.viewport.show()
840                self.terminal_scrolled.show()
841                self.terminal_label.show()
842                msg_terminal=_("Update process details")
843                self.terminal_label.set_markup(msg_terminal)
844               
845       
846        #def install_packages
847
848        def pulsate_pbar(self):
849
850                if not self.t.is_alive():
851                        self.updated_percentage(0.5)
852                else:
853                        self.pbar.hide()
854                       
855        #def pulsate_pbar
856                       
857        def view_packages_clicked(self,widget,event):
858
859                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
860                self.stack.set_visible_child_name("packages")
861               
862        #def view_packages_clicked     
863       
864
865        def no_button_clicked(self,widget,event):
866               
867                self.response=0 
868               
869        def yes_button_clicked(self,widget,event):
870       
871                self.response=1
872               
873        #def no_button_clicked 
874
875        def arrow_clicked(self,widget,event):
876       
877                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
878                self.stack.set_visible_child_name("update")     
879               
880        #def arrow_clicked
881
882        def update_installed_icon(self,pkg_name):
883       
884                image=Gtk.Image()
885                image.set_from_file(DONE_ICON)         
886                icon=image.get_pixbuf()
887
888                for item in self.packages_store:
889                        name=item[1].split(">")[2]
890                        name=name.split("<")[0]
891                        if name==pkg_name:
892                                item[3]=icon
893               
894                       
895        #def update_installed_icon     
896
897        def mouse_over_yes(self,widget,event):
898                self.yes_button_box.set_name("BUTTON_OVER_COLOR")
899
900        def mouse_exit_yes(self,widget,event):
901                self.yes_button_box.set_name("BUTTON_COLOR")
902
903        def mouse_over_no(self,widget,event):
904                self.no_button_box.set_name("BUTTON_OVER_COLOR")
905
906        def mouse_exit_no(self,widget,event):
907                self.no_button_box.set_name("BUTTON_COLOR")
908                       
909        def mouse_over_view_packages(self,widget,event):
910                self.view_packages_button_box.set_name("BUTTON_OVER_COLOR")     
911
912        def mouse_exit_view_packages(self,widget,event):
913                self.view_packages_button_box.set_name("BUTTON_COLOR")
914
915                       
916        def mouse_over_update_button(self,widget,event):
917                self.update_button_box.set_name("UPDATE_OVER_COLOR")   
918
919        def mouse_exit_update_button(self,widget,event):
920                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
921
922
923        def mouse_over_cancel(self,widget,event):
924                self.cancel_button_box.set_name("BUTTON_OVER_COLOR")   
925
926        def mouse_exit_cancel(self,widget,event):
927                self.cancel_button_box.set_name("BUTTON_COLOR") 
928
929               
930        def mouse_over_return_arrow(self,widget,event):
931                self.return_arrow_box.set_name("BUTTON_OVER_COLOR")     
932
933        def mouse_exit_return_arrow(self,widget,event):
934                self.return_arrow_box.set_name("BUTTON_COLOR")         
935
936
937
938        def quit(self,widget,event=None):
939               
940                Gtk.main_quit() 
941
942#class LliurexMirror
943
944at=LliurexUp()         
Note: See TracBrowser for help on using the repository browser.