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

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

WIP in gui. Update gui size and summary info update

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