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

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

wip

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