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

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

Wip in gui. Improve mirror conexion and create log

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