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

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

WIP in gui. Checking meta

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