source: lliurex-up/trunk/fuentes/install-files/usr/share/lliurex-up/gui/lliurex-up @ 464

Last change on this file since 464 was 464, checked in by jrpelegrina, 5 years ago

First release to Xenial

  • Property svn:executable set to *
File size: 12.3 KB
Line 
1#!/usr/bin/env python
2
3import gtk
4import gtk.glade
5import gettext
6import vte
7import pango
8import ConfigParser
9import subprocess
10import glib
11import os
12import os.path
13import sys
14import getpass
15import threading
16import time
17
18
19
20gettext.textdomain('lliurex-up')
21gtk.glade.textdomain('lliurex-up')
22_ = gettext.gettext
23
24
25UPDATE_LOG="/tmp/upgrade-version.log"
26
27
28class Package:
29       
30        def __init__(self,name,version,size,desktop_file,changelog_file):
31               
32                self.name=name
33                self.version=version
34                self.size=size
35                self.parse_desktop(desktop_file)
36                self.parse_changelog(changelog_file)
37               
38               
39               
40        #def __init__
41       
42
43       
44        def parse_desktop(self,desktop_file):
45               
46                try:
47                        config = ConfigParser.ConfigParser()
48                        config.optionxform=str
49                        config.read(desktop_file)
50                       
51                        if config.has_section("Desktop Entry") and config.has_option("Desktop Entry","Icon"):
52                                self.icon=config.get("Desktop Entry","Icon")
53                        else:
54                                self.icon="package"
55                               
56                except Exception as e:
57                       
58                        self.icon="package"
59                       
60               
61        #def parse_desktop
62       
63        def parse_changelog(self,changelog_file):
64               
65                try:
66                       
67                        f=open(changelog_file,"r")
68                        self.changelog=f.readlines()
69                        f.close()
70                                               
71                except Exception as e:
72                       
73                        self.changelog="Changelog not found"
74               
75               
76        #def parse_changelog
77       
78       
79       
80       
81#class Package
82
83
84
85class LliurexUp:
86       
87        def __init__(self):
88       
89                       
90                if (self.test_if_new_version_is_possible()): 
91                        self.upgrade_version_dialog()
92                       
93                self.package_list=[]
94                self.updating=False
95
96                self.check_user()
97                self.free_space_check()
98               
99                try:
100                        os.remove(UPDATE_LOG)
101                except:
102                        pass
103               
104               
105
106                self.read_glade()
107                self.gathering=True
108                glib.timeout_add(500,self.pulsating)
109
110
111                t=threading.Thread(target=self.gather_information)
112                t.daemon=True
113                t.start()
114
115               
116               
117        #def init
118
119
120        def test_if_new_version_is_possible(self):
121                p1=subprocess.Popen(["/usr/bin/lliurex-version","-n"],stdout=subprocess.PIPE)
122                output=p1.communicate()
123                stdout,stderr=output
124                if ("13.06" in stdout): 
125                        return True
126                else:
127                        return False
128               
129
130        #def test_if_new_version_is_possible
131       
132        def upgrade_version_dialog(self):
133               
134               
135                img = gtk.Image()
136                img.set_from_file('/usr/share/icons/hicolor/scalable/apps/lliurex-up.svg')
137               
138                vbox_label=gtk.VBox()
139                hbox_label=gtk.HBox()
140       
141                # Test if is a server (lliurex-mirro-upgrade-script is installed and ready)
142                aux_label=""   
143                if (os.path.exists("/etc/llxcfg/upgrade-version-scripts.d/005-upgrade-mirror")):
144                        aux_label=_('''This is a machine with a previous mirror installed, this process will upgrade it.
145This is a long, long time operation...take a cup of coffee.
146''')
147               
148                label = gtk.Label(_('''Platinum (LliureX 14.06) provides a lot of features that can make your life easier.
149If you want, the upgrade is posible with  only some clicks...
150Do you wish to upgrade now?
151''')+"\n\n"+aux_label)
152               
153                #label.set_justify(gtk.JUSTIFY_FILL)   add_button(button_text, response_id)
154                #(gtk.STOCK_OPEN, 42, "Close", gtk.RESPONSE_CLOSE)
155                dialog = gtk.Dialog()
156                dialog.add_buttons(_("Continue in 13.06"),gtk.RESPONSE_REJECT)
157                dialog.add_buttons(_("Upgrade to 14.06"),gtk.RESPONSE_ACCEPT)
158                hbox_label.pack_start(img,False,False,10)
159                hbox_label.pack_start(label,False,False,10)
160                hbox_label.show_all()
161                dialog.vbox.pack_start(hbox_label,False,False,10)
162                label.show()
163                response = dialog.run()
164                dialog.destroy()
165               
166                if (response != -2):
167                        #
168                        # At this moment (14.06) development the steps to migrate to 14.06 must be more "fine" than never before.
169                        #
170                        p1=subprocess.Popen(["/usr/sbin/platinum-upgrade"],stdout=subprocess.PIPE)
171                        output=p1.communicate()
172                        stdout,stderr=output
173                        p1=subprocess.Popen(["/etc/llxcfg/upgrade-version-scripts/change-sources-list","migrate"],stdout=subprocess.PIPE)
174                        output=p1.communicate()
175                        stdout,stderr=output
176                        p1=subprocess.Popen(["/usr/sbin/llxcfg-upgrade-version-scripts","allow","change-sources-list"],stdout=subprocess.PIPE)
177                        output=p1.communicate()
178                        stdout,stderr=output
179
180
181
182                else:
183                        p1=subprocess.Popen(["/usr/sbin/llxcfg-upgrade-version-scripts","deny","change-sources-list"],stdout=subprocess.PIPE)
184                        output=p1.communicate()
185                        stdout,stderr=output
186
187
188
189
190        #def upgrade_version_dialog
191       
192        def free_space_check(self):
193               
194                if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
195                        md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, _("There's not enough space on disk to upgrade (2 GB needed)"))
196                        md.run()
197                        md.destroy()
198                        sys.exit(1)
199
200        #def size_check
201       
202        def check_user(self):
203               
204               
205                try:
206                        f=open("/etc/lliurex-up.token","w")
207                        f.close()
208                        os.remove("/etc/lliurex-up.token")
209                except:
210                        md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, _("You need administrator privileges to run this program"))
211                        md.run()
212                        md.destroy()
213                        sys.exit(1)
214
215        #def size_check
216               
217       
218       
219        def gather_information(self):
220       
221
222                try:
223                        p1=subprocess.Popen(["llxcfg-upgrade-version-scripts","info"],stdout=subprocess.PIPE)
224                        output=p1.communicate()
225                        stdout,stderr=output
226                        tmp=stdout.split("\n")
227                        self.list_of_processes=[]
228                        for line in tmp:
229                                if len(line)>0:
230                                        self.list_of_processes.append(line)
231                except:
232                        pass
233               
234                try:
235                        p1=subprocess.Popen(["llxcfg-upgrade-version-scripts","details"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
236                        output=p1.communicate()[0]
237                        f=open("/tmp/.lliurex_up_log","w")
238                        if output!=None:
239                                f.write(output)
240                        f.close()
241       
242                except:
243                        pass 
244                       
245                self.gathering=False
246
247
248                return False
249
250        #def gather_action_list
251       
252               
253               
254       
255        def pulsating(self):
256
257                gtk.gdk.threads_enter()
258                self.progress_bar.pulse()
259               
260                if not self.gathering:
261                        self.parse_simulate_output("/tmp/.lliurex_up_log")
262                        self.populate_packages_tv()     
263                        if len(self.package_list)==0:
264                                md = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, _("Your system is up to date"))
265                                md.run()
266                                md.destroy()
267                                sys.exit(0)
268
269                        self.progress_win.destroy()
270                        self.window.show_all()
271
272                gtk.gdk.threads_leave()
273                return self.gathering
274               
275        #def gathering
276       
277        def populate_packages_tv(self):
278               
279                for package in self.package_list:
280                        self.packages_store.append((package.icon,"<b>"+package.name+"</b>\n"+"<span size='small'>"+package.version+"</span>","<span foreground='#009400' size='large'>"+package.size+"</span>"))
281                       
282                       
283        #def populate_packages_tv
284       
285        def parse_simulate_output(self,test_file=None):
286               
287                if test_file!=None:
288                        f=open(test_file,"r")
289                       
290                        for line in f:
291                                if line.find("#")==0:
292                                        pass
293                                else:
294                                        tmp=line.split(";")
295                                        if len(tmp)>4:
296                                                package=Package(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4])
297                                                self.package_list.append(package)
298                                       
299                       
300                else:
301                        #to be done later
302                        pass
303               
304
305               
306        #def parse_simulate_output
307       
308       
309        def read_glade(self):
310               
311                if os.path.exists("rsrc/lliurex-up.glade"):
312                        glade=gtk.glade.XML("rsrc/lliurex-up.glade")
313                else:
314                        glade=gtk.glade.XML("/usr/share/lliurex-up/gui/rsrc/lliurex-up.glade")
315                       
316                       
317                # PAGE 1
318                       
319                self.window=glade.get_widget("window")
320                self.window.connect("destroy",self.quit)
321                self.window.set_title("Lliurex UP")
322                self.window.set_size_request(600,520)
323                self.window.set_icon_name("lliurex-up")
324               
325                self.notebook=glade.get_widget("notebook")
326                self.notebook.remove_page(2)
327               
328                self.close_button=glade.get_widget("closeButton")
329                self.update_button=glade.get_widget("updateButton")
330                self.packages_tv=glade.get_widget("packagesTreeview")
331               
332                self.update_button.connect("clicked",self.update_clicked)
333                self.close_button.connect("clicked",self.close_clicked)
334               
335               
336                self.changelog_textview=glade.get_widget("changelogTextview")
337               
338                self.packages_store=gtk.ListStore(str,str,str)
339                self.packages_tv.set_model(self.packages_store)
340                column=gtk.TreeViewColumn("ICON")
341                cell=gtk.CellRendererPixbuf()
342                cell.set_property("stock-size",gtk.ICON_SIZE_DIALOG)
343                column.pack_start(cell,True)
344                column.add_attribute(cell,"icon-name",0)
345                self.packages_tv.append_column(column)
346               
347                column=gtk.TreeViewColumn("Package")
348                cell=gtk.CellRendererText()
349                column.pack_start(cell,True)
350                column.add_attribute(cell,"markup",1)
351               
352                self.packages_tv.append_column(column)
353               
354                self.packages_tv.connect("button-release-event",self.package_clicked)
355               
356                column=gtk.TreeViewColumn("Size")
357                cell=gtk.CellRendererText()
358                cell.set_property("alignment",pango.ALIGN_CENTER)
359                column.pack_start(cell,True)
360                column.add_attribute(cell,"markup",2)
361                self.packages_tv.append_column(column)         
362               
363                self.close_button2=glade.get_widget("closeButton2")
364                self.close_button2.connect("clicked",self.close_clicked)
365                self.actions_tv=glade.get_widget("actionsTreeview")
366                self.label4=glade.get_widget("label4")
367                self.label6=glade.get_widget("label6")
368               
369               
370                self.terminal_scrolled=glade.get_widget("terminalScrolledwindow")
371                self.vterminal=vte.Terminal()
372                self.vterminal.connect ("child-exited",self.update_done)
373                self.vterminal.set_font_from_string("monospace 10")
374                self.terminal_scrolled.add(self.vterminal)
375               
376                self.actions_store=gtk.ListStore(str,str)
377                self.actions_tv.set_model(self.actions_store)
378               
379                column=gtk.TreeViewColumn("Status")
380                cell=gtk.CellRendererPixbuf()
381                column.pack_start(cell,True)
382                column.add_attribute(cell,"icon-name",0)
383                self.actions_tv.append_column(column)
384
385                column=gtk.TreeViewColumn("Message")
386                cell=gtk.CellRendererText()
387                column.pack_start(cell,True)
388                column.add_attribute(cell,"text",1)
389                self.actions_tv.append_column(column)
390
391
392                self.set_page_sensitive(False)
393
394                # ## END OF PAGE 2 ## #
395               
396               
397                # PROGRESS WINDOW
398               
399                self.progress_win=glade.get_widget("progressWindow")
400                self.progress_bar=glade.get_widget("progressbar")
401               
402                # ## END OF PROGRESS WINDOW ## #
403               
404               
405                #self.window.show_all()
406                self.window.hide()
407                self.progress_win.show_all()
408
409               
410        #def read_glade
411       
412        def set_page_sensitive(self,state):
413               
414               
415                self.actions_tv.set_sensitive(state)
416                self.vterminal.set_sensitive(state)
417                self.label4.set_sensitive(state)
418                self.label6.set_sensitive(state)
419               
420                self.close_button2.set_sensitive(not state)
421                self.update_button.set_sensitive(not state)
422                # HACK
423                #self.update_button2.set_sensitive(not state)
424                # # HACK # #
425                self.close_button.set_sensitive(not state)
426               
427               
428        #def set_page_2_sensitive
429       
430       
431       
432       
433        def package_clicked(self,x,y):
434               
435                selection=self.packages_tv.get_selection()
436                model,iter=selection.get_selected()
437                name=self.packages_store.get_value(iter,1)
438                name=name[name.find("<b>")+3:name.find("</b>")]
439                               
440                for package in self.package_list:
441                       
442                        if package.name==name:
443                                self.changelog_textview.get_buffer().set_text("".join(package.changelog))
444                                break
445                               
446               
447               
448        #package_clicked
449       
450        def update_done(self,data):
451               
452                self.return_value=False
453                self.set_page_sensitive(False)
454                md = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, _("Update done"))
455                md.run()
456                md.destroy()
457                sys.exit(0)
458               
459        #def update_done
460       
461       
462        def update_clicked(self,widget):
463               
464                self.set_page_sensitive(True)
465                #HACK
466                self.notebook.set_current_page(1)
467                # HACK #
468                self.parsed_lines=[]
469                glib.timeout_add(500,self.check_log)
470                self.vterminal.fork_command(command="llxcfg-upgrade-version-scripts",argv=("llxcfg-upgrade-version-scripts","--log-dir=/tmp/","migrate"))
471               
472               
473        #def update_clicked
474       
475        def check_log(self):
476               
477                self.return_value=True
478       
479                if os.path.exists(UPDATE_LOG):
480               
481                        f=open(UPDATE_LOG)
482                        lines=f.readlines()
483                        f.close()
484
485                        tmp=[]
486                        for line in lines:
487                                if line=='\n':
488                                        pass
489                                else:
490                                        if line.find("END")!=-1:
491                                                self.return_value=False
492                                                break
493
494                                        if line.find("RESULT:")!=-1:
495                                                new_line=line.split('\t')
496                                                for ln in new_line:
497                                                        if ln.find("RESULT")!=-1:
498                                                                found_line=ln.split(":")
499                                                                tmp.append(found_line[1].strip('\n'))
500                               
501
502                        self.parsed_lines=tmp
503                        self.populate_actions_tv(self.parsed_lines)
504
505                        return self.return_value
506                       
507        #def check_log
508       
509        def populate_actions_tv(self,list):
510
511                if self.updating:
512                        pass
513                else:
514                        self.updating=True
515                        self.actions_store.clear()
516                        count=0
517                        for line in list:
518                                if line=="0":
519                                        self.actions_store.append(("gtk-apply",self.list_of_processes[count]))
520                                if line=="1":
521                                        self.actions_store.append(("gtk-cancel",self.list_of_processes[count])) 
522                                count+=1
523                                if count==len(self.list_of_processes):
524                                        self.return_value=False
525                        self.updating=False
526
527        #def populate_actions_tv
528       
529       
530        def close_clicked(self,widget):
531               
532                self.quit(None)
533               
534        #def close_clicked
535       
536        def quit(self,args):
537               
538                gtk.main_quit()
539       
540       
541       
542#class LliurexUp
543
544
545if __name__=="__main__":
546       
547        gtk.gdk.threads_init()
548        ll_up=LliurexUp()
549        gtk.main()
550       
551       
Note: See TracBrowser for help on using the repository browser.