source: lliurex-up/trunk/fuentes/lliurex-up-gui/lliurex-up @ 2662

Last change on this file since 2662 was 2662, checked in by jrpelegrina, 3 years ago

WIP

File size: 12.8 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import gi
5gi.require_version('Gtk', '3.0')
6gi.require_version('PangoCairo', '1.0')
7gi.require_version('Vte', '2.91')
8
9import cairo
10import os
11import threading
12import ConfigParser
13import platform
14import subprocess
15import sys
16import time
17
18from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango, Vte
19
20import signal
21signal.signal(signal.SIGINT, signal.SIG_DFL)
22
23import gettext
24gettext.textdomain('lliurex-up')
25_ = gettext.gettext
26
27
28
29RSRC_DIR="rsrc/"
30
31class Package:
32
33        def __init__(self,name,version,size):
34
35                self.name=name
36                self.version=version
37                self.size=size
38                #self.parse_desktop(desktop_file)
39                #self.parse_changelog(changelog_file)
40
41
42        def parse_desktop(self,desktop_file):
43               
44                try:
45                        config = ConfigParser.ConfigParser()
46                        config.optionxform=str
47                        config.read(desktop_file)
48                       
49                        if config.has_section("Desktop Entry") and config.has_option("Desktop Entry","Icon"):
50                                self.icon=config.get("Desktop Entry","Icon")
51                        else:
52                                self.icon="package"
53                               
54                except Exception as e:
55                       
56                        self.icon="package"
57                       
58
59        def parse_changelog(self,changelog_file):
60               
61                try:
62                       
63                        f=open(changelog_file,"r")
64                        self.changelog=f.readlines()
65                        f.close()
66                                               
67                except Exception as e:
68                       
69                        self.changelog="Changelog not found"
70
71
72
73class LliurexUp:
74
75        def __init__(self):
76
77
78                self.start_gui()
79
80        def start_gui(self):
81               
82                builder=Gtk.Builder()
83               
84                glade_path=RSRC_DIR+"lliurex-up.ui"
85                builder.add_from_file(glade_path)
86
87                self.stack = Gtk.Stack()
88                self.stack.set_transition_duration(1000)
89                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
90
91
92                self.window=builder.get_object("main_window")
93                self.main_box=builder.get_object("main_box")
94                self.pbar=builder.get_object("progressbar")
95                #self.pbar_label=builder.get_object("pbar_label")
96               
97
98                self.cancel_button_box=builder.get_object("cancel_button_box")
99                self.cancel_eb=builder.get_object("cancel_button_eventbox")
100                self.cancel_eb.connect("button-press-event", self.quit)
101                self.cancel_label=builder.get_object("cancel_button_label")
102
103
104                self.gather_box=builder.get_object("gather_box")
105                self.yes_button_box=builder.get_object("yes_button_box")
106                self.yes_button_label=builder.get_object("yes_button_label")
107                self.no_button_box=builder.get_object("no_button_box")
108                self.no_button_eb=builder.get_object("no_button_eventbox")
109                self.no_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
110                self.no_button_eb.connect("button-release-event", self.no_button_clicked)
111                self.no_button_label=builder.get_object("no_button_label")
112                self.gather_logo_box=builder.get_object("gather_logo_box")
113                self.gather_label=builder.get_object("gather_label")
114
115                self.update_box=builder.get_object("update_box")
116                self.version_available_label=builder.get_object("version_available_label")
117                self.version_update_label=builder.get_object("version_update_label")
118                self.number_packages_label=builder.get_object("number_packages_label")
119                self.size_update_label=builder.get_object("size_update_label")
120                self.view_packages_button_box=builder.get_object("view_packages_button_box")
121                self.view_packages_eb=builder.get_object("view_packages_eventbox")
122                self.view_packages_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
123                self.view_packages_eb.connect("button-release-event", self.view_packages_clicked)
124                self.view_packages_label=builder.get_object("view_packages_label")
125
126                self.update_button_box=builder.get_object("update_button_box")
127                self.update_button_eb=builder.get_object("update_button_eventbox")
128                self.update_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
129                self.update_button_eb.connect("button-release-event", self.install_packages)
130                self.update_button_label=builder.get_object("update_button_label")
131                self.terminal_label=builder.get_object("terminal_label")
132                self.viewport=builder.get_object("viewport")
133                self.terminal_scrolled=builder.get_object("terminalScrolledWindow")
134                self.vterminal=Vte.Terminal()
135                font_terminal = Pango.FontDescription("monospace normal 10")
136                self.vterminal.set_font(font_terminal)
137                self.terminal_scrolled.add(self.vterminal)
138               
139
140                self.packages_box=builder.get_object("packages_box")
141                self.return_arrow_box=builder.get_object("return_arrow_box")
142                self.return_arrow_eb=builder.get_object("return_arrow_eventbox")
143                self.return_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
144                self.return_arrow_eb.connect("button-release-event", self.arrow_clicked)
145                self.packages_label=builder.get_object("packages_label")
146                self.packages_tv=builder.get_object("packages_treeview")
147                self.changelog_texview=builder.get_object("changelog_textview")
148
149                self.packages_store=Gtk.ListStore(str,str)
150                self.packages_tv.set_model(self.packages_store)
151                #column=Gtk.TreeViewColumn("ICON")
152                #cell=Gtk.CellRendererPixbuf()
153                #cell.set_property("stock-size",Gtk.ICON_SIZE_DIALOG)
154                #column.pack_start(cell,True)
155                #column.add_attribute(cell,"icon-name",0)
156                #self.packages_tv.append_column(column)
157               
158                column=Gtk.TreeViewColumn("Package")
159                cell=Gtk.CellRendererText()
160                column.pack_start(cell,True)
161                column.add_attribute(cell,"markup",1)
162               
163                self.packages_tv.append_column(column)
164               
165                #self.packages_tv.connect("button-release-event",self.package_clicked)
166               
167                column=Gtk.TreeViewColumn("Size")
168                cell=Gtk.CellRendererText()
169                #cell.set_property("alignment",Pango.ALIGN_CENTER)
170                column.pack_start(cell,True)
171                column.add_attribute(cell,"markup",2)
172                self.packages_tv.append_column(column)         
173               
174
175
176                self.stack.add_titled(self.gather_box,"gather","Gather")
177                self.stack.add_titled(self.update_box,"update", "Update")
178                self.stack.add_titled(self.packages_box, "packages", "Packages")
179
180                self.main_box.pack_start(self.stack,True,False,5)
181
182                self.window.show_all()
183                self.terminal_scrolled.hide()
184                self.viewport.hide()
185                self.terminal_label.hide()
186                self.cancel_button_box.hide()
187                self.yes_button_box.hide()
188                self.no_button_box.hide()
189
190                #self.pbar_label.hide()
191                self.pbar.show()
192               
193                self.window.connect("destroy",self.quit)
194               
195               
196                self.set_css_info()
197                #self.get_update_info()
198
199
200                GLib.timeout_add(100,self.pulsate_gathering_info)
201               
202                self.t=threading.Thread(target=self.gather_info)
203                self.t.daemon=True
204                self.t.start()
205                self.no_mirror=False
206
207                self.package_list=[]
208
209                GObject.threads_init()
210                Gtk.main()
211
212
213        def set_css_info(self):
214       
215                css = """
216
217
218                #WHITE_BACKGROUND {
219                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
220               
221                }
222
223                #BUTTON_LABEL{
224                        color:white;
225                        font: Roboto 10;
226                }
227
228                #DISABLED_BUTTON_OVER{
229                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
230                }
231               
232                #DISABLED_BUTTON{
233                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
234                }
235               
236                #CANCEL_BUTTON{
237                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
238                }
239               
240                #CANCEL_BUTTON_OVER{
241                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
242                }
243
244                #BUTTON_COLOR {
245                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
246               
247                }
248               
249                #UPDATE_BUTTON_LABEL{
250                        color:white;
251                        font: Roboto 11;
252                }
253               
254                #UPDATE_BUTTON_COLOR {
255                        background-image:-gtk-gradient (linear, left top, left bottom, from (#43A047),  to (#43A047));;
256               
257                }
258               
259                #GATHER_ICON_COLOR {
260                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
261               
262                }
263               
264               
265                #BLUE_FONT {
266                        color: #3366cc;
267                        font: Roboto 10;
268                       
269                }       
270               
271
272                #LABEL_OPTION{
273               
274                        color: #808080;
275                        font: Roboto 11;
276                }
277               
278                """
279
280                self.style_provider=Gtk.CssProvider()
281                self.style_provider.load_from_data(css)
282                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
283               
284                self.update_box.set_name("WHITE_BACKGROUN")
285                self.gather_logo_box.set_name("GATHER_ICON_COLOR")
286                self.gather_label.set_name("BLUE_FONT")
287
288                self.yes_button_box.set_name("BUTTON_COLOR")
289                self.yes_button_label.set_name("BUTTON_LABEL")
290
291                self.no_button_box.set_name("BUTTON_COLOR")
292                self.no_button_label.set_name("BUTTON_LABEL")
293
294                self.view_packages_button_box.set_name("BUTTON_COLOR")
295                self.view_packages_label.set_name("BUTTON_LABEL")
296
297                self.cancel_button_box.set_name("BUTTON_COLOR")
298                self.cancel_label.set_name("BUTTON_LABEL")     
299
300                self.version_available_label.set_name("LABEL_OPTION")
301                self.version_update_label.set_name("LABEL_OPTION")     
302                self.number_packages_label.set_name("LABEL_OPTION")
303                self.size_update_label.set_name("LABEL_OPTION")
304                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
305                self.update_button_box.set_name("UPDATE_BUTTON_COLOR")
306                self.terminal_label.set_name("LABEL_OPTION")
307
308
309                self.packages_label.set_name("LABEL OPTION")
310               
311
312        def check_lliurexup_version(self):
313
314                print "Checking lliurex-up version"
315                msg_gather="<span><b>"+_("Checking for new version of lliurex-up")+"</b></span>"
316                self.gather_label.set_markup(msg_gather)
317                time.sleep(2)
318                return True
319
320
321        def check_mirror(self):
322                print "Checking mirror"
323                self.response=-1
324                t=0
325                self.yes_button_box.show()
326                self.no_button_box.show()
327                msg_gather="<span><b>"+_("Do you want to update your mirror?")+"</b></span>"
328                self.gather_label.set_markup(msg_gather)
329               
330                while self.response==-1:
331                        time.sleep(t)
332                        t=t+1
333
334                self.yes_button_box.hide()
335                self.no_button_box.hide()       
336                return True
337
338
339        def gather_info(self):
340
341                self.check_lliurexup_version()
342                self.check_mirror()
343                               
344
345                cmd="sudo apt-get update"
346                msg_gather="<span><b>"+_("Checking for new updates")+"</b></span>"
347                self.gather_label.set_markup(msg_gather)
348               
349                #p=subprocess.Popen([cmd],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)     
350                #output=p.communicate()
351                try:
352                        p1=subprocess.Popen(["llxcfg-upgrade-version-scripts","details"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
353                        output=p1.communicate()[0]
354                        f=open("/tmp/.lliurex_up_log","w")
355                        if output!=None:
356                                f.write(output)
357                        f.close()
358       
359                except:
360                        pass 
361
362
363
364        def pulsate_gathering_info(self):
365               
366                self.pbar.pulse()
367               
368                if not self.t.is_alive():
369                       
370                        self.parse_simulate_output("/tmp/.lliurex_up_log")
371                        self.populate_packages_tv()     
372                        self.get_update_info()
373                        self.pbar.hide()
374                        self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
375                        self.stack.set_visible_child_name("update")     
376                        self.cancel_button_box.show()
377
378                return self.t.is_alive()       
379
380               
381        def populate_packages_tv(self):
382               
383                for package in self.package_list:
384                        print package
385                        self.packages_store.append(("<b>"+package.name+"</b>\n"+"<span size='small'>"+package.version+"</span>","<span foreground='#009400' size='large'>"+package.size+"</span>"))
386                       
387                       
388                print len(self.packages_store) 
389        #def populate_packages_tv
390       
391        def parse_simulate_output(self,test_file=None):
392               
393                if test_file!=None:
394                        f=open(test_file,"r")
395                       
396                        for line in f:
397                                if line.find("#")==0:
398                                        pass
399                                else:
400                                        tmp=line.split(";")
401                                        if len(tmp)>4:
402                                                package=Package(tmp[0],tmp[1],tmp[2])
403                                                self.package_list.append(package)
404
405                       
406                else:
407                        #to be done later
408                        pass   
409
410
411        def execute(self):
412               
413                self.vterminal.spawn_sync(
414                        Vte.PtyFlags.DEFAULT,
415                        os.environ['HOME'],
416                        ["/usr/sbin/dpkg-reconfigure", "xdm"],
417                        [],
418                        GLib.SpawnFlags.DO_NOT_REAP_CHILD,
419                        None,
420                        None,
421                )
422
423                               
424        def install_packages(self,widget, event=None):
425                self.t=threading.Thread(target=self.execute,args=())
426                self.t.daemon=True
427                self.t.start()
428                GLib.timeout_add(100,self.pulsate_pbar)
429                self.pbar.show()
430                self.viewport.show()
431                self.terminal_scrolled.show()
432                self.terminal_label.show()
433                msg_terminal=_("Update process details")
434                self.terminal_label.set_markup(msg_terminal)
435                               
436       
437        def get_update_info(self):
438                self.version_available="16.160916"
439                self.version_update="16.160915"
440                self.number_pkg="15"
441                self.size_update="100 Mb"
442               
443                msg_version_available=_("Version available: ")+"<span foreground='#3366cc'><b>"+self.version_available+"</b></span>"
444                msg_version_update=_("Version to update: ")+"<span foreground='#3366cc'><b>"+self.version_update+"</b></span>"
445
446                msg_number=_("Number packages: ")+"<span foreground='#3366cc'><b>"+self.number_pkg+"</b></span>"
447                msg_size=_("Size of update: ")+"<span foreground='#3366cc'><b>"+self.size_update+"</b></span>"
448               
449                self.version_available_label.set_markup(msg_version_available)
450                self.version_update_label.set_markup(msg_version_update)
451                self.number_packages_label.set_markup(msg_number)
452                self.size_update_label.set_markup(msg_size)
453               
454
455        def pulsate_pbar(self):
456                if not self.t.is_alive():
457                        self.pbar.pulse()
458                else:
459                        self.pbar.hide()
460
461                       
462        def view_packages_clicked(self,widget,event):
463                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
464                self.stack.set_visible_child_name("packages")
465
466
467        def no_button_clicked(self,widget,event):
468               
469                self.response=1 
470
471        def arrow_clicked(self,widget,event):
472                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
473                self.stack.set_visible_child_name("update")     
474       
475
476        def quit(self,widget,event=None):
477               
478                Gtk.main_quit() 
479
480#class LliurexMirror
481
482at=LliurexUp()         
Note: See TracBrowser for help on using the repository browser.