source: lliurex-up/trunk/fuentes/lliurex-up/usr/share/lliurex-up/lliurex-up.py @ 7449

Last change on this file since 7449 was 7449, checked in by jrpelegrina, 17 months ago

Wip in integration with dpkg-unlocker

  • Property svn:executable set to *
File size: 52.2 KB
Line 
1#!/usr/bin/env python
2import gi
3gi.require_version('Gtk', '3.0')
4gi.require_version('PangoCairo', '1.0')
5gi.require_version('Vte', '2.91')
6
7import cairo
8import os
9import shutil
10import threading
11import ConfigParser
12import platform
13import subprocess
14import sys
15import time
16import commands
17from gi.repository import Gtk, Gdk, GdkPixbuf, GObject, GLib, PangoCairo, Pango, Vte
18
19
20import LliurexUpConnect
21
22import signal
23signal.signal(signal.SIGINT, signal.SIG_DFL)
24
25import gettext
26gettext.textdomain('lliurex-up')
27_ = gettext.gettext
28
29
30
31BASE_DIR="/usr/share/lliurex-up/"
32GLADE_FILE=BASE_DIR+"rsrc/lliurex-up.ui"
33CACHED_ICON=BASE_DIR+"rsrc/cached.png"
34DONE_ICON=BASE_DIR+"rsrc/done.png"
35ERROR_ICON=BASE_DIR+"rsrc/error.png"
36NEWPACKAGE_ICON=BASE_DIR +"rsrc/newpackage.png"
37UPDATEPACKAGE_ICON=BASE_DIR + "rsrc/updatepackage.png" 
38DESKTOP_PATH="/usr/share/applications"
39LOCK_PATH="/var/run/lliurexUp.lock"
40DISABLE_INDICATOR_PATH="/etc/lliurex-up-indicator"
41DISABLE_INDICATOR_TOKEN=os.path.join(DISABLE_INDICATOR_PATH,'disableIndicator.token')
42TERMINAL_CONFIG=BASE_DIR+"terminal_config"
43
44
45
46class Package:
47
48        #def __init__(self,name,version,size,desktop_file,changelog_file):
49        def __init__(self,installed,name,version,size):
50                self.name=name
51                self.version=version
52                self.size=size
53                desktop_file=os.path.join(DESKTOP_PATH,name+".desktop")
54                self.parse_desktop(desktop_file)
55                #self.parse_changelog(changelog_file)
56                self.parse_installed_icon(CACHED_ICON)
57                self.parse_newpackage_icon(installed)
58
59        #def__init__
60       
61        def parse_desktop(self,desktop_file):
62               
63                try:
64                        config = ConfigParser.ConfigParser()
65                        config.optionxform=str
66
67                        config.read(desktop_file)
68                       
69                        #Zomandos may include a desktop file of type zomando with info for the store. Those desktops must be skipped
70                        if config.has_section("Desktop Entry") and config.has_option("Desktop Entry","Icon") and config.get("Desktop Entry","Type").lower()!="zomando":
71                                self.icon=config.get("Desktop Entry","Icon")
72                                icon_extension=os.path.splitext(self.icon)[1]
73                                if icon_extension==".xpm":
74                                        self.icon="package"
75                        else:
76                                self.icon="package"
77                               
78                except Exception as e:
79                       
80                        self.icon="package"
81                       
82        #def parse_desktop
83
84        '''
85        def parse_changelog(self,changelog_file):
86               
87                try:
88                       
89                        f=open(changelog_file,"r")
90                        self.changelog=f.readlines()
91                        f.close()
92                                               
93                except Exception as e:
94                       
95                        self.changelog="Changelog not found"
96
97        #def parse_changelog
98        '''
99       
100        def parse_installed_icon(self, icon_file):
101               
102                        image=Gtk.Image()
103                        image.set_from_file(icon_file)         
104                        self.installed=image.get_pixbuf()
105
106
107        #def parse_installed_icon
108
109
110        def parse_newpackage_icon(self, installed):
111               
112                        image=Gtk.Image()
113                        if installed==str(None):
114                                icon_file=NEWPACKAGE_ICON
115                        else:
116                                icon_file=UPDATEPACKAGE_ICON
117
118                        image.set_from_file(icon_file)         
119                        self.type=image.get_pixbuf()
120
121
122class LliurexUp:
123
124        def __init__(self):
125               
126                #self.free_space_check()
127                self.llxup_connect=LliurexUpConnect.LliurexUpConnect()
128                self.check_root()
129                self.isLliurexUpLocked()
130                                       
131        #def __init__           
132
133
134        def isLliurexUpLocked(self):
135
136                print "  [Lliurex-Up]: Checking if LliureX-Up is running..."
137
138                code=self.llxup_connect.isLliurexUpLocked()
139
140                if code !=0:
141                        message="Lliurex-Up"+self.getMessageDialog(code)
142                        self.showMessageDialog(code,message)
143                else:
144                        self.isAptLocked()     
145               
146        #def islliurexup_running       
147
148
149        def isAptLocked(self):
150
151                print "  [Lliurex-Up]: Checking if Apt is running..."
152
153                code=self.llxup_connect.isAptLocked()
154
155                if code !=0:
156                        message="Apt"+self.getMessageDialog(code)
157                        self.showMessageDialog(code,message)
158               
159                else:
160                        self.isDpkgLocked()
161       
162        #def isAptLocked               
163
164
165        def isDpkgLocked(self):
166
167                print "  [Lliurex-Up]: Checking if Dpkg is running..."
168
169                code=self.llxup_connect.isDpkgLocked()
170
171                if code !=0:
172                        tmp_msg=self.getMessageDialog(code)
173                        if code!=3:
174                                message="Dpkg"+tmp_msg
175                        else:
176                                message=tmp_msg
177
178                        self.showMessageDialog(code,message)
179                else:
180                        self.llxup_connect.startLliurexUp()
181                        self.start_gui()
182                               
183
184        #def isDpkgLocked       
185
186
187        def getMessageDialog(self,code):
188
189                if code==1:
190                        msg=_(" is now running. Wait a moment and try again")
191                elif code==2:
192                        msg=_(" seems blocked by a failed previous execution.\nLliurex-Up can not continue if this block is maintained.\nDo you want to try to unlock it? ")
193                elif code==3:
194                        msg=_("Apt is now running. Wait a moment and try again")
195
196                return msg
197
198        #def getMessageDialog                                   
199
200        def showMessageDialog(self,code,message):
201
202                if code!=2:
203                        dialog_type=Gtk.MessageType.INFO
204                        dialog_buttons=Gtk.ButtonsType.CANCEL
205                else:
206                        dialog_type=Gtk.MessageType.WARNING
207                        dialog_buttons=Gtk.ButtonsType.YES_NO   
208
209       
210                dialog = Gtk.MessageDialog(None,0,dialog_type, dialog_buttons, "Lliurex-Up")
211                dialog.format_secondary_text(message)
212                if code!=2:
213                        dialog.run()
214                        sys.exit(1)
215                else:
216                        response=dialog.run()
217                        dialog.destroy()
218                        if response==Gtk.ResponseType.YES:
219                                GObject.threads_init()
220                                self.unlocking_t=threading.Thread(target=self.unlocking_process)
221                                self.unlocking_t.daemon=True
222                                self.unlocking_t.launched=False
223                                self.unlocking_t.done=False
224                                GLib.timeout_add(100,self.pulsate_unlocking_process)
225                                self.showProgressDialog()
226                               
227
228                        else:
229                                sys.exit(1)             
230               
231                                       
232        #def showMessageDialog                         
233
234        def showProgressDialog(self):
235
236                self.unlocking_dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.INFO, Gtk.ButtonsType.CANCEL, "Lliurex-Up")
237                self.unlocking_dialog.set_size_request(510, 40)
238                self.unlocking_dialog.format_secondary_text(_("The unlocking process is running. Wait a moment..."))
239                self.unlocking_dialog_pbar=Gtk.ProgressBar()
240                self.unlocking_dialog_pbar.set_margin_left(15)
241                self.unlocking_dialog_pbar.set_margin_right(15)
242
243                self.unlocking_dialog_pbar.show()
244               
245                self.unlocking_dialog.get_children()[0].pack_start(self.unlocking_dialog_pbar,False,False,20)
246                self.unlocking_dialog.get_children()[0].get_children()[2].hide()
247                self.unlocking_dialog.run()
248
249        #def showProgressDialog
250
251
252        def pulsate_unlocking_process(self):
253
254
255                if not self.unlocking_t.launched:
256                        self.unlocking_t.launched=True
257                        self.unlocking_t.start()
258                       
259
260                if self.unlocking_t.done:
261                        self.unlocking_dialog.destroy() 
262                        if self.result_unlocking !=0:
263                                dialog=Gtk.MessageDialog(None,0,Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Lliurex-Up")
264                                dialog.format_secondary_text(_("The unlocking process has failed"))
265                                dialog.run()
266                                sys.exit(1)
267                        else:           
268                                os.execl(sys.executable, sys.executable, *sys.argv)     
269
270                if self.unlocking_t.launched:
271                        if not self.unlocking_t.done:
272                                self.unlocking_dialog_pbar.pulse()
273                                return True             
274
275
276        #def pulsate_unlocking_process 
277
278
279        def unlocking_process(self):
280
281                self.result_unlocking=self.llxup_connect.unlockingProcess()
282                self.unlocking_t.done=True
283
284        #def unlocking_process
285
286        def check_root(self):
287               
288                try:
289                        print "  [Lliurex-Up]: Checking root"
290                        f=open("/etc/lliurex-up.token","w")
291                        f.close()
292                        os.remove("/etc/lliurex-up.token")
293                except:
294                        print "  [Lliurex-Up]: No administration privileges"
295                        dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Lliurex-Up")
296                        dialog.format_secondary_text(_("You need administration privileges to run this application."))
297                        dialog.run()
298                        sys.exit(1)
299               
300        #def check_root
301
302        '''
303        def free_space_check(self):
304               
305                if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
306                        return False
307                       
308                        md = Gtk.MessageDialog(None, 0,Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL," Lliurex UP")
309                        md.format_secondary_text(_("There's not enough space on disk to upgrade (2 GB needed)"))
310                        md.run()
311                        md.destroy()
312                        sys.exit(1)
313                       
314                else:
315                        return True     
316
317        # def free_space_check
318        '''
319                       
320        def start_gui(self):
321               
322                builder=Gtk.Builder()
323                builder.set_translation_domain('lliurex-up')
324
325                glade_path=GLADE_FILE
326                builder.add_from_file(glade_path)
327
328                self.stack = Gtk.Stack()
329                self.stack.set_transition_duration(1000)
330                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
331
332
333                self.window=builder.get_object("main_window")
334                self.window.resize(640,769)
335                self.main_box=builder.get_object("main_box")
336                self.pbar=builder.get_object("progressbar")
337                self.pbar_label=builder.get_object("progressbar_label")
338               
339
340                self.cancel_button_box=builder.get_object("cancel_button_box")
341                self.cancel_button_eb=builder.get_object("cancel_button_eventbox")
342                self.cancel_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
343                self.cancel_button_eb.connect("button-press-event", self.quit)
344                self.cancel_button_eb.connect("motion-notify-event", self.mouse_over_cancel)
345                self.cancel_button_eb.connect("leave-notify-event", self.mouse_exit_cancel)
346                self.cancel_button_label=builder.get_object("cancel_button_label")
347
348                self.indicator_box=builder.get_object("indicator_box")
349                self.indicator_label=builder.get_object("indicator_label")
350                self.indicator_switch=builder.get_object("indicator_switch")
351
352               
353                if os.path.exists(DISABLE_INDICATOR_TOKEN):
354                        self.indicator_switch.set_active(False)
355                else:
356                        self.indicator_switch.set_active(True)
357       
358               
359
360                self.gather_box=builder.get_object("gather_box")
361                self.yes_button_box=builder.get_object("yes_button_box")
362                self.yes_button_eb=builder.get_object("yes_button_eventbox")
363                self.yes_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
364                self.yes_button_eb.connect("button-release-event", self.yes_button_clicked)
365                self.yes_button_eb.connect("motion-notify-event", self.mouse_over_yes)
366                self.yes_button_eb.connect("leave-notify-event", self.mouse_exit_yes)
367                self.yes_button_label=builder.get_object("yes_button_label")
368
369                self.no_button_box=builder.get_object("no_button_box")
370                self.no_button_eb=builder.get_object("no_button_eventbox")
371                self.no_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
372                self.no_button_eb.connect("button-release-event", self.no_button_clicked)
373                self.no_button_eb.connect("motion-notify-event", self.mouse_over_no)
374                self.no_button_eb.connect("leave-notify-event",self.mouse_exit_no)
375                self.no_button_label=builder.get_object("no_button_label")
376                self.gather_logo_box=builder.get_object("gather_logo_box")
377                self.gather_label=builder.get_object("gather_label")
378                self.spinner=builder.get_object("spinner")
379
380                self.update_box=builder.get_object("update_box")
381                self.current_version_label=builder.get_object("current_version_label")
382                self.current_version_label_info=builder.get_object("current_version_info_label")
383                self.version_available_label=builder.get_object("version_available_label")
384                self.version_available_label_info=builder.get_object("version_available_info_label")
385                self.version_update_label=builder.get_object("version_update_label")
386                self.version_update_label_info=builder.get_object("version_update_info_label")
387                self.number_packages_label=builder.get_object("number_packages_label")
388                self.number_packages_label_info=builder.get_object("number_packages_info_label")
389
390                self.size_update_label=builder.get_object("size_update_label")
391                self.size_update_label_info=builder.get_object("size_update_info_label")
392
393                self.view_packages_button_box=builder.get_object("view_packages_button_box")
394                self.view_packages_eb=builder.get_object("view_packages_eventbox")
395                self.view_packages_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
396                self.view_packages_eb.connect("button-release-event", self.view_packages_clicked)
397                self.view_packages_eb.connect("motion-notify-event", self.mouse_over_view_packages)
398                self.view_packages_eb.connect("leave-notify-event", self.mouse_exit_view_packages)
399
400                self.view_packages_label=builder.get_object("view_packages_label")
401
402                self.update_button_box=builder.get_object("update_button_box")
403                self.update_button_eb=builder.get_object("update_button_eventbox")
404                self.update_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
405                self.update_button_eb.connect("button-release-event", self.upgrade_process)
406                self.update_button_eb.connect("motion-notify-event", self.mouse_over_update_button)
407                self.update_button_eb.connect("leave-notify-event", self.mouse_exit_update_button)
408
409                self.update_button_label=builder.get_object("update_button_label")
410                self.update_button_label.set_label(_("Update now"))
411                self.update_button_label.set_width_chars(20)
412                self.update_button_label.set_max_width_chars(20)
413
414                self.terminal_label=builder.get_object("terminal_label")
415                self.viewport=builder.get_object("viewport")
416                self.terminal_scrolled=builder.get_object("terminalScrolledWindow")
417                self.vterminal=Vte.Terminal()
418                self.vterminal.spawn_sync(
419                        Vte.PtyFlags.DEFAULT,
420                        os.environ['HOME'],
421                        #["/usr/sbin/dpkg-reconfigure", "xdm"],
422                        ["/bin/bash","--rcfile",TERMINAL_CONFIG],
423                        [],
424                        GLib.SpawnFlags.DO_NOT_REAP_CHILD,
425                        None,
426                        None,
427                )
428                font_terminal = Pango.FontDescription("monospace normal 10")
429                self.vterminal.set_font(font_terminal)
430                self.vterminal.set_scrollback_lines(-1)
431                self.vterminal.set_sensitive(False)
432                self.terminal_scrolled.add(self.vterminal)
433               
434
435                self.packages_box=builder.get_object("packages_box")
436                self.return_arrow_box=builder.get_object("return_arrow_box")
437                self.return_arrow_eb=builder.get_object("return_arrow_eventbox")
438                self.return_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
439                self.return_arrow_eb.connect("button-release-event", self.arrow_clicked)
440                self.return_arrow_eb.connect("motion-notify-event",self.mouse_over_return_arrow)
441                self.return_arrow_eb.connect("leave-notify-event",self.mouse_exit_return_arrow)
442                self.packages_label=builder.get_object("packages_label")
443                self.packages_tv=builder.get_object("packages_treeview")
444                self.changelog_texview=builder.get_object("changelog_textview")
445
446                #self.packages_store=Gtk.ListStore(str,str,str,GdkPixbuf.Pixbuf)
447                self.packages_store=Gtk.ListStore(GdkPixbuf.Pixbuf,str,str,str,GdkPixbuf.Pixbuf)
448                self.packages_tv.set_model(self.packages_store)
449
450                column=Gtk.TreeViewColumn("")
451                cell=Gtk.CellRendererPixbuf()
452                column.pack_start(cell,True)
453                column.add_attribute(cell,"pixbuf",0)
454                self.packages_tv.append_column(column)
455
456                column=Gtk.TreeViewColumn("")
457                cell=Gtk.CellRendererPixbuf()
458                cell.set_property("stock-size",Gtk.IconSize.DIALOG)
459                column.pack_start(cell,True)
460                column.add_attribute(cell,"icon-name",1)
461                self.packages_tv.append_column(column)
462               
463                column=Gtk.TreeViewColumn(_("Package"))
464                cell=Gtk.CellRendererText()
465                column.pack_start(cell,True)
466                column.add_attribute(cell,"markup",2)
467                column.set_expand(True)
468
469               
470                self.packages_tv.append_column(column)
471                self.packages_tv.connect("button-release-event",self.package_clicked)
472               
473                column=Gtk.TreeViewColumn(_("Size"))
474                cell=Gtk.CellRendererText()
475                cell.set_property("alignment",Pango.Alignment.CENTER)
476                column.pack_start(cell,False)
477                column.add_attribute(cell,"markup",3)
478                self.packages_tv.append_column(column)         
479
480
481                # done_icon=Gtk.Image()
482                # done_icon.set_from_file(CACHED_ICON)
483                # pixbuf=done_icon.get_pixbuf()
484                column=Gtk.TreeViewColumn(_("State"))
485                cell=Gtk.CellRendererPixbuf()
486                column.pack_start(cell,True)
487                column.add_attribute(cell,"pixbuf",4)
488                self.packages_tv.append_column(column)
489               
490                self.changelog_textview=builder.get_object("changelog_textview")
491                self.changelog_label=builder.get_object("changelog_label")
492
493
494                self.stack.add_titled(self.gather_box,"gather","Gather")
495                self.stack.add_titled(self.update_box,"update", "Update")
496                self.stack.add_titled(self.packages_box, "packages", "Packages")
497
498                self.main_box.pack_start(self.stack,True,False,5)
499
500                self.window.show_all()
501                self.terminal_scrolled.hide()
502                self.viewport.hide()
503                self.terminal_label.hide()
504                self.cancel_button_box.hide()
505                self.indicator_box.hide()
506                self.yes_button_box.hide()
507                self.no_button_box.hide()
508
509                self.pbar_label.show()
510                self.pbar.show()
511               
512                self.window.connect("destroy",self.quit)
513               
514                self.set_css_info()
515
516                msg_gather="<span><b>"+_("Checking system")+"</b></span>"
517                self.gather_label.set_markup(msg_gather)
518                GLib.timeout_add(100,self.pulsate_checksystem)
519
520                self.initactions_process_t=threading.Thread(target=self.initActions_process)
521                self.check_lliurexup_t=threading.Thread(target=self.check_lliurexup_version)
522                self.install_lliurexup_t=threading.Thread(target=self.install_lliurexup)
523                self.check_mirror_t=threading.Thread(target=self.check_mirror)
524                #self.wait_response_t=threading.Thread(target=self.wait_response)
525                self.execute_lliurexmirror_t=threading.Thread(target=self.execute_lliurexmirror)
526                self.get_lliurexversionlocal_t=threading.Thread(target=self.get_lliurexversionlocal)
527                self.get_lliurexversionnet_t=threading.Thread(target=self.get_lliurexversionnet)
528                self.checkInitialFlavourToInstall_t=threading.Thread(target=self.checkInitialFlavourToInstall)
529                self.gather_packages_t=threading.Thread(target=self.gather_packages)
530                self.preactions_process_t=threading.Thread(target=self.preactions_process)
531                self.update_process_t=threading.Thread(target=self.update_process)
532                self.checkFinalFlavourToInstall_t=threading.Thread(target=self.checkFinalFlavourToInstall)
533                self.postactions_process_t=threading.Thread(target=self.postactions_process)
534
535                self.initactions_process_t.daemon=True
536                self.check_lliurexup_t.daemon=True
537                self.install_lliurexup_t.daemon=True
538                self.check_mirror_t.daemon=True
539                #self.wait_response_t.daemon=True
540                self.execute_lliurexmirror_t.daemon=True
541                self.get_lliurexversionlocal_t.daemon=True
542                self.get_lliurexversionnet_t.daemon=True
543                self.checkInitialFlavourToInstall_t.daemon=True
544                self.gather_packages_t.daemon=True
545                self.preactions_process_t.daemon=True
546                self.update_process_t.daemon=True
547                self.checkFinalFlavourToInstall_t.daemon=True
548                self.postactions_process_t.daemon=True
549
550                self.initactions_process_t.done=False
551                self.check_lliurexup_t.done=False
552                self.install_lliurexup_t.done=False
553                self.check_mirror_t.done=False
554                #self.wait_response_t.done=False
555                self.execute_lliurexmirror_t.done=False
556                self.get_lliurexversionlocal_t.done=False
557                self.get_lliurexversionnet_t.done=False
558                self.checkInitialFlavourToInstall_t.done=False
559                self.gather_packages_t.done=False
560                self.preactions_process_t.done=False
561                self.update_process_t.done=False
562                self.checkFinalFlavourToInstall_t.done=False
563                self.postactions_process_t.done=False
564               
565                self.initactions_process_t.launched=False
566                self.check_lliurexup_t.launched=False
567                self.install_lliurexup_t.launched=False
568                self.check_mirror_t.launched=False
569                #self.wait_response_t.launched=False
570                self.execute_lliurexmirror_t.launched=False
571                self.get_lliurexversionlocal_t.launched=False
572                self.get_lliurexversionnet_t.launched=False
573                self.checkInitialFlavourToInstall_t.launched=False
574                self.gather_packages_t.launched=False
575                self.preactions_process_t.launched=False
576                self.update_process_t.launched=False
577                self.checkFinalFlavourToInstall_t.launched=False
578                self.postactions_process_t.launched=False
579               
580                self.spinner.start()
581                self.package_list=[]
582                self.max_seconds=5.0
583                self.current_second=0
584                self.number_process=8
585
586                GObject.threads_init()
587                Gtk.main()
588
589        #def start_gui
590       
591        def set_css_info(self):
592       
593                css = """
594
595
596                #WHITE_BACKGROUND {
597                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
598               
599                }
600
601                #BUTTON_LABEL{
602                        color:white;
603                        font: Roboto 10;
604                }
605
606                #DISABLED_BUTTON_OVER{
607                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
608                }
609               
610                #DISABLED_BUTTON{
611                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
612                }
613               
614                #CANCEL_BUTTON{
615                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
616                }
617               
618                #CANCEL_BUTTON_OVER{
619                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
620                }
621
622                #BUTTON_COLOR {
623                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
624               
625                }
626               
627                #BUTTON_OVER_COLOR {
628                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
629                       
630               
631                }
632
633                #UPDATE_BUTTON_LABEL{
634                        color:white;
635                        font: Roboto 11;
636                }
637               
638                #UPDATE_CORRECT_BUTTON_COLOR {
639                        background-image:-gtk-gradient (linear, left top, left bottom, from (#979797),  to (#979797));;
640               
641                }
642
643                #UPDATE_OVER_COLOR {
644                        background-image:-gtk-gradient (linear, left top, left bottom, from (#53b757),  to (#53b757));;
645               
646                }
647
648
649                #UPDATE_ERROR_BUTTON_COLOR {
650                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
651               
652                }
653
654                #UPDATE_LAUNCHED_OVER_COLOR {
655                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
656               
657                }
658
659                #UPDATE_BUTTON_LAUNCHED_COLOR {
660                        background-image:-gtk-gradient (linear, left top, left bottom, from (#7cadff), to (#7cadff));;
661
662                }
663                               
664                #GATHER_ICON_COLOR {
665                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
666               
667                }
668               
669               
670                #BLUE_FONT {
671                        color: #3366cc;
672                        font: Roboto Bold 11;
673                       
674                }       
675               
676
677                #CHANGELOG_FONT {
678                        color: #3366cc;
679                        font: Roboto 11;
680                       
681                }
682
683                #LABEL_OPTION{
684               
685                        color: #808080;
686                        font: Roboto 11;
687                }
688
689                #ERROR_FONT {
690                        color: #CC0000;
691                        font: Roboto Bold 11;
692                }
693
694                #CORRECT_FONT {
695                        color: #43a047;
696                        font: Roboto Bold 11;
697
698                }
699               
700                #DISABLED_BUTTON{
701                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
702                }
703                """
704
705                self.style_provider=Gtk.CssProvider()
706                self.style_provider.load_from_data(css)
707                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
708               
709                self.window.set_name("WHITE_BACKGROUND")
710                self.update_box.set_name("WHITE_BACKGROUND")
711                self.gather_box.set_name("WHITE_BACKGROUND")
712                self.packages_box.set_name("WHITE_BACKGROUND")
713                self.gather_label.set_name("CHANGELOG_FONT")
714                self.pbar_label.set_name("CHANGELOG_FONT")
715
716                self.yes_button_box.set_name("BUTTON_COLOR")
717                self.yes_button_label.set_name("BUTTON_LABEL")
718
719                self.no_button_box.set_name("BUTTON_COLOR")
720                self.no_button_label.set_name("BUTTON_LABEL")
721
722                self.view_packages_button_box.set_name("BUTTON_COLOR")
723                self.view_packages_label.set_name("BUTTON_LABEL")
724
725                self.cancel_button_box.set_name("BUTTON_COLOR")
726                self.cancel_button_label.set_name("BUTTON_LABEL")
727                self.indicator_label.set_name("LABEL_OPTION")   
728
729                self.current_version_label.set_name("LABEL_OPTION")
730                self.version_available_label.set_name("LABEL_OPTION")
731                self.version_update_label.set_name("LABEL_OPTION")     
732                self.number_packages_label.set_name("LABEL_OPTION")
733                self.size_update_label.set_name("LABEL_OPTION")
734                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
735                self.update_button_box.set_name("BUTTON_COLOR")
736                self.terminal_label.set_name("CHANGELOG_FONT")
737                self.current_version_label_info.set_name("BLUE_FONT")
738                self.version_available_label_info.set_name("BLUE_FONT")
739                self.version_update_label_info.set_name("BLUE_FONT")
740                self.number_packages_label_info.set_name("BLUE_FONT")
741                self.size_update_label_info.set_name("BLUE_FONT")
742
743
744                self.packages_label.set_name("LABEL_OPTION")
745                #self.changelog_label.set_name("LABEL_OPTION")
746                self.changelog_texview.set_name("CHANGELOG_FONT")
747                self.return_arrow_box.set_name("BUTTON_COLOR")
748               
749        #def set_css_info       
750
751
752        def pulsate_checksystem(self):
753
754                #self.pbar.pulse()
755
756                abort=False
757                if not self.initactions_process_t.launched:
758                        print "  [Lliurex-Up]: Checking system: connection to lliurex.net and init-actions"
759                        self.initactions_process_t.start()
760                        self.initactions_process_t.launched=True
761                        self.show_number_process_executing(1,"")
762                # if not self.check_lliurexup_t.launched:
763                #       print "[Lliurex-Up]: Checking Lliurex-up version"
764                #       self.check_lliurexup_t.start()
765                #       self.check_lliurexup_t.launched=True
766                #       self.show_number_process_executing(1,"")
767
768                if self.initactions_process_t.done:
769                        if self.free_space:
770                                if self.statusN4d:
771                                        if self.can_connect:
772                                                #is_mirror_running_inserver=self.llxup_connect.clientCheckingMirrorIsRunning()
773                                                if self.is_mirror_running_inserver==False:
774
775                                                        if  not self.check_lliurexup_t.is_alive() and not self.check_lliurexup_t.launched:
776                                                                print "  [Lliurex-Up]: Checking Lliurex-Up version"
777                                                                msg_gather="<span><b>"+_("Looking for new version of LliureX Up")+"</b></span>"
778                                                                self.gather_label.set_markup(msg_gather)
779                                                                self.check_lliurexup_t.start()
780                                                                self.check_lliurexup_t.launched=True
781                                                                self.show_number_process_executing(2,"")
782
783
784                                                        if  self.check_lliurexup_t.done:
785                                                                if not self.is_lliurexup_updated:
786                                                                        if  not self.install_lliurexup_t.is_alive() and not self.install_lliurexup_t.launched:
787                                                                                print "  [Lliurex-Up]: Updating Lliurex-Up"
788                                                                                msg_gather="<span><b>"+_("Updating LliureX Up")+"</b></span>"
789                                                                                self.gather_label.set_markup(msg_gather)
790                                                                                self.install_lliurexup_t.start()
791                                                                                self.install_lliurexup_t.launched=True
792                                                                                self.show_number_process_executing(3,"")
793
794                                                                        else:
795                                                                                if self.install_lliurexup_t.done:
796                                                                                        print "  [Lliurex-Up]: Reboot Lliurex-Up"
797                                                                                        #msg_gather="<span><b>"+_("Lliurex-up is now updated and will be reboot")+"</b></span>"
798                                                                                        #self.pbar.hide()
799                                                                                        #self.gather_label.set_markup(msg_gather)
800                                                                                        #self.t=threading.Thread(target=self.reboot_lliurexup)
801                                                                                        self.pbar_label.hide()
802                                                                                        self.msg_wait="<span><b>"+_("LliureX Up is now updated and will be reboot in %s seconds...")+"</b></span>"
803                                                                                        GLib.timeout_add(10,self.wait_to_reboot)
804                                                                                        #self.t.daemon=True
805                                                                                        #self.t.start()
806                                                                                        return False
807                                                                else:
808                                                                        if not self.check_mirror_t.is_alive() and not self.check_mirror_t.launched:
809                                                                                print "  [Lliurex-Up]: Checking if mirror exist"
810                                                                                msg_gather="<span><b>"+_("Checking if mirror exist and there is updated")+"</b></span>"
811                                                                                self.gather_label.set_markup(msg_gather)
812                                                                                self.check_mirror_t.start()
813                                                                                self.check_mirror_t.launched=True
814                                                                                self.show_number_process_executing(4,"")
815
816
817                                                                       
818                                                                        if      self.check_mirror_t.done:
819                                                                                is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
820
821                                                                                if not self.is_mirror_updated:
822                                                                                        if not is_mirror_running:
823                                                                                                print "  [Lliurex-Up]: Asking if mirror will be update"
824                                                                                                self.yes_button_box.show()
825                                                                                                self.no_button_box.show()
826                                                                                                self.pbar.hide()
827                                                                                                self.pbar_label.hide()
828                                                                                                #self.spinner.stop()
829                                                                                                msg_gather="<span><b>"+_("Your mirror is not update. Do you want to update it?")+"</b></span>"
830                                                                                                self.gather_label.set_markup(msg_gather)
831                                                                                                #GLib.timeout_add(100,self.pulsate_wait_response)
832                                                                                                return False
833
834                                                                                        else:
835                                                                                                self.mirror_running_msg()
836                                                                                                return False
837
838                                                                                else:   
839                                                                                        if is_mirror_running:
840                                                                                                self.mirror_running_msg()
841                                                                                                return False
842                                                                                        else:   
843                                                                                                print "  [Lliurex-Up]: Nothing to do with mirror"
844                                                                                                GLib.timeout_add(100,self.pulsate_get_info)
845                                                                                                return False
846                                       
847                                                else:
848                                                        abort=True
849                                                        '''
850                                                        self.spinner.stop()
851                                                        self.pbar.hide()
852                                                        self.pbar_label.hide()
853                                                        self.cancel_button_box.show()
854                                                        self.gather_label.set_name("ERROR_FONT")
855                                                        '''
856                                                        if self.is_mirror_running_inserver:
857                                                                msg_gather="<span><b>"+_("Mirror is being updated in server. Unable to update the system")+"</b></span>"
858                                                                print "  [Lliurex-Up]: Mirror is being updated in server"
859                                                        else:
860                                                                msg_gather="<span><b>"+_("Unable to connect with server")+"</b></span>"
861                                                                print "  [Lliurex-Up]: Unable to connect with server"
862
863
864                                                        #self.gather_label.set_markup(msg_gather)
865                                                        #return False
866
867
868                                        else:
869                                                abort=True
870                                                '''
871                                                self.spinner.stop()
872                                                self.pbar.hide()
873                                                self.pbar_label.hide()
874                                                self.cancel_button_box.show()
875                                                self.gather_label.set_name("ERROR_FONT")
876                                                '''
877                                                msg_gather="<span><b>"+_("Unable to connect to lliurex.net")+"</b></span>"
878                                                #self.gather_label.set_markup(msg_gather)
879                                                print "  [Lliurex-Up]: Unable to connect to lliurex.net"
880                                                #return False
881
882                                else:
883                                        abort=True
884                                        '''
885                                        self.spinner.stop()
886                                        self.pbar.hide()
887                                        self.pbar_label.hide()
888                                        self.cancel_button_box.show()
889                                        self.gather_label.set_name("ERROR_FONT")
890                                        '''
891                                        msg_gather="<span><b>"+_('N4d is not working. Restart the service and try againg')+"</b></span>"
892                                        #self.gather_label.set_markup(msg_gather)
893                                        print "  [Lliurex-Up]: N4d is not working"
894                                        #return False
895                        else:
896                                abort=True
897                                msg_gather="<span><b>"+_("There's not enough space on disk to upgrade (2 GB needed)")+"</b></span>"
898                                print "  [Lliurex-Up]: Not enough space on disk"
899                                                               
900                if abort:
901                        self.spinner.stop()
902                        self.pbar.hide()
903                        self.pbar_label.hide()
904                        self.cancel_button_box.show()
905                        self.show_indicator_switch()
906                        self.gather_label.set_name("ERROR_FONT")
907                        self.gather_label.set_markup(msg_gather)
908                        return False
909               
910                               
911                if self.initactions_process_t.is_alive():
912                        return True                                     
913
914                if  self.check_lliurexup_t.launched:
915                        if self.check_lliurexup_t.is_alive():
916                                return True
917
918                if self.install_lliurexup_t.launched: 
919                        if self.install_lliurexup_t.is_alive():
920                                return True     
921                                       
922                if self.check_mirror_t.launched:
923                        if self.check_mirror_t.is_alive():
924                                return True
925
926               
927        #def pulsate_checksystem       
928
929        def wait_to_reboot(self):
930
931                csecond=int(self.max_seconds+1-self.current_second)
932                self.gather_label.set_markup(self.msg_wait%csecond)
933                self.pbar.set_fraction(self.current_second/self.max_seconds)
934
935                self.current_second+=0.01
936
937                if self.current_second>=self.max_seconds:
938                        self.llxup_connect.cleanLliurexUpLock()
939                        os.execl(sys.executable, sys.executable, *sys.argv)     
940                        return False
941                else:
942                        return True
943
944        #def wait_to_reboot
945
946       
947        def initActions_process(self):
948                time.sleep(5)
949                self.free_space=self.llxup_connect.free_space_check()
950                if self.free_space:
951                        self.statusN4d=self.llxup_connect.checkInitialN4dStatus()
952                        if self.statusN4d:
953                                self.llxup_connect.checkInitialFlavour()
954                                self.can_connect=self.llxup_connect.canConnectToLliurexNet()
955                                if self.can_connect:
956                                        self.is_mirror_running_inserver=self.llxup_connect.clientCheckingMirrorIsRunning()
957                                        self.llxup_connect.initActionsScript()
958
959                self.initactions_process_t.done=True
960       
961        def check_lliurexup_version(self):
962
963                #time.sleep(5) 
964                self.is_lliurexup_updated=self.llxup_connect.isLliurexUpIsUpdated()
965                self.check_lliurexup_t.done=True
966               
967        #def check_lliurexup_version   
968               
969        def install_lliurexup(self):
970
971                self.is_lliurexup_installed=self.llxup_connect.installLliurexUp()
972                self.install_lliurexup_t.done=True
973
974        #def install_lliurexup 
975
976               
977        def check_mirror(self):
978
979                self.is_mirror_updated=self.llxup_connect.lliurexMirrorIsUpdated()
980                self.check_mirror_t.done=True
981       
982        #def check_mirror       
983
984        def no_button_clicked(self,widget,event):
985               
986                #self.response=0
987                self.pbar.show()
988                self.pbar_label.show() 
989                GLib.timeout_add(100,self.pulsate_get_info)
990                self.yes_button_box.hide()
991                self.no_button_box.hide()
992                log_msg="Update lliurex-mirror: No"
993                self.llxup_connect.log(log_msg)
994
995        #def def no_button_clicked
996               
997        def yes_button_clicked(self,widget,event):
998       
999                #self.response=1
1000                self.pbar.show()
1001                self.pbar_label.show()
1002                print "[Lliurex-Up]: Updating mirror"
1003                self.updated_percentage(0)
1004                #self.spinner.start()
1005                self.yes_button_box.hide()
1006                self.no_button_box.hide()
1007                #msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
1008                #self.gather_label.set_markup(msg_gather)
1009                self.execute_lliurexmirror_t.start()
1010                self.mirror_running_msg()
1011                #GLib.timeout_add(1000,self.pulsate_updating_mirror)
1012                log_msg="Update lliurex-mirror: Yes"
1013                print log_msg
1014                self.llxup_connect.log(log_msg)
1015
1016        #def yes_button_clicked
1017
1018        def pulsate_updating_mirror(self):
1019
1020                self.is_mirror_running=self.llxup_connect.lliurexMirrorIsRunning()
1021
1022                if self.is_mirror_running or self.execute_lliurexmirror_t.is_alive():
1023                        mirror_percentage=self.llxup_connect.getPercentageLliurexMirror()
1024                        self.updated_percentage(mirror_percentage)
1025                        return True
1026               
1027                else:
1028                        #self.spinner.stop()
1029                        #self.pbar_label.hide()
1030                        GLib.timeout_add(100,self.pulsate_get_info)
1031                        return False   
1032
1033        #def pulsate_updating_mirro             
1034
1035        def execute_lliurexmirror(self):
1036               
1037                commands.getoutput('/usr/sbin/lliurex-mirror-gui')
1038
1039        #def def execute_lliurexmirror 
1040
1041        def mirror_running_msg(self):
1042
1043                self.spinner.start()
1044                msg_gather="<span><b>"+_("Mirror is being updated. The process may take several minutes")+"</b></span>"
1045                self.gather_label.set_markup(msg_gather)
1046                GLib.timeout_add(1000,self.pulsate_updating_mirror)
1047
1048        #def mirror_running_msg
1049
1050
1051        def pulsate_get_info(self):
1052
1053                #self.pbar.pulse()
1054 
1055                if not self.get_lliurexversionlocal_t.launched:
1056                        print "  [Lliurex-Up]: Looking for LliurexVersion from local repository "
1057                        msg_gather="<span><b>"+_("Looking for new version to update")+"</b></span>"
1058                        self.gather_label.set_markup(msg_gather)
1059                        self.get_lliurexversionlocal_t.start()
1060                        self.get_lliurexversionlocal_t.launched=True
1061                        self.show_number_process_executing(5,"")
1062
1063
1064
1065                if self.get_lliurexversionlocal_t.done:
1066                        if not self.get_lliurexversionnet_t.is_alive() and not self.get_lliurexversionnet_t.launched:
1067                                print "  [Lliurex-Up]: Looking for LliurexVersion from Lliurex net"
1068                                msg_gather="<span><b>"+_("Looking for new version available")+"</b></span>"
1069                                self.gather_label.set_markup(msg_gather)
1070                                self.get_lliurexversionnet_t.start()   
1071                                self.get_lliurexversionnet_t.launched=True
1072                                self.show_number_process_executing(6,"")
1073
1074
1075
1076                        if self.get_lliurexversionnet_t.done:
1077
1078                                if not self.checkInitialFlavourToInstall_t.is_alive() and not self.checkInitialFlavourToInstall_t.launched:
1079                                        print "  [Lliurex-Up]: Checking if installation of metapackage is required"
1080                                        msg_gather="<span><b>"+_("Checking if installation of metapackage is required")+"</b></span>"
1081                                        self.gather_label.set_markup(msg_gather)
1082                                        self.checkInitialFlavourToInstall_t.start()
1083                                        self.checkInitialFlavourToInstall_t.launched=True
1084                                        self.show_number_process_executing(7,"")
1085
1086
1087
1088                                if self.checkInitialFlavourToInstall_t.done:
1089
1090                                        if not self.gather_packages_t.is_alive() and not self.gather_packages_t.launched:
1091                                                print "  [Lliurex-Up]: Looking for for new updates"
1092                                                msg_gather="<span><b>"+_("Looking for new updates")+"</b></span>"
1093                                                self.gather_label.set_markup(msg_gather)
1094                                                self.gather_packages_t.start()
1095                                                self.gather_packages_t.launched=True
1096                                                self.show_number_process_executing(8,"")
1097
1098
1099                                        if self.gather_packages_t.done:
1100                                                self.spinner.stop()
1101                                                self.pbar.hide()
1102                                                self.pbar_label.hide()
1103                                                self.cancel_button_box.show()   
1104                                                self.show_indicator_switch()
1105
1106                                                if len(self.packages)==0:
1107                                                                system_update=True
1108
1109                                                                if self.is_flavour_installed!=0:
1110                                                                        system_update=False
1111                                                                else:   
1112
1113                                                                        if self.version_update["candidate"]!=None:
1114
1115                                                                                if self.version_update["installed"]!=self.version_update["candidate"]:
1116                                                                                        system_update=False
1117                                                                                                                       
1118                                                                        else:
1119                                                                                if self.version_update["installed"]!=self.version_available:
1120                                                                                        system_update=False
1121
1122                                                                if not system_update:
1123                                                                                self.gather_label.set_name("ERROR_FONT")
1124                                                                                msg_gather="<span><b>"+_("Updated abort. An error occurred in the search for updates")+"</b></span>"
1125                                                                                self.gather_label.set_markup(msg_gather)
1126                                                                                log_msg="Updated abort. An error occurred in the search for updates"
1127                                                                                self.llxup_connect.log(log_msg)
1128                                                                                print "  [Lliurex-Up]: Error in search for updates"
1129                                                                                return False
1130                                                                else:
1131                                                                        self.show_indicator_switch()
1132                                                                        self.cancel_button_label.set_label(_("Close"))
1133                                                                        msg_gather="<span><b>"+_("Your system is update")+"</b></span>"
1134                                                                        self.gather_label.set_markup(msg_gather)
1135                                                                        log_msg="System update. Nothing to do"
1136                                                                        self.llxup_connect.log(log_msg)
1137                                                                        print "  [Lliurex-Up]: System update. Nothing to do"
1138                                                                        return False
1139                                                                                                       
1140                                                else:
1141                                                        if not self.incorrect_flavours:
1142
1143                                                                print "  [Lliurex-Up]: System nor update"       
1144
1145                                                                #self.requires_installing_metapackage()
1146                                                                self.parse_packages_updated()
1147                                                                self.populate_packages_tv()
1148                                                                self.get_update_summary()
1149                                                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1150                                                                self.stack.set_visible_child_name("update")     
1151                                                                return False
1152                                                        else:
1153                                                                self.gather_label.set_name("ERROR_FONT")
1154                                                                msg_gather="<span><b>"+_("Updated abort for incorrect metapackages detected in update")+"</b></span>"
1155                                                                self.gather_label.set_markup(msg_gather)
1156                                                                #self.pbar.hide()
1157                                                                log_msg="Updated abort for incorrect metapackages detected in update"
1158                                                                self.llxup_connect.log(log_msg)
1159                                                                print "  [Lliurex-Up]: Update abort. Detect incorrect metapackages in new updates"
1160                                                                return False                                                   
1161               
1162
1163                if self.get_lliurexversionlocal_t.launched:
1164                        if self.get_lliurexversionlocal_t.is_alive():
1165                                return True     
1166
1167                if self.get_lliurexversionnet_t.launched:
1168                        if self.get_lliurexversionnet_t.is_alive():
1169                                return True                             
1170
1171                if self.checkInitialFlavourToInstall_t.launched:
1172                        if self.checkInitialFlavourToInstall_t.is_alive():
1173                                return True
1174
1175                if self.gather_packages_t.launched:
1176                        if self.gather_packages_t.is_alive():
1177                                return True
1178
1179        #def pulsate_get_info   
1180
1181        def get_lliurexversionlocal(self):
1182                self.version_update=self.llxup_connect.getLliurexVersionLocal()
1183                self.get_lliurexversionlocal_t.done=True
1184
1185        #def get_lliurexversionlocal
1186       
1187        def get_lliurexversionnet(self):
1188                self.version_available=self.llxup_connect.getLliurexVersionNet()
1189                self.get_lliurexversionnet_t.done=True
1190
1191
1192        #def get_lliurexversionlocal   
1193       
1194        def checkInitialFlavourToInstall(self):
1195                self.is_flavour_installed=0
1196                self.targetMetapackage=self.llxup_connect.targetMetapackage
1197
1198                if self.targetMetapackage == None:
1199                        # self.flavourToInstall=self.llxup_connect.requiresInstallFlavour()
1200                        # if self.flavourToInstall != None:
1201                        #       print self.flavourToInstall
1202                        #       print "  [Lliurex-Up]: Installation of flavour is required"
1203                        #       self.is_flavour_installed=self.llxup_connect.installInitialFlavour(self.flavourToInstall)       
1204                        #       self.checkInitialFlavourToInstall_t.done=True   
1205                        # else:
1206                        print "  [Lliurex-Up]: Installation of metapackage is not required"
1207                        self.checkInitialFlavourToInstall_t.done=True   
1208
1209                else:
1210                        print "  [Lliurex-Up]: Installation of metapackage is required: " +str(self.targetMetapackage)
1211                        self.is_flavour_installed=self.llxup_connect.installInitialFlavour(self.targetMetapackage)     
1212                        self.checkInitialFlavourToInstall_t.done=True                   
1213
1214        #def checkInitialFlavourToInstall(
1215       
1216        def gather_packages(self):
1217
1218                self.packages,self.size_update=self.llxup_connect.getPackagesToUpdate()
1219                self.incorrect_flavours=self.llxup_connect.checkIncorrectFlavours()
1220                self.gather_packages_t.done=True
1221
1222               
1223        #def gather_info
1224
1225
1226        def get_update_summary(self):
1227
1228                #self.version_available=self.llxup_connect.getLliurexVersionNet()
1229                if self.version_update["installed"]==None:
1230                        msg_current_version_info=_("Not available")
1231
1232                else:
1233                        msg_current_version_info=str(self.version_update["installed"])
1234
1235
1236                if self.version_available==None:
1237                        if 'client' in self.llxup_connect.previousFlavours or self.targetMetapackage=='lliurex-meta-client':
1238                                msg_version_available_info=_("Not available for clients")
1239
1240                        else:
1241                                self.version_available_label_info.set_name("ERROR_FONT")
1242                                msg_version_available_info=_("Not available. Check conexion to lliurex.net")
1243
1244                else:
1245                        msg_version_available_info=self.version_available
1246
1247
1248                if self.version_update["candidate"]==None:
1249                        msg_version_update_info=_("Not available")
1250
1251                else:
1252                        msg_version_update_info=self.version_update["candidate"]
1253
1254                self.number_pkg=len(self.packages)
1255                 
1256                self.size_update_label.show()
1257
1258                msg_number_info=str(self.number_pkg)+ " ("  +str(self.newpackages)+ _(" new)")
1259
1260                msg_size=self.size_update
1261
1262               
1263                self.current_version_label_info.set_markup(msg_current_version_info)
1264                self.version_available_label_info.set_markup(msg_version_available_info)
1265                self.version_update_label_info.set_markup(msg_version_update_info)
1266                self.number_packages_label_info.set_markup(msg_number_info)
1267                self.size_update_label_info.set_markup(msg_size)
1268               
1269        #def get_update_summary
1270               
1271        def updated_percentage(self,completed):
1272
1273                percentage=completed/100.0
1274
1275                self.pbar.set_fraction(percentage)
1276               
1277                msg_value=format(completed,'.0f')
1278               
1279                msg_percentage="<span><b>"+msg_value+"%"+"</b></span>"
1280                self.pbar_label.set_markup(msg_percentage)
1281               
1282               
1283        #def updated_percentage
1284               
1285        def show_number_process_executing(self, execprocess, processname):
1286
1287                self.total_process=self.number_process+1.0
1288                self.pbar.set_fraction(execprocess/self.total_process)
1289                if processname =="":
1290                        msg_pbar=_("Executing process: ") + str(execprocess) + _(" of ") + str(self.number_process)
1291                else:
1292                        msg_pbar=_("Executing process: ") + str(execprocess) + _(" of ") + str(self.number_process) + ". " + processname
1293       
1294                msg_pbar="<span><b>"+msg_pbar+"</b></span>" 
1295                self.pbar_label.set_markup(msg_pbar)
1296
1297        #def show_number_process_executing
1298       
1299        def populate_packages_tv(self):
1300               
1301                for package in self.package_list:
1302                        #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))
1303                        self.packages_store.append((package.type,package.icon,"<span font='Roboto'><b>"+package.name+"</b></span>\n"+"<span font='Roboto' size='small'>"+package.version+"</span>","<span font='Roboto' size='small'>"+package.size+"</span>", package.installed))
1304                       
1305                #print len(self.packages_store)
1306               
1307        #def populate_packages_tv
1308       
1309        def parse_packages_updated(self):
1310               
1311                self.newpackages=0     
1312                for item in self.packages:
1313                        tmp=item.split(";")
1314                        if len(tmp)>1:
1315                                pack=Package(tmp[3],tmp[0],tmp[1],tmp[2])
1316                                self.package_list.append(pack)
1317                                if tmp[3]==str(None):
1318                                        self.newpackages=int(self.newpackages)+1       
1319
1320        #def parse_simulate_output
1321       
1322        def package_clicked(self,x,y):
1323
1324                default_text="Downloading changelog..."
1325                selection=self.packages_tv.get_selection()
1326                model,iter=selection.get_selected()
1327                self.changelog_textview.get_buffer().set_text("".join(default_text))
1328
1329                #name=self.packages_store.get_value(iter,1)
1330                name=model[iter][2]
1331                name=name[name.find("<b>")+3:name.find("</b>")]
1332                changelog=self.llxup_connect.getPackageChangelog(name)
1333                self.changelog_textview.get_buffer().set_text("".join(changelog))
1334               
1335       
1336        #def package_clicked                   
1337
1338        def upgrade_process(self,widget, event=None):
1339
1340               
1341                self.msg_upgrade_running=_("The update process is running. Wait a moment please")
1342
1343                if not self.preactions_process_t.launched:
1344                        self.number_process=4
1345                        self.pbar.show()
1346                        #self.pbar.pulse()
1347                        self.viewport.show()
1348                        self.terminal_scrolled.show()
1349                        self.terminal_label.show()
1350                        self.msg_terminal=_("Update process details")
1351                        self.terminal_label.set_markup(self.msg_terminal)
1352                        GLib.timeout_add(100,self.dist_upgrade)
1353
1354                        # self.preactions_process_t.start()
1355                        # self.preactions_process_t.launched=True
1356
1357
1358                else:
1359                        if not self.postactions_process_t.done:
1360                                self.terminal_label.set_name("ERROR_FONT")
1361                                self.terminal_label.set_markup(self.msg_upgrade_running)
1362
1363        #def upgrade_process
1364       
1365        def dist_upgrade(self):
1366
1367                if not self.preactions_process_t.launched:
1368                        print "  [Lliurex-Up]: Executing pre-actions"
1369                        self.pbar_label.show()
1370                        self.cancel_button_box.hide()
1371                        self.indicator_box.hide()
1372
1373                        self.preactions_process_t.start()
1374                        self.preactions_process_t.launched=True
1375                        self.show_number_process_executing(1,_("Preparing system to the update"))
1376                        self.update_button_label.set_text(_("Updating"))
1377                        self.update_button_box.set_name("UPDATE_BUTTON_LAUNCHED_COLOR")
1378
1379                else:
1380
1381                        if self.preactions_process_t.done:
1382                                if not self.update_process_t.is_alive() and not self.update_process_t.launched:
1383                                        print "  [Lliurex-Up]: Executing dist-upgrade"
1384                                        self.update_process_t.start()
1385                                        self.update_process_t.launched=True
1386                                        self.show_number_process_executing(2,_("Downloading and installing packages"))
1387
1388                               
1389                                if self.update_process_t.done:
1390                                        if not self.postactions_process_t.is_alive() and not self.postactions_process_t.launched:
1391                                                print "  [Lliurex-Up]: Executing post-actions"
1392                                                self.postactions_process_t.start()
1393                                                self.postactions_process_t.launched=True
1394                                                self.show_number_process_executing(3,_("Ending the update"))
1395                                       
1396                                        if self.postactions_process_t.done:
1397
1398                               
1399                                                if not self.checkFinalFlavourToInstall_t.is_alive() and not self.checkFinalFlavourToInstall_t.launched:
1400                                                        print "  [Lliurex-Up]: Checking Final metapackage"
1401                                                        self.checkFinalFlavourToInstall_t.start()
1402                                                        self.checkFinalFlavourToInstall_t.launched=True
1403                                                        self.show_number_process_executing(4,_("Checking metapackage"))
1404                                                                                                       
1405                                                               
1406                                                if self.checkFinalFlavourToInstall_t.done:                               
1407                                                        self.cancel_button_box.show()
1408                                                        self.show_indicator_switch()
1409                                                        self.cancel_button_label.set_label(_("Close"))
1410                                                        self.pbar.hide()
1411                                                        self.pbar_label.hide()
1412                                                        self.update_installed_icon()
1413                                                               
1414                                                        self.terminal_label.set_name("CHANGELOG_FONT")
1415                                                                               
1416                                                        if not self.llxup_connect.checkErrorDistUpgrade():
1417                                                                self.terminal_label.set_name("CORRECT_FONT")
1418                                                                self.msg_upgrade_running="<span><b>" + _("The system is now update") + "</b></span>"
1419                                                                self.update_button_label.set_text(_("Update successfully"))
1420                                                                self.update_button_box.set_name("UPDATE_CORRECT_BUTTON_COLOR")
1421
1422                                                        else:
1423                                                                self.terminal_label.set_name("ERROR_FONT")
1424                                                                self.msg_upgrade_running="<span><b>" + _("The updated process has ended with errors") + "</b></span>"
1425                                                                self.update_button_label.set_text(_("Update error"))
1426                                                                self.update_button_box.set_name("UPDATE_ERROR_BUTTON_COLOR")
1427                                                                #self.update_button_box.set_name("UPDATE_BUTTON_END_COLOR")
1428                                                                               
1429                                                       
1430                                                        self.terminal_label.set_markup(self.msg_upgrade_running)
1431                                                        return False   
1432       
1433
1434                if self.preactions_process_t.launched:
1435                        if      not self.preactions_process_t.done:
1436                                if not os.path.exists(self.llxup_connect.preactions_token):
1437                                        return True
1438                                else:
1439                                        self.preactions_process_t.done=True
1440                                        return True
1441
1442
1443                if self.update_process_t.launched:
1444                        if      not self.update_process_t.done:
1445                                if not os.path.exists(self.llxup_connect.upgrade_token):
1446                                        return True
1447                                else:
1448                                        self.update_process_t.done=True 
1449                                        return True
1450                                       
1451                if self.postactions_process_t.launched:
1452                        if      not self.postactions_process_t.done:
1453                               
1454                                if not os.path.exists(self.llxup_connect.postactions_token):
1455                                        return True
1456                                else:
1457                                        self.postactions_process_t.done=True
1458                                        return True             
1459
1460               
1461
1462                if self.checkFinalFlavourToInstall_t.launched:
1463                        if not self.checkFinalFlavourToInstall_t.done:
1464                                if not os.path.exists(self.llxup_connect.installflavour_token):
1465                                        return True
1466                                else:
1467                                        self.checkFinalFlavourToInstall_t.done=True     
1468                                        return True                             
1469
1470                       
1471        #def dist_upgrade
1472
1473
1474        def preactions_process(self):
1475
1476                self.command=self.llxup_connect.preActionsScript()
1477                #self.command=self.llxup_connect.preActionsScript() + ' | tee ' + TMP_FILE + ';rm ' + TMP_FILE +'\n'
1478                length=len(self.command)
1479                self.vterminal.feed_child(self.command, length)
1480
1481        #def preactions_process
1482       
1483        def update_process(self):
1484                 
1485                #self.command='apt-get dist-upgrade -sV | tee '+ TMP_FILE + ';rm ' + TMP_FILE +'\n'
1486                self.command=self.llxup_connect.distUpgradeProcess()
1487                length=len(self.command)
1488                self.vterminal.feed_child(self.command, length)
1489
1490        #def update_process             
1491
1492
1493        def postactions_process(self):
1494
1495                self.command=self.llxup_connect.postActionsScript()
1496                #self.command=self.llxup_connect.preActionsScript() + ' | tee ' + TMP_FILE + ';rm ' + TMP_FILE +'\n'
1497                length=len(self.command)
1498                self.vterminal.feed_child(self.command, length)
1499
1500        #def postactions_process
1501
1502       
1503        def checkFinalFlavourToInstall(self):
1504
1505               
1506                time.sleep(5)
1507                self.flavourToInstall=self.llxup_connect.checkFinalFlavour()
1508
1509                if self.flavourToInstall !=None:
1510                        print "  [Lliurex-Up]: Check Final Metapackage: Instalation of metapackage is required"
1511                        self.installFinalFlavour(self.flavourToInstall)
1512                else:
1513                        print "  [Lliurex-Up]: Check Final Metapackage: Nothing to do"
1514                        self.command='exit ' + '\n'
1515                        length=len(self.command)
1516                        self.vterminal.feed_child(self.command, length)
1517                        self.checkFinalFlavourToInstall_t.done=True     
1518       
1519        #def checkFinalFlavourToInstall
1520
1521        def installFinalFlavour(self,flavourToInstall):
1522
1523                self.command=self.llxup_connect.installFinalFlavour(flavourToInstall)
1524                length=len(self.command)
1525                self.vterminal.feed_child(self.command, length)
1526                               
1527        #def installFinalFlavour
1528       
1529       
1530        def view_packages_clicked(self,widget,event):
1531
1532                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1533                self.stack.set_visible_child_name("packages")
1534               
1535        #def view_packages_clicked     
1536       
1537
1538        def arrow_clicked(self,widget,event):
1539       
1540                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1541                self.stack.set_visible_child_name("update")     
1542               
1543        #def arrow_clicked
1544
1545        def update_installed_icon(self):
1546       
1547                imagok=Gtk.Image()
1548                imagok.set_from_file(DONE_ICON)         
1549                iconok=imagok.get_pixbuf()
1550
1551                imagerr=Gtk.Image()
1552                imagerr.set_from_file(ERROR_ICON)               
1553                iconerr=imagerr.get_pixbuf()
1554                packages_status=self.llxup_connect.getStatusPackage()
1555
1556                for item in self.packages_store:
1557                        name=item[2].split(">")[2]
1558                        name=name.split("<")[0]
1559                        version=item[2].split(">")[5]
1560                        version=version.split("<")[0]
1561                        tmp=str(name)+"_"+str(version)
1562                        if tmp in packages_status:
1563                                item[4]=iconok
1564                        else:
1565                                item[4]=iconerr
1566                       
1567        #def update_installed_icon     
1568
1569        def mouse_over_yes(self,widget,event):
1570
1571                self.yes_button_box.set_name("BUTTON_OVER_COLOR")
1572
1573        #def mouse_over_yes     
1574
1575        def mouse_exit_yes(self,widget,event):
1576
1577                self.yes_button_box.set_name("BUTTON_COLOR")
1578
1579        #def mouse_exit_yes     
1580
1581        def mouse_over_no(self,widget,event):
1582
1583                self.no_button_box.set_name("BUTTON_OVER_COLOR")
1584
1585        #def mouse_over_no     
1586
1587        def mouse_exit_no(self,widget,event):
1588
1589                self.no_button_box.set_name("BUTTON_COLOR")
1590
1591        #def mouse_exit_no     
1592                       
1593        def mouse_over_view_packages(self,widget,event):
1594
1595                self.view_packages_button_box.set_name("BUTTON_OVER_COLOR")     
1596
1597        #def mouse_over_view_packages   
1598
1599        def mouse_exit_view_packages(self,widget,event):
1600
1601                self.view_packages_button_box.set_name("BUTTON_COLOR")
1602
1603        #def mouse_exit_view_packages   
1604                       
1605        def mouse_over_update_button(self,widget,event):
1606
1607                if not self.preactions_process_t.launched and not self.postactions_process_t.done:
1608                        self.update_button_box.set_name("BUTTON_OVER_COLOR")
1609                else:
1610                        if self.preactions_process_t.launched and not self.postactions_process_t.done :
1611                                self.terminal_label.set_name("BLUE_FONT")
1612                                self.terminal_label.set_markup(self.msg_upgrade_running)
1613
1614        #def mouse_over_update_button
1615                       
1616        def mouse_exit_update_button(self,widget,event):
1617
1618                if self.preactions_process_t.launched and not self.postactions_process_t.done:
1619                        self.terminal_label.set_name("CHANGELOG_FONT")
1620                        self.terminal_label.set_markup(self.msg_terminal)
1621                else:
1622                        if not self.preactions_process_t.launched:
1623                                self.update_button_box.set_name("BUTTON_COLOR")
1624
1625        #def mouse_exit_update_button
1626                       
1627        def mouse_over_cancel(self,widget,event):
1628
1629                self.cancel_button_box.set_name("BUTTON_OVER_COLOR")   
1630
1631        #def mouse_over_cancel 
1632
1633        def mouse_exit_cancel(self,widget,event):
1634
1635                self.cancel_button_box.set_name("BUTTON_COLOR") 
1636
1637        #def mouse_exit_cancel
1638
1639        def mouse_over_return_arrow(self,widget,event):
1640
1641                self.return_arrow_box.set_name("BUTTON_OVER_COLOR")     
1642
1643        #def mouse_over_return_arrow   
1644
1645        def mouse_exit_return_arrow(self,widget,event):
1646
1647                self.return_arrow_box.set_name("BUTTON_COLOR")         
1648
1649        #def mouse_exit_return_arrow   
1650
1651        def show_indicator_switch (self):
1652
1653                indicator=True
1654
1655                try:
1656                        if self.targetMetapackage !=None:
1657                                if self.targetMetapackage =='lliurex-meta-client': 
1658                                        indicator=False
1659                        else:
1660                                if 'client' in self.llxup_connect.previousFlavours:
1661                                        indicator=False
1662
1663                        if indicator:           
1664                                self.indicator_box.show()
1665
1666                except Exception as e: 
1667                        self.indicator_box.hide()       
1668
1669        #def show_indicator_switch             
1670
1671        def config_indicator(self):
1672
1673                show_indicator=self.indicator_switch.get_state()
1674               
1675                if show_indicator:
1676                        if os.path.exists(DISABLE_INDICATOR_TOKEN):
1677                                os.remove(DISABLE_INDICATOR_TOKEN)
1678                else:
1679                        if not os.path.exists(DISABLE_INDICATOR_TOKEN):
1680                                if not os.path.exists(DISABLE_INDICATOR_PATH):
1681                                        os.mkdir(DISABLE_INDICATOR_PATH)
1682                       
1683                                f=open(DISABLE_INDICATOR_TOKEN,'w')
1684                                f.close
1685
1686
1687        #def config_indicator                   
1688                               
1689        def quit(self,widget,event=None):
1690
1691                self.llxup_connect.cleanEnvironment()
1692                self.llxup_connect.cleanLliurexUpLock()
1693                self.config_indicator()
1694                Gtk.main_quit() 
1695
1696        #def quit       
1697
1698#class LliurexUp
1699
1700lup=LliurexUp()
1701#lup.start_gui()               
1702 
Note: See TracBrowser for help on using the repository browser.