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

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

WIP in new gui. Add some features

File size: 38.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
30BASE_DIR="/home/lliurex/svn/lliurex-up/trunk/fuentes/lliurex-up-gui/"
31GLADE_FILE=BASE_DIR+"rsrc/lliurex-up.ui"
32CACHED_ICON=BASE_DIR+"rsrc/cached.png"
33DONE_ICON=BASE_DIR+"/done.png"
34ERROR_ICON=BASE_DIR+"rsrc/error.png"
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=GLADE_FILE
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.vterminal.set_scrollback_lines(-1)
212                self.terminal_scrolled.add(self.vterminal)
213               
214
215                self.packages_box=builder.get_object("packages_box")
216                self.return_arrow_box=builder.get_object("return_arrow_box")
217                self.return_arrow_eb=builder.get_object("return_arrow_eventbox")
218                self.return_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
219                self.return_arrow_eb.connect("button-release-event", self.arrow_clicked)
220                self.return_arrow_eb.connect("motion-notify-event",self.mouse_over_return_arrow)
221                self.return_arrow_eb.connect("leave-notify-event",self.mouse_exit_return_arrow)
222                self.packages_label=builder.get_object("packages_label")
223                self.packages_tv=builder.get_object("packages_treeview")
224                self.changelog_texview=builder.get_object("changelog_textview")
225
226                #self.packages_store=Gtk.ListStore(str,str,str,GdkPixbuf.Pixbuf)
227                self.packages_store=Gtk.ListStore(str,GdkPixbuf.Pixbuf)
228                self.packages_tv.set_model(self.packages_store)
229                # column=Gtk.TreeViewColumn("")
230                # cell=Gtk.CellRendererPixbuf()
231                # cell.set_property("stock-size",Gtk.IconSize.DIALOG)
232                # column.pack_start(cell,True)
233                # column.add_attribute(cell,"icon-name",0)
234                # self.packages_tv.append_column(column)
235               
236                column=Gtk.TreeViewColumn("Package")
237                cell=Gtk.CellRendererText()
238                column.pack_start(cell,True)
239                column.add_attribute(cell,"markup",0)
240                column.set_expand(True)
241
242               
243                self.packages_tv.append_column(column)
244               
245                # self.packages_tv.connect("button-release-event",self.package_clicked)
246               
247                # column=Gtk.TreeViewColumn("Size")
248                # cell=Gtk.CellRendererText()
249                # cell.set_property("alignment",Pango.Alignment.CENTER)
250                # column.pack_start(cell,False)
251                # column.add_attribute(cell,"markup",1)
252                # self.packages_tv.append_column(column)               
253
254
255                done_icon=Gtk.Image()
256                done_icon.set_from_file(CACHED_ICON)
257                pixbuf=done_icon.get_pixbuf()
258                column=Gtk.TreeViewColumn("Installed")
259                cell=Gtk.CellRendererPixbuf()
260                column.pack_start(cell,True)
261                column.add_attribute(cell,"pixbuf",1)
262                self.packages_tv.append_column(column)
263               
264                # self.changelog_textview=builder.get_object("changelog_textview")
265                # self.changelog_label=builder.get_object("changelog_label")
266
267
268                self.stack.add_titled(self.gather_box,"gather","Gather")
269                self.stack.add_titled(self.update_box,"update", "Update")
270                self.stack.add_titled(self.packages_box, "packages", "Packages")
271
272                self.main_box.pack_start(self.stack,True,False,5)
273
274                self.window.show_all()
275                self.terminal_scrolled.hide()
276                self.viewport.hide()
277                self.terminal_label.hide()
278                self.cancel_button_box.hide()
279                self.yes_button_box.hide()
280                self.no_button_box.hide()
281
282                self.pbar_label.show()
283                self.pbar.show()
284               
285                self.window.connect("destroy",self.quit)
286               
287                self.set_css_info()
288
289                msg_gather="<span><b>"+_("Checking for new version of Lliurex-up")+"</b></span>"
290                self.gather_label.set_markup(msg_gather)
291                GLib.timeout_add(100,self.pulsate_checksystem)
292               
293                self.check_lliurexup_t=threading.Thread(target=self.check_lliurexup_version)
294                self.install_lliurexup_t=threading.Thread(target=self.install_lliurexup)
295                self.check_mirror_t=threading.Thread(target=self.check_mirror)
296                #self.wait_response_t=threading.Thread(target=self.wait_response)
297                self.execute_lliurexmirror_t=threading.Thread(target=self.execute_lliurexmirror)
298                self.get_lliurexversionlocal_t=threading.Thread(target=self.get_lliurexversionlocal)
299                self.get_lliurexversionnet_t=threading.Thread(target=self.get_lliurexversionnet)
300                self.checkInitialFlavourToInstall_t=threading.Thread(target=self.checkInitialFlavourToInstall)
301                self.gather_packages_t=threading.Thread(target=self.gather_packages)
302                self.preactions_process_t=threading.Thread(target=self.preactions_process)
303                self.update_process_t=threading.Thread(target=self.update_process)
304                self.checkFinalFlavourToInstall_t=threading.Thread(target=self.checkFinalFlavourToInstall)
305
306                self.postactions_process_t=threading.Thread(target=self.postactions_process)
307
308                self.check_lliurexup_t.daemon=True
309                self.install_lliurexup_t.daemon=True
310                self.check_mirror_t.daemon=True
311                #self.wait_response_t.daemon=True
312                self.execute_lliurexmirror_t.daemon=True
313                self.get_lliurexversionlocal_t.daemon=True
314                self.get_lliurexversionnet_t.daemon=True
315                self.checkInitialFlavourToInstall_t.daemon=True
316
317                self.gather_packages_t.daemon=True
318                self.preactions_process_t.daemon=True
319                self.update_process_t.daemon=True
320                self.checkFinalFlavourToInstall_t.daemon=True
321                self.postactions_process_t.daemon=True
322
323                self.check_lliurexup_t.done=False
324                self.install_lliurexup_t.done=False
325                self.check_mirror_t.done=False
326                #self.wait_response_t.done=False
327                self.execute_lliurexmirror_t.done=False
328                self.get_lliurexversionlocal_t.done=False
329                self.get_lliurexversionnet_t.done=False
330                self.checkInitialFlavourToInstall_t.done=False
331
332                self.gather_packages_t.done=False
333                self.preactions_process_t.done=False
334                self.update_process_t.done=False
335                self.postactions_process_t.done=False
336                self.checkFinalFlavourToInstall_t.done=False
337
338                self.check_lliurexup_t.launched=False
339                self.install_lliurexup_t.launched=False
340                self.check_mirror_t.launched=False
341                #self.wait_response_t.launched=False
342                self.execute_lliurexmirror_t.launched=False
343                self.get_lliurexversionlocal_t.launched=False
344                self.get_lliurexversionnet_t.launched=False
345                self.checkInitialFlavourToInstall_t.launched=False
346
347                self.gather_packages_t.launched=False
348                self.preactions_process_t.launched=False
349                self.update_process_t.launched=False
350                self.checkFinalFlavourToInstall_t.launched=False
351                self.postactions_process_t.launched=False
352                self.spinner.start()
353               
354                self.package_list=[]
355                self.max_seconds=5.0
356                self.current_second=0
357                self.number_process=7
358
359                GObject.threads_init()
360                Gtk.main()
361
362        #def start_gui
363       
364        def set_css_info(self):
365       
366                css = """
367
368
369                #WHITE_BACKGROUND {
370                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
371               
372                }
373
374                #BUTTON_LABEL{
375                        color:white;
376                        font: Roboto 10;
377                }
378
379                #DISABLED_BUTTON_OVER{
380                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
381                }
382               
383                #DISABLED_BUTTON{
384                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
385                }
386               
387                #CANCEL_BUTTON{
388                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
389                }
390               
391                #CANCEL_BUTTON_OVER{
392                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
393                }
394
395                #BUTTON_COLOR {
396                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
397               
398                }
399               
400                #BUTTON_OVER_COLOR {
401                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
402                       
403               
404                }
405
406                #UPDATE_BUTTON_LABEL{
407                        color:white;
408                        font: Roboto 11;
409                }
410               
411                #UPDATE_BUTTON_COLOR {
412                        background-image:-gtk-gradient (linear, left top, left bottom, from (#43A047),  to (#43A047));;
413               
414                }
415
416                #UPDATE_OVER_COLOR {
417                        background-image:-gtk-gradient (linear, left top, left bottom, from (#53b757),  to (#53b757));;
418               
419                }
420
421
422                #UPDATE_BUTTON_LAUNCHED_COLOR {
423                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
424               
425                }
426
427                #UPDATE_LAUNCHED_OVER_COLOR {
428                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
429               
430                }
431
432                #UPDATE_BUTTON_END_COLOR {
433                        background-image:-gtk-gradient (linear, left top, left bottom, from (#546e7a), to (#546e7a));;
434
435                }
436                               
437                #GATHER_ICON_COLOR {
438                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
439               
440                }
441               
442               
443                #BLUE_FONT {
444                        color: #3366cc;
445                        font: Roboto 10;
446                       
447                }       
448               
449
450                #CHANGELOG_FONT {
451                        color: #3366cc;
452                        font: Roboto 11;
453                       
454                }
455
456                #LABEL_OPTION{
457               
458                        color: #808080;
459                        font: Roboto 11;
460                }
461
462                #ERROR_FONT {
463                        color: #CC0000;
464                        font: Roboto 11;
465                }
466               
467                #DISABLED_BUTTON{
468                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
469                }
470                """
471
472                self.style_provider=Gtk.CssProvider()
473                self.style_provider.load_from_data(css)
474                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
475               
476                self.window.set_name("WHITE_BACKGROUND")
477                self.update_box.set_name("WHITE_BACKGROUND")
478                self.gather_box.set_name("WHITE_BACKGROUND")
479                self.packages_box.set_name("WHITE_BACKGROUND")
480                self.gather_label.set_name("CHANGELOG_FONT")
481                self.pbar_label.set_name("CHANGELOG_FONT")
482
483                self.yes_button_box.set_name("BUTTON_COLOR")
484                self.yes_button_label.set_name("BUTTON_LABEL")
485
486                self.no_button_box.set_name("BUTTON_COLOR")
487                self.no_button_label.set_name("BUTTON_LABEL")
488
489                self.view_packages_button_box.set_name("BUTTON_COLOR")
490                self.view_packages_label.set_name("BUTTON_LABEL")
491
492                self.cancel_button_box.set_name("BUTTON_COLOR")
493                self.cancel_button_label.set_name("BUTTON_LABEL")       
494
495                self.version_available_label.set_name("LABEL_OPTION")
496                self.version_update_label.set_name("LABEL_OPTION")     
497                self.number_packages_label.set_name("LABEL_OPTION")
498                self.size_update_label.set_name("LABEL_OPTION")
499                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
500                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
501                self.terminal_label.set_name("CHANGELOG_FONT")
502
503
504                self.packages_label.set_name("LABEL_OPTION")
505                #self.changelog_label.set_name("LABEL_OPTION")
506                self.changelog_texview.set_name("CHANGELOG_FONT")
507                self.return_arrow_box.set_name("BUTTON_COLOR")
508               
509        #def set_css_info       
510
511
512        def pulsate_checksystem(self):
513
514                #self.pbar.pulse()
515
516                if not self.check_lliurexup_t.launched:
517                        print "[Lliurex-up]: Checking Lliurex-up version"
518                        self.check_lliurexup_t.start()
519                        self.check_lliurexup_t.launched=True
520                        self.show_number_process_executing(1,"")
521
522                if  self.check_lliurexup_t.done:
523                        if not self.is_lliurexup_updated:
524                                if  not self.install_lliurexup_t.is_alive() and not self.install_lliurexup_t.launched:
525                                        print "[Lliurex-up]: Updating Lliurex-up"
526                                        msg_gather="<span><b>"+_("Updating Lliurex-up")+"</b></span>"
527                                        self.gather_label.set_markup(msg_gather)
528                                        self.install_lliurexup_t.start()
529                                        self.install_lliurexup_t.launched=True
530                                        self.show_number_process_executing(2,"")
531
532                                else:
533                                        if self.install_lliurexup_t.done:
534                                                print "[Lliurex-up]: Reboot Lliurex-up"
535                                                #msg_gather="<span><b>"+_("Lliurex-up is now updated and will be reboot")+"</b></span>"
536                                                #self.pbar.hide()
537                                                #self.gather_label.set_markup(msg_gather)
538                                                #self.t=threading.Thread(target=self.reboot_lliurexup)
539                                                self.pbar_label.hide()
540                                                self.msg_wait="<span><b>"+_("Lliurex-up is now updated and will be reboot in %s seconds...")+"</b></span>"
541                                                GLib.timeout_add(10,self.wait_to_reboot)
542                                                #self.t.daemon=True
543                                                #self.t.start()
544                                                return False
545                        else:
546                               
547                                if not self.check_mirror_t.is_alive() and not self.check_mirror_t.launched:
548                                        print "[Lliurex-up]: Checking if mirror exist"
549                                        msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
550                                        self.gather_label.set_markup(msg_gather)
551                                        self.check_mirror_t.start()
552                                        self.check_mirror_t.launched=True
553                                        self.show_number_process_executing(3,"")
554
555
556                               
557                                if      self.check_mirror_t.done:
558                                        is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
559
560                                        if not self.is_mirror_updated:
561                                                if not is_mirror_running:
562                                                        print "[Lliurex-up]: Asking if mirror will be update"
563                                                        self.yes_button_box.show()
564                                                        self.no_button_box.show()
565                                                        self.pbar.hide()
566                                                        self.pbar_label.hide()
567                                                        #self.spinner.stop()
568                                                        msg_gather="<span><b>"+_("Your mirror is not update.Do you want to update it?")+"</b></span>"
569                                                        self.gather_label.set_markup(msg_gather)
570                                                        #GLib.timeout_add(100,self.pulsate_wait_response)
571                                                        return False
572
573                                                else:
574                                                        self.mirror_running_msg()
575                                                        return False
576
577                                        else:   
578                                                if is_mirror_running:
579                                                        self.mirror_running_msg()
580                                                        return False
581                                                else:   
582                                                        print "[Lliurex-up]: Nothing to do with mirror"
583                                                        GLib.timeout_add(100,self.pulsate_get_info)
584                                                        return False
585                                               
586
587                if  self.check_lliurexup_t.is_alive():
588                        return True
589
590                if self.install_lliurexup_t.launched: 
591                        if self.install_lliurexup_t.is_alive():
592                                return True     
593                                       
594                if self.check_mirror_t.launched:
595                        if self.check_mirror_t.is_alive():
596                                return True
597
598               
599        #def pulsate_checksystem       
600
601        def wait_to_reboot(self):
602
603                csecond=int(self.max_seconds+1-self.current_second)
604                self.gather_label.set_markup(self.msg_wait%csecond)
605                self.pbar.set_fraction(self.current_second/self.max_seconds)
606
607                self.current_second+=0.01
608
609                if self.current_second>=self.max_seconds:
610                        os.execl(sys.executable, sys.executable, *sys.argv)     
611                        return False
612                else:
613                        return True
614
615        #def wait_to_reboot
616
617        # def reboot_lliurexup(self):
618
619        #       time.sleep(5)
620        #       os.execl(sys.executable, sys.executable, *sys.argv)     
621
622        # #def reboot_me       
623
624        def check_lliurexup_version(self):
625
626                time.sleep(5)   
627                self.is_lliurexup_updated=self.llxup_connect.isLliurexUpIsUpdated()
628                self.check_lliurexup_t.done=True
629               
630        #def check_lliurexup_version   
631               
632        def install_lliurexup(self):
633
634                self.install=self.llxup_connect.installLliurexUp()
635                self.install_lliurexup_t.done=True
636
637        #def install_lliurexup 
638
639               
640        def check_mirror(self):
641
642                self.is_mirror_updated=self.llxup_connect.lliurexMirrorIsUpdated()
643                self.check_mirror_t.done=True
644       
645        #def check_mirror       
646
647        def no_button_clicked(self,widget,event):
648               
649                #self.response=0
650                self.pbar.show()
651                self.pbar_label.show() 
652                GLib.timeout_add(100,self.pulsate_get_info)
653                self.yes_button_box.hide()
654                self.no_button_box.hide()
655                log_msg="Update lliurex-mirror: No"
656                self.llxup_connect.log(log_msg)
657
658        #def def no_button_clicked
659               
660        def yes_button_clicked(self,widget,event):
661       
662                #self.response=1
663                self.pbar.show()
664                self.pbar_label.show()
665                print "[Lliurex-up]: Updating mirror"
666                self.updated_percentage(0)
667                #self.spinner.start()
668                self.yes_button_box.hide()
669                self.no_button_box.hide()
670                #msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
671                #self.gather_label.set_markup(msg_gather)
672                self.execute_lliurexmirror_t.start()
673                self.mirror_running_msg()
674                #GLib.timeout_add(1000,self.pulsate_updating_mirror)
675                log_msg="Update lliurex-mirror: Yes"
676                print log_msg
677                self.llxup_connect.log(log_msg)
678                       
679        #def yes_button_clicked         
680
681        #def check_mirror
682
683        # def pulsate_wait_response(self):
684
685        #       if self.response==0:
686        #               GLib.timeout_add(100,self.pulsate_get_info)
687
688        #               self.yes_button_box.hide()
689        #               self.no_button_box.hide()
690        #               return False
691
692        #       if self.response==1:
693        #               self.pbar_label.show()
694        #               self.updated_percentage(0)
695        #               self.spinner.start()
696        #               self.yes_button_box.hide()
697        #               self.no_button_box.hide()
698        #               msg_gather="<span><b>"+_("Updating mirror")+"</b></span>"
699        #               self.gather_label.set_markup(msg_gather)
700        #               self.execute_lliurexmirror_t.start()
701        #               GLib.timeout_add(1000,self.pulsate_updating_mirror)
702                       
703        #               return False
704               
705        #       self.pbar.pulse()
706        #       return True
707
708        #def yes_button_clicked
709
710        def pulsate_updating_mirror(self):
711
712                self.is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
713
714                if self.is_mirror_running or self.execute_lliurexmirror_t.is_alive():
715                        mirror_percentage=self.llxup_connect.getPercentageLliurexMirror()
716                        self.updated_percentage(mirror_percentage)
717                        return True
718               
719                else:
720                        #self.spinner.stop()
721                        #self.pbar_label.hide()
722                        GLib.timeout_add(100,self.pulsate_get_info)
723                        return False   
724
725        #def pulsate_updating_mirro             
726
727        def execute_lliurexmirror(self):
728               
729                commands.getoutput('/usr/sbin/lliurex-mirror-gui')
730
731        #def def execute_lliurexmirror 
732
733        def mirror_running_msg(self):
734
735                self.spinner.start()
736                msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
737                self.gather_label.set_markup(msg_gather)
738                GLib.timeout_add(1000,self.pulsate_updating_mirror)
739
740        #def mirror_running_msg
741
742
743        def pulsate_get_info(self):
744
745                #self.pbar.pulse()
746 
747                if not self.get_lliurexversionlocal_t.launched:
748                        print "[Lliurex-up]: Checking LliurexVersion from local repository "
749                        msg_gather="<span><b>"+_("Checking new version to update")+"</b></span>"
750                        self.gather_label.set_markup(msg_gather)
751                        self.get_lliurexversionlocal_t.start()
752                        self.get_lliurexversionlocal_t.launched=True
753                        self.show_number_process_executing(4,"")
754
755
756
757                if self.get_lliurexversionlocal_t.done:
758                        if not self.get_lliurexversionnet_t.is_alive() and not self.get_lliurexversionnet_t.launched:
759                                print "[Lliurex-up]: Checking LliurexVersion from Lliurex net"
760                                msg_gather="<span><b>"+_("Checking new version available")+"</b></span>"
761                                self.gather_label.set_markup(msg_gather)
762                                self.get_lliurexversionnet_t.start()   
763                                self.get_lliurexversionnet_t.launched=True
764                                self.show_number_process_executing(5,"")
765
766
767
768                        if self.get_lliurexversionnet_t.done:
769
770                                if not self.checkInitialFlavourToInstall_t.is_alive() and not self.checkInitialFlavourToInstall_t.launched:
771                                        print "[Lliurex-up]: Checking if installation of flavour is required"
772                                        msg_gather="<span><b>"+_("Checking if installation of flavour is required")+"</b></span>"
773                                        self.gather_label.set_markup(msg_gather)
774                                        self.checkInitialFlavourToInstall_t.start()
775                                        self.checkInitialFlavourToInstall_t.launched=True
776                                        self.show_number_process_executing(6,"")
777
778
779
780                                if self.checkInitialFlavourToInstall_t.done:
781
782                                        if not self.gather_packages_t.is_alive() and not self.gather_packages_t.launched:
783                                                print "[Lliurex-up]: Checking for new updates"
784                                                msg_gather="<span><b>"+_("Checking for new updates")+"</b></span>"
785                                                self.gather_label.set_markup(msg_gather)
786                                                self.gather_packages_t.start()
787                                                self.gather_packages_t.launched=True
788                                                self.show_number_process_executing(7,"")
789
790
791                                        if self.gather_packages_t.done:
792                                                self.spinner.stop()
793                                                self.pbar.hide()
794                                                self.pbar_label.hide()
795                                                self.cancel_button_box.show()   
796
797                                                if not self.incorrect_flavours:
798                                                        if len(self.packages)==0:
799                                                                msg_gather="<span><b>"+_("Your system is update")+"</b></span>"
800                                                                self.gather_label.set_markup(msg_gather)
801                                                                #self.pbar.hide()
802                                                                print "[Lliurex-up]: Sytem update. Nothing to do"
803                                                                return False
804                                                        else:
805                                                                print "[Lliurex-up]: System nor update" 
806
807                                                                #self.requires_installing_metapackage()
808                                                                self.parse_packages_updated()
809                                                                self.populate_packages_tv()
810                                                                self.get_update_summary()
811                                                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
812                                                                self.stack.set_visible_child_name("update")     
813                                                                return False
814                                                else:
815                                                        self.gather_label.set_name("ERROR_FONT")
816                                                        msg_gather="<span><b>"+_("Updated abort for incorrect flavours detected in update")+"</b></span>"
817                                                        self.gather_label.set_markup(msg_gather)
818                                                        #self.pbar.hide()
819                                                        print "[Lliurex-up]: Sytem update. Nothing to do"
820                                                        return False                                                   
821               
822
823                if self.get_lliurexversionlocal_t.launched:
824                        if self.get_lliurexversionlocal_t.is_alive():
825                                return True     
826
827                if self.get_lliurexversionnet_t.launched:
828                        if self.get_lliurexversionnet_t.is_alive():
829                                return True                             
830
831                if self.checkInitialFlavourToInstall_t.launched:
832                        if self.checkInitialFlavourToInstall_t.is_alive():
833                                return True
834
835                if self.gather_packages_t.launched:
836                        if self.gather_packages_t.is_alive():
837                                return True
838
839        #def pulsate_get_info   
840
841        def get_lliurexversionlocal(self):
842                self.version_update=self.llxup_connect.getLliurexVersionLocal()
843                self.get_lliurexversionlocal_t.done=True
844
845        #def get_lliurexversionlocal
846       
847        def get_lliurexversionnet(self):
848                self.version_available=self.llxup_connect.getLliurexVersionNet()
849                self.get_lliurexversionnet_t.done=True
850
851
852        #def get_lliurexversionlocal   
853       
854        def checkInitialFlavourToInstall(self):
855
856                self.flavourToInstall=self.llxup_connect.targetMetapackage
857
858                if self.flavourToInstall == None:
859                        self.flavourToInstall=self.llxup_connect.requiresInstallFlavour()
860                        if self.flavourToInstall != None:
861                                print "[Lliurex-up]: Installation of flavour is required"
862                        else:
863                                print "[Lliurex-up]: Installation of flavour is not required"
864               
865                self.checkInitialFlavourToInstall_t.done=True   
866
867
868        def gather_packages(self):
869
870                self.packages=self.llxup_connect.getPackagesToUpdate()
871                self.incorrect_flavours=self.llxup_connect.checkIncorrectFlavours()
872                self.gather_packages_t.done=True
873
874               
875        #def gather_info
876
877
878        def get_update_summary(self):
879
880                #self.version_available=self.llxup_connect.getLliurexVersionNet()
881                if self.version_available==None:
882                        if 'client' in self.llxup_connect.previousFlavours or self.flavourToInstall=='client':
883                                msg_version_available_info="<span foreground='#3366cc'><b>"+_("Info not available for clients")+"</b></span>"
884
885                        else:
886                                msg_version_available_info="<span foreground='#CC0000'><b>"+_("Info not available. Check conexion to lliurex.net")+"</b></span>"
887
888                else:
889                        #self.version_available="16.160920"     
890                        msg_version_available_info="<span foreground='#3366cc'><b>"+self.version_available+"</b></span>"
891
892
893                if self.version_update==None:
894                        msg_version_update="<span foreground='#3366cc'><b>"+_("Info not available")+"</b></span>"
895               
896                else:
897                        msg_version_update="<span foreground='#3366cc'><b>"+self.version_update+"</b></span>"
898       
899                self.number_pkg=len(self.packages)
900                self.size_update_label.hide()
901                #self.size_update="100 Mb"
902
903
904                msg_number="<span foreground='#3366cc'><b>"+str(self.number_pkg)+"</b></span>"
905                #msg_size="<span foreground='#3366cc'><b>"+self.size_update+"</b></span>"
906               
907                self.version_available_label_info.set_markup(msg_version_available_info)
908                self.version_update_label_info.set_markup(msg_version_update)
909                self.number_packages_label_info.set_markup(msg_number)
910                #self.size_update_label_info.set_markup(msg_size)
911               
912        #def get_update_summary
913               
914        def updated_percentage(self,completed):
915
916                percentage=completed/100.0
917
918                self.pbar.set_fraction(percentage)
919               
920                msg_value=format(completed,'.0f')
921               
922                msg_percentage="<span><b>"+msg_value+"%"+"</b></span>"
923                self.pbar_label.set_markup(msg_percentage)
924               
925               
926        #def updated_percentage
927               
928        def show_number_process_executing(self, execprocess, processname):
929
930                self.total_process=self.number_process+1.0
931                self.pbar.set_fraction(execprocess/self.total_process)
932                if processname =="":
933                        msg_pbar="Executing process: " + str(execprocess) + " of " + str(self.number_process)
934                else:
935                        msg_pbar="Executing process: " + str(execprocess) + " of " + str(self.number_process) + ". " + processname
936       
937                msg_pbar="<span><b>"+msg_pbar+"</b></span>" 
938                self.pbar_label.set_markup(msg_pbar)
939
940       
941        def populate_packages_tv(self):
942               
943                for package in self.package_list:
944                        #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))
945                        self.packages_store.append(("<span font='Roboto'><b>"+package.name+"</b></span>\n"+"<span font='Roboto' size='small'>"+package.version+"</span>",package.installed))
946                       
947                #print len(self.packages_store)
948               
949        #def populate_packages_tv
950       
951        def parse_packages_updated(self):
952               
953                       
954                for item in self.packages:
955                        tmp=item.split(";")
956                        if len(tmp)>1:
957                                pack=Package(tmp[0],tmp[1])
958                                self.package_list.append(pack)
959
960
961        #def parse_simulate_output
962       
963        def package_clicked(self,x,y):
964               
965                selection=self.packages_tv.get_selection()
966                model,iter=selection.get_selected()
967                name=self.packages_store.get_value(iter,1)
968                name=name[name.find("<b>")+3:name.find("</b>")]
969                               
970                for package in self.package_list:
971                       
972                        if package.name==name:
973                                self.changelog_textview.get_buffer().set_text("".join(package.changelog))
974                               
975                                break
976       
977        #def package_clicked                   
978
979        def upgrade_process(self,widget, event=None):
980
981                self.number_process=4
982                if not self.preactions_process_t.launched:
983
984                        self.pbar.show()
985                        #self.pbar.pulse()
986                        self.viewport.show()
987                        self.terminal_scrolled.show()
988                        self.terminal_label.show()
989                        self.msg_terminal=_("Update process details")
990                        self.terminal_label.set_markup(self.msg_terminal)
991                        GLib.timeout_add(100,self.dist_upgrade)
992
993                        # self.preactions_process_t.start()
994                        # self.preactions_process_t.launched=True
995
996
997                else:
998                        if not self.postactions_process_t.done:
999                                self.terminal_label.set_name("ERROR_FONT")
1000                                msg_updgrade_running=_("The update process is running. Wait a moment please")
1001                                self.terminal_label.set_markup(msg_updgrade_running)
1002
1003
1004        def dist_upgrade(self):
1005
1006
1007                if not self.preactions_process_t.launched:
1008                        print "[Lliurex-up]: Executing pre-actions"
1009                        self.pbar_label.show()
1010
1011                        self.preactions_process_t.start()
1012                        self.preactions_process_t.launched=True
1013                        self.show_number_process_executing(1,"Pre-actions process")
1014                        self.update_button_box.set_name("UPDATE_BUTTON_LAUNCHED_COLOR")
1015
1016                else:
1017
1018                        if self.preactions_process_t.done:
1019                                if not self.update_process_t.is_alive() and not self.update_process_t.launched:
1020                                        print "[Lliurex-up]: Executing dist-upgrade"
1021                                        self.update_process_t.start()
1022                                        self.update_process_t.launched=True
1023                                        self.show_number_process_executing(2,"Dist-upgrade process")
1024
1025                               
1026                                if self.update_process_t.done:
1027                                        if not self.checkFinalFlavourToInstall_t.is_alive() and not self.checkFinalFlavourToInstall_t.launched:
1028                                                print "[Lliurex-up]: Checking Final Flavour"
1029                                                self.checkFinalFlavourToInstall_t.start()
1030                                                self.checkFinalFlavourToInstall_t.launched=True
1031                                                self.show_number_process_executing(3,"Checking Flavour")
1032                                                                               
1033                                       
1034                                        if self.checkFinalFlavourToInstall_t.done:                               
1035
1036                                                if not self.postactions_process_t.is_alive() and not self.postactions_process_t.launched:
1037                                                        print "[Lliurex-up]: Executing post-actions"
1038                                                        self.postactions_process_t.start()
1039                                                        self.postactions_process_t.launched=True
1040                                                        self.show_number_process_executing(4,"Post-actions process")
1041
1042                                               
1043                                                if self.postactions_process_t.done:
1044                                                        self.pbar.hide()
1045                                                        self.pbar_label.hide()
1046                                                        self.terminal_label.set_name("CHANGELOG_FONT")
1047                                                        msg_updgrade_running="<span><b>" + _("The system is now update") + "</b></span>"
1048                                                        self.update_button_box.set_name("UPDATE_BUTTON_END_COLOR")
1049                                                        self.terminal_label.set_markup(msg_updgrade_running)
1050                                                        return False
1051               
1052       
1053
1054                if self.preactions_process_t.launched:
1055                        if      not self.preactions_process_t.done:
1056                                if not os.path.exists(self.llxup_connect.preactions_token):
1057                                        return True
1058                                else:
1059                                        self.preactions_process_t.done=True
1060                                        return True
1061
1062
1063                if self.update_process_t.launched:
1064                        if      not self.update_process_t.done:
1065                                if not os.path.exists(self.llxup_connect.upgrade_token):
1066                                        return True
1067                                else:
1068                                        self.update_process_t.done=True 
1069                                        return True
1070
1071                if self.checkFinalFlavourToInstall_t.launched:
1072                        if not self.checkFinalFlavourToInstall_t.done:
1073                                if not os.path.exists(self.llxup_connect.installflavour_token):
1074                                        return True
1075                                else:
1076                                        self.checkFinalFlavourToInstall_t.done=True     
1077                                        return True
1078
1079
1080                if self.postactions_process_t.launched:
1081                        if      not self.postactions_process_t.done:
1082                               
1083                                if not os.path.exists(self.llxup_connect.postactions_token):
1084                                        return True
1085                                else:
1086                                        self.postactions_process_t.done=True
1087                                        return True                     
1088
1089                       
1090        #def waiting_update
1091
1092
1093        def preactions_process(self):
1094
1095                self.command=self.llxup_connect.preActionsScript()
1096                #self.command=self.llxup_connect.preActionsScript() + ' | tee ' + TMP_FILE + ';rm ' + TMP_FILE +'\n'
1097                length=len(self.command)
1098                self.vterminal.feed_child(self.command, length)
1099
1100
1101        def update_process(self):
1102                 
1103                #self.command='apt-get dist-upgrade -sV | tee '+ TMP_FILE + ';rm ' + TMP_FILE +'\n'
1104                self.command=self.llxup_connect.distUpgradeProcess()
1105                length=len(self.command)
1106                self.vterminal.feed_child(self.command, length)
1107
1108        #def update_process             
1109
1110
1111        def checkFinalFlavourToInstall(self):
1112
1113                self.flavourToInstall=self.llxup_connect.checkFinalFlavour()
1114
1115                if self.flavourToInstall !=None:
1116                        print "[Lliurex-up]: Check Final Metapackage: Instalation of meta is required"
1117                        self.installFinalFlavour(self.flavourToInstall)
1118                else:
1119                        print "[Lliurex-up]: Check Final Metapackage: Nothing to do"
1120                        self.checkFinalFlavourToInstall_t.done=True     
1121
1122
1123        def installFinalFlavour(self,flavourToInstall):
1124
1125                self.command=self.llxup_connect.installFinalFlavour(flavourToInstall)
1126                length=len(self.command)
1127                self.vterminal.feed_child(self.command, length)
1128                               
1129
1130        def postactions_process(self):
1131
1132                self.command=self.llxup_connect.postActionsScript()
1133                #self.command=self.llxup_connect.preActionsScript() + ' | tee ' + TMP_FILE + ';rm ' + TMP_FILE +'\n'
1134                length=len(self.command)
1135                self.vterminal.feed_child(self.command, length)
1136
1137       
1138        def view_packages_clicked(self,widget,event):
1139
1140                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1141                self.stack.set_visible_child_name("packages")
1142               
1143        #def view_packages_clicked     
1144       
1145
1146        def arrow_clicked(self,widget,event):
1147       
1148                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1149                self.stack.set_visible_child_name("update")     
1150               
1151        #def arrow_clicked
1152
1153        def update_installed_icon(self,pkg_name):
1154       
1155                image=Gtk.Image()
1156                image.set_from_file(DONE_ICON)         
1157                icon=image.get_pixbuf()
1158
1159                for item in self.packages_store:
1160                        name=item[1].split(">")[2]
1161                        name=name.split("<")[0]
1162                        if name==pkg_name:
1163                                item[3]=icon
1164               
1165                       
1166        #def update_installed_icon     
1167
1168        def mouse_over_yes(self,widget,event):
1169
1170                self.yes_button_box.set_name("BUTTON_OVER_COLOR")
1171
1172        #def mouse_over_yes     
1173
1174        def mouse_exit_yes(self,widget,event):
1175
1176                self.yes_button_box.set_name("BUTTON_COLOR")
1177
1178        #def mouse_exit_yes     
1179
1180        def mouse_over_no(self,widget,event):
1181
1182                self.no_button_box.set_name("BUTTON_OVER_COLOR")
1183
1184        #def mouse_over_no     
1185
1186        def mouse_exit_no(self,widget,event):
1187
1188                self.no_button_box.set_name("BUTTON_COLOR")
1189
1190        #def mouse_exit_no     
1191                       
1192        def mouse_over_view_packages(self,widget,event):
1193
1194                self.view_packages_button_box.set_name("BUTTON_OVER_COLOR")     
1195
1196        #def mouse_over_view_packages   
1197
1198        def mouse_exit_view_packages(self,widget,event):
1199
1200                self.view_packages_button_box.set_name("BUTTON_COLOR")
1201
1202        #def mouse_exit_view_packages   
1203                       
1204        def mouse_over_update_button(self,widget,event):
1205
1206                if self.preactions_process_t.launched and not self.postactions_process_t.done:
1207                        self.update_button_box.set_name("UPDATE_LAUNCHED_OVER_COLOR")
1208                else:
1209                        if self.postactions_process_t.done:
1210                                self.update_button_box.set_name("UPDATE_BUTTON_END_COLOR")
1211                        else:
1212                                self.update_button_box.set_name("UPDATE_OVER_COLOR")
1213
1214        #def mouse_over_update_button
1215                       
1216        def mouse_exit_update_button(self,widget,event):
1217
1218                if self.preactions_process_t.launched and not self.postactions_process_t.done:
1219                        self.update_button_box.set_name("UPDATE_BUTTON_LAUNCHED_COLOR")
1220                        self.terminal_label.set_name("CHANGELOG_FONT")
1221                        self.terminal_label.set_markup(self.msg_terminal)
1222                else:
1223                        if self.postactions_process_t.done:
1224                                self.update_button_box.set_name("UPDATE_BUTTON_END_COLOR")
1225
1226                        else:
1227                                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
1228
1229        #def mouse_exit_update_button
1230                       
1231        def mouse_over_cancel(self,widget,event):
1232
1233                self.cancel_button_box.set_name("BUTTON_OVER_COLOR")   
1234
1235        #def mouse_over_cancel 
1236
1237        def mouse_exit_cancel(self,widget,event):
1238
1239                self.cancel_button_box.set_name("BUTTON_COLOR") 
1240
1241        #def mouse_exit_cancel
1242
1243        def mouse_over_return_arrow(self,widget,event):
1244
1245                self.return_arrow_box.set_name("BUTTON_OVER_COLOR")     
1246
1247        #def mouse_over_return_arrow   
1248
1249        def mouse_exit_return_arrow(self,widget,event):
1250
1251                self.return_arrow_box.set_name("BUTTON_COLOR")         
1252
1253        #def mouse_exit_return_arrow   
1254
1255        def quit(self,widget,event=None):
1256                self.llxup_connect.cleanEnvironment()
1257                Gtk.main_quit() 
1258
1259        #def quit       
1260
1261#class LliurexMirror
1262
1263lup=LliurexUp()
1264lup.start_gui()         
1265 
Note: See TracBrowser for help on using the repository browser.