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

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

minor cosmetic changes

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