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

Last change on this file was 8500, checked in by jrpelegrina, 6 months ago

WIP in new button to update

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