source: lliurex-mirror/trunk/fuentes/lliurex-mirror2/lliurex-mirror.py @ 2577

Last change on this file since 2577 was 2577, checked in by hectorgh, 3 years ago

wip

File size: 52.7 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3gi.require_version('PangoCairo', '1.0')
4
5import cairo
6import os
7import threading
8import ConfigParser
9import platform
10import json
11import random
12import xmlrpclib
13import time
14import math
15import sys
16from math import pi
17import lliurex_mirror_connect
18
19from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango,GdkPixbuf
20
21import signal
22signal.signal(signal.SIGINT, signal.SIG_DFL)
23
24import glob
25
26import gettext
27gettext.textdomain('lliurex-mirror')
28_ = gettext.gettext
29
30BANNERS_PATH="./banners/"
31UNKNOWN_BANNER=BANNERS_PATH+"mirror_banner.png"
32SHADOW_BANNER=BANNERS_PATH+"shadow.png"
33MIRROR_CONF_DIR="./mirrors/"
34GLADE_FILE="rsrc/lliurex-mirror.ui"
35ADD_IMAGE="rsrc/a1.png"
36ADD_IMAGE_OVER="rsrc/a2.png"
37TOKEN_FILE="/run/lliurex-mirror.pid"
38ERROR=Gtk.MessageType.ERROR
39INFO=Gtk.MessageType.INFO
40
41class MirrorButton:
42       
43        def __init__(self,info):
44               
45                self.info=info # "pkg"
46                self.info["updating"]=False
47                self.info["exporting"]=False
48                self.info["executing"]=False
49                self.info["shadow_alpha"]=0.1
50                self.info["animation_active"]=False
51                self.info["shadow_start"]=0
52                self.info["available"]=True
53                self.info["degree_offset"]=0
54                self.info["red_position"]=0
55                self.info["red_right"]=True
56                self.info["max_random_lights"]=30
57                self.info["random_lights"]=[]
58                self.info["cancelled"]=False
59               
60                if os.path.exists(BANNERS_PATH+self.info["BANNER"]+".png"):
61                        self.info["image"]=BANNERS_PATH+self.info["BANNER"]+".png"
62                else:
63                        self.info["image"]=UNKNOWN_BANNER
64               
65        #def init
66       
67       
68#class GridButton
69
70class LightPoint:
71       
72        def __init__(self,x,y,radius=None):
73               
74                #self.degree=degree
75                self.radius=radius
76               
77                self.x=x
78                self.y=y
79                self.opacity=1.0
80               
81        #def
82
83class CustomColor:
84       
85        def __init__(self,r,g,b):
86               
87                self.r=r/255.0
88                self.g=g/255.0
89                self.b=b/255.0
90
91#class CustomColor             
92
93class LliurexMirror:
94       
95        def __init__(self):
96       
97                self.frame_size=116
98                self.percentage=0
99                self.circle={}
100                self.circle["x"]=58
101                self.circle["y"]=58
102                self.circle["radius"]=46
103                self.degree_offset=0
104                self.y_offset=5
105               
106                self.wave_xoffset=0
107                self.wave_yoffset=0
108                self.wave_lenght=80
109                self.wave_amplitude=3
110                self.wave_amplitude2=2
111                self.wave_amplitude3=2
112                self.wave_xoffset2=50
113                self.wave_xoffset3=80
114               
115                self.add_flag=False
116               
117                self.current_grid_width=0
118                self.current_grid_height=0
119                self.max_grid_width=2
120       
121                self.dark_gray=CustomColor(130.0,151.0,161.0)
122                self.light_gray=CustomColor(185.0,195.0,195.0)
123               
124                self.green=CustomColor(74.0,166.,69.0)
125                self.light_green=CustomColor(88.0,208.0,86.0)
126               
127               
128                self.conf_light=CustomColor(49.0,55.0,66.0)
129                self.conf_dark=CustomColor(30.0,36.0,42.0)
130               
131                self.conf_light_shadow=CustomColor(107.0,116.0,137.0)
132                self.conf_dark_shadow=CustomColor(0,0,0)
133                self.red=CustomColor(255,0,0)
134               
135                self.update_water_colors=[]
136               
137                self.update_water_colors.append(CustomColor(12,54,64))
138                self.update_water_colors.append(CustomColor(17,92,108))
139                self.update_water_colors.append(CustomColor(0.2*255,0.93*255,0.97*255))
140                self.update_water_colors.append(CustomColor(82, 176, 225))
141                self.update_water_colors.append(CustomColor(68, 159, 255))
142               
143               
144                self.export_water_colors=[]
145               
146               
147               
148                self.export_water_colors.append(CustomColor(29,12,64))
149                self.export_water_colors.append(CustomColor(47,17,108))
150                self.export_water_colors.append(CustomColor(93,51,247))
151                self.export_water_colors.append(CustomColor(153,82,225))
152                self.export_water_colors.append(CustomColor(182,68,225))
153               
154                #self.update_water_colors=self.export_water_colors
155               
156                self.login_animation_x=236 + 127/2
157                self.login_animation_y=131 + 128/2
158                self.login_animation_r=60
159               
160                self.login_enabled=True
161               
162                self.current_mirror=None
163                self.updating_mirror=None
164               
165                self.update_percentage_time=10000
166                self.update_y_time=50
167                self.update_degree_time=50
168                self.update_mirror_button_time=50
169               
170               
171        #def init
172       
173        def check_root(self):
174               
175                try:
176               
177                        f=open(TOKEN_FILE,"w")
178                        f.write(str(os.getpid()))
179                        f.close()
180                       
181                        return True
182                       
183                except:
184                       
185                        dialog = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Lliurex Mirror")
186                        dialog.format_secondary_text("You need administration privileges to run this application.")
187                        dialog.run()
188                        sys.exit(1)
189               
190        #def check_root
191       
192        def start_gui(self):
193               
194                ui_path=GLADE_FILE
195                builder=Gtk.Builder()
196                builder.add_from_file(ui_path)
197               
198               
199               
200               
201                self.stack = Gtk.Stack()
202                self.stack.set_transition_duration(1000)
203                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
204               
205                self.label_image=builder.get_object("label_da")
206                self.label_image1=builder.get_object("label_da1")
207                self.label_image.connect("draw",self.draw_label)
208                self.label_image1.connect("draw",self.draw_label)
209               
210               
211                self.window=builder.get_object("main_window")
212                self.mirror_header_box=builder.get_object("mirror_header_box")
213                self.mirror_name_label=builder.get_object("mirror_name_label")
214                self.conf_mirror_name_label=builder.get_object("conf_mirror_name_label")
215                self.llx_mirror_label=builder.get_object("llx_mirror_label")
216                self.arch_label=builder.get_object("arch_label")
217                self.progress_da=builder.get_object("progress_drawingarea")
218                self.shadow_box=builder.get_object("shadow_box")
219                self.shadow_box1=builder.get_object("shadow_box1")
220                self.shadow_box2=builder.get_object("shadow_box2")
221                self.content_box=builder.get_object("mirror_box")
222                #self.main_content_box=builder.get_object("main_content_box")
223                self.progress_label=builder.get_object("progress_label")
224                self.list_box=builder.get_object("list_box")
225                self.arrow_eb=builder.get_object("arrow_eventbox")
226                self.main_header_box=builder.get_object("main_header_box")
227                self.update_label_box=builder.get_object("update_label_box")
228                self.export_label_box=builder.get_object("export_label_box")
229                self.configuration_label_box=builder.get_object("configuration_label_box")
230                self.folder_fcb=builder.get_object("folder_fcb")
231                self.folder_fcb.connect("file-set",self.folder_fcb_changed)
232                self.local_folder_label=builder.get_object("local_folder_label")
233                self.destination_fcb=builder.get_object("destination_fcb")
234                self.destination_fcb.connect("file-set",self.destination_fcb_changed)
235                self.destination_label=builder.get_object("destination_label")
236                self.scrolledwindow=builder.get_object("scrolledwindow1")
237               
238                self.internet_rb=builder.get_object("internet_rb")
239                self.local_folder_rb=builder.get_object("local_folder_rb")
240                self.url_rb=builder.get_object("url_rb")
241                self.url_entry=builder.get_object("url_entry")
242               
243                self.arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK )
244                self.arrow_eb.connect("button-release-event",self.arrow_clicked)
245               
246                self.update_eb=builder.get_object("update_eventbox")
247                self.update_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
248                self.update_eb.connect("motion-notify-event",self.mouse_over_update)
249                self.update_eb.connect("leave_notify_event",self.mouse_exit_update)
250                self.update_eb.connect("button-release-event",self.update_clicked)
251               
252                self.export_eb=builder.get_object("export_eventbox")
253                self.export_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
254                self.export_eb.connect("motion-notify-event",self.mouse_over_export)
255                self.export_eb.connect("leave_notify_event",self.mouse_exit_export)
256                self.export_eb.connect("button-release-event",self.export_clicked)
257               
258                self.configuration_eb=builder.get_object("configuration_eventbox")
259                self.configuration_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
260                self.configuration_eb.connect("motion-notify-event",self.mouse_over_conf)
261                self.configuration_eb.connect("leave_notify_event",self.mouse_exit_conf)
262                self.configuration_eb.connect("button-release-event",self.conf_clicked)
263               
264               
265                self.configuration_box=builder.get_object("configuration_box")
266                self.configuration_header_box=builder.get_object("configuration_header_box")
267                self.configuration_arrow_eb=builder.get_object("configuration_arrow_eventbox")
268                self.configuration_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK )
269                self.configuration_arrow_eb.connect("button-release-event",self.configuration_arrow_clicked)
270               
271                self.name_label=builder.get_object("name_label")
272                self.banner_label=builder.get_object("banner_label")
273                self.origin_label=builder.get_object("origin_label")
274                self.distributions_label=builder.get_object("distributions_label")
275                self.sections_label=builder.get_object("sections_label")
276                self.architectures_label=builder.get_object("architectures_label")
277                self.local_path_label=builder.get_object("local_path_label")
278                self.check_md5_label=builder.get_object("check_md5_label")
279                self.ign_gpg_label=builder.get_object("ign_gpg_label")
280                self.ign_release_label=builder.get_object("ign_release_label")
281               
282                self.name_entry=builder.get_object("name_entry")
283                self.banner_combobox=builder.get_object("banner_combobox")
284                self.origin_entry=builder.get_object("origin_entry")
285                self.distributions_entry=builder.get_object("distributions_entry")
286                self.sections_entry=builder.get_object("sections_entry")
287                self.i386_cb=builder.get_object("i386_checkbutton")
288                self.amd64_cb=builder.get_object("amd64_checkbutton")
289                self.mirror_path_entry=builder.get_object("mirror_path_entry")
290                self.check_md5_cb=builder.get_object("check_md5_checkbutton")
291                self.ign_gpg_cb=builder.get_object("ign_gpg_checkbutton")
292                self.ign_release_cb=builder.get_object("ign_release_checkbutton")
293               
294               
295                self.save_button_box=builder.get_object("save_button_box")
296                self.save_eb=builder.get_object("save_eventbox")
297                self.save_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK  )
298                self.save_eb.connect("button-release-event",self.save_button_clicked)
299                self.save_eb.connect("motion-notify-event",self.mouse_over_save)
300                self.save_eb.connect("leave_notify_event",self.mouse_exit_save)
301               
302                self.export_label=builder.get_object("export_label")
303                self.update_label=builder.get_object("update_label")
304                self.save_label=builder.get_object("save_label")
305                self.conf_label=builder.get_object("conf_label")
306                self.i386_label=builder.get_object("i386_label")
307                self.amd64_label=builder.get_object("amd64_label")
308               
309                self.update_header_label=builder.get_object("update_header_label")
310                self.export_header_label=builder.get_object("export_header_label")
311                self.internet_rb_label=builder.get_object("internet_rb_label")
312                self.internet_rb_label=builder.get_object("internet_rb_label")
313                self.local_folder_rb_label=builder.get_object("local_folder_rb_label")
314                self.url_rb_label=builder.get_object("url_rb_label")
315                self.destination_opt_label=builder.get_object("destination_opt_label")
316               
317               
318               
319                self.ib=builder.get_object("infobar1")
320                self.ib.connect("response",self.ib_response)
321                self.info_label=builder.get_object("info_label")
322               
323                self.main_content_box=Gtk.Grid()
324                self.main_content_box.set_column_homogeneous(True)
325                self.main_content_box.set_row_spacing(10)
326                self.main_content_box.set_margin_top(15)
327                self.main_content_box.set_margin_left(40)
328               
329                self.viewport=builder.get_object("viewport1")
330                self.viewport.add(self.main_content_box)
331               
332       
333                self.overlay=Gtk.Overlay()
334                self.overlay.add(self.list_box)
335                self.overlay.show_all()
336               
337                eb=Gtk.EventBox()
338                eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK  )
339                b=Gtk.Image()
340               
341                eb.connect("button-release-event",self.add_clicked)
342                eb.connect("motion-notify-event",self.add_mouse_over,b)
343                eb.connect("leave_notify_event",self.add_mouse_left,b)
344                b.set_from_file(ADD_IMAGE)
345                b.show()
346               
347                eb.add(b)
348               
349                eb.set_valign(Gtk.Align.END)
350                eb.set_halign(Gtk.Align.END)
351                eb.set_margin_bottom(5)
352                eb.set_margin_right(20)
353                self.overlay.add_overlay(eb)
354               
355               
356                self.login_da_box=builder.get_object("login_da_box")
357                self.login_da=builder.get_object("login_drawingarea")
358                self.login_da.connect("draw",self.draw_login)
359               
360                self.login_overlay=Gtk.Overlay()
361                self.login_overlay.add(self.login_da_box)
362               
363                '''
364                self.login_box=Gtk.VBox()
365               
366                self.login_button=Gtk.Button("Login")
367                self.login_button.connect("clicked",self.login_clicked)
368               
369                self.login_box.pack_end(self.login_button,False,True,5)
370                self.login_box.pack_end(Gtk.Entry(),False,True,5)
371                self.login_box.pack_end(Gtk.Entry(),False,True,5)
372                self.tmp_label=Gtk.Label("hola")
373                self.login_box.pack_start(self.tmp_label,False,True,100)
374                '''
375               
376                self.login_box=builder.get_object("login_box")
377                self.login_eb=builder.get_object("login_eventbox")
378                self.login_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK  )
379                self.login_eb.connect("button-press-event",self.login_clicked)
380                self.login_eb.connect("motion-notify-event",self.mouse_over_login)
381                self.login_eb.connect("leave_notify_event",self.mouse_exit_login)
382                self.user_entry=builder.get_object("user_entry")
383                self.user_entry.connect("activate",self.entries_press_event)
384                self.password_entry=builder.get_object("password_entry")
385                self.password_entry.connect("activate",self.entries_press_event)
386                self.login_eb_box=builder.get_object("login_eb_box")
387                self.login_msg_label=builder.get_object("login_msg_label")
388               
389                self.server_ip_entry=builder.get_object("server_ip_entry")
390                self.server_ip_entry.connect("activate",self.entries_press_event)
391               
392                self.button1=builder.get_object("button1")
393                self.button1.grab_focus()
394               
395               
396                self.login_overlay.add_overlay(self.login_box)
397                self.login_overlay.show_all()
398               
399               
400                self.stack.add_titled(self.login_overlay,"login","Login")
401                self.stack.add_titled(self.overlay, "main", "Main")
402                self.stack.add_titled(self.content_box, "mirror", "Mirror")
403                self.stack.add_titled(self.configuration_box,"configuration","Configuration")
404               
405               
406                self.banner_combo=builder.get_object("banner_combobox")
407                self.banner_store=Gtk.ListStore(GdkPixbuf.Pixbuf,str)
408               
409                for x in glob.glob(BANNERS_PATH+"*.png"):
410                        f_name=x.replace(BANNERS_PATH,"").split(".png")[0]
411                        image=Gtk.Image()
412                        image.set_from_file(x)
413                        pixbuf=image.get_pixbuf()
414                        pixbuf=pixbuf.scale_simple(64,64,GdkPixbuf.InterpType.BILINEAR)
415                        self.banner_store.append([pixbuf,f_name])
416                       
417                       
418                self.banner_combobox.set_model(self.banner_store)
419                txt_renderer=Gtk.CellRendererText()
420                pixbuf_renderer=Gtk.CellRendererPixbuf()
421               
422                self.banner_combobox.pack_start(pixbuf_renderer,True)
423                self.banner_combobox.add_attribute(pixbuf_renderer,"pixbuf",0)
424                self.banner_combobox.pack_start(txt_renderer,True)
425                self.banner_combobox.add_attribute(txt_renderer,"text",1)
426               
427               
428                self.window.add(self.stack)
429               
430                self.check_root()
431               
432                self.set_css_info()
433               
434                self.window.show_all()
435                self.ib.hide()
436                self.button1.hide()
437               
438                self.progress_da.connect("draw",self.draw_progress)
439                self.window.connect("destroy",self.quit)
440               
441                               
442               
443               
444               
445               
446                #self.set_previous_values()
447               
448               
449                GObject.threads_init()
450                Gtk.main()
451               
452        #def start_gui
453       
454       
455        def set_css_info(self):
456               
457                css = """
458               
459                #BLUE_HEADER {
460                        background-image:-gtk-gradient (linear, left top, left bottom, from (#455A64),  to (#455A64));;
461                       
462                }
463               
464                #LIGHT_BLUE_BACKGROUND {
465                        background-image:-gtk-gradient (linear, left top, left bottom, from (#338fef),  to (#338fef));;
466                       
467                }
468               
469                #HEADER_SHADOW {
470                        background-image:-gtk-gradient (linear, left top, left bottom, from (#7b7b7b),  to (#ffffff));;
471               
472                }
473               
474               
475                #WHITE_BACKGROUND {
476                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
477               
478                }
479               
480                #RED_BACKGROUND {
481                        background-image:-gtk-gradient (linear, left top, left bottom, from (#cc0000),  to (#cc0000));;
482               
483                }
484               
485                #ORANGE_BACKGROUND {
486                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff6600),  to (#ff6600));;
487                }
488               
489                #LIGHT_RED_BACKGROUND {
490                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff2d2d),  to (#ff2d2d));;
491               
492                }
493               
494                #BUTTON_COLOR {
495                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
496                       
497               
498                }
499               
500                #DISABLED_BUTTON_OVER{
501                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
502                }
503               
504                #DISABLED_BUTTON{
505                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
506                }
507               
508                #CANCEL_BUTTON{
509                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
510                }
511               
512                #CANCEL_BUTTON_OVER{
513                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
514                }
515               
516                #SECTION_LABEL {
517                        font: Roboto 16;
518                }
519               
520               
521                #BUTTON_OVER_COLOR {
522                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
523                       
524               
525                }
526               
527                #BUTTON_LABEL{
528                        color:white;
529                        font: Roboto 10;
530                }
531               
532               
533                #WHITE_MIRROR_NAME {
534                        color: white;
535                        font: Roboto Medium 20;
536               
537                }
538               
539                #WHITE_EXTRA_INFO {
540                        color: white;
541                        font: Roboto Light 12;
542               
543                }
544               
545                #BLUE_FONT {
546                        color: #3366cc;
547                        font: Roboto 10;
548                       
549                }
550
551                #LABEL_OPTION{
552               
553                        color: #808080;
554                        font: Roboto 11;
555                }
556               
557                #LOGIN_BUTTON {
558                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
559                        color: #FFFFFF;
560                        font: Roboto 12;
561                }
562               
563                #LOGIN_BUTTON_OVER {
564                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
565                        color: #FFFFFF;
566                        font: Roboto 12;
567                }
568               
569                #LOGIN_BUTTON_DISABLED {
570                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
571                        color: #FFFFFF;
572                        font: Roboto 12;
573                }
574               
575                #LOGIN_BUTTON_DISABLED_OVER {
576                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
577                        color: #FFFFFF;
578                        font: Roboto 12;
579                }
580               
581                #ERROR_FONT {
582                        color: #CC0000;
583                        font: Roboto 10;
584                }
585               
586
587                """
588               
589                self.style_provider=Gtk.CssProvider()
590                self.style_provider.load_from_data(css)
591                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
592               
593                self.mirror_header_box.set_name("BLUE_HEADER")
594                self.main_header_box.set_name("BLUE_HEADER")
595                self.update_label_box.set_name("BUTTON_COLOR")
596                self.export_label_box.set_name("BUTTON_COLOR")
597                self.save_button_box.set_name("BUTTON_COLOR")
598                self.configuration_header_box.set_name("BLUE_HEADER")
599                self.configuration_label_box.set_name("BUTTON_COLOR")
600               
601                self.mirror_name_label.set_name("WHITE_MIRROR_NAME")
602                self.llx_mirror_label.set_name("WHITE_MIRROR_NAME")
603                self.conf_mirror_name_label.set_name("WHITE_MIRROR_NAME")
604                self.arch_label.set_name("WHITE_EXTRA_INFO")
605                self.shadow_box.set_name("HEADER_SHADOW")
606                self.shadow_box1.set_name("HEADER_SHADOW")
607                self.shadow_box2.set_name("HEADER_SHADOW")
608                self.content_box.set_name("WHITE_BACKGROUND")
609                self.list_box.set_name("WHITE_BACKGROUND")
610                self.configuration_box.set_name("WHITE_BACKGROUND")
611               
612                self.name_label.set_name("LABEL_OPTION")
613                self.banner_label.set_name("LABEL_OPTION")
614                self.origin_label.set_name("LABEL_OPTION")
615                self.distributions_label.set_name("LABEL_OPTION")
616                self.sections_label.set_name("LABEL_OPTION")
617                self.architectures_label.set_name("LABEL_OPTION")
618                self.local_path_label.set_name("LABEL_OPTION")
619                self.check_md5_label.set_name("LABEL_OPTION")
620                self.ign_gpg_label.set_name("LABEL_OPTION")
621                self.ign_release_label.set_name("LABEL_OPTION")
622       
623                self.update_label.set_name("BUTTON_LABEL")
624                self.export_label.set_name("BUTTON_LABEL")
625                self.save_label.set_name("BUTTON_LABEL")
626                self.conf_label.set_name("BUTTON_LABEL")
627               
628                self.url_entry.set_name("BLUE_FONT")
629                self.name_entry.set_name("BLUE_FONT")
630                self.origin_entry.set_name("BLUE_FONT")
631                self.distributions_entry.set_name("BLUE_FONT")
632                self.sections_entry.set_name("BLUE_FONT")
633                self.mirror_path_entry.set_name("BLUE_FONT")
634                self.i386_label.set_name("BLUE_FONT")
635                self.amd64_label.set_name("BLUE_FONT")
636               
637                self.user_entry.set_name("BLUE_FONT")
638                self.password_entry.set_name("BLUE_FONT")
639                self.server_ip_entry.set_name("BLUE_FONT")
640               
641                self.update_header_label.set_name("SECTION_LABEL")
642                self.export_header_label.set_name("SECTION_LABEL")
643               
644                self.internet_rb_label.set_name("LABEL_OPTION")
645                self.local_folder_rb_label.set_name("LABEL_OPTION")
646                self.url_rb_label.set_name("LABEL_OPTION")
647                self.destination_opt_label.set_name("LABEL_OPTION")
648               
649                self.local_folder_label.set_name("BLUE_FONT")
650                self.destination_label.set_name("BLUE_FONT")
651                self.login_eb.set_name("LOGIN_BUTTON")
652                #self.login_eb_box.set_name("HEADER_SHADOW")
653                self.login_msg_label.set_name("ERROR_FONT")
654               
655               
656        #def set_css
657       
658        def set_mirror_info(self,mirror_button):
659
660
661                '''
662                "NAME": "",
663                "BANNER": "",
664                "ORIGS" : {"1":"lliruex.net/xenial","2":"","3":""},
665                "ARCHITECTURES": [ "amd64", "i386"],
666                "SECTIONS": ["main", "main/debian-installer", "universe", "restricted", "multiverse", "partner"],
667                "MIRROR_PATH": "/net/mirror/llx16",
668                "DISTROS": ["xenial","xenial-updates","xenial-security"],
669                "IGN_GPG":1,
670                "IGN_RELEASE":0,
671                "CHK_MD5":0,
672                "CURRENT_UPDATE_OPTION":"1"
673                '''
674
675                self.url_entry.set_text(mirror_button.info["ORIGS"]["3"])
676                if len(mirror_button.info["NAME"]) < 22 :
677                        self.mirror_name_label.set_text(mirror_button.info["NAME"])
678                        self.conf_mirror_name_label.set_text(mirror_button.info["NAME"])
679                        self.mirror_name_label.set_tooltip_text("")
680                        self.conf_mirror_name_label.set_tooltip_text("")
681                else:
682                        self.mirror_name_label.set_text(mirror_button.info["NAME"][0:19]+"...")
683                        self.mirror_name_label.set_tooltip_text(mirror_button.info["NAME"])
684                        self.conf_mirror_name_label.set_tooltip_text(mirror_button.info["NAME"])       
685                        self.conf_mirror_name_label.set_text(mirror_button.info["NAME"][0:19]+"...")
686               
687               
688               
689               
690                self.arch_label.set_text(", ".join(mirror_button.info["ARCHITECTURES"]))
691               
692                self.internet_rb.set_active(True)
693               
694                #if mirror_button.info["CURRENT_UPDATE_OPTION"]=="2":
695                #       self.local_folder_rb.set_active(True)
696                       
697                if mirror_button.info["CURRENT_UPDATE_OPTION"]=="3":
698                        self.url_rb.set_active(True)
699               
700                self.name_entry.set_text(mirror_button.info["NAME"])
701               
702                c=0
703               
704                for i in self.banner_store:
705                        if i[1]==mirror_button.info["BANNER"]:
706                                break
707                        c+=1
708                       
709                self.banner_combobox.set_active(c)
710                       
711                       
712               
713                self.origin_entry.set_text(mirror_button.info["ORIGS"]["1"])
714                self.distributions_entry.set_text(", ".join(mirror_button.info["DISTROS"]))
715                self.sections_entry.set_text(", ".join(mirror_button.info["SECTIONS"]))
716                self.i386_cb.set_active("i386" in mirror_button.info["ARCHITECTURES"])
717                self.amd64_cb.set_active("amd64" in mirror_button.info["ARCHITECTURES"])
718                self.mirror_path_entry.set_text(mirror_button.info["MIRROR_PATH"])
719               
720                self.check_md5_cb.set_active(mirror_button.info["CHK_MD5"]==1)
721                self.ign_gpg_cb.set_active(mirror_button.info["IGN_GPG"]==1)
722                self.ign_release_cb.set_active(mirror_button.info["IGN_RELEASE"]==1)
723               
724                self.progress_label.set_text("")
725               
726                self.current_mirror=mirror_button
727
728               
729               
730               
731                if self.updating_mirror!=None:
732                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["updating"]:
733                                self.update_label_box.set_name("DISABLED_BUTTON")
734                                self.update_label.set_text("Update")
735                               
736                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["exporting"]:
737                                self.export_label_box.set_name("DISABLED_BUTTON")
738                                self.export_label.set_text("Export")
739                               
740                        if self.current_mirror==self.updating_mirror:
741                               
742                                if self.updating_mirror.info["updating"]:
743                                        self.update_label.set_text("Cancel")
744                                        self.update_label_box.set_name("CANCEL_BUTTON")
745                                       
746                                if self.updating_mirror.info["exporting"]:
747                                        self.export_label.set_text("Cancel")
748                                        self.export_label_box.set_name("CANCEL_BUTTON")
749                                       
750               
751                '''
752                if "2.5" in self.current_mirror.info["ORIGS"]:
753               
754                        if self.current_mirror.info["ORIGS"]["2.5"]!="":
755                                self.folder_fcb.set_filename(self.current_mirror.info["ORIGS"]["2.5"])
756                                self.local_folder_label.set_text(self.current_mirror.info["ORIGS"]["2.5"])
757                        else:
758                                self.folder_fcb.set_filename(os.environ["HOME"])
759                                self.local_folder_label.set_text(os.environ["HOME"])
760                '''             
761               
762               
763                self.destination_fcb.set_filename(os.environ["HOME"])
764                self.destination_label.set_text(os.environ["HOME"])
765               
766               
767               
768                return True
769               
770        #def set_mirror_info
771
772
773        def parse_mirrors(self):
774                '''
775                self.mirrors={}
776               
777                once=True
778               
779                for t in range(0,1):
780               
781                        for m_file in glob.glob(MIRROR_CONF_DIR+"*"):
782                               
783                                f=open(m_file,"r")
784                                data=json.load(f)
785                                f.close()
786                                m=MirrorButton(data)
787
788                                if once:
789                                       
790                                        if m.info["updating"]:
791                                                if once:
792                                                        GLib.timeout_add(5,self.update_mirror_button_animation,m)
793                                                        once=False
794                                                               
795                                else:
796                                               
797                                        m.info["updating"]=False
798                                       
799                                if t == 0:
800                                        self.mirrors[m_file.split("/")[-1]]=m
801                                else:
802                                        self.mirrors[m_file.split("/")[-1]+"%s"%t]=m
803                                self.add_mirror_button(m)
804               
805                return True
806                '''
807               
808                self.mirrors=self.llx_conn.mirror_list()
809               
810                #print self.mirrors["mippa"]
811               
812                mirror_key=self.llx_conn.is_alive()
813               
814                for key in self.mirrors:
815               
816                        m=MirrorButton(self.mirrors[key])
817                        m.info["KEY"]=key
818                        if key==mirror_key["msg"] and mirror_key["status"]:
819                                m.info["executing"]=True
820                                m.info["updating"]=True
821                                self.updating_mirror=m
822                               
823                                GLib.timeout_add(self.update_y_time,self.update_ys)
824                                GLib.timeout_add(self.update_percentage_time,self.update_percentage)
825                                GLib.timeout_add(self.update_degree_time,self.update_degree)
826                               
827                                GLib.timeout_add(self.update_mirror_button_time,self.update_mirror_button_animation,self.updating_mirror)
828                                self.export_label_box.set_name("DISABLED_BUTTON")
829                               
830                               
831                               
832                        self.add_mirror_button(m)
833               
834                return True
835               
836               
837        #def parse_mirrors
838       
839
840        def set_previous_values(self):
841               
842                #self.folder_fcb.set_filename("/home/cless")
843                #self.local_folder_label.set_text("/home/cless")
844               
845                #self.destination_fcb.set_filename("/home/cless")
846                #self.destination_label.set_text("/home/cless")
847               
848                pass
849               
850        #def set_previous_values
851       
852        def set_info_text(self,txt,message_type=Gtk.MessageType.INFO):
853               
854                self.ib.set_message_type(message_type)
855                self.info_label.set_text(txt)
856                self.ib.show()
857               
858        #def set_info_text
859       
860        def show_content(self,widget):
861               
862                self.ib.hide()
863                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
864                self.stack.set_visible_child_name("mirror")
865               
866               
867        #show_content
868       
869        def add_mirror_button(self,mirror_button):
870               
871                #print mirror_button.info
872               
873                da=Gtk.DrawingArea()
874                da.set_size_request(140,148)
875                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
876               
877                da.connect("draw",self.draw_button,mirror_button)
878                da.connect("motion-notify-event",self.mouse_over,mirror_button)
879                da.connect("leave_notify_event",self.mouse_left,mirror_button)
880                da.connect("button-press-event",self.mirror_button_clicked,mirror_button)
881               
882                da.size_request()
883               
884                da.show()
885               
886                mirror_button.info["da"]=da
887               
888                self.main_content_box.attach(da,self.current_grid_width,self.current_grid_height,1,1)
889               
890                self.current_grid_width+=1
891               
892                if self.current_grid_width > self.max_grid_width:
893                        self.current_grid_width=0
894                        self.current_grid_height+=1
895                       
896        #def add_mirror_button
897       
898
899        def add_clicked(self,widget,event):
900               
901                print "add clicked"
902               
903                self.add_flag=True
904       
905                info={}
906               
907                info["NAME"]=""
908                info["ARCHITECTURES"]=""
909                info["CURRENT_UPDATE_OPTION"]=""
910                info["BANNER"]=""
911                info["DISTROS"]=""
912                info["SECTIONS"]=""
913                info["MIRROR_PATH"]=""
914                info["ORIGS"]={}
915                info["ORIGS"]["1"]=""
916                info["ORIGS"]["2"]=""
917                info["ORIGS"]["3"]=""
918                info["CHK_MD5"]=""
919                info["IGN_GPG"]=""
920                info["IGN_RELEASE"]=""
921               
922               
923                mirror=MirrorButton(info)
924                mirror.info["updating"]=False
925               
926                self.set_mirror_info(mirror)
927                self.banner_combobox.set_active(0)
928                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
929                self.stack.set_visible_child_name("configuration")
930               
931               
932               
933        #def add_clicked
934       
935        def add_mouse_over(self,widget,event,i):
936               
937                i.set_from_file(ADD_IMAGE_OVER)
938               
939        #def add_mouse_over
940       
941       
942        def add_mouse_left(self,widget,event,i):
943               
944                i.set_from_file(ADD_IMAGE)
945               
946        #def add_mouse_over
947       
948        def entries_press_event(self,widget):
949               
950               
951               
952                self.login_clicked(None,None)
953
954        def ib_response(self,widget,response):
955
956                self.ib.hide()
957               
958        #
959       
960        def folder_fcb_changed(self,widget):
961               
962               
963                self.local_folder_label.set_text(self.folder_fcb.get_filename())
964               
965        #def
966       
967        def destination_fcb_changed(self,widget):
968               
969               
970                self.destination_label.set_text(self.destination_fcb.get_filename())
971               
972        #def
973       
974       
975        def configuration_arrow_clicked(self,widget,event):
976               
977                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
978                if self.add_flag:
979                        self.stack.set_visible_child_name("main")
980                        self.add_flag=False
981                        return True
982               
983                self.ib.hide()                 
984                self.stack.set_visible_child_name("mirror")
985               
986               
987        #def arrow_clicked
988       
989       
990        def arrow_clicked(self,widget,event):
991               
992                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
993                self.stack.set_visible_child_name("main")
994               
995               
996               
997        #def arrow_clicked
998
999       
1000        def mouse_over_update(self,widget,event):
1001               
1002               
1003                if self.updating_mirror!=None and self.updating_mirror.info["updating"]:
1004                       
1005                        if self.updating_mirror==self.current_mirror:
1006                                self.update_label_box.set_name("CANCEL_BUTTON_OVER")
1007                                return True
1008                               
1009                        self.update_label_box.set_name("DISABLED_BUTTON_OVER")
1010                        return True
1011                       
1012               
1013                if self.updating_mirror!=None and self.updating_mirror.info["exporting"]:
1014                       
1015                        self.update_label_box.set_name("DISABLED_BUTTON_OVER")
1016                        return True
1017               
1018                       
1019                self.update_label_box.set_name("BUTTON_OVER_COLOR")
1020               
1021        #def mouse_over_event
1022       
1023        def mouse_exit_update(self,widget,event):
1024               
1025               
1026                if self.updating_mirror!=None and self.updating_mirror.info["updating"]:
1027                       
1028                        if self.updating_mirror==self.current_mirror:
1029                                self.update_label_box.set_name("CANCEL_BUTTON")
1030                                return True
1031                               
1032                        self.update_label_box.set_name("DISABLED_BUTTON")
1033                        return True
1034                       
1035               
1036                if self.updating_mirror!=None and self.updating_mirror.info["exporting"]:
1037                       
1038                        self.update_label_box.set_name("DISABLED_BUTTON")
1039                        return True
1040               
1041                       
1042                self.update_label_box.set_name("BUTTON_COLOR")
1043               
1044               
1045        #def mouse left_update
1046       
1047        def update_clicked(self,widget,event):
1048               
1049                print "Update clicked"
1050       
1051                mode="1"
1052                data=None
1053       
1054                self.current_mirror.info["cancelled"]=False
1055               
1056                if self.updating_mirror!=None and self.updating_mirror!=self.current_mirror:
1057                        if self.updating_mirror.info["executing"]:
1058                                self.set_info_text("'%s' is currently %s."%(self.updating_mirror.info["NAME"], 'updating' if self.updating_mirror.info["updating"] else 'exporting'),Gtk.MessageType.ERROR)
1059                                return False
1060               
1061                if self.current_mirror.info["exporting"]:
1062                        self.set_info_text("'%s' is currently exporting."%self.updating_mirror.info["NAME"],Gtk.MessageType.ERROR)
1063                        return False
1064               
1065                if self.internet_rb.get_active():
1066                        print "INTERNET"
1067               
1068                if self.local_folder_rb.get_active():
1069                        print "LOCAL_FOLDER: %s"%self.folder_fcb.get_filename()
1070                        mode="2"
1071                        data=self.folder_fcb.get_filename()
1072                        self.current_mirror.info["ORIGS"]["2"]=data
1073                       
1074                       
1075                if self.url_rb.get_active():
1076                        print "URL: %s"%self.url_entry.get_text()
1077                        mode="3"
1078                        data=self.url_entry.get_text()
1079                        self.current_mirror.info["ORIGS"]["3"]=data
1080               
1081                self.current_mirror.info["CURRENT_UPDATE_OPTION"]=mode
1082               
1083                if not self.current_mirror.info["executing"]:
1084                       
1085                        self.percentage=0
1086                        self.progress_label.set_text("")
1087                        GLib.idle_add(self.ib.hide)
1088                        self.updating_mirror=self.current_mirror
1089                        self.current_mirror.info["updating"]=True
1090                        self.current_mirror.info["executing"]=True
1091                        self.current_mirror.info["cancelled"]=False
1092                        GLib.timeout_add(self.update_y_time,self.update_ys)
1093                        GLib.timeout_add(self.update_percentage_time,self.update_percentage)
1094                        GLib.timeout_add(self.update_degree_time,self.update_degree)
1095                       
1096                        #print c.update('mippa','3','172.20.8.6/mirror/ppa-xenial')
1097                        #print c.update('mippa','2','/home/mirror-ppa-otracarpeta')
1098                        #print c.update('mippa','1')
1099       
1100                        self.llx_conn.update(self.current_mirror.info["KEY"],mode,data)
1101                       
1102                        GLib.timeout_add(self.update_mirror_button_time,self.update_mirror_button_animation,self.updating_mirror)
1103                        self.update_label.set_text("Cancel")
1104                        self.update_label_box.set_name("CANCEL_BUTTON_OVER")
1105                       
1106                        self.export_label_box.set_name("DISABLED_BUTTON")
1107                       
1108                else:
1109                       
1110                        self.llx_conn.stop_update()
1111                       
1112                        self.updating_mirror.info["updating"]=False
1113                        self.updating_mirror.info["executing"]=False
1114                        self.updating_mirror.info["cancelled"]=True
1115                        self.update_label.set_text("Update")
1116                        self.update_label_box.set_name("BUTTON_COLOR")
1117                        self.export_label_box.set_name("BUTTON_COLOR")
1118
1119        #def update_clicked
1120
1121       
1122        def mouse_over_export(self,widget,event):
1123               
1124               
1125                if self.updating_mirror!=None and self.updating_mirror.info["exporting"]:
1126                       
1127                        if self.updating_mirror==self.current_mirror:
1128                                self.export_label_box.set_name("CANCEL_BUTTON_OVER")
1129                                return True
1130                               
1131                        self.export_label_box.set_name("DISABLED_BUTTON_OVER")
1132                        return True
1133                       
1134               
1135                if self.updating_mirror!=None and self.updating_mirror.info["updating"]:
1136                       
1137                        self.export_label_box.set_name("DISABLED_BUTTON_OVER")
1138                        return True
1139               
1140                self.export_label_box.set_name("BUTTON_OVER_COLOR")
1141               
1142        #def mouse_over_event
1143       
1144        def mouse_exit_export(self,widget,event):
1145               
1146                if self.updating_mirror!=None and self.updating_mirror.info["exporting"]:
1147                       
1148                        if self.updating_mirror==self.current_mirror:
1149                                self.export_label_box.set_name("CANCEL_BUTTON")
1150                                return True
1151                               
1152                        self.export_label_box.set_name("DISABLED_BUTTON")
1153                        return True
1154                       
1155               
1156                if self.updating_mirror!=None and self.updating_mirror.info["updating"]:
1157                       
1158                        self.export_label_box.set_name("DISABLED_BUTTON")
1159                        return True
1160               
1161                self.export_label_box.set_name("BUTTON_COLOR")
1162               
1163        #def mouse left_update
1164       
1165        def export_clicked(self,widget,event):
1166               
1167                print "Export clicked: %s"%self.destination_fcb.get_filename()
1168               
1169               
1170                if self.updating_mirror!=None and self.updating_mirror!=self.current_mirror:
1171                        if self.updating_mirror.info["executing"]:
1172                                self.set_info_text("'%s' is currently %s."%(self.updating_mirror.info["NAME"], 'updating' if self.updating_mirror.info["updating"] else 'exporting'),Gtk.MessageType.ERROR)
1173                                return False
1174               
1175
1176                if self.current_mirror.info["updating"]:
1177                        self.set_info_text("'%s' is currently updating."%self.updating_mirror.info["NAME"],Gtk.MessageType.ERROR)
1178                        return False
1179
1180                if not self.current_mirror.info["exporting"]:
1181                       
1182                        self.percentage=0
1183                        self.updating_mirror=self.current_mirror
1184                        self.updating_mirror.info["exporting"]=True
1185                        self.updating_mirror.info["executing"]=True
1186                        self.updating_mirror.info["cancelled"]=False
1187                        GLib.timeout_add(self.update_y_time,self.update_ys)
1188                        GLib.timeout_add(self.update_percentage_time,self.update_percentage)
1189                        GLib.timeout_add(self.update_degree_time,self.update_degree)
1190                       
1191                        self.llx_conn.export(self.updating_mirror.info["KEY"],self.destination_fcb.get_filename())
1192                       
1193                        GLib.timeout_add(self.update_mirror_button_time,self.update_mirror_button_animation,self.updating_mirror)
1194                       
1195                       
1196
1197                        self.export_label.set_text("Cancel")
1198                        self.export_label_box.set_name("CANCEL_BUTTON_OVER")
1199                       
1200                        self.update_label_box.set_name("DISABLED_BUTTON")
1201
1202                       
1203                else:
1204                       
1205                        self.updating_mirror.info["exporting"]=False
1206                        self.updating_mirror.info["executing"]=False
1207                        self.updating_mirror.info["cancelled"]=True
1208                        self.export_label.set_text("Export")
1209                        self.update_label_box.set_name("BUTTON_COLOR")
1210                        self.export_label_box.set_name("BUTTON_COLOR")
1211               
1212               
1213               
1214               
1215               
1216               
1217        #def update_clicked
1218               
1219
1220        def mouse_over_conf(self,widget,event):
1221               
1222                self.configuration_label_box.set_name("BUTTON_OVER_COLOR")
1223               
1224        #def mouse_over_event
1225       
1226        def mouse_exit_conf(self,widget,event):
1227               
1228                self.configuration_label_box.set_name("BUTTON_COLOR")
1229               
1230        #def mouse left_update
1231       
1232        def conf_clicked(self,widget,event):
1233               
1234                print "Configuration clicked"
1235                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1236                self.stack.set_visible_child_name("configuration")
1237               
1238        #def update_clicked
1239
1240        def mirror_button_clicked(self,widget,event,mirror_button):
1241               
1242                self.set_mirror_info(mirror_button)
1243                self.show_content(None)
1244               
1245        #def button_clicked
1246       
1247        def mouse_over_save(self,widget,event):
1248               
1249                self.save_button_box.set_name("BUTTON_OVER_COLOR")
1250               
1251        #def mouse_over_event
1252       
1253        def mouse_exit_save(self,widget,event):
1254               
1255                self.save_button_box.set_name("BUTTON_COLOR")
1256               
1257        #def mouse left_update
1258       
1259       
1260        def save_button_clicked(self,widget,event):
1261               
1262                self.current_mirror.info["NAME"]=self.name_entry.get_text()
1263               
1264                self.current_mirror.info["BANNER"]=self.banner_store[self.banner_combobox.get_active()][1]
1265               
1266                # internal info based on banner name
1267                if os.path.exists(BANNERS_PATH+self.current_mirror.info["BANNER"]+".png"):
1268                        self.current_mirror.info["image"]=BANNERS_PATH+self.current_mirror.info["BANNER"]+".png"
1269                else:
1270                        self.current_mirror.info["image"]=UNKNOWN_BANNER
1271                       
1272                if "img" in self.current_mirror.info:
1273                        self.current_mirror.info.pop("img")
1274               
1275                #
1276               
1277               
1278               
1279                self.label_image.queue_draw()
1280                self.label_image1.queue_draw()
1281               
1282               
1283                self.current_mirror.info["ORIGS"]["1"]=self.origin_entry.get_text()
1284               
1285                self.current_mirror.info["DISTROS"]=[]
1286                for item in self.distributions_entry.get_text().split(","):
1287                       
1288                        item=item.lstrip(" ").rstrip(" ")
1289                        self.current_mirror.info["DISTROS"].append(item)
1290               
1291                self.current_mirror.info["SECTIONS"]=[]
1292                for item in self.sections_entry.get_text().split(","):
1293                       
1294                        item=item.lstrip(" ").rstrip(" ")
1295                        self.current_mirror.info["SECTIONS"].append(item)
1296                       
1297                self.current_mirror.info["ARCHITECTURES"]=[]
1298                if self.i386_cb.get_active():
1299                        self.current_mirror.info["ARCHITECTURES"].append("i386")
1300                if self.amd64_cb.get_active():
1301                        self.current_mirror.info["ARCHITECTURES"].append("amd64")
1302               
1303                self.current_mirror.info["MIRROR_PATH"]=self.mirror_path_entry.get_text()
1304               
1305                self.current_mirror.info["IGN_GPG"]=0
1306                if self.ign_gpg_cb.get_active():
1307                        self.current_mirror.info["IGN_GPG"]=1
1308               
1309                self.current_mirror.info["IGN_RELEASE"]=0
1310                if self.ign_release_cb.get_active():
1311                        self.current_mirror.info["IGN_RELEASE"]=1
1312               
1313                self.current_mirror.info["CHK_MD5"]=0
1314                if self.check_md5_cb.get_active():
1315                        self.current_mirror.info["CHK_MD5"]=1
1316
1317                self.set_mirror_info(self.current_mirror)
1318               
1319                if self.add_flag:
1320                       
1321                        self.mirrors[str(random.random())]=self.current_mirror
1322                        self.add_mirror_button(self.current_mirror)
1323                        self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1324                        self.ib.hide()
1325                        self.stack.set_visible_child_name("mirror")
1326                       
1327                        self.add_flag=False
1328                       
1329                        try:
1330                                key=self.llx_conn.create_config(self.current_mirror.info)
1331                                self.current_mirror.info["KEY"]=key
1332                                self.set_info_text("Configuration Saved",INFO)
1333                        except Exception as e:
1334                                self.set_info_text("Could not save configuration [%s]"%e,ERROR)
1335               
1336                else:
1337                        try:
1338                                self.llx_conn.save_config(self.current_mirror.info["KEY"],self.current_mirror.info)
1339                                self.set_info_text("Configuration Saved",INFO)
1340                        except Exception as e:
1341                                self.set_info_text("Could not save configuration [%s]"%e,ERROR)
1342               
1343        #def save_button_clicked
1344
1345       
1346        def mouse_over_login(self,widget,event):
1347               
1348                if self.login_enabled:
1349               
1350                        self.login_eb.set_name("LOGIN_BUTTON_OVER")
1351                       
1352                else:
1353                       
1354                        self.login_eb.set_name("LOGIN_BUTTON_DISABLED")
1355               
1356        #def mouse_over_login
1357       
1358        def mouse_exit_login(self,widget,event):
1359               
1360                if self.login_enabled:
1361               
1362                        self.login_eb.set_name("LOGIN_BUTTON")
1363                else:
1364                       
1365                        self.login_eb.set_name("LOGIN_BUTTON_DISABLED")
1366               
1367        #def mouse_over_login
1368
1369        def validate_user(self):
1370               
1371                GLib.idle_add(self.validate_thread)
1372               
1373        #validate_user
1374       
1375        def validate_thread(self):
1376               
1377               
1378               
1379                c=xmlrpclib.ServerProxy("https://"+self.server_ip+":9779")
1380                self.ret=None
1381
1382                try:
1383                        self.ret=c.validate_user(self.user,self.password)
1384                except Exception as e:
1385                        self.ret=[False,str(e)]
1386
1387               
1388                if self.ret[0]:
1389                        GLib.timeout_add(10,self.update_login_animation)
1390                        GLib.idle_add(self.set_login_msg,"")
1391                else:
1392                        GLib.idle_add(self.set_login_msg,"Wrong user and/or password")
1393                        GLib.idle_add(self.login_form_sensitive)
1394                       
1395               
1396        #def validate_thread
1397
1398        def set_login_msg(self,msg):
1399               
1400                self.login_msg_label.set_text(msg)
1401               
1402        #def set_login_msg
1403       
1404       
1405        def login_form_sensitive(self,state=None):
1406               
1407                if state==None:
1408                        state=not self.login_enabled
1409               
1410                self.login_enabled=state
1411               
1412                self.user_entry.set_sensitive(state)
1413                self.password_entry.set_sensitive(state)
1414                self.server_ip_entry.set_sensitive(state)
1415               
1416                if state:
1417                        self.login_eb.set_name("LOGIN_BUTTON")
1418                else:
1419                        self.login_eb.set_name("LOGIN_BUTTON_DISABLED")
1420               
1421               
1422        #def login_form_sensible
1423       
1424
1425        def login_clicked(self,widget,event):
1426               
1427               
1428                if self.login_enabled:
1429               
1430                       
1431                        self.user=self.user_entry.get_text()
1432                        self.password=self.password_entry.get_text()
1433                        self.server_ip=self.server_ip_entry.get_text()
1434                       
1435                        if self.server_ip=="":
1436                                #self.server_ip="server"
1437                                self.server_ip="localhost"
1438                               
1439                               
1440                        self.user="lliurex"
1441                        self.password="lliurex"
1442                       
1443                        self.login_animation_r=60
1444                        self.login_form_sensitive()
1445                       
1446                       
1447                       
1448                        self.t=threading.Thread(target=self.validate_thread)
1449                        self.t.daemon=True
1450                        self.t.start()
1451                       
1452                       
1453                       
1454               
1455               
1456        #def login_clicked
1457       
1458        def update_login_animation(self):
1459               
1460                #print "update_login_animation"
1461               
1462                self.login_animation_r+=8
1463               
1464                if self.login_animation_r<650:
1465                        self.login_da.queue_draw()
1466                        return True
1467                else:
1468                        #return False
1469                        self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
1470                        self.stack.set_visible_child_name("main")
1471                        self.llx_conn=lliurex_mirror_connect.LliurexMirrorN4d(self.server_ip,(self.user,self.password))
1472                        self.parse_mirrors()
1473                       
1474        def update_mirror_button_animation(self,mirror_button):
1475               
1476                #print "update_button_animation"
1477               
1478                if self.stack.get_visible_child_name()!="main":
1479                        return True
1480               
1481                mirror_button.info["degree_offset"]+=1
1482               
1483                if self.updating_mirror.info["executing"]:
1484                        if self.stack.get_visible_child_name()=="main":
1485                                mirror_button.info["da"].queue_draw()
1486                        return True
1487               
1488        #def update_mirror_animation
1489       
1490                       
1491               
1492
1493
1494        def update_ys(self):
1495               
1496               
1497               
1498               
1499               
1500                self.wave_xoffset-=1
1501                self.wave_xoffset2+=2
1502                self.wave_xoffset3+=1
1503               
1504                if self.stack.get_visible_child_name()=="mirror":
1505                        self.progress_da.queue_draw()
1506
1507                if self.updating_mirror.info["executing"]:
1508               
1509                        return True
1510                       
1511
1512               
1513               
1514               
1515        #def update_ys
1516
1517               
1518        def update_percentage(self):
1519               
1520                print "Update %"
1521               
1522                ret={}
1523                ret["status"]=False
1524               
1525                if self.updating_mirror.info["updating"]:
1526                        ret=self.llx_conn.is_alive()
1527                        self.percentage=self.llx_conn.get_percentage(self.updating_mirror.info["KEY"])
1528                if self.updating_mirror.info["exporting"]:
1529                        print "exporting updat percentagee"
1530                        ret=self.llx_conn.is_alive_export()
1531                        print ret
1532                        self.percentage=self.llx_conn.get_percentage_export()
1533                        print self.percentage
1534               
1535               
1536               
1537                self.progress_label.set_text(str(self.percentage) + "%")
1538                       
1539                if self.percentage>=100:
1540                                       
1541                        self.updating_mirror.info["executing"]=False
1542                        self.updating_mirror.info["updating"]=False
1543                        self.updating_mirror.info["exporting"]=False
1544                        self.export_label_box.set_name("BUTTON_COLOR")
1545                        self.update_label_box.set_name("BUTTON_COLOR")
1546                                       
1547                        self.update_label.set_text("Update")
1548                        self.export_label.set_text("Export")
1549
1550
1551                if ret["status"]:
1552                        return True
1553                else:
1554                                if not self.updating_mirror.info["cancelled"]:
1555                                        ret=self.llx_conn.get_status(self.updating_mirror.info["KEY"])
1556                                        if ret["status"]:
1557                                                pass
1558                                        else:
1559                                                error="Error:\n"
1560                                               
1561                                                error+=ret["msg"].lstrip().rstrip()
1562                                                self.set_info_text(error,Gtk.MessageType.ERROR)
1563                                               
1564                                                self.updating_mirror.info["executing"]=False
1565                                                self.updating_mirror.info["updating"]=False
1566                                                self.updating_mirror.info["exporting"]=False
1567                                                self.updating_mirror.info["cancelled"]=True
1568                                                self.export_label_box.set_name("BUTTON_COLOR")
1569                                                self.update_label_box.set_name("BUTTON_COLOR")
1570                                                self.update_label.set_text("Update")
1571                                                self.export_label.set_text("Export")
1572                       
1573               
1574        #def update_percentage
1575
1576               
1577        def update_degree(self):
1578               
1579                #print "update degree"
1580               
1581                self.degree_offset+=1
1582               
1583                if self.degree_offset==360:
1584                        self.dregree_offset=0
1585               
1586                if self.updating_mirror.info["executing"]:
1587                        if self.stack.get_visible_child_name()=="mirror":
1588                                self.updating_mirror.info["da"].queue_draw()
1589                       
1590                        return True
1591               
1592        #def update_degree
1593       
1594
1595        def draw_label(self,widget,ctx):
1596               
1597                if self.stack.get_visible_child_name()=="main" :
1598                        return
1599               
1600                ctx.move_to(0,0)
1601                if "img" not in self.current_mirror.info:
1602                        self.current_mirror.info["img"]=cairo.ImageSurface.create_from_png(self.current_mirror.info["image"])
1603                ctx.set_source_surface(self.current_mirror.info["img"],(140-116)/-2,(140-116)/-2)
1604                ctx.paint()
1605               
1606                ctx.set_source_rgba(69/255.0,90/255.0,100/255.0,1)
1607                ctx.rectangle(0,0,116,116)
1608                ctx.arc_negative(self.circle["x"],self.circle["y"],self.circle["radius"]*0.9,self.to_rad(360),self.to_rad(0))
1609                ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD)
1610                ctx.fill()
1611               
1612                ctx.set_fill_rule(cairo.FILL_RULE_WINDING)
1613                ctx.set_source_rgba(1,1,1,1)
1614                ctx.set_line_width(1)
1615                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"]*0.9,self.to_rad(0),self.to_rad(360))
1616                ctx.stroke()
1617               
1618        #def draw
1619
1620       
1621        def draw_progress(self,widget,ctx):
1622
1623                if self.stack.get_visible_child_name()!="mirror":
1624                        return
1625
1626                if self.current_mirror==self.updating_mirror and self.updating_mirror.info["executing"]:
1627                        percentage=self.percentage
1628                else:
1629                        percentage=110
1630
1631                ctx.set_source_rgba(1,1,1,1)
1632                ctx.rectangle(0,0,self.frame_size,self.frame_size)
1633                ctx.fill()
1634               
1635                ctx.move_to(0,self.frame_size)
1636
1637               
1638               
1639                ctx.set_source_rgba(self.update_water_colors[0].r,self.update_water_colors[0].g,self.update_water_colors[0].b,1)
1640                self.wave_yoffset=self.frame_size-(self.frame_size - (self.circle["radius"]*2))/2 - 7  - self.circle["radius"]*2*percentage/100
1641               
1642               
1643                first=True
1644                for x in range(0,self.frame_size + 1):
1645                       
1646                        y=self.get_wave_y(x,2)
1647                        if y>self.frame_size:
1648                                y=self.frame_size
1649                        if first:
1650                                fy=y
1651                                first=False
1652                        ctx.line_to(x,y)
1653               
1654                ctx.line_to(x,self.frame_size)
1655                ctx.line_to(0,self.frame_size)
1656                ctx.fill()
1657               
1658                               
1659                ctx.set_source_rgba(self.update_water_colors[1].r,self.update_water_colors[1].g,self.update_water_colors[1].b,1)
1660                self.wave_yoffset=self.frame_size-(self.frame_size - (self.circle["radius"]*2))/2 - 5  - self.circle["radius"]*2*percentage/100
1661               
1662                first=True
1663                for x in range(0,self.frame_size + 1):
1664                       
1665                        y=self.get_wave_y(x,1)
1666                        if y>self.frame_size:
1667                                y=self.frame_size
1668                        if first:
1669                                fy=y
1670                                first=False
1671                        ctx.line_to(x,y)
1672               
1673                ctx.line_to(x,self.frame_size)
1674                ctx.line_to(0,self.frame_size)
1675                ctx.fill()
1676               
1677                               
1678                ctx.set_source_rgba(self.update_water_colors[2].r,self.update_water_colors[2].g,self.update_water_colors[2].b,1)
1679                self.wave_yoffset=self.frame_size- (self.frame_size - (self.circle["radius"]*2))/2  - 2  - self.circle["radius"]*2*percentage/100
1680               
1681                first=True
1682               
1683                ys=[]           
1684                for x in range(0,self.frame_size + 1):
1685                       
1686                        y=self.get_wave_y(x)
1687                        ys.append(y)
1688                        if y>self.frame_size:
1689                                y=self.frame_size
1690                       
1691                        if first:
1692                                fy=y
1693                                first=False
1694                               
1695                       
1696                        ctx.line_to(x,y)
1697               
1698                ctx.line_to(x,self.frame_size)
1699                ctx.line_to(0,self.frame_size)
1700                ctx.fill()
1701               
1702               
1703               
1704                r2 = cairo.RadialGradient(0, 40, 1,0, 50, 100)
1705                r2.add_color_stop_rgb(0,self.update_water_colors[3].r,self.update_water_colors[3].g,self.update_water_colors[3].b)
1706                r2.add_color_stop_rgb(1, self.update_water_colors[4].r,self.update_water_colors[4].g,self.update_water_colors[4].b)
1707                ctx.set_source(r2)
1708                self.wave_yoffset=self.frame_size -  (self.frame_size - (self.circle["radius"]*2))/2   - self.circle["radius"]*2*percentage/100
1709               
1710                first=True
1711               
1712                for x in range(0,self.frame_size + 1):
1713                       
1714                        y=ys[x]+3
1715                       
1716                        if y>self.frame_size:
1717                                y=self.frame_size
1718                       
1719                        if first:
1720                                fy=y
1721                                first=False
1722                               
1723                       
1724                        ctx.line_to(x,y)
1725               
1726                ctx.line_to(x,self.frame_size)
1727                ctx.line_to(0,self.frame_size)
1728                ctx.fill()
1729               
1730                ctx.set_source_rgba(69/255.0,90/255.0,100/255.0,1)
1731                ctx.rectangle(0,0,self.frame_size,self.frame_size)
1732                ctx.arc_negative(self.circle["x"],self.circle["y"],self.circle["radius"],self.to_rad(360),self.to_rad(0))
1733                ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD)
1734                ctx.fill()
1735               
1736                ctx.set_fill_rule(cairo.FILL_RULE_WINDING)
1737                ctx.set_source_rgba(52/255.0,52/255.0,52/255.0,1)
1738                ctx.set_line_width(2)
1739                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"],self.to_rad(0),self.to_rad(360))
1740                ctx.stroke()
1741               
1742                ctx.set_line_width(2)
1743                ctx.set_source_rgba(1,1,1,1)
1744                if self.current_mirror.info["cancelled"]:
1745                        ctx.set_source_rgba(1,0,0,1)
1746                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"]+1,self.to_rad(0+self.degree_offset),self.to_rad(percentage*360/100+self.degree_offset))
1747                ctx.stroke()
1748               
1749        #
1750
1751        def draw_login(self,widget,ctx):
1752               
1753               
1754               
1755               
1756                ctx.move_to(0,0)
1757                ctx.set_source_rgba(1,1,1,1)
1758                ctx.rectangle(0,0,600,1000)
1759                ctx.fill()
1760               
1761               
1762                '''
1763                ctx.set_source_rgba(0.4,0.4,1,1)
1764                ctx.arc(300,150,50,self.to_rad(0),self.to_rad(360))
1765                ctx.fill()
1766                '''
1767               
1768               
1769               
1770                #ctx.set_source_rgba(0,0,0,0.1)
1771               
1772       
1773               
1774                ctx.set_source_rgba(69/255.0,90/255.0,100/255.0,1)
1775               
1776               
1777                ctx.arc(self.login_animation_x,self.login_animation_y,self.login_animation_r,self.to_rad(0),self.to_rad(360))
1778                ctx.fill()
1779               
1780                               
1781                '''
1782                ctx.arc(self.login_animation_x,self.login_animation_y,self.login_animation_r,self.to_rad(0),self.to_rad(360))
1783                x,y=ctx.get_current_point()
1784
1785                r2 = cairo.RadialGradient(x, y, self.login_animation_r/2,x, y, self.login_animation_r)
1786                r2.add_color_stop_rgba(0, 1,1,0,1)
1787                r2.add_color_stop_rgba(1, 0, 0, ,1)
1788                ctx.set_line_width(8)
1789                ctx.set_source(r2)
1790                       
1791                ctx.stroke()
1792                '''
1793               
1794               
1795        #def draw_login
1796
1797
1798        def draw_button(self,widget,ctx,mirror_button):
1799               
1800                if self.stack.get_visible_child_name()!="main":
1801                        return 
1802               
1803                ctx.move_to(0,0)
1804                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
1805                ctx.set_source_surface(img,0,mirror_button.info["shadow_start"])
1806                ctx.paint_with_alpha(mirror_button.info["shadow_alpha"])
1807               
1808                ctx.move_to(0,0)
1809                img=cairo.ImageSurface.create_from_png(mirror_button.info["image"])
1810                ctx.set_source_surface(img,0,0)
1811                ctx.paint()
1812               
1813                ctx.move_to(0,0)
1814                ctx.set_source_rgba(1,1,1,1)
1815                ctx.rectangle(0,110,140,30)
1816                ctx.fill()
1817               
1818                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
1819               
1820                pctx = PangoCairo.create_layout(ctx)
1821               
1822                desc = Pango.font_description_from_string ("Roboto 9")
1823                pctx.set_font_description(desc)
1824                pctx.set_markup(mirror_button.info["NAME"])
1825                width=pctx.get_pixel_size()[0]
1826               
1827                if width > 130:
1828                        pctx.set_markup(mirror_button.info["NAME"][0:22]+"...")
1829                       
1830                       
1831               
1832                ctx.move_to(5,118)
1833                PangoCairo.show_layout(ctx, pctx)
1834               
1835               
1836               
1837               
1838                if mirror_button.info["executing"]:
1839                       
1840                        ctx.move_to(0,0)
1841                        ctx.set_source_rgba(0,0,0,0.5)
1842                        ctx.rectangle(0,0,140,110)
1843                        ctx.fill()
1844                       
1845                        ctx.arc(70,70-15,40,self.to_rad(0+mirror_button.info["degree_offset"]),self.to_rad(180+mirror_button.info["degree_offset"]))
1846                        x,y=ctx.get_current_point()
1847
1848                        r2 = cairo.RadialGradient(x, y, 10,x, y, 60)
1849                        r2.add_color_stop_rgba(0, 1,1,1,1)
1850                        r2.add_color_stop_rgba(1, 68/255.0, 159/255.0, 255/255.0,0)
1851                        ctx.set_line_width(8)
1852                        ctx.set_source(r2)
1853                       
1854                        ctx.stroke()
1855                       
1856                        ctx.set_line_width(1)
1857                       
1858                        ctx.set_source_rgba(1,1,1,1)
1859                        ctx.arc(x,y,4,self.to_rad(0),self.to_rad(360))
1860                        ctx.fill()
1861                       
1862                        if int(random.random()*100) > 35:
1863       
1864                                if len(mirror_button.info["random_lights"]) < mirror_button.info["max_random_lights"]:
1865                                       
1866                                        offset=int(random.random()*12)
1867                                       
1868                                        if offset > 6:
1869                                               
1870                                                offset=offset/-2
1871                                       
1872                                        mirror_button.info["random_lights"].append(LightPoint(x+offset,y,random.random()*2))
1873
1874                               
1875                        for i in range(len(mirror_button.info["random_lights"])-1,-1,-1):
1876                               
1877                                mirror_button.info["random_lights"][i].opacity-=0.02
1878                                if mirror_button.info["random_lights"][i].opacity <=0.0:
1879                                        mirror_button.info["random_lights"].pop(i)
1880                                        continue
1881                               
1882                                #ctx.set_source_rgba(1,1,1,mirror_button.info["random_lights"][i].opacity)
1883                                ctx.set_source_rgba(random.random(),1,1,mirror_button.info["random_lights"][i].opacity)
1884                                ctx.arc(mirror_button.info["random_lights"][i].x,mirror_button.info["random_lights"][i].y,mirror_button.info["random_lights"][i].radius,self.to_rad(0),self.to_rad(360))
1885                                #ctx.arc(mirror_button.info["random_lights"][i].x,mirror_button.info["random_lights"][i].y,random.random()*3,self.to_rad(0),self.to_rad(360))
1886                                ctx.fill()
1887       
1888        #def draw_button
1889
1890       
1891        def mouse_over(self,widget,event,mirror_button):
1892               
1893                #print mirror_button.info
1894                mirror_button.info["animation_active"]=False
1895                if mirror_button.info["shadow_alpha"] <0.3 :
1896                        mirror_button.info["shadow_alpha"]+=0.1
1897                        widget.queue_draw()
1898                        return True
1899                       
1900                return False
1901               
1902        #def mouse_over
1903
1904       
1905        def mouse_left(self,widget,event,mirror_button):
1906               
1907                if not mirror_button.info["animation_active"]:
1908                       
1909                        mirror_button.info["animation_active"]=True
1910                        GLib.timeout_add(10,self.restore_shadow_alpha,mirror_button,widget)
1911                       
1912        #def mouse_left
1913
1914       
1915        def restore_shadow_alpha(self,mirror_button,widget):
1916
1917                if mirror_button.info["shadow_alpha"] >=0.2 :
1918                        mirror_button.info["shadow_alpha"]-=0.1
1919                        widget.queue_draw()
1920                        return True
1921                       
1922                mirror_button.info["animation_active"]=False
1923                return False
1924               
1925        #def  restore_shadow_alpha
1926       
1927
1928        def to_rad(self,degree):
1929               
1930                return degree * (pi/180)
1931               
1932        #def to_rad
1933       
1934       
1935        def get_wave_y(self,x,wtype=0):
1936               
1937               
1938                #return 1
1939               
1940                x_offset=self.wave_xoffset
1941                amplitude=self.wave_amplitude
1942               
1943                if wtype==1:
1944                        x_offset=self.wave_xoffset2
1945                        amplitude=self.wave_amplitude2
1946                       
1947                if wtype==2:
1948                        x_offset=self.wave_xoffset3
1949                        amplitude=self.wave_amplitude3
1950               
1951                return amplitude * math.sin((2*pi / self.wave_lenght)*(x - x_offset)) + self.wave_yoffset
1952               
1953               
1954        #def get_wave_y
1955
1956
1957        def quit(self,widget):
1958               
1959                Gtk.main_quit()
1960       
1961        #def quit
1962
1963       
1964#class LliurexMirror
1965
1966lm=LliurexMirror()
1967lm.start_gui()
Note: See TracBrowser for help on using the repository browser.