source: lliurex-up/trunk/old/install-files/usr/share/lliurex-up/gui/lliurex-up @ 2636

Last change on this file since 2636 was 2636, checked in by kbut, 3 years ago

add old files

  • Property svn:executable set to *
File size: 13.7 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                self.packages_unchecked=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                                self.packages_unchecked=self.packages_unchecked+1
441                packages_checked.close()                               
442
443               
444        def set_page_sensitive(self,state):
445               
446               
447                self.actions_tv.set_sensitive(state)
448                self.vterminal.set_sensitive(state)
449                self.label4.set_sensitive(state)
450                self.label6.set_sensitive(state)
451               
452                self.close_button2.set_sensitive(not state)
453                self.update_button.set_sensitive(not state)
454                # HACK
455                #self.update_button2.set_sensitive(not state)
456                # # HACK # #
457                self.close_button.set_sensitive(not state)
458               
459               
460        #def set_page_2_sensitive
461       
462       
463       
464       
465        def package_clicked(self,x,y):
466               
467                selection=self.packages_tv.get_selection()
468                model,iter=selection.get_selected()
469                name=self.packages_store.get_value(iter,1)
470                name=name[name.find("<b>")+3:name.find("</b>")]
471                               
472                for package in self.package_list:
473                       
474                        if package.name==name:
475                                self.changelog_textview.get_buffer().set_text("".join(package.changelog))
476                                break
477                               
478               
479               
480        #package_clicked
481       
482        def update_done(self,data):
483               
484                self.return_value=False
485                self.set_page_sensitive(False)
486                md = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, _("Update done"))
487                md.run()
488                md.destroy()
489                sys.exit(0)
490               
491        #def update_done
492       
493       
494        def update_clicked(self,widget):
495
496                self.check_packages_select()
497
498                self.set_page_sensitive(True)
499                #HACK
500                self.notebook.set_current_page(1)
501                # HACK #
502                self.parsed_lines=[]
503                glib.timeout_add(500,self.check_log)           
504
505                if self.packages_unchecked == 0:
506                        self.vterminal.fork_command(command="llxcfg-upgrade-version-scripts",argv=("llxcfg-upgrade-version-scripts","--log-dir=/tmp/","migrate"))
507       
508                else:
509               
510                        if self.packages_unchecked < len(self.packages_store):
511                                                       
512                                #self.vterminal.fork_command(command="apt-get",argv=("apt-get", "install", packages ))
513                                self.vterminal.fork_command(command="llxcfg-upgrade-version-scripts",argv=("llxcfg-upgrade-version-scripts","--log-dir=/tmp/","partial"))
514                        else:
515                                md = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, _("No selected packages to install"))
516                                md.run()
517                                md.destroy()           
518               
519        #def update_clicked
520       
521        def check_log(self):
522               
523                self.return_value=True
524       
525                if os.path.exists(UPDATE_LOG):
526               
527                        f=open(UPDATE_LOG)
528                        lines=f.readlines()
529                        f.close()
530
531                        tmp=[]
532                        for line in lines:
533                                if line=='\n':
534                                        pass
535                                else:
536                                        if line.find("END")!=-1:
537                                                self.return_value=False
538                                                break
539
540                                        if line.find("RESULT:")!=-1:
541                                                new_line=line.split('\t')
542                                                for ln in new_line:
543                                                        if ln.find("RESULT")!=-1:
544                                                                found_line=ln.split(":")
545                                                                tmp.append(found_line[1].strip('\n'))
546                               
547
548                        self.parsed_lines=tmp
549                        self.populate_actions_tv(self.parsed_lines)
550
551                        return self.return_value
552                       
553        #def check_log
554       
555        def populate_actions_tv(self,list):
556
557                if self.updating:
558                        pass
559                else:
560                        self.updating=True
561                        self.actions_store.clear()
562                        count=0
563                        for line in list:
564                                if line=="0":
565                                        self.actions_store.append(("gtk-apply",self.list_of_processes[count]))
566                                if line=="1":
567                                        self.actions_store.append(("gtk-cancel",self.list_of_processes[count])) 
568                                count+=1
569                                if count==len(self.list_of_processes):
570                                        self.return_value=False
571                        self.updating=False
572
573        #def populate_actions_tv
574       
575       
576        def close_clicked(self,widget):
577               
578                self.quit(None)
579               
580        #def close_clicked
581       
582        def quit(self,args):
583               
584                gtk.main_quit()
585       
586       
587       
588#class LliurexUp
589
590
591if __name__=="__main__":
592       
593        gtk.gdk.threads_init()
594        ll_up=LliurexUp()
595        gtk.main()
596       
597       
Note: See TracBrowser for help on using the repository browser.