source: lliurex-mirror/trunk/fuentes/python-lliurex-mirror.install/usr/sbin/lliurex-mirror-gui @ 246

Last change on this file since 246 was 246, checked in by hectorgh, 5 years ago

adding project files

  • Property svn:executable set to *
File size: 11.9 KB
Line 
1#!/usr/bin/env python
2
3import sys
4import os
5import os.path
6import signal
7from gi.repository import Gtk, Gdk,GObject,GLib
8from subprocess import call
9import subprocess
10import time
11import threading
12import shutil
13import locale
14from locale import gettext as _
15import xmlrpclib as x
16
17# Esto permite traducir los textos escritos en el .py (no en glade)
18locale.bindtextdomain('python-lliurex-mirror', '/usr/share/locale/')
19locale.textdomain('python-lliurex-mirror')
20
21
22# Some values
23signal.signal(signal.SIGINT, signal.SIG_DFL)
24
25class LliurexMirror:
26
27        def __init__(self):
28               
29                os.system("lliurex-mirror do_sanity_checks")
30                self.button_list=[]
31                self.actual_token=None
32               
33               
34        #def init
35
36        # Some useful values
37        distro="llx1505"
38        token_32="/usr/share/lliurex-mirror/token_32.tk"
39        token_64="/usr/share/lliurex-mirror/token_64.tk"
40        token_all="/usr/share/lliurex-mirror/token_all.tk"
41        template_dist_32="/usr/share/lliurex-mirror/templates-%s/distributions_32"%distro
42        template_dist_64="/usr/share/lliurex-mirror/templates-%s/distributions_64"%distro
43        template_dist_all="/usr/share/lliurex-mirror/templates-%s/distributions_all"%distro
44        target_distributions="/net/mirror/%s/conf/distributions"%distro
45        template_updates_32="/usr/share/lliurex-mirror/templates-%s/updates_32"%distro
46        template_updates_64="/usr/share/lliurex-mirror/templates-%s/updates_64"%distro
47        template_updates_all="/usr/share/lliurex-mirror/templates-%s/updates_all"%distro
48        target_updates="/net/mirror/%s/conf/updates"%distro
49
50       
51
52        def read_key(self):
53               
54                f=open("/etc/n4d/key")
55                key = f.readline().strip("\n")
56                f.close()
57                return key
58               
59        #def read_key
60
61        def close_window(self,widget):
62
63                Gtk.main_quit()
64                sys.exit(0)
65
66        #def close_window
67
68
69        def set_sensitive_buttons(self,state):
70               
71                for button in self.button_list:
72                        button.set_sensitive(state)
73               
74        #def show_buttons
75
76
77        # ######################################################## #
78
79        def export_mirror(self,widget,export_chooser,pbar):
80               
81                custom_dir=export_chooser.get_filename()
82                thread=threading.Thread(target=self.export_mirror_thread,args=(custom_dir,))
83                #thread.daemon=True
84                thread.start()
85               
86                GLib.timeout_add(1000,self.update_bar,pbar,thread)
87               
88               
89        #def export_mirror
90
91        def export_mirror_thread(self, custom_dir):
92               
93                os.system("/usr/share/n4d/binary-plugins/lliurex_mirror save_to_custom_dir " +  custom_dir)
94               
95        #def export_mirror_thread
96       
97       
98        def update_bar(self,pbar,thread):
99               
100                pbar.pulse()
101                if not thread.is_alive():
102                        pbar.set_fraction(1.0)
103                return thread.is_alive()       
104       
105        # ######################################################## #
106       
107        def update_custom_mirror(self,widget,pbar,custom_dir):
108
109                #GObject.timeout_add_seconds(1,self.check_thread,widget,thread)
110                custom_dir=custom_dir.get_filename()
111               
112                # Check if the custom dir seems to contains a mirror
113                if os.path.isdir(custom_dir+"/conf"):
114                        cmd="/usr/share/n4d/binary-plugins/lliurex_mirror update_from_custom_dir_pre_actions %s"%custom_dir
115                        os.system(cmd)
116                        self.update_mirror(None,pbar,True)
117                else:
118                        warning_text=_("\"Directory must contains a pool\"")
119                        cmd="zenity --error --text="+warning_text+""
120                        os.system(cmd)
121                       
122        #def update_mirror     
123       
124
125       
126        # ################################################################ #
127
128
129        def update_from_ip(self,widget,pbar,custom_ip):
130                """
131                This method updates the mirror from custom IP addres
132                or a server machine (hostname) if dnsmasq is alive and
133                configured.
134                """
135                ip=custom_ip.get_text()
136                cmd="/usr/share/n4d/binary-plugins/lliurex_mirror set_ip_in_updates %s"%ip
137                os.system(cmd)
138               
139                self.update_mirror(None,pbar,True)
140               
141        #def update_from_ip
142
143        # ###################################################### #
144       
145
146        def update_mirror(self,widget,pbar,restore_default=False):
147               
148                self.set_architecture(self.actual_token)               
149                n4d_client = x.ServerProxy("https://localhost:9779")
150                key = self.read_key()
151               
152                print("[LliureX Mirror] Update Mirror ")
153               
154                n4d_client.do_sanity_checks(key,"LliurexMirrorNonGtk")
155                lock="/net/mirror/%s/db/lockfile"%LliurexMirror.distro
156                ret=n4d_client.update(key,"LliurexMirrorCore")
157                ok=False
158                if ret[0]==True or "unning" in ret[1]:
159                        GLib.timeout_add(10000,self.update_mirror_pbar,pbar,restore_default)
160                        pbar.set_text("0.0%")
161                        pbar.set_show_text(True)
162                        self.set_sensitive_buttons(False)
163                else:
164                        error_msg=_("Lock file %s exists."%lock) + "\n" + _("If no instance of reprepro is running, you should delete it.")
165                        os.system('zenity --error --text="%s"'%error_msg)
166               
167        #def update_mirror
168       
169       
170        def update_mirror_pbar(self,pbar,restore_default):
171               
172               
173                n4d_client=x.ServerProxy("https://localhost:9779")
174               
175                try:
176                        tmp=n4d_client.get_progress("","LliurexMirrorCore")
177                        tmp=tmp.split(":")[0].split(" ")[1].split("%")[0]
178                        tmp=int(tmp)*0.01
179                        pbar.set_fraction(tmp)
180                        pbar.set_text(str(tmp*100)+"%")
181                        pbar.set_show_text(True)
182                except Exception as e:
183                        print e
184                       
185                       
186                ret=self.is_n4d_thread_alive()
187               
188                if not ret:
189                       
190                        self.set_sensitive_buttons(True)
191                        if restore_default:
192                                cmd="/usr/share/n4d/binary-plugins/lliurex_mirror restore_default_updates"
193                                os.system(cmd)
194                        reprepro_rc=n4d_client.get_rc_status("","LliurexMirrorCore")
195                        if reprepro_rc != 0:
196                                error_msg=_("Something went wrong, probably a network error.") + "\n" + _("You should try updating again.")
197                                os.system('zenity --error --text="%s"'%error_msg)
198                return ret
199               
200        #def update_mirror_pbar
201       
202       
203        # ############################################ #
204
205       
206        def is_n4d_thread_alive(self):
207               
208                n4d_client = x.ServerProxy("https://localhost:9779")
209                try:
210                        return n4d_client.is_alive("","LliurexMirrorCore")
211                except Exception as e:
212                        print e
213                        return False
214                       
215        #def is_n4d_thread_alive
216
217       
218        def clean_mirror(self,widget):
219                os.system("rm -rf /net/mirror/%s/"%LliurexMirror.distro)
220                os.system("/usr/share/n4d/binary-plugins/lliurex_mirror do_sanity_checks")
221               
222        # def clean_mirror     
223       
224       
225        def load_abstract(self,widget):
226               
227                print("[LliureX Mirror] Load Abstract ")
228                if os.path.exists("/var/log/lliurex/lliurex-mirror.log"):
229                        abstract = open('/var/log/lliurex/lliurex-mirror.log', 'r').read()
230                else:
231                        abstract = ""
232                #Reset the buffer
233                buffer = Gtk.TextBuffer()
234                widget.set_buffer(buffer)
235                buffer.set_text(abstract)
236                widget.set_buffer(buffer)
237               
238               
239        #def load_abstract(widget):
240       
241       
242        def is_64bits(self):
243                is_64bits=False
244                try:
245                        is_64bits=sys.maxsize > 2**32
246                except:
247                        is_64bits=True
248                return is_64bits
249
250        #def get_host_arch(self):
251
252        def get_architecture_opts(self):
253                """
254                Get the architecture option selected
255                If no one is selected never, then select the host
256                architecture
257                """
258               
259                # Is 32 bits?
260                if (os.path.exists(LliurexMirror.token_32)):
261                        return "32"
262                # Is 64?
263                elif (os.path.exists(LliurexMirror.token_64)):
264                        return "64"
265               
266                # Is All?
267                elif (os.path.exists(LliurexMirror.token_all)):
268                        return "all"
269                       
270                # else is host architecture
271                else:
272                        if self.is_64bits():
273                                return "all"
274                        else:
275                                return "32"
276       
277        #def get_architecture_opts(self):
278       
279        def set_architecture(self,arch):
280
281                # Delete all
282                os.system("rm -f /usr/share/lliurex-mirror/token*")
283               
284                if arch=="32":
285                        os.system("touch "+LliurexMirror.token_32)
286                        shutil.copyfile(LliurexMirror.template_dist_32,LliurexMirror.target_distributions)
287                        shutil.copyfile(LliurexMirror.template_updates_32,LliurexMirror.target_updates)
288                elif arch=="64":
289                        os.system("touch "+LliurexMirror.token_64)
290                        shutil.copyfile(LliurexMirror.template_dist_64,LliurexMirror.target_distributions)
291                        shutil.copyfile(LliurexMirror.template_updates_64,LliurexMirror.target_updates)
292                elif arch=="all":
293                        os.system("touch "+LliurexMirror.token_all)
294                        shutil.copyfile(LliurexMirror.template_dist_all,LliurexMirror.target_distributions)
295                        shutil.copyfile(LliurexMirror.template_updates_all,LliurexMirror.target_updates)
296                else:
297                        os.system("touch "+LliurexMirror.token_32)
298                        shutil.copyfile(LliurexMirror.template_dist_32,LliurexMirror.target_distributions)
299                        shutil.copyfile(LliurexMirror.template_updates_32,LliureXMirror.target_updates)
300                       
301        #def set_architecture(self,arch):
302       
303        def rbi386_set_architecture(self,widget):
304                #self.set_architecture("32")
305                self.actual_token="32"
306        #def rbi386_set_architecture(self,widget):
307       
308        def rbamd64_set_architecture(self,widget):
309                #self.set_architecture("64")
310                self.actual_token="64"
311        #def rbamd64_set_architecture(self,widget):
312       
313        def rball_set_architecture(self,widget):
314                #self.set_architecture("all")
315                self.actual_token="all"
316        #def rball_set_architecture(self,widget):
317
318        def save_mirror(self,widget):
319
320                print("[LliureX Mirror] Save Mirror")
321        #def save_mirror(widget)
322       
323        def import_from_custom_dir(self,widget,custom_dir):
324                print("[LliureX Mirror] Prepare custom mirror "+str(custom_dir))
325               
326        #def prepare_custom_import(self,widget)
327       
328        def check_thread(self,widget,thread):
329
330               
331
332                if not thread.is_alive():
333                       
334                        widget.set_sensitive(True)
335                       
336                       
337                return thread.is_alive()
338
339        #def check_thread
340       
341
342if __name__== "__main__":
343
344        lliurexMirror=LliurexMirror()
345        #lliurexMirror.prepare_custom_import()
346        #button_list=[]
347       
348        builder = Gtk.Builder()
349        builder.set_translation_domain('python-lliurex-mirror')
350        builder.add_from_file("/usr/share/lliurex-mirror/gui/lliurex-mirror-gui.glade")
351       
352        window=builder.get_object("windowLliureXMirror")
353        window.connect("destroy",lliurexMirror.close_window)
354
355        #progress bar
356        pbar=builder.get_object("progressbar")
357       
358       
359        # Button Update
360        button=builder.get_object("buttonUpdate")
361        #thread=threading.Thread(target=lliurexMirror.update_mirror_thread)
362        button.connect("clicked",lliurexMirror.update_mirror,pbar)
363        lliurexMirror.button_list.append(button)
364       
365        bDelete=builder.get_object("buttonDelete")
366        bDelete.connect("clicked",lliurexMirror.clean_mirror)
367        lliurexMirror.button_list.append(bDelete)
368       
369       
370        bExit=builder.get_object("buttonExit")
371        bExit.connect("clicked",lliurexMirror.close_window)
372        lliurexMirror.button_list.append(bExit)
373       
374       
375        # Buttons architecture
376        rbi386=builder.get_object("rbi386")
377        rbi386.connect("clicked",lliurexMirror.rbi386_set_architecture)
378       
379        rbamd64=builder.get_object("rbamd64")
380        rbamd64.connect("clicked",lliurexMirror.rbamd64_set_architecture)
381       
382        rball=builder.get_object("rball")
383        rball.connect("clicked",lliurexMirror.rball_set_architecture)
384       
385        current_arch=lliurexMirror.get_architecture_opts()
386        if current_arch=="32":
387                rbi386.set_active(True)
388                #lliurexMirror.set_architecture("32")
389                lliurexMirror.actual_token="32"
390        elif current_arch=="64":
391                rbamd64.set_active(True)
392                #lliurexMirror.set_architecture("64")
393                lliurexMirror.actual_token="64"
394        else:
395                rball.set_active(True)
396                #lliurexMirror.set_architecture("all")
397                lliurexMirror.actual_token="all"
398       
399        # Abstract
400        textviewAbstract = builder.get_object("textviewAbstract")
401        lliurexMirror.load_abstract(textviewAbstract)
402       
403       
404        # Import mirror buttons and labels
405        buttonImport=builder.get_object("buttonImport")
406        filechooserbuttonImport=builder.get_object("filechooserbuttonImport")
407        lliurexMirror.button_list.append(buttonImport)
408       
409        custom_dir=subprocess.check_output(["lliurex-mirror","get_the_last_custom_dir"])
410        # If last mirror custom has a word, restore it from file
411        print("[LliureX Mirror] custom_dir "+ custom_dir)
412        custom_dir=custom_dir.strip("\n")
413        if custom_dir != "None":
414                filechooserbuttonImport.set_current_folder(custom_dir)
415               
416        custom_dir=filechooserbuttonImport.get_filename()
417        buttonImport.connect("clicked",lliurexMirror.update_custom_mirror,pbar,filechooserbuttonImport)
418       
419       
420        # Export Zone
421        buttonexport=builder.get_object("buttonSave")
422        buttonexport.set_sensitive(True)
423        lliurexMirror.button_list.append(buttonexport)
424       
425        export_chooser=builder.get_object("filechooserbutton1")
426        export_chooser.set_sensitive(True)
427       
428        buttonexport.connect("clicked",lliurexMirror.export_mirror,export_chooser,pbar)
429       
430        # Custom Server updated
431        entryCustomServer=builder.get_object("entryCustomServer")
432
433
434        buttonUpdateCustomServer=builder.get_object("buttonUpdateCustomServer")
435        buttonUpdateCustomServer.set_sensitive(True)
436        buttonUpdateCustomServer.connect("clicked",lliurexMirror.update_from_ip,pbar,entryCustomServer)
437        lliurexMirror.button_list.append(buttonUpdateCustomServer)
438       
439       
440        window.show_all()
441
442        GObject.threads_init()
443        Gtk.main()
444        GObject.threads_leave()
445       
Note: See TracBrowser for help on using the repository browser.