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

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

WIP in checked packages to install

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