source: zero-center/trunk/fuentes/install-files/usr/share/zero-center/zero-center.py @ 4267

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

fixing rows with two buttons

  • Property svn:executable set to *
File size: 33.0 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*
3 
4
5import os
6import multiprocessing
7import time
8import random
9import xmlrpclib
10import cairo
11import grp
12import sys
13import subprocess
14
15try:
16        import gi
17        gi.require_version('Gtk', '3.0')
18        gi.require_version('PangoCairo', '1.0')
19        from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
20       
21except Exception as e:
22        print e
23        #zero-server-wizard initialization forces me to do this
24
25import signal
26signal.signal(signal.SIGINT, signal.SIG_DFL)
27
28import gettext
29gettext.textdomain('zero-center')
30_ = gettext.gettext
31
32
33BAR_HEIGHT=90
34CONF_X=5
35
36if os.path.exists("/home/lliurex/banners/"):
37        BANNER_PATH="/home/lliurex/banners/"
38else:
39        BANNER_PATH="/usr/share/banners/lliurex-neu/"
40       
41
42class CategoriesParser:
43       
44        CATEGORIES_PATH="/usr/share/zero-center/categories/"
45       
46        def __init__(self):
47               
48                self.parse_categories()
49               
50        #def init
51       
52        def parse_categories(self,path=None):
53               
54                self.categories=[]
55               
56                if path==None:
57                        path=self.CATEGORIES_PATH
58                       
59                for item in os.listdir(path):
60                        file_path=path+item
61                       
62                        f=open(file_path)
63                        lines=f.readlines()
64                        f.close()
65                       
66                        cat={}
67                       
68                        for line in lines:
69                                key,value=line.split("=")
70                                cat[key]=value.strip("\n")
71                                if key=="level":
72                                        cat[key]=int(cat[key])
73                       
74                        self.categories.append(cat)
75                       
76                tmp=[]
77               
78                while len(self.categories)>0:
79                        selected_index=0
80                        index=0
81                        level=0
82                        for item in self.categories:
83                                if item["level"]>level:
84                                        level=item["level"]
85                                        selected_index=index
86                                       
87                               
88                                index+=1
89                       
90                        tmp.append(self.categories[selected_index])
91                        self.categories.pop(selected_index)
92                       
93                self.categories=tmp
94               
95        #def parse_categories
96               
97               
98#class CategoriesParser
99
100
101class AppParser:
102       
103        BASE_DIR="/usr/share/zero-center/"
104        APP_PATH=BASE_DIR+"applications/"
105        ZMD_PATH=BASE_DIR+"zmds/"
106       
107       
108        def __init__(self):
109               
110                self.categories=["ID","Name","Comment","Icon","Category","Icon","ScriptPath","Groups","Service","Locks"]
111                self.apps={}
112                self.app_list=[]
113                self.configured=[]
114                #print("[ZeroCenter] Parsing apps...")
115                self.parse_all()
116               
117        #def init
118
119       
120        def add_app(self,app):
121               
122                try:
123                        if app["Category"].lower() not in self.apps:
124                                self.apps[app["Category"].lower()]=[]
125                       
126                        self.apps[app["Category"].lower()].append(app)
127                        self.app_list.append(app["ID"])
128                except:
129                        pass
130                       
131        #def add_app
132       
133        def parse_all(self,dir=None):
134               
135                if dir==None:
136                        dir=self.APP_PATH
137       
138                for item in os.listdir(dir):
139                        file_path=self.APP_PATH+item
140                        app=self.parse_file(file_path)
141                        self.add_app(app)
142                       
143        #def parse_all
144
145       
146        def parse_file(self,file_path):
147               
148                f=open(file_path)
149                lines=f.readlines()
150                f.close()
151                id=file_path.split("/")[-1].split(".")[0]
152                app={}
153                for item in lines:
154                        try:
155                                key,value=item.split("=")
156                                app[key]=value.strip("\n")
157                        except:
158                                pass
159               
160                app["ID"]=id
161                app["configured"]=-1
162                app["custom_msg"]=""
163               
164                app["bar_height"]=BAR_HEIGHT
165                app["conf_alpha"]=1.0
166
167               
168                app["expanding"]=False
169                app["restoring"]=False
170
171                return app
172               
173        #def parse_file
174
175       
176#class AppParser
177
178
179class ZeroCenter:
180       
181        def __init__(self):
182               
183                self.client=xmlrpclib.ServerProxy("https://localhost:9779")
184                self.create_user_env()
185                self.categories_parser=CategoriesParser()
186                self.app_parser=AppParser()
187                self.configured_apps=[]
188                self.get_states()
189               
190                self.mprocess=multiprocessing.Process()
191                self.commands=["set-configured","set-non-configured","set-failed","set-custom-text","add-zero-center-notification","remove-zero-center-notification","help","add-pulsating-color","remove-pulsating-color","non-animated","animated"]
192                self.drawing_mode=True
193                self.msg_text=""
194                self.msg_x=0
195                self.scrolling=False
196               
197                try:
198                        self.msg_text=self.client.get_zc_messages("","ZCenterVariables",self.lang)
199                        if self.msg_text=="":
200                                txt=self.client.lliurex_version("","LliurexVersion")
201                                if type(txt)==type([]):
202                                        self.msg_text=str(txt[1])
203                                else:
204                                        f=open("/etc/lsb-release")
205                                        lines=f.readlines()
206                                        f.close()
207                                        for line in lines:
208                                                if "DISTRIB_DESCRIPTION" in line:
209                                                        self.msg_text=line.split("=")[1]
210                        #Load slave_blacklist
211                        self.blacklist=self.client.get_variable("","VariablesManager","SLAVE_BLACKLIST")
212
213                except:
214                        self.msg_text=""
215               
216                #self.msg_text="hi, i'm a long enough text so that it won't show in just one line. I wonder how many lines I can get inside the box. In my restless dreams I see that town, Silent Hill. I don't know what to type, but I have to keep typing"
217                #57
218               
219        #def init
220
221       
222        def get_states(self):
223               
224                try:
225                        var=self.client.get_all_states("","ZCenterVariables")
226                       
227                        for cat in self.app_parser.apps:
228                       
229                                for app in self.app_parser.apps[cat]:
230                                        app["configured"]=0
231                                       
232                                        if app["ID"] in var:
233                                                for key in ["state","pulsating","time","custom_text"]:
234                                                        if key in var[app["ID"]]:
235                                                                app[key]=var[app["ID"]][key]
236               
237                                                       
238                                        if "state" in app:
239                                                app["configured"]=app["state"]
240                               
241                                        if app["configured"]==1:
242                                                self.configured_apps.append(app["ID"])
243                               
244                               
245                except Exception as e:
246                        print e
247                        pass
248                       
249        #def get_states
250
251       
252        def get_translation(self,text):
253               
254                for category in self.categories_parser.categories:
255                       
256                        if text.lower()==category["name"].lower():
257                                for lang in self.language:
258                                        try:
259                                                return category["name["+lang+"]"]
260                                        except Exception as e:
261                                                pass
262                                return category["name"]
263               
264                return text
265               
266        #def get_translation
267
268       
269        def get_name(self,app):
270               
271                for lang in self.language:
272                        try:
273                                return app["Name["+lang+"]"]
274                        except:
275                                pass
276                               
277                return app["Name"]
278               
279        #def get_name
280
281       
282        def get_comment(self,app):
283               
284                for lang in self.language:
285                        try:
286                                return app["Comment["+lang+"]"]
287                        except:
288                                pass
289                               
290                return app["Comment"]
291               
292        #def get_name
293
294       
295        def create_user_env(self):
296               
297                try:
298                        self.lang=os.environ["LANGUAGE"].split(":")[0]
299                        self.language=os.environ["LANGUAGE"].split(":")
300                        if "es_ES" in self.language and "es" not in self.language:
301                                self.language.insert(self.language.index("es_ES")+1,"es")
302                        self.lang=self.lang.split("_")[0]
303                       
304                        if "ca_ES@valencia" in self.language:
305                                self.language.insert(self.language.index("ca_ES@valencia"),"qcv")
306                except:
307                        try:
308                                self.lang=os.environ["LANG"].split(".")[0]
309                                self.language=[]
310                                self.language.append(self.lang)
311                                self.lang=self.lang.split("_")[0]
312                               
313                        except:
314                                self.lang="en"
315                               
316                       
317                groups={}
318               
319                for item in grp.getgrall():
320                        if len(item.gr_mem)>0:
321                                if item.gr_name not in groups:
322                                        groups[item.gr_name]=item.gr_mem
323                                else:
324                                        groups[item.gr_name]=list(groups[item.gr_name]+item.gr_mem)
325                       
326               
327                self.user_groups=[]
328                try:
329                        for item in groups:
330                                if os.environ["USER"] in groups[item]:
331                                        self.user_groups.append(item)
332                                       
333                        self.user_groups.append("*")
334                except:
335                        pass
336               
337        #def create_user_area
338
339       
340        def start_gui(self):
341               
342               
343                self.icon_theme=Gtk.IconTheme()
344                self.icon_theme.set_custom_theme("lliurex-neu")
345               
346                builder=Gtk.Builder()
347                if os.path.exists("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade"):
348                        builder.add_from_file("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade")
349                else:
350                        builder.add_from_file("/usr/share/zero-center/rsrc/zero-center.glade")
351                self.window=builder.get_object("window1")
352                self.window.connect("delete_event",self.close_window)
353                self.window.set_name("BLACK")
354                self.buttons_vbox=builder.get_object("buttons_vbox")
355                self.content_hbox=builder.get_object("main_box")
356                self.content_hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0.2,0.2,0.2,1))
357                self.window_box=builder.get_object("window_box")
358                self.viewport=builder.get_object("viewport1")
359                self.viewport.set_name("ORANGE")
360                self.category_combobox=builder.get_object("category_combobox")
361                self.msg_label=builder.get_object("llx_label")
362                self.msg_label.connect("draw",self.drawing_label_event)
363                self.msg_label.set_tooltip_text(self.msg_text)
364               
365                self.progress_bar=builder.get_object("progressbar")
366                self.progress_label=builder.get_object("progress_label")
367                self.progress_label.set_name("WHITE")
368               
369                self.add_categories_to_window("All")
370                self.set_css_info()
371               
372                self.window.show()
373                GObject.threads_init()
374                Gtk.main()
375               
376        #def start_gui
377       
378       
379        def scroll_me(self,img):
380               
381                if self.msg_x > (self.scroll_width)*-1:
382                        self.msg_x-=1
383                else:
384                        self.msg_x=401
385                img.queue_draw()
386                return self.scrolling
387               
388        #def scroll_me
389
390
391        def set_msg_label_text(self,txt):
392       
393                self.msg_text=txt
394                self.msg_label.queue_draw()
395               
396        #def set_msg_label_text()
397
398       
399        def drawing_label_event(self,widget,ctx):
400               
401                lg1 = cairo.LinearGradient(0.0,18.0, 400.0, 18.0)
402                lg1.add_color_stop_rgba(0, 0.38, 0.38, 0.38, 1)
403                lg1.add_color_stop_rgba(0.1, 0.2, 0.2, 0.2, 1)
404                lg1.add_color_stop_rgba(0.9, 0.2, 0.2, 0.2, 1)
405                lg1.add_color_stop_rgba(1, 0.38, 0.38, 0.38, 1)
406                ctx.rectangle(0, 0, 400, 18)
407                ctx.set_source(lg1)
408                ctx.fill()
409
410                tmp_text=self.msg_text
411
412                if len(tmp_text)>66:
413                        if self.drawing_mode:
414                                if not self.scrolling:
415                                        self.scrolling=True
416                                        self.msg_x=200
417                                        GLib.timeout_add(12,self.scroll_me,widget)
418                        else:
419                                tmp_text=tmp_text[:63]
420                                tmp_text="      " + tmp_text+u" …"
421                else:
422                        self.scrolling=False
423                        spaces=90-len(tmp_text)
424                        space="".join([" "]*(spaces/2))
425                        tmp_text=space+tmp_text+space
426                       
427               
428               
429                tmp_text=tmp_text.replace("[","<b>[")
430                tmp_text=tmp_text.replace("]","] </b>")
431               
432                x=self.msg_x
433                pctx = PangoCairo.create_layout(ctx)
434                desc = Pango.font_description_from_string ("Ubuntu 9")
435                pctx.set_font_description(desc)
436                ctx.set_source_rgb(0.9,0.9,0.9)
437                pctx.set_markup(tmp_text)
438                self.scroll_width=pctx.get_pixel_size()[0]
439                ctx.move_to(x,0)
440                PangoCairo.show_layout(ctx, pctx)
441               
442        #def set_msg_label
443       
444       
445        def set_css_info(self):
446               
447                css = """
448               
449                #BLACK {
450                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#616161));
451                       
452                }
453
454                #ORANGE {
455                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#575757),  to (#373737));
456                       
457                }
458               
459                #BLACKEXPANDER {
460                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#1a1a1a),  to (#1a1a1a));
461                        color: white;
462                        box-shadow: 50px 50px;
463                       
464                }
465               
466                #WHITE {
467                        color: white;
468                        text-shadow: 0px 1px black;
469                }               
470               
471                #WHITE-15 {
472                        color: white;
473                        font-size: 15px;
474                        text-shadow: 1px 2px black;
475                }
476
477               
478                #BLACKBUTTON{
479                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#2a2a2a),  to (#616161));
480                        color: #e0e0e0;
481                        border-color: #000;
482                        border-style: none;
483                        border-radius: 10px;
484                       
485                }
486               
487               
488               
489                #APPBUTTON{
490
491                        padding: 0px 0px;
492                        border:none;
493                        background-image: none;
494                        box-shadow: none;
495                        background-color: transparent;
496                        box-shadow: 0px 2px 5px rgba(0,0,0,0.8);
497
498                }
499
500                #APPBUTTON:hover{
501
502                       
503                        border-width: 0;
504                        border-radius: 0px;
505                        border-color: transparent;
506                        border: none;   
507                        box-shadow: 0px 1px 8px rgba(0,0,0,1);
508                }
509               
510                GtkSeparator {
511                        color: rgba(255,255,255,0.8);
512                }
513               
514                """
515               
516                self.style_provider=Gtk.CssProvider()
517                self.style_provider.load_from_data(css)
518               
519                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
520               
521        #def set_css_info       
522       
523       
524        def get_banner_image(self,app):
525
526                package_rsrc_path=BANNER_PATH
527                img_path=package_rsrc_path+"package.png"
528               
529                for item in os.listdir(package_rsrc_path):
530                        f,ext=item.split(".")
531                        if app["Icon"] == f:
532                                img_path=package_rsrc_path+item
533               
534               
535                img=cairo.ImageSurface.create_from_png(img_path)
536                ctx=cairo.Context(img)
537
538                if not self.check_app_dependences(app):
539                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
540                        ctx.rectangle(0,0,235,110)
541                        ctx.fill()
542               
543
544                ctx.set_source_rgba(0,0,0,0.8)
545                ctx.rectangle(0,90,235,110)
546                ctx.fill()
547
548
549                show_status=True
550                if "Depends" in app:
551
552                        if not self.check_app_dependences(app):
553                               
554                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
555                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
556                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
557                                ctx.rectangle(0, 0, 200, 20)
558                                ctx.set_source(lg1)
559                                ctx.fill()
560                                                                                       
561                                ctx.select_font_face("Ubuntu")
562                                ctx.set_font_size(15)
563                                ctx.move_to(5,15)
564                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
565                                                                                       
566                                ctx.show_text(_("Unmet dependences"))
567                                ctx.stroke()
568                               
569                                show_status=False
570
571
572                if "Service" in app and show_status:
573
574                        if app["Service"].lower()=="true":
575
576                                if app["configured"]==1:
577
578                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
579                                                               
580                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
581                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
582                                        ctx.rectangle(0, 0, 200, 20)
583                                        ctx.set_source(lg1)
584                                        ctx.fill()
585                                                       
586                                        ctx.select_font_face("Ubuntu")
587                                        ctx.set_font_size(15)
588                                        ctx.move_to(5,15)
589                                        ctx.set_source_rgb(1,1,1)
590                                                       
591                                        ctx.show_text(_("Configured"))
592                                        ctx.stroke()
593
594
595                                elif app["configured"]==0:
596
597                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
598                                                               
599                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
600                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
601                                        ctx.rectangle(0, 0, 200, 20)
602                                        ctx.set_source(lg1)
603                                        ctx.fill()
604                                                       
605                                        ctx.select_font_face("Ubuntu")
606                                        ctx.set_font_size(15)
607                                        ctx.move_to(5,15)
608                                        ctx.set_source_rgb(1,1,1)
609                                                       
610                                        ctx.show_text(_("Not configured"))
611                                        ctx.stroke()
612                                       
613                                else:
614                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
615                                        lg1.add_color_stop_rgba(0, 1, 0, 0, 1)
616                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
617                                        ctx.rectangle(0, 0, 200, 20)
618                                        ctx.set_source(lg1)
619                                        ctx.fill()
620                                                               
621                                        ctx.select_font_face("Ubuntu")
622                                        ctx.set_font_size(15)
623                                        ctx.move_to(5,15)
624                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
625                                                               
626                                        ctx.show_text(_("Failed"))
627                                        ctx.stroke()
628
629                ctx.select_font_face("Ubuntu")
630                ctx.set_font_size(15)
631                ctx.move_to(5,105)
632                ctx.set_source_rgb(1,1,1)
633                txt=""
634                fix=True
635               
636                text=self.get_name(app)
637               
638               
639                for char in range(30):
640                        try:
641                                txt+=text[char]
642                        except:
643                                fix=False
644                                break
645                                                       
646                if fix:
647                        txt+="…"
648               
649                ctx.show_text(txt)
650                ctx.stroke()
651
652                #img.write_to_png(self.user_rsrc_path+item)
653                image=Gtk.Image()
654                #image.set_from_file(self.user_rsrc_path+item)
655                image.set_from_pixbuf(Gdk.pixbuf_get_from_surface(img,0,0,235,110))
656                image.set_name("BIMAGE")
657                return image
658               
659        #def get_image
660
661       
662        def drawing_banner_event(self,widget,ctx,app):
663               
664                package_rsrc_path=BANNER_PATH
665                img_path=package_rsrc_path+"package.png"
666                for item in os.listdir(package_rsrc_path):
667                        f,ext=item.split(".")
668                        if app["Icon"] == f:
669                                img_path=package_rsrc_path+item
670               
671       
672                img=cairo.ImageSurface.create_from_png(img_path)
673                ctx.set_source_surface(img,0,0)
674               
675                if not self.check_app_dependences(app):
676                        ctx.paint_with_alpha(0.2)
677                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
678                        ctx.rectangle(0,0,235,110)
679                        ctx.fill()
680                else:
681                        ctx.paint()
682
683
684                if "pulsating" in app and app["pulsating"]:
685                       
686                        '''
687                        if app["pulsating"]:
688                                ctx.set_source_rgba(1,1,1,app["pulsating_alpha"])
689                                ctx.rectangle(0,0,235,110)
690                                ctx.fill()             
691                        '''
692       
693                        lg1 = cairo.LinearGradient(0.0,10.0, 235.0, 10.0)
694                        lg1.add_color_stop_rgba(0, 0, 0.0, 0.8, 0.7)
695                        lg1.add_color_stop_rgba(app["pulsating_alpha"], 0.1, 0.7, 0.9, 1)
696                        lg1.add_color_stop_rgba(1, 0, 0, 0.8, 0.5)
697                        ctx.rectangle(0,app["bar_height"],235,20)
698                        ctx.set_source(lg1)
699                        ctx.fill()
700                        ctx.set_source_rgba(0,0,0,0.8)
701                        ctx.rectangle(0,app["bar_height"]+20,235,110)
702                        ctx.fill()                     
703                       
704                else:
705                       
706                        ctx.set_source_rgba(0,0,0,0.7)
707                        ctx.rectangle(0,app["bar_height"],235,110)
708                        ctx.fill()
709               
710                show_status=True
711                if "Depends" in app:
712
713                        if not self.check_app_dependences(app):
714                               
715                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
716                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
717                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
718                                ctx.rectangle(0, 0, 200, 20)
719                                ctx.set_source(lg1)
720                                ctx.fill()
721                                                                                       
722                                ctx.select_font_face("Ubuntu")
723                                ctx.set_font_size(15)
724                               
725                                ctx.move_to(6,16)
726                                ctx.set_source_rgba(0,0,0,app["conf_alpha"])
727                                ctx.show_text(_("Unmet dependences"))
728                                ctx.stroke()
729                               
730                               
731                                ctx.move_to(5,15)
732                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
733                                ctx.show_text(_("Unmet dependences"))
734                                ctx.stroke()
735                               
736                                show_status=False
737
738                if "Service" in app and show_status:
739                       
740                        if app["Service"].lower()=="true":
741
742                                if app["configured"]==1:
743
744                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
745                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
746                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
747                                        ctx.rectangle(0, 0, 200, 20)
748                                        ctx.set_source(lg1)
749                                        ctx.fill()
750                                                       
751                                        ctx.select_font_face("Ubuntu")
752                                        ctx.set_font_size(15)
753                                       
754                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
755                                        ctx.move_to(6,16)               
756                                        ctx.show_text(_("Configured"))
757                                        ctx.stroke()
758                                       
759                                       
760                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
761                                        ctx.move_to(5,15)               
762                                        ctx.show_text(_("Configured"))
763                                        ctx.stroke()
764                                                       
765                                elif app["configured"]==-1:
766
767                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
768                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
769                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
770                                        ctx.rectangle(0, 0, 200, 20)
771                                        ctx.set_source(lg1)
772                                        ctx.fill()
773                                                       
774                                        ctx.select_font_face("Ubuntu")
775                                        ctx.set_font_size(15)
776                                       
777                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
778                                        ctx.move_to(6,16)               
779                                        ctx.show_text(_("Failed"))
780                                        ctx.stroke()
781                                       
782                                       
783                                        ctx.move_to(5,15)
784                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
785                                        ctx.show_text(_("Failed"))
786                                        ctx.stroke()
787                                       
788                                else:
789                                       
790                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
791                                        lg1.add_color_stop_rgba(0, 0.8, 0, 0, 1)
792                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
793                                        ctx.rectangle(0, 0, 200, 20)
794                                        ctx.set_source(lg1)
795                                        ctx.fill()
796
797                                        ctx.select_font_face("Ubuntu")
798                                        ctx.set_font_size(15)
799                                       
800                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
801                                        ctx.move_to(6,16)               
802                                        ctx.show_text(_("Not configured"))
803                                        ctx.stroke()                                   
804                                       
805                                        ctx.move_to(5,15)
806                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
807                                        ctx.show_text(_("Not configured"))
808                                        ctx.stroke()                                   
809
810
811                txt=""
812                fix=True
813                for char in range(30):
814                        try:
815                                txt+=self.get_name(app)[char]
816                        except:
817                                fix=False
818                                break
819                                                       
820                if fix:
821                        txt+="…"
822
823
824                ctx.select_font_face("Ubuntu")
825                ctx.set_font_size(15)
826               
827                ctx.move_to(6,app["bar_height"]+16)
828                ctx.set_source_rgb(0,0,0)
829                ctx.show_text(txt)
830                ctx.stroke()           
831               
832                ctx.move_to(5,app["bar_height"]+15)
833                ctx.set_source_rgb(0.9,0.9,0.9)
834                ctx.show_text(txt)
835                ctx.stroke()           
836
837               
838               
839               
840                y=app["bar_height"]+30
841                pctx = PangoCairo.create_layout(ctx)
842                desc = Pango.font_description_from_string ("Ubuntu 8")
843                pctx.set_font_description(desc)
844                pctx.set_alignment(Pango.Alignment.LEFT)
845                pctx.set_justify(True)
846                pctx.set_width(225000)
847                pctx.set_height(10)
848                ctx.set_source_rgb(1,1,0.8)
849                pctx.set_text(self.get_comment(app),-1)
850               
851
852                ctx.move_to(6,y)
853                PangoCairo.show_layout (ctx, pctx)
854               
855                if "custom_text" in app:
856                       
857                        ctx.set_source_rgb(0.5,0.5,1)
858                        pctx.set_text(app["custom_text"],-1)
859                        ctx.move_to(6,y+60)
860                        PangoCairo.show_layout (ctx, pctx)
861                       
862               
863        #def drawing_event
864       
865
866        def mouse_over(self,widget,event,app,img):
867               
868                if not app["expanding"]:
869                        app["restoring"]=False
870                        app["expanding"]=True
871                        GLib.timeout_add(10,self.expand_black_area,app,img)
872               
873        #def mouse_over
874
875       
876        def mouse_left(self,widget,event,app,img):
877               
878                if not app["restoring"]:
879                        app["expanding"]=False
880                        app["restoring"]=True
881                        GLib.timeout_add(10,self.restore_black_area,app,img)
882               
883        #def mouse_left
884
885       
886        def expand_black_area(self,app,img):
887               
888                while app["bar_height"]>0 and app["expanding"]:
889                        app["bar_height"]-=2
890                        if app["conf_alpha"]>0.0:
891                                app["conf_alpha"]-=0.025
892                        img.queue_draw()
893                        return True
894                       
895                if not app["expanding"]:
896                        return False
897                       
898                app["expanding"]=False
899                app["conf_alpha"]=0.0
900                img.queue_draw()
901                return False
902               
903        #def expand_black_area
904       
905       
906        def restore_black_area(self,app,img):
907               
908                while app["bar_height"]<BAR_HEIGHT and app["restoring"]:
909                        app["bar_height"]+=2
910                        if app["conf_alpha"]<1.0:
911                                app["conf_alpha"]+=0.025
912                        img.queue_draw()
913                        return True
914                       
915                if not app["restoring"]:
916                        return False
917                       
918                app["restoring"]=False
919                app["conf_alpha"]=1.0
920                img.queue_draw()
921                return False
922               
923        #def restore_black_area
924       
925       
926        def check_app_groups(self,app):
927               
928                sys.stdout.write(" * Checking " + app["ID"] + " ... ")
929                groups=[]
930                if "Groups" not in app:
931                        print("OK")
932                        return True
933               
934                try:
935                       
936                        if os.environ["USER"]=="root":
937                                print("OK")
938                                return True
939                       
940                        groups=app["Groups"].strip("\n").split(";")
941                        for group in groups:
942                                if group in self.user_groups:
943                                        print("OK")             
944                                        return True
945                       
946                except Exception as e:
947                        print e
948                        pass
949               
950                print "NOT ALLOWED"
951                print "\t[!] App groups: ",sorted(groups)
952                return False
953               
954        #def check_app_groups
955
956       
957        def add_pulsating(self,app,image):
958               
959                GLib.timeout_add(70,self.pulsate_color,app,image)
960               
961        #def add_pulsating
962
963
964        def pulsate_color(self,app,image):
965               
966                app["pulsating_alpha"]+=app["pulsating_increment"]
967               
968                if app["pulsating_alpha"] >= 1.0 :
969                       
970                        app["pulsating_increment"]=-0.02
971                       
972                if app["pulsating_alpha"] <= 0.0 :
973                       
974                        app["pulsating_increment"]=0.02
975                       
976                image.queue_draw()
977                return app["pulsating"]
978               
979        #def pulsate_color
980               
981               
982        def check_app_dependences(self,app):
983               
984                if "Depends" in app:
985                        depends=app["Depends"].split(";")
986                        for dep in depends:
987                               
988                                if dep not in self.configured_apps:
989                                        return False
990                               
991                return True
992               
993        #def check_app_dependences
994
995       
996        def add_categories_to_window(self,category):
997               
998                for category in self.categories_parser.categories:
999                       
1000                        icon=category["icon"]
1001                        category=category["name"].lower()
1002                       
1003                        once=True
1004                        hbox=Gtk.HBox()
1005                        hbox.set_margin_left(10)
1006                        hbox.set_margin_right(10)
1007                        count=0
1008                        if category in self.app_parser.apps:
1009                                for app in sorted(self.app_parser.apps[category]):
1010                                       
1011                                        if self.check_app_groups(app):
1012
1013
1014                                                button=Gtk.Button()
1015                                                button.set_name("APPBUTTON")
1016                                                button.set_size_request(235,110)
1017                                               
1018                                                if not self.drawing_mode:
1019                                                        image=self.get_banner_image(app)
1020                                                else:
1021                                                        image=Gtk.DrawingArea()
1022                                                        image.show()
1023                                                        image.connect("draw",self.drawing_banner_event,app)
1024                                                       
1025                                                        if "pulsating" in app:
1026                                                                if app["pulsating"]:
1027                                                                        app["pulsating_alpha"]=0.0
1028                                                                        app["pulsating_increment"]=0.02
1029                                                                        self.add_pulsating(app,image)
1030                                                       
1031                                                       
1032                                                        button.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
1033                                                        button.connect("motion-notify-event",self.mouse_over,app,image)
1034                                                        button.connect("leave_notify_event",self.mouse_left,app,image)
1035                                                        #button.set_size_request(245,120)
1036                                               
1037                                                button.add(image)
1038                                                if "Name["+self.lang+"]" in app:
1039                                                        button.set_tooltip_text(app["Name["+self.lang+"]"])
1040                                                else:
1041                                                        button.set_tooltip_text(app["Name"])
1042                                                button.connect("clicked",self.app_clicked,app)
1043                                                app["gtk_button"]=button
1044                                                hbox.pack_start(button,True,False,0)
1045                                                count+=1
1046                                                if count==3:
1047                                                        hbox.show_all()
1048                                                        if once:
1049                                                                self.add_label(self.get_translation(category),icon)
1050                                                                once=False
1051                                                        self.content_hbox.pack_start(hbox,False,False,10)
1052                                                        count=0
1053                                                        hbox=Gtk.HBox()
1054                                                        hbox.set_margin_left(10)
1055                                                        hbox.set_margin_right(10)
1056                                               
1057                        if count!=0:
1058                                hbox.show_all()
1059                                if once:
1060                                        self.add_label(self.get_translation(category),icon)
1061                                        once=False
1062                                hbox.set_halign(Gtk.Align.START)
1063                                hbox.set_margin_left(20)
1064                                children=hbox.get_children()
1065                                if len(children)>1:
1066                                        for child in children[1:]:
1067                                                child.set_margin_left(20)
1068                                self.content_hbox.pack_start(hbox,False,False,5)
1069                               
1070                self.content_hbox.get_children()[-1].set_margin_bottom(10)
1071               
1072        #def add_categories_to_window
1073       
1074       
1075       
1076       
1077        def add_label(self,label_name,icon_name=None):
1078               
1079                if icon_name==None:
1080                        icon_name="system"
1081                       
1082                tmpbox=Gtk.HBox()
1083                img=Gtk.Image()
1084                img.set_from_icon_name(icon_name,Gtk.IconSize.MENU)
1085                label=Gtk.Label(label_name)
1086                label.set_name("WHITE-15")
1087                expander=Gtk.HSeparator()
1088                expander.set_margin_right(15)
1089                tmpbox.set_margin_left(10)
1090                tmpbox.set_margin_top(5)
1091                tmpbox.pack_start(img,False,False,0)
1092                tmpbox.pack_start(label,False,False,10)
1093                tmpbox.pack_start(expander,True,True,5)
1094                tmpbox.show_all()
1095                self.content_hbox.pack_start(tmpbox,False,False,5)             
1096               
1097        #def add_label
1098       
1099       
1100        def app_clicked(self,widget,app):
1101       
1102                if  self.client.get_variable("","VariablesManager","MASTER_SERVER_IP"):
1103                        if app["ID"] in self.blacklist:
1104                                result = self.open_dialog("Warning",_("We are in a center model and therefore should install this service on the master \n server to be accessible from any computer in the center, whether to continue \n with the installation on this computer the service is only available on computers \n that are in the internal network of this server."),True)
1105                                if result == Gtk.ResponseType.CANCEL:
1106                                        return -1
1107
1108                if app["ID"] in self.configured_apps:
1109                        ret=self.open_dialog("Warning",_("<b>%s</b> is already configured. Do you want to execute it again?")%self.get_name(app),True)
1110                        if ret==Gtk.ResponseType.CANCEL:
1111                                return -1
1112               
1113                if self.check_app_dependences(app):
1114               
1115                        cmd=""
1116                               
1117                        if "Using" in app:
1118                                cmd+=app["Using"].strip(" ").strip("\n") +" "
1119                                       
1120                        cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
1121                       
1122                        gt=False
1123                        if "Gnome-terminal" in app:
1124                                if app["Gnome-terminal"].lower()=="true":
1125                                        cmd='gnome-terminal --command="'+cmd+'"'
1126                                        gt=True
1127                                       
1128                        if not gt:
1129                                if "gnome-terminal" in app:
1130                                        if app["gnome-terminal"].lower()=="true":
1131                                                cmd='gnome-terminal --command="'+cmd+'"'
1132                               
1133                               
1134                       
1135                        blocked=False
1136                        print(' * Executing "' + cmd + '" ...')
1137                        if "Modal" in app:
1138                                if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
1139                                        GLib.timeout_add(250,self.pulse_progress)
1140                                        self.progress_bar.show()
1141                                       
1142                                        try:
1143                                                txt="Executing %s"%app["Name["+self.lang+"]"]
1144                                        except:
1145                                                txt="Executing %s"%app["Name"]
1146                                        self.progress_label.set_text(txt)
1147                                        self.progress_label.show()
1148                                        self.mprocess_app_name=app["Name"]
1149                                        blocked=True
1150                                else:
1151                                        self.open_dialog("Warning","<b>%s</b> is being executed. Please wait until it finishes."%self.mprocess_app_name )
1152                                        return -1
1153               
1154                        self.execute(cmd,blocked,app,widget)
1155                       
1156                else:
1157                       
1158                        self.open_dialog("Warning","<b>%s</b> dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
1159               
1160        #def app_clicked
1161       
1162       
1163        def check_output(self,process,app,button):
1164               
1165                if not process.is_alive():
1166                       
1167                        print "[ZeroCenter] %s has ended"%app["ID"]
1168                       
1169                        if "Service" in app:
1170                                if app["Service"].lower()=="true":
1171                                       
1172                                        try:
1173                                                self.get_states()
1174                       
1175                                                for cat in self.app_parser.apps:
1176                                                        for item in self.app_parser.apps[cat]:
1177                                                                item["gtk_button"].get_child().queue_draw()
1178                                               
1179                                                darea=button.get_child()
1180                                                darea.queue_draw()
1181                                               
1182                                        except Exception as e:
1183                                                pass
1184                                       
1185                return process.is_alive()
1186               
1187        #def check_output
1188       
1189       
1190        def pulse_progress(self):
1191               
1192                self.progress_bar.pulse()
1193                if not self.mprocess.is_alive():
1194                        self.progress_bar.hide()
1195                        self.progress_label.hide()
1196                return self.mprocess.is_alive()
1197
1198        #def pulse_progress
1199
1200       
1201        def execute(self,cmd,blocked=False,app=None,widget=None):
1202               
1203                if not blocked:
1204                        p=multiprocessing.Process(target=self._execute,args=(cmd,))
1205                        #p.daemon=True
1206                        GLib.timeout_add(1000,self.check_output,p,app,widget)
1207                        p.start()
1208                       
1209                if blocked:
1210                       
1211                        if not self.mprocess.is_alive():
1212                                self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
1213                                #self.mprocess.daemon=True
1214                                self.mprocess.start()
1215                                GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
1216                        else:
1217                                self.open_dialog("Warning",_("<b>%s</b> is being executed. Please wait until it finishes.")%self.mprocess_app_name )
1218               
1219        #def execute
1220
1221
1222        def _execute(self,cmd):
1223               
1224               
1225                subprocess.call(cmd,shell=True,preexec_fn=lambda: signal.signal(signal.SIGPIPE,signal.SIG_DFL))
1226               
1227                #os.system(cmd)
1228               
1229        #def _execute
1230
1231       
1232        def close_window(self,widget,data):
1233               
1234                if self.mprocess.is_alive():
1235                        ret=self.open_dialog("Warning",_("<b>%s</b> is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
1236               
1237                        if ret==Gtk.ResponseType.CANCEL:
1238                                return -1
1239                               
1240                        self.mprocess.terminate()
1241                        self.mprocess=multiprocessing.Process()
1242               
1243                Gtk.main_quit()
1244                print("")
1245               
1246        #def close_window
1247
1248               
1249        def open_dialog(self,title,text,show_cancel=False):
1250
1251                label = Gtk.Label()
1252                label.set_markup(text)
1253                if show_cancel:
1254                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT,Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL))
1255                else:
1256                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
1257                hbox = Gtk.HBox()
1258                img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
1259                hbox.pack_start(img,True,True,5)
1260                hbox.pack_start(label,True,True,10)
1261                hbox.show_all()
1262                dialog.vbox.pack_start(hbox,True,True,10)
1263                dialog.set_border_width(6)
1264                response = dialog.run()
1265                dialog.destroy()
1266                return response
1267               
1268        #def open_dialog
1269
1270       
1271        def get_state(self,app):
1272
1273                try:
1274                        configured=self.client.get_state("","ZCenterVariables",app["ID"])
1275                        return configured
1276                except:
1277                        return 0
1278               
1279        #def get_state
1280
1281       
1282        def set_configured(self,app,key):
1283               
1284                if app in self.app_parser.app_list:
1285                       
1286                        try:
1287                                self.client.set_configured(key,"ZCenterVariables",app)
1288                        except Exception as e:
1289                                print e
1290                               
1291                else:
1292                        print("[!] %s is not installed"%app)
1293               
1294                sys.exit(0)
1295                               
1296        #def set_configured
1297
1298       
1299        def set_non_configured(self,app,key):
1300               
1301                if app in self.app_parser.app_list:
1302                       
1303                        try:
1304                                self.client.set_non_configured(key,"ZCenterVariables",app)
1305                        except:
1306                                pass
1307                               
1308                else:
1309                        print("\t[!] %s is not installed"%app)
1310               
1311                sys.exit(0)
1312               
1313        #def set_non_configured
1314       
1315        def set_failed(self,app,key):
1316               
1317                if app in self.app_parser.app_list:
1318                       
1319                        try:
1320                                self.client.set_failed(key,"ZCenterVariables",app)
1321                        except:
1322                                pass
1323                               
1324                else:
1325                        print("\t[!] %s is not installed"%app)
1326               
1327                sys.exit(0)
1328               
1329        #def set_non_configured
1330
1331       
1332        def set_custom_text(self,app,text,key):
1333               
1334                if app in self.app_parser.app_list:
1335                       
1336                        try:
1337                                self.client.set_custom_text(key,"ZCenterVariables",app,text)
1338                        except:
1339                                pass
1340                               
1341                else:
1342                        print("\t[!] %s is not installed"%app)
1343               
1344                sys.exit(0)
1345               
1346        #def set_custom_text
1347
1348       
1349        def add_pulsating_color(self,key,app):
1350               
1351                try:
1352                        self.client.add_pulsating_color(key,"ZCenterVariables",app)
1353                except:
1354                        pass
1355                       
1356                sys.exit(0)
1357               
1358        #def add_pulsating_color
1359
1360       
1361        def remove_pulsating_color(self,key,app):
1362               
1363                try:
1364                        self.client.remove_pulsating_color(key,"ZCenterVariables",app)
1365                except:
1366                        pass
1367               
1368                sys.exit(0)
1369               
1370        #def add_pulsating_color
1371
1372       
1373        def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
1374               
1375                try:
1376                        self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
1377                except Exception as e:
1378                        print e
1379                       
1380                sys.exit(0)
1381               
1382        #def add_zc_notification
1383
1384       
1385        def remove_zc_notification(self,key,app):
1386               
1387                try:
1388                        self.client.remove_zc_message(key,"ZCenterVariables",app)
1389                except Exception as e:
1390                        print e
1391                       
1392                sys.exit(0)
1393               
1394        #def remove_zc_notification
1395
1396
1397        def usage(self):
1398               
1399                print("USAGE:")
1400                print("\tzero-center [ OPTION [ APP ] ]")
1401                print("Options:")
1402                print("\tset-configured APP") 
1403                print("\tset-non-configured APP") 
1404                print("\tset-custom-text APP TEXT") 
1405                print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
1406                print("\tremove-zero-center-notification APP") 
1407                print("\tadd-pulsating-color APP") 
1408                print("\tremove-pulsating-color APP") 
1409                print("\tnon-animated")
1410                print("\tanimated")
1411                print("\thelp")
1412                print("")
1413                sys.exit(0)
1414               
1415        #def usage
1416       
1417
1418def check_root():
1419        try:
1420                f=open("/etc/n4d/key","r")
1421                key=f.readline().strip("\n")
1422                f.close()
1423                return key
1424        except:
1425                print("[!] You need root privileges to execute this option [!]")
1426                sys.exit(1)
1427
1428if __name__=="__main__":
1429       
1430
1431        zc=ZeroCenter()
1432        zc.drawing_mode=True
1433
1434        if len(sys.argv)>=2:
1435               
1436                if sys.argv[1] not in zc.commands:
1437                        zc.usage()
1438                        sys.exit(1)
1439                       
1440                if sys.argv[1] == "help":
1441                        zc.usage()
1442                       
1443                if sys.argv[1] == "set-configured":
1444                        key=check_root()
1445                        zc.set_configured(sys.argv[2],key)
1446                       
1447                if sys.argv[1] == "set-non-configured":
1448                        key=check_root()
1449                        zc.set_non_configured(sys.argv[2],key)
1450                       
1451                if sys.argv[1] == "set-failed":
1452                        key=check_root()
1453                        zc.set_failed(sys.argv[2],key)
1454                       
1455                if sys.argv[1] == "set-custom-text":
1456                        key=check_root()
1457                        zc.set_custom_text(sys.argv[2],sys.argv[3],key)
1458                       
1459                if sys.argv[1] == "add-zero-center-notification":
1460                        key=check_root()
1461                       
1462                        try:
1463                                app=sys.argv[2]
1464                        except:
1465                                zc.usage()
1466                        try:
1467                                text=sys.argv[3]
1468                        except:
1469                                zc.usage()
1470                        try:
1471                                text_es=sys.argv[4]
1472                        except Exception as e:
1473                                print e
1474                                text_es=""
1475                        try:
1476                                text_qcv=sys.argv[5]
1477                        except Exception as e:
1478                                print e
1479                                text_qcv=""
1480                       
1481                        zc.add_zc_notification(key,app,text,text_es,text_qcv)
1482                       
1483                if sys.argv[1] == "remove-zero-center-notification":
1484                       
1485                        key=check_root()
1486                       
1487                        try:
1488                                app=sys.argv[2]
1489                        except:
1490                                zc.usage()
1491                               
1492                        zc.remove_zc_notification(key,app)
1493                       
1494                if sys.argv[1] == "add-pulsating-color":
1495                        key=check_root()
1496                        try:
1497                                app=sys.argv[2]
1498                        except:
1499                                zc.usage()
1500                               
1501                        zc.add_pulsating_color(key,app)
1502                               
1503                if sys.argv[1] == "remove-pulsating-color":
1504                        key=check_root()
1505                       
1506                        try:
1507                                app=sys.argv[2]
1508                        except:
1509                                zc.usage()
1510                               
1511                        zc.remove_pulsating_color(key,app)
1512                       
1513
1514                if sys.argv[1]=="animated":
1515                        zc.drawing_mode=True
1516                       
1517                if sys.argv[1]=="non-animated":
1518                        zc.drawing_mode=False
1519               
1520       
1521       
1522        zc.start_gui()
1523
Note: See TracBrowser for help on using the repository browser.