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

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

WIP in new gui. Add checking of meta

File size: 32.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 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
345                GObject.threads_init()
346                Gtk.main()
347
348        #def start_gui
349       
350        def set_css_info(self):
351       
352                css = """
353
354
355                #WHITE_BACKGROUND {
356                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
357               
358                }
359
360                #BUTTON_LABEL{
361                        color:white;
362                        font: Roboto 10;
363                }
364
365                #DISABLED_BUTTON_OVER{
366                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
367                }
368               
369                #DISABLED_BUTTON{
370                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
371                }
372               
373                #CANCEL_BUTTON{
374                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
375                }
376               
377                #CANCEL_BUTTON_OVER{
378                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
379                }
380
381                #BUTTON_COLOR {
382                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
383               
384                }
385               
386                #BUTTON_OVER_COLOR {
387                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
388                       
389               
390                }
391
392                #UPDATE_BUTTON_LABEL{
393                        color:white;
394                        font: Roboto 11;
395                }
396               
397                #UPDATE_BUTTON_COLOR {
398                        background-image:-gtk-gradient (linear, left top, left bottom, from (#43A047),  to (#43A047));;
399               
400                }
401
402                #UPDATE_OVER_COLOR {
403                        background-image:-gtk-gradient (linear, left top, left bottom, from (#53b757),  to (#53b757));;
404               
405                }
406
407
408                #UPDATE_BUTTON_LAUNCHED_COLOR {
409                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
410               
411                }
412
413                #UPDATE_LAUNCHED_OVER_COLOR {
414                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
415               
416                }
417
418                               
419                #GATHER_ICON_COLOR {
420                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
421               
422                }
423               
424               
425                #BLUE_FONT {
426                        color: #3366cc;
427                        font: Roboto 10;
428                       
429                }       
430               
431
432                #CHANGELOG_FONT {
433                        color: #3366cc;
434                        font: Roboto 11;
435                       
436                }
437
438                #LABEL_OPTION{
439               
440                        color: #808080;
441                        font: Roboto 11;
442                }
443
444                #ERROR_FONT {
445                        color: #CC0000;
446                        font: Roboto 11;
447                }
448               
449                #DISABLED_BUTTON{
450                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
451                }
452                """
453
454                self.style_provider=Gtk.CssProvider()
455                self.style_provider.load_from_data(css)
456                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
457               
458                self.window.set_name("WHITE_BACKGROUND")
459                self.update_box.set_name("WHITE_BACKGROUND")
460                self.gather_box.set_name("WHITE_BACKGROUND")
461                self.packages_box.set_name("WHITE_BACKGROUND")
462                self.gather_label.set_name("CHANGELOG_FONT")
463                self.pbar_label.set_name("CHANGELOG_FONT")
464
465                self.yes_button_box.set_name("BUTTON_COLOR")
466                self.yes_button_label.set_name("BUTTON_LABEL")
467
468                self.no_button_box.set_name("BUTTON_COLOR")
469                self.no_button_label.set_name("BUTTON_LABEL")
470
471                self.view_packages_button_box.set_name("BUTTON_COLOR")
472                self.view_packages_label.set_name("BUTTON_LABEL")
473
474                self.cancel_button_box.set_name("BUTTON_COLOR")
475                self.cancel_button_label.set_name("BUTTON_LABEL")       
476
477                self.version_available_label.set_name("LABEL_OPTION")
478                self.version_update_label.set_name("LABEL_OPTION")     
479                self.number_packages_label.set_name("LABEL_OPTION")
480                self.size_update_label.set_name("LABEL_OPTION")
481                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
482                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
483                self.terminal_label.set_name("CHANGELOG_FONT")
484
485
486                self.packages_label.set_name("LABEL_OPTION")
487                #self.changelog_label.set_name("LABEL_OPTION")
488                self.changelog_texview.set_name("CHANGELOG_FONT")
489                self.return_arrow_box.set_name("BUTTON_COLOR")
490               
491        #def set_css_info       
492
493
494        def pulsate_checksystem(self):
495
496                self.pbar.pulse()
497
498                if not self.check_lliurexup_t.launched:
499                        print "[Lliurex-up]: Checking lliurex up version"
500                        self.check_lliurexup_t.start()
501                        self.check_lliurexup_t.launched=True
502
503                if  self.check_lliurexup_t.done:
504                        if not self.is_lliurexup_updated:
505                                if  not self.install_lliurexup_t.is_alive() and not self.install_lliurexup_t.launched:
506                                        print "[Lliurex-up]: Updating lliurex-up"
507                                        msg_gather="<span><b>"+_("Updating lliurex-up")+"</b></span>"
508                                        self.gather_label.set_markup(msg_gather)
509                                        self.install_lliurexup_t.start()
510                                        self.install_lliurexup_t.launched=True
511                                else:
512                                        if self.install_lliurexup_t.done:
513                                                print "[Lliurex-up]: Reboot lliurex-up"
514                                                #msg_gather="<span><b>"+_("Lliurex-up is now updated and will be reboot")+"</b></span>"
515                                                #self.pbar.hide()
516                                                #self.gather_label.set_markup(msg_gather)
517                                                #self.t=threading.Thread(target=self.reboot_lliurexup)
518                                                #self.pbar.hide()
519                                                self.msg_wait="<span><b>"+_("Lliurex-up is now updated and will be reboot in %s seconds...")+"</b></span>"
520                                                GLib.timeout_add(10,self.wait_to_reboot)
521                                                #self.t.daemon=True
522                                                #self.t.start()
523                                                return False
524                        else:
525                               
526                                if not self.check_mirror_t.is_alive() and not self.check_mirror_t.launched:
527                                        print "[Lliurex-up]: Checking if mirror exist"
528                                        msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
529                                        self.gather_label.set_markup(msg_gather)
530                                        self.check_mirror_t.start()
531                                        self.check_mirror_t.launched=True
532
533                               
534                                if      self.check_mirror_t.done:
535                                        is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
536
537                                        if not self.is_mirror_updated:
538                                                if not is_mirror_running:
539                                                        print "[Lliurex-up]: Asking if mirror will be update"
540                                                        self.yes_button_box.show()
541                                                        self.no_button_box.show()
542                                                        self.pbar.hide()
543                                                        self.spinner.stop()
544                                                        msg_gather="<span><b>"+_("Your mirror is not update.Do you want to update it?")+"</b></span>"
545                                                        self.gather_label.set_markup(msg_gather)
546                                                        #GLib.timeout_add(100,self.pulsate_wait_response)
547                                                        return False
548
549                                                else:
550                                                        self.mirror_running_msg()
551                                                        return False
552
553                                        else:   
554                                                if is_mirror_running:
555                                                        self.mirror_running_msg()
556                                                        return False
557                                                else:   
558                                                        print "[Lliurex-up]: Nothing to do with mirror"
559                                                        GLib.timeout_add(100,self.pulsate_get_info)
560                                                        return False
561                                               
562
563                if  self.check_lliurexup_t.is_alive():
564                        return True
565
566                if self.install_lliurexup_t.launched: 
567                        if self.install_lliurexup_t.is_alive():
568                                return True     
569                                       
570                if self.check_mirror_t.launched:
571                        if self.check_mirror_t.is_alive():
572                                return True
573
574               
575        #def pulsate_checksystem       
576
577        def wait_to_reboot(self):
578
579                csecond=int(self.max_seconds+1-self.current_second)
580                self.gather_label.set_markup(self.msg_wait%csecond)
581                self.pbar.set_fraction(self.current_second/self.max_seconds)
582
583                self.current_second+=0.01
584
585                if self.current_second>=self.max_seconds:
586                        os.execl(sys.executable, sys.executable, *sys.argv)     
587                        return False
588                else:
589                        return True
590
591        #def wait_to_reboot
592
593        # def reboot_lliurexup(self):
594
595        #       time.sleep(5)
596        #       os.execl(sys.executable, sys.executable, *sys.argv)     
597
598        # #def reboot_me       
599
600        def check_lliurexup_version(self):
601
602                time.sleep(3)   
603                self.is_lliurexup_updated=self.llxup_connect.isLliurexUpIsUpdated()
604                self.check_lliurexup_t.done=True
605               
606        #def check_lliurexup_version   
607               
608        def install_lliurexup(self):
609
610                self.install=self.llxup_connect.installLliurexUp()
611                self.install_lliurexup_t.done=True
612
613        #def install_lliurexup 
614
615               
616        def check_mirror(self):
617
618                self.is_mirror_updated=self.llxup_connect.lliurexMirrorIsUpdated()
619                self.check_mirror_t.done=True
620       
621        #def check_mirror       
622
623        def no_button_clicked(self,widget,event):
624               
625                #self.response=0
626                self.pbar.show()       
627                GLib.timeout_add(100,self.pulsate_get_info)
628                self.yes_button_box.hide()
629                self.no_button_box.hide()
630                log_msg="Update lliurex-mirror: No"
631                self.llxup_connect.log(log_msg)
632
633        #def def no_button_clicked
634               
635        def yes_button_clicked(self,widget,event):
636       
637                #self.response=1
638                self.pbar.show()
639                self.pbar_label.show()
640                print "[Lliurex-up]: Updating mirror"
641                self.updated_percentage(0)
642                #self.spinner.start()
643                self.yes_button_box.hide()
644                self.no_button_box.hide()
645                #msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
646                #self.gather_label.set_markup(msg_gather)
647                self.execute_lliurexmirror_t.start()
648                self.mirror_running_msg()
649                #GLib.timeout_add(1000,self.pulsate_updating_mirror)
650                log_msg="Update lliurex-mirror: Yes"
651                print log_msg
652                self.llxup_connect.log(log_msg)
653                       
654        #def yes_button_clicked         
655
656        #def check_mirror
657
658        # def pulsate_wait_response(self):
659
660        #       if self.response==0:
661        #               GLib.timeout_add(100,self.pulsate_get_info)
662
663        #               self.yes_button_box.hide()
664        #               self.no_button_box.hide()
665        #               return False
666
667        #       if self.response==1:
668        #               self.pbar_label.show()
669        #               self.updated_percentage(0)
670        #               self.spinner.start()
671        #               self.yes_button_box.hide()
672        #               self.no_button_box.hide()
673        #               msg_gather="<span><b>"+_("Updating mirror")+"</b></span>"
674        #               self.gather_label.set_markup(msg_gather)
675        #               self.execute_lliurexmirror_t.start()
676        #               GLib.timeout_add(1000,self.pulsate_updating_mirror)
677                       
678        #               return False
679               
680        #       self.pbar.pulse()
681        #       return True
682
683        #def yes_button_clicked
684
685        def pulsate_updating_mirror(self):
686
687                self.is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
688
689                if self.is_mirror_running or self.execute_lliurexmirror_t.is_alive():
690                        mirror_percentage=self.llxup_connect.getPercentageLliurexMirror()
691                        self.updated_percentage(mirror_percentage)
692                        return True
693               
694                else:
695                        self.spinner.stop()
696                        self.pbar_label.hide()
697                        GLib.timeout_add(100,self.pulsate_get_info)
698                        return False   
699
700        #def pulsate_updating_mirro             
701
702        def execute_lliurexmirror(self):
703               
704                commands.getoutput('/usr/sbin/lliurex-mirror-gui')
705
706        #def def execute_lliurexmirror 
707
708        def mirror_running_msg(self):
709
710                self.spinner.start()
711                msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
712                self.gather_label.set_markup(msg_gather)
713                GLib.timeout_add(1000,self.pulsate_updating_mirror)
714
715        #def mirror_running_msg
716
717
718        def pulsate_get_info(self):
719
720                self.pbar.pulse()
721 
722                if not self.get_lliurexversionlocal_t.launched:
723                        print "[Lliurex-up]: Get LliurexVersion from local repository "
724                        msg_gather="<span><b>"+_("Get LliurexVersion from local repository")+"</b></span>"
725                        self.gather_label.set_markup(msg_gather)
726                        self.get_lliurexversionlocal_t.start()
727                        self.get_lliurexversionlocal_t.launched=True
728
729
730                if self.get_lliurexversionlocal_t.done:
731                        if not self.get_lliurexversionnet_t.is_alive() and not self.get_lliurexversionnet_t.launched:
732                                print "[Lliurex-up]: Get LliurexVersion from Lliurex net"
733                                msg_gather="<span><b>"+_("Get LliurexVersion from lliurex net")+"</b></span>"
734                                self.gather_label.set_markup(msg_gather)
735                                self.get_lliurexversionnet_t.start()   
736                                self.get_lliurexversionnet_t.launched=True
737
738
739                        if self.get_lliurexversionnet_t.done:
740
741                                if not self.checkFlavourToInstall_t.is_alive() and not self.checkFlavourToInstall_t.launched:
742                                        print "[Lliurex-up]: Checking if installation of flavour is required"
743                                        msg_gather="<span><b>"+_("Checking if installation of flavour is required")+"</b></span>"
744                                        self.gather_label.set_markup(msg_gather)
745                                        self.checkFlavourToInstall_t.start()
746                                        self.checkFlavourToInstall_t.launched=True
747
748
749                                if self.checkFlavourToInstall_t.done:
750
751                                        if not self.gather_packages_t.is_alive() and not self.gather_packages_t.launched:
752                                                print "[Lliurex-up]: Checking for new updates"
753                                                msg_gather="<span><b>"+_("Checking for new updates")+"</b></span>"
754                                                self.gather_label.set_markup(msg_gather)
755                                                self.gather_packages_t.start()
756                                                self.gather_packages_t.launched=True
757
758
759                                        if self.gather_packages_t.done:
760                                                if len(self.packages)==0:
761                                                        msg_gather="<span><b>"+_("Your system is update")+"</b></span>"
762                                                        self.gather_label.set_markup(msg_gather)
763                                                        self.pbar.hide()
764                                                        self.cancel_button_box.show()
765                                                        print "[Lliurex-up]: Sytem update. Nothing to do"
766                                                        return False
767                                                else:
768                                                        print "[Lliurex-up]: System nor update" 
769
770                                                        #self.requires_installing_metapackage()
771                                                        self.parse_packages_updated()
772                                                        self.populate_packages_tv()
773                                                        self.get_update_summary()
774                                                        self.pbar.hide()
775                                                        self.pbar_label.hide()
776                                                        self.spinner.stop()
777                                                        self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
778                                                        self.stack.set_visible_child_name("update")     
779                                                        self.cancel_button_box.show()   
780                                                        return False   
781               
782
783                if self.get_lliurexversionlocal_t.launched:
784                        if self.get_lliurexversionlocal_t.is_alive():
785                                return True     
786
787                if self.get_lliurexversionnet_t.launched:
788                        if self.get_lliurexversionnet_t.is_alive():
789                                return True                             
790
791                if self.checkFlavourToInstall_t.launched:
792                        if self.checkFlavourToInstall_t.is_alive():
793                                return True
794
795                if self.gather_packages_t.launched:
796                        if self.gather_packages_t.is_alive():
797                                return True
798
799        #def pulsate_get_info   
800
801        def get_lliurexversionlocal(self):
802                self.version_update=self.llxup_connect.getLliurexVersionLocal()
803                self.get_lliurexversionlocal_t.done=True
804
805        #def get_lliurexversionlocal
806       
807        def get_lliurexversionnet(self):
808                self.version_available=self.llxup_connect.getLliurexVersionNet()
809                self.get_lliurexversionnet_t.done=True
810
811
812        #def get_lliurexversionlocal   
813       
814        def checkFlavourToInstall(self):
815
816                self.flavourToInstall=self.llxup_connect.requiresInstallFlavour()
817
818                if self.flavourToInstall != None:
819                        print "[Lliurex-up]: Installation of flavour is required"
820
821
822                else:
823                        print "[Lliurex-up]: Installation of flavour is not required"
824
825                self.checkFlavourToInstall_t.done=True 
826
827
828        def gather_packages(self):
829
830                self.packages=self.llxup_connect.getPackagesToUpdate()
831                self.gather_packages_t.done=True
832
833               
834        #def gather_info
835
836
837        def get_update_summary(self):
838
839                #self.version_available=self.llxup_connect.getLliurexVersionNet()
840
841                if 'client' in self.llxup_connect.previousFlavours or self.flavourToInstall=='client':
842                        msg_version_available_info="<span foreground='#3366cc'><b>"+_("Info not available for clients")+"</b></span>"
843
844                else:
845                        if self.version_available==None:
846                                msg_version_available_info="<span foreground='#CC0000'><b>"+_("Info not available. Check conexion to lliurex.net")+"</b></span>"
847
848                        else:
849                                #self.version_available="16.160920"     
850                                msg_version_available_info="<span foreground='#3366cc'><b>"+self.version_available+"</b></span>"
851
852
853                if self.version_update==None:
854                        msg_version_update="<span foreground='#3366cc'><b>"+_("Info not available")+"</b></span>"
855               
856                else:
857                        msg_version_update="<span foreground='#3366cc'><b>"+self.version_update+"</b></span>"
858       
859                self.number_pkg=len(self.packages)
860                self.size_update="100 Mb"
861
862
863                msg_number="<span foreground='#3366cc'><b>"+str(self.number_pkg)+"</b></span>"
864                msg_size="<span foreground='#3366cc'><b>"+self.size_update+"</b></span>"
865               
866                self.version_available_label_info.set_markup(msg_version_available_info)
867                self.version_update_label_info.set_markup(msg_version_update)
868                self.number_packages_label_info.set_markup(msg_number)
869                self.size_update_label_info.set_markup(msg_size)
870               
871        #def get_update_summary
872               
873        def updated_percentage(self,completed):
874
875                percentage=completed/100.0
876
877                self.pbar.set_fraction(percentage)
878               
879                msg_value=format(completed,'.0f')
880               
881                msg_percentage="<span><b>"+msg_value+"%"+"</b></span>"
882                self.pbar_label.set_markup(msg_percentage)
883               
884               
885        #def updated_percentage
886               
887        def populate_packages_tv(self):
888               
889                for package in self.package_list:
890                        #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))
891                        self.packages_store.append(("<span font='Roboto'><b>"+package.name+"</b></span>\n"+"<span font='Roboto' size='small'>"+package.version+"</span>",package.installed))
892                       
893                #print len(self.packages_store)
894               
895        #def populate_packages_tv
896       
897        def parse_packages_updated(self):
898               
899                       
900                for item in self.packages:
901                        tmp=item.split(";")
902                        if len(tmp)>1:
903                                pack=Package(tmp[0],tmp[1])
904                                self.package_list.append(pack)
905
906
907        #def parse_simulate_output
908       
909        def package_clicked(self,x,y):
910               
911                selection=self.packages_tv.get_selection()
912                model,iter=selection.get_selected()
913                name=self.packages_store.get_value(iter,1)
914                name=name[name.find("<b>")+3:name.find("</b>")]
915                               
916                for package in self.package_list:
917                       
918                        if package.name==name:
919                                self.changelog_textview.get_buffer().set_text("".join(package.changelog))
920                               
921                                break
922       
923        #def package_clicked                   
924
925        def update_process(self):
926                 
927                self.command='apt-get dist-upgrade -sV | tee '+ TMP_FILE + ';rm ' + TMP_FILE +'\n'
928                print self.command
929                length=len(self.command)
930                self.vterminal.feed_child(self.command, length)
931
932        #def update_process             
933                               
934        def upgrade_process(self,widget, event=None):
935
936                if not self.update_process_t.launched:
937                        self.update_button_box.set_name("UPDATE_LAUNCHED_BUTTON_COLOR")
938
939                        self.pbar.show()
940                        self.pbar.pulse()
941                        self.viewport.show()
942                        self.terminal_scrolled.show()
943                        self.terminal_label.show()
944                        self.msg_terminal=_("Update process details")
945                        self.terminal_label.set_markup(self.msg_terminal)
946                        GLib.timeout_add(100,self.waiting_update)
947                        self.update_process_t.start()
948                        self.update_process_t.launched=True
949
950
951                else:
952                        if not self.update_process_t.done:
953                                self.terminal_label.set_name("ERROR_FONT")
954                                msg_updgrade_running=_("The update process is running. Wait a moment please")
955                                self.terminal_label.set_markup(msg_updgrade_running)
956
957       
958        #def upgrade_process
959
960        def waiting_update(self):
961
962                if os.path.exists(TMP_FILE):
963                        return True
964                else:
965                        self.pbar.hide()
966                        self.terminal_label.set_name("CHANGELOG_FONT")
967                        msg_updgrade_running="<span><b>" + _("The system is now update") + "</b></span>"
968                        self.terminal_label.set_markup(msg_updgrade_running)
969                        self.update_process_t.done=True
970                        return False
971
972                                       
973        #def waiting_update
974
975
976        def checkFinalFlavour(self):
977
978                self.isMetapackageCorrect=self.llxup_connect.checkFinalFlavour()
979
980                if self.isMetapackageCorrect !=None:
981                        print "Check Final Metapackage: Instalation of meta is required"
982                else:
983                        print "Check Final Metapackage: Nothing to do" 
984
985
986                       
987        def view_packages_clicked(self,widget,event):
988
989                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
990                self.stack.set_visible_child_name("packages")
991               
992        #def view_packages_clicked     
993       
994
995        def arrow_clicked(self,widget,event):
996       
997                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
998                self.stack.set_visible_child_name("update")     
999               
1000        #def arrow_clicked
1001
1002        def update_installed_icon(self,pkg_name):
1003       
1004                image=Gtk.Image()
1005                image.set_from_file(DONE_ICON)         
1006                icon=image.get_pixbuf()
1007
1008                for item in self.packages_store:
1009                        name=item[1].split(">")[2]
1010                        name=name.split("<")[0]
1011                        if name==pkg_name:
1012                                item[3]=icon
1013               
1014                       
1015        #def update_installed_icon     
1016
1017        def mouse_over_yes(self,widget,event):
1018
1019                self.yes_button_box.set_name("BUTTON_OVER_COLOR")
1020
1021        #def mouse_over_yes     
1022
1023        def mouse_exit_yes(self,widget,event):
1024
1025                self.yes_button_box.set_name("BUTTON_COLOR")
1026
1027        #def mouse_exit_yes     
1028
1029        def mouse_over_no(self,widget,event):
1030
1031                self.no_button_box.set_name("BUTTON_OVER_COLOR")
1032
1033        #def mouse_over_no     
1034
1035        def mouse_exit_no(self,widget,event):
1036
1037                self.no_button_box.set_name("BUTTON_COLOR")
1038
1039        #def mouse_exit_no     
1040                       
1041        def mouse_over_view_packages(self,widget,event):
1042
1043                self.view_packages_button_box.set_name("BUTTON_OVER_COLOR")     
1044
1045        #def mouse_over_view_packages   
1046
1047        def mouse_exit_view_packages(self,widget,event):
1048
1049                self.view_packages_button_box.set_name("BUTTON_COLOR")
1050
1051        #def mouse_exit_view_packages   
1052                       
1053        def mouse_over_update_button(self,widget,event):
1054
1055                if self.update_process_t.launched and not self.update_process_t.done:
1056                        self.update_button_box.set_name("UPDATE_LAUNCHED_OVER_COLOR")
1057                else:
1058                        if self.update_process_t.done:
1059                                self.update_button_box.set_name("UPDATE_LAUNCHED_OVER_COLOR")
1060                        else:
1061                                self.update_button_box.set_name("UPDATE_OVER_COLOR")
1062
1063        #def mouse_over_update_button
1064                       
1065        def mouse_exit_update_button(self,widget,event):
1066
1067                if self.update_process_t.launched and not self.update_process_t.done:
1068                        self.update_button_box.set_name("UPDATE_BUTTON_LAUNCHED_COLOR")
1069                        self.terminal_label.set_name("CHANGELOG_FONT")
1070                        self.terminal_label.set_markup(self.msg_terminal)
1071                else:
1072                        if self.update_process_t.done:
1073                                self.update_button_box.set_name("UPDATE_BUTTON_LAUNCHED_COLOR")
1074
1075                        else:
1076                                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
1077
1078        #def mouse_exit_update_button
1079                       
1080        def mouse_over_cancel(self,widget,event):
1081
1082                self.cancel_button_box.set_name("BUTTON_OVER_COLOR")   
1083
1084        #def mouse_over_cancel 
1085
1086        def mouse_exit_cancel(self,widget,event):
1087
1088                self.cancel_button_box.set_name("BUTTON_COLOR") 
1089
1090        #def mouse_exit_cancel
1091
1092        def mouse_over_return_arrow(self,widget,event):
1093
1094                self.return_arrow_box.set_name("BUTTON_OVER_COLOR")     
1095
1096        #def mouse_over_return_arrow   
1097
1098        def mouse_exit_return_arrow(self,widget,event):
1099
1100                self.return_arrow_box.set_name("BUTTON_COLOR")         
1101
1102        #def mouse_exit_return_arrow   
1103
1104        def quit(self,widget,event=None):
1105               
1106                Gtk.main_quit() 
1107
1108        #def quit       
1109
1110#class LliurexMirror
1111
1112lup=LliurexUp()
1113lup.start_gui()         
1114 
Note: See TracBrowser for help on using the repository browser.