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

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

WIP in check packages to install

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