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

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

WIP in new gui. Add metapackage control

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