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

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

adding files

  • Property svn:executable set to *
File size: 31.6 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       
20        from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
21       
22       
23except Exception as e:
24        print e
25        #zero-server-wizard initialization forces me to do this
26
27import signal
28signal.signal(signal.SIGINT, signal.SIG_DFL)
29
30import gettext
31gettext.textdomain('zero-center')
32_ = gettext.gettext
33
34
35BAR_HEIGHT=90
36CONF_X=5
37
38if os.path.exists("/home/lliurex/banners/"):
39        BANNER_PATH="/home/lliurex/banners/"
40else:
41        BANNER_PATH="/usr/share/banners/lliurex-neu/"
42       
43
44class CategoriesParser:
45       
46        CATEGORIES_PATH="/usr/share/zero-center/categories/"
47       
48        def __init__(self):
49               
50                self.parse_categories()
51               
52        #def init
53       
54        def parse_categories(self,path=None):
55               
56                self.categories=[]
57               
58                if path==None:
59                        path=self.CATEGORIES_PATH
60                       
61                for item in os.listdir(path):
62                        file_path=path+item
63                       
64                        f=open(file_path)
65                        lines=f.readlines()
66                        f.close()
67                       
68                        cat={}
69                       
70                        for line in lines:
71                                key,value=line.split("=")
72                                cat[key]=value.strip("\n")
73                                if key=="level":
74                                        cat[key]=int(cat[key])
75                       
76                        self.categories.append(cat)
77                       
78                tmp=[]
79               
80                while len(self.categories)>0:
81                        selected_index=0
82                        index=0
83                        level=0
84                        for item in self.categories:
85                                if item["level"]>level:
86                                        level=item["level"]
87                                        selected_index=index
88                                       
89                               
90                                index+=1
91                       
92                        tmp.append(self.categories[selected_index])
93                        self.categories.pop(selected_index)
94                       
95                self.categories=tmp
96               
97        #def parse_categories
98               
99               
100#class CategoriesParser
101
102
103class AppParser:
104       
105        BASE_DIR="/usr/share/zero-center/"
106        APP_PATH=BASE_DIR+"applications/"
107        ZMD_PATH=BASE_DIR+"zmds/"
108       
109       
110        def __init__(self):
111               
112                self.categories=["ID","Name","Comment","Icon","Category","Icon","ScriptPath","Groups","Service","Locks"]
113                self.apps={}
114                self.app_list=[]
115                self.configured=[]
116                #print("[ZeroCenter] Parsing apps...")
117                self.parse_all()
118               
119               
120        #def init
121
122       
123        def add_app(self,app):
124               
125                try:
126                        if app["Category"].lower() not in self.apps:
127                                self.apps[app["Category"].lower()]=[]
128                       
129                        self.apps[app["Category"].lower()].append(app)
130                        self.app_list.append(app["ID"])
131                except:
132                        pass
133                       
134        #def add_app
135       
136        def parse_all(self,dir=None):
137               
138                if dir==None:
139                        dir=self.APP_PATH
140       
141                for item in os.listdir(dir):
142                        file_path=self.APP_PATH+item
143                        app=self.parse_file(file_path)
144                        self.add_app(app)
145                       
146        #def parse_all
147
148       
149        def parse_file(self,file_path):
150               
151                f=open(file_path)
152                lines=f.readlines()
153                f.close()
154                id=file_path.split("/")[-1].split(".")[0]
155                app={}
156                for item in lines:
157                        try:
158                                key,value=item.split("=")
159                                app[key]=value.strip("\n")
160                        except:
161                                pass
162               
163                app["ID"]=id
164                app["configured"]=-1
165                app["custom_msg"]=""
166               
167                app["bar_height"]=BAR_HEIGHT
168                app["conf_alpha"]=1.0
169
170               
171                app["expanding"]=False
172                app["restoring"]=False
173
174                return app
175               
176        #def parse_file
177
178       
179#class AppParser
180
181
182class ZeroCenter:
183       
184        def __init__(self):
185               
186                self.client=xmlrpclib.ServerProxy("https://localhost:9779")
187                self.create_user_env()
188                self.categories_parser=CategoriesParser()
189                self.app_parser=AppParser()
190                self.configured_apps=[]
191                self.get_states()
192               
193                self.mprocess=multiprocessing.Process()
194                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"]
195                self.drawing_mode=True
196                self.msg_text=""
197                self.msg_x=0
198                self.scrolling=False
199               
200                try:
201                        self.msg_text=self.client.get_zc_messages("","ZCenterVariables",self.lang)
202                        if self.msg_text=="":
203                                txt=self.client.lliurex_version("","LliurexVersion")
204                                if type(txt)==type([]):
205                                        self.msg_text=str(txt[1])
206                                else:
207                                        f=open("/etc/lsb-release")
208                                        lines=f.readlines()
209                                        f.close()
210                                        for line in lines:
211                                                if "DISTRIB_DESCRIPTION" in line:
212                                                        self.msg_text=line.split("=")[1]
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:hover{
491                       
492                        background-image: -gtk-gradient (linear,        left top, left bottom, from (#ffffff),  to (#ffff00));
493                }
494               
495                """
496               
497                self.style_provider=Gtk.CssProvider()
498                self.style_provider.load_from_data(css)
499               
500                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
501               
502        #def set_css_info       
503       
504       
505        def get_banner_image(self,app):
506
507                package_rsrc_path=BANNER_PATH
508                img_path=package_rsrc_path+"package.png"
509               
510                for item in os.listdir(package_rsrc_path):
511                        f,ext=item.split(".")
512                        if app["Icon"] == f:
513                                img_path=package_rsrc_path+item
514               
515               
516                img=cairo.ImageSurface.create_from_png(img_path)
517                ctx=cairo.Context(img)
518
519                if not self.check_app_dependences(app):
520                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
521                        ctx.rectangle(0,0,235,110)
522                        ctx.fill()
523               
524
525                ctx.set_source_rgba(0,0,0,0.8)
526                ctx.rectangle(0,90,235,110)
527                ctx.fill()
528
529
530                show_status=True
531                if "Depends" in app:
532
533                        if not self.check_app_dependences(app):
534                               
535                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
536                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
537                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
538                                ctx.rectangle(0, 0, 200, 20)
539                                ctx.set_source(lg1)
540                                ctx.fill()
541                                                                                       
542                                ctx.select_font_face("Ubuntu")
543                                ctx.set_font_size(15)
544                                ctx.move_to(5,15)
545                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
546                                                                                       
547                                ctx.show_text(_("Unmet dependences"))
548                                ctx.stroke()
549                               
550                                show_status=False
551
552
553                if "Service" in app and show_status:
554
555                        if app["Service"].lower()=="true":
556
557                                if app["configured"]==1:
558
559                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
560                                                               
561                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
562                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
563                                        ctx.rectangle(0, 0, 200, 20)
564                                        ctx.set_source(lg1)
565                                        ctx.fill()
566                                                       
567                                        ctx.select_font_face("Ubuntu")
568                                        ctx.set_font_size(15)
569                                        ctx.move_to(5,15)
570                                        ctx.set_source_rgb(1,1,1)
571                                                       
572                                        ctx.show_text(_("Configured"))
573                                        ctx.stroke()
574
575
576                                elif app["configured"]==0:
577
578                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
579                                                               
580                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
581                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 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(_("Not configured"))
592                                        ctx.stroke()
593                                       
594                                else:
595                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
596                                        lg1.add_color_stop_rgba(0, 1, 0, 0, 1)
597                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
598                                        ctx.rectangle(0, 0, 200, 20)
599                                        ctx.set_source(lg1)
600                                        ctx.fill()
601                                                               
602                                        ctx.select_font_face("Ubuntu")
603                                        ctx.set_font_size(15)
604                                        ctx.move_to(5,15)
605                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
606                                                               
607                                        ctx.show_text(_("Failed"))
608                                        ctx.stroke()
609
610                ctx.select_font_face("Ubuntu")
611                ctx.set_font_size(15)
612                ctx.move_to(5,105)
613                ctx.set_source_rgb(1,1,1)
614                txt=""
615                fix=True
616               
617                text=self.get_name(app)
618               
619               
620                for char in range(30):
621                        try:
622                                txt+=text[char]
623                        except:
624                                fix=False
625                                break
626                                                       
627                if fix:
628                        txt+="…"
629               
630                ctx.show_text(txt)
631                ctx.stroke()
632
633                #img.write_to_png(self.user_rsrc_path+item)
634                image=Gtk.Image()
635                #image.set_from_file(self.user_rsrc_path+item)
636                image.set_from_pixbuf(Gdk.pixbuf_get_from_surface(img,0,0,235,110))
637                image.set_name("BIMAGE")
638                return image
639               
640        #def get_image
641
642       
643        def drawing_banner_event(self,widget,ctx,app):
644               
645                package_rsrc_path=BANNER_PATH
646                img_path=package_rsrc_path+"package.png"
647                for item in os.listdir(package_rsrc_path):
648                        f,ext=item.split(".")
649                        if app["Icon"] == f:
650                                img_path=package_rsrc_path+item
651               
652       
653                img=cairo.ImageSurface.create_from_png(img_path)
654                ctx.set_source_surface(img,0,0)
655               
656                if not self.check_app_dependences(app):
657                        ctx.paint_with_alpha(0.2)
658                        ctx.set_source_rgba(0.5,0.5,0.5,0.7)
659                        ctx.rectangle(0,0,235,110)
660                        ctx.fill()
661                else:
662                        ctx.paint()
663
664
665                if "pulsating" in app and app["pulsating"]:
666                       
667                        '''
668                        if app["pulsating"]:
669                                ctx.set_source_rgba(1,1,1,app["pulsating_alpha"])
670                                ctx.rectangle(0,0,235,110)
671                                ctx.fill()             
672                        '''
673       
674                        lg1 = cairo.LinearGradient(0.0,10.0, 235.0, 10.0)
675                        lg1.add_color_stop_rgba(0, 0, 0.0, 0.8, 0.7)
676                        lg1.add_color_stop_rgba(app["pulsating_alpha"], 0.1, 0.7, 0.9, 1)
677                        lg1.add_color_stop_rgba(1, 0, 0, 0.8, 0.5)
678                        ctx.rectangle(0,app["bar_height"],235,20)
679                        ctx.set_source(lg1)
680                        ctx.fill()
681                        ctx.set_source_rgba(0,0,0,0.8)
682                        ctx.rectangle(0,app["bar_height"]+20,235,110)
683                        ctx.fill()                     
684                       
685                else:
686                       
687                        ctx.set_source_rgba(0,0,0,0.7)
688                        ctx.rectangle(0,app["bar_height"],235,110)
689                        ctx.fill()
690               
691                show_status=True
692                if "Depends" in app:
693
694                        if not self.check_app_dependences(app):
695                               
696                                lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
697                                lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
698                                lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
699                                ctx.rectangle(0, 0, 200, 20)
700                                ctx.set_source(lg1)
701                                ctx.fill()
702                                                                                       
703                                ctx.select_font_face("Ubuntu")
704                                ctx.set_font_size(15)
705                               
706                                ctx.move_to(6,16)
707                                ctx.set_source_rgba(0,0,0,app["conf_alpha"])
708                                ctx.show_text(_("Unmet dependences"))
709                                ctx.stroke()
710                               
711                               
712                                ctx.move_to(5,15)
713                                ctx.set_source_rgba(1,1,1,app["conf_alpha"])
714                                ctx.show_text(_("Unmet dependences"))
715                                ctx.stroke()
716                               
717                                show_status=False
718
719                if "Service" in app and show_status:
720                       
721                        if app["Service"].lower()=="true":
722
723                                if app["configured"]==1:
724
725                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
726                                        lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
727                                        lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
728                                        ctx.rectangle(0, 0, 200, 20)
729                                        ctx.set_source(lg1)
730                                        ctx.fill()
731                                                       
732                                        ctx.select_font_face("Ubuntu")
733                                        ctx.set_font_size(15)
734                                       
735                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
736                                        ctx.move_to(6,16)               
737                                        ctx.show_text(_("Configured"))
738                                        ctx.stroke()
739                                       
740                                       
741                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
742                                        ctx.move_to(5,15)               
743                                        ctx.show_text(_("Configured"))
744                                        ctx.stroke()
745                                                       
746                                elif app["configured"]==-1:
747
748                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
749                                        lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
750                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
751                                        ctx.rectangle(0, 0, 200, 20)
752                                        ctx.set_source(lg1)
753                                        ctx.fill()
754                                                       
755                                        ctx.select_font_face("Ubuntu")
756                                        ctx.set_font_size(15)
757                                       
758                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
759                                        ctx.move_to(6,16)               
760                                        ctx.show_text(_("Failed"))
761                                        ctx.stroke()
762                                       
763                                       
764                                        ctx.move_to(5,15)
765                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
766                                        ctx.show_text(_("Failed"))
767                                        ctx.stroke()
768                                       
769                                else:
770                                       
771                                        lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
772                                        lg1.add_color_stop_rgba(0, 0.8, 0, 0, 1)
773                                        lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
774                                        ctx.rectangle(0, 0, 200, 20)
775                                        ctx.set_source(lg1)
776                                        ctx.fill()
777
778                                        ctx.select_font_face("Ubuntu")
779                                        ctx.set_font_size(15)
780                                       
781                                        ctx.set_source_rgba(0,0,0,app["conf_alpha"])
782                                        ctx.move_to(6,16)               
783                                        ctx.show_text(_("Not configured"))
784                                        ctx.stroke()                                   
785                                       
786                                        ctx.move_to(5,15)
787                                        ctx.set_source_rgba(1,1,1,app["conf_alpha"])
788                                        ctx.show_text(_("Not configured"))
789                                        ctx.stroke()                                   
790
791
792                txt=""
793                fix=True
794                for char in range(30):
795                        try:
796                                txt+=self.get_name(app)[char]
797                        except:
798                                fix=False
799                                break
800                                                       
801                if fix:
802                        txt+="…"
803
804
805                ctx.select_font_face("Ubuntu")
806                ctx.set_font_size(15)
807               
808                ctx.move_to(6,app["bar_height"]+16)
809                ctx.set_source_rgb(0,0,0)
810                ctx.show_text(txt)
811                ctx.stroke()           
812               
813                ctx.move_to(5,app["bar_height"]+15)
814                ctx.set_source_rgb(0.9,0.9,0.9)
815                ctx.show_text(txt)
816                ctx.stroke()           
817
818               
819               
820               
821                y=app["bar_height"]+30
822                pctx = PangoCairo.create_layout(ctx)
823                desc = Pango.font_description_from_string ("Ubuntu 8")
824                pctx.set_font_description(desc)
825                pctx.set_alignment(Pango.Alignment.LEFT)
826                pctx.set_justify(True)
827                pctx.set_width(225000)
828                pctx.set_height(10)
829                ctx.set_source_rgb(1,1,0.8)
830                pctx.set_text(self.get_comment(app),-1)
831               
832
833                ctx.move_to(6,y)
834                PangoCairo.show_layout (ctx, pctx)
835               
836                if "custom_text" in app:
837                       
838                        ctx.set_source_rgb(0.5,0.5,1)
839                        pctx.set_text(app["custom_text"],-1)
840                        ctx.move_to(6,y+60)
841                        PangoCairo.show_layout (ctx, pctx)
842                       
843               
844        #def drawing_event
845       
846
847        def mouse_over(self,widget,event,app,img):
848               
849                if not app["expanding"]:
850                        app["restoring"]=False
851                        app["expanding"]=True
852                        GLib.timeout_add(10,self.expand_black_area,app,img)
853               
854        #def mouse_over
855
856       
857        def mouse_left(self,widget,event,app,img):
858               
859                if not app["restoring"]:
860                        app["expanding"]=False
861                        app["restoring"]=True
862                        GLib.timeout_add(10,self.restore_black_area,app,img)
863               
864        #def mouse_left
865
866       
867        def expand_black_area(self,app,img):
868               
869                while app["bar_height"]>0 and app["expanding"]:
870                        app["bar_height"]-=2
871                        if app["conf_alpha"]>0.0:
872                                app["conf_alpha"]-=0.025
873                        img.queue_draw()
874                        return True
875                       
876                if not app["expanding"]:
877                        return False
878                       
879                app["expanding"]=False
880                app["conf_alpha"]=0.0
881                img.queue_draw()
882                return False
883               
884        #def expand_black_area
885       
886       
887        def restore_black_area(self,app,img):
888               
889                while app["bar_height"]<BAR_HEIGHT and app["restoring"]:
890                        app["bar_height"]+=2
891                        if app["conf_alpha"]<1.0:
892                                app["conf_alpha"]+=0.025
893                        img.queue_draw()
894                        return True
895                       
896                if not app["restoring"]:
897                        return False
898                       
899                app["restoring"]=False
900                app["conf_alpha"]=1.0
901                img.queue_draw()
902                return False
903               
904        #def restore_black_area
905       
906       
907        def check_app_groups(self,app):
908               
909                sys.stdout.write(" * Checking " + app["ID"] + " ... ")
910                groups=[]
911                if "Groups" not in app:
912                        print("OK")
913                        return True
914               
915                try:
916                       
917                        groups=app["Groups"].strip("\n").split(";")
918                        for group in groups:
919                                if group in self.user_groups:
920                                        print("OK")             
921                                        return True
922                       
923                except Exception as e:
924                        print e
925                        pass
926               
927                print "NOT ALLOWED"
928                print "\t[!] App groups: ",sorted(groups)
929                return False
930               
931        #def check_app_groups
932
933       
934        def add_pulsating(self,app,image):
935               
936                GLib.timeout_add(70,self.pulsate_color,app,image)
937               
938        #def add_pulsating
939
940
941        def pulsate_color(self,app,image):
942               
943                app["pulsating_alpha"]+=app["pulsating_increment"]
944               
945                if app["pulsating_alpha"] >= 1.0 :
946                       
947                        app["pulsating_increment"]=-0.02
948                       
949                if app["pulsating_alpha"] <= 0.0 :
950                       
951                        app["pulsating_increment"]=0.02
952                       
953                image.queue_draw()
954                return app["pulsating"]
955               
956        #def pulsate_color
957               
958               
959        def check_app_dependences(self,app):
960               
961                if "Depends" in app:
962                        depends=app["Depends"].split(";")
963                        for dep in depends:
964                               
965                                if dep not in self.configured_apps:
966                                        return False
967                               
968                return True
969               
970        #def check_app_dependences
971
972       
973        def add_categories_to_window(self,category):
974
975                for category in self.categories_parser.categories:
976                       
977                        category=category["name"].lower()
978                        once=True
979                        hbox=Gtk.HBox()
980                        count=0
981                        if category in self.app_parser.apps:
982                                for app in sorted(self.app_parser.apps[category]):
983                                       
984                                        if self.check_app_groups(app):
985
986
987                                                button=Gtk.Button()
988                                                button.set_name("APPBUTTON")
989                                                button.set_size_request(235,110)
990                                               
991                                                if not self.drawing_mode:
992                                                        image=self.get_banner_image(app)
993                                                else:
994                                                        image=Gtk.DrawingArea()
995                                                        image.show()
996                                                        image.connect("draw",self.drawing_banner_event,app)
997                                                       
998                                                        if "pulsating" in app:
999                                                                if app["pulsating"]:
1000                                                                        app["pulsating_alpha"]=0.0
1001                                                                        app["pulsating_increment"]=0.02
1002                                                                        self.add_pulsating(app,image)
1003                                                       
1004                                                       
1005                                                        button.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
1006                                                        button.connect("motion-notify-event",self.mouse_over,app,image)
1007                                                        button.connect("leave_notify_event",self.mouse_left,app,image)
1008                                                        button.set_size_request(245,120)
1009                                               
1010                                                button.add(image)
1011                                                if "Name["+self.lang+"]" in app:
1012                                                        button.set_tooltip_text(app["Name["+self.lang+"]"])
1013                                                else:
1014                                                        button.set_tooltip_text(app["Name"])
1015                                                button.connect("clicked",self.app_clicked,app)
1016                                                app["gtk_button"]=button
1017                                                hbox.pack_start(button,False,False,5)
1018                                                count+=1
1019                                                if count==3:
1020                                                        hbox.show_all()
1021                                                        if once:
1022                                                                self.add_label(self.get_translation(category))
1023                                                                once=False
1024                                                        self.content_hbox.pack_start(hbox,False,False,5)
1025                                                        count=0
1026                                                        hbox=Gtk.HBox()
1027                                               
1028                        if count!=0:
1029                                hbox.show_all()
1030                                if once:
1031                                        self.add_label(self.get_translation(category))
1032                                        once=False
1033                                self.content_hbox.pack_start(hbox,False,False,5)
1034               
1035        #def add_categories_to_window
1036       
1037               
1038        def add_label(self,label_name,icon_name=None):
1039               
1040                if icon_name==None:
1041                        icon_name="applications-internet"
1042                       
1043                tmpbox=Gtk.HBox()
1044                img=Gtk.Image()
1045                img.set_from_icon_name(icon_name,Gtk.IconSize.MENU)
1046                label=Gtk.Label(label_name)
1047                label.set_name("WHITE-15")
1048                expander=Gtk.HSeparator()
1049                tmpbox.pack_start(img,False,False,5)
1050                tmpbox.pack_start(label,False,False,0)
1051                tmpbox.pack_start(expander,True,True,14)
1052                tmpbox.show_all()
1053                self.content_hbox.pack_start(tmpbox,False,False,5)             
1054               
1055        #def add_label
1056       
1057       
1058        def app_clicked(self,widget,app):
1059               
1060                if app["ID"] in self.configured_apps:
1061                        ret=self.open_dialog("Warning",_("<b>%s</b> is already configured. Do you want to execute it again?")%self.get_name(app),True)
1062                        if ret==Gtk.ResponseType.CANCEL:
1063                                return -1
1064               
1065                if self.check_app_dependences(app):
1066               
1067                        cmd=""
1068                               
1069                        if "Using" in app:
1070                                cmd+=app["Using"].strip(" ").strip("\n") +" "
1071                                       
1072                        cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
1073                       
1074                        gt=False
1075                        if "Gnome-terminal" in app:
1076                                if app["Gnome-terminal"].lower()=="true":
1077                                        cmd='gnome-terminal --command="'+cmd+'"'
1078                                        gt=True
1079                                       
1080                        if not gt:
1081                                if "gnome-terminal" in app:
1082                                        if app["gnome-terminal"].lower()=="true":
1083                                                cmd='gnome-terminal --command="'+cmd+'"'
1084                               
1085                               
1086                       
1087                        blocked=False
1088                        print(' * Executing "' + cmd + '" ...')
1089                        if "Modal" in app:
1090                                if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
1091                                        GLib.timeout_add(250,self.pulse_progress)
1092                                        self.progress_bar.show()
1093                                       
1094                                        try:
1095                                                txt="Executing %s"%app["Name["+self.lang+"]"]
1096                                        except:
1097                                                txt="Executing %s"%app["Name"]
1098                                        self.progress_label.set_text(txt)
1099                                        self.progress_label.show()
1100                                        self.mprocess_app_name=app["Name"]
1101                                        blocked=True
1102                                else:
1103                                        self.open_dialog("Warning","<b>%s</b> is being executed. Please wait until it finishes."%self.mprocess_app_name )
1104                                        return -1
1105               
1106                        self.execute(cmd,blocked,app,widget)
1107                       
1108                else:
1109                       
1110                        self.open_dialog("Warning","<b>%s</b> dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
1111               
1112        #def app_clicked
1113       
1114       
1115        def check_output(self,process,app,button):
1116               
1117                if not process.is_alive():
1118                       
1119                        print "[ZeroCenter] %s has ended"%app["ID"]
1120                       
1121                        if "Service" in app:
1122                                if app["Service"].lower()=="true":
1123                                       
1124                                        try:
1125                                                self.get_states()
1126                       
1127                                                for cat in self.app_parser.apps:
1128                                                        for item in self.app_parser.apps[cat]:
1129                                                                item["gtk_button"].get_child().queue_draw()
1130                                               
1131                                                darea=button.get_child()
1132                                                darea.queue_draw()
1133                                               
1134                                        except Exception as e:
1135                                                pass
1136                                       
1137                return process.is_alive()
1138               
1139        #def check_output
1140       
1141       
1142        def pulse_progress(self):
1143               
1144                self.progress_bar.pulse()
1145                if not self.mprocess.is_alive():
1146                        self.progress_bar.hide()
1147                        self.progress_label.hide()
1148                return self.mprocess.is_alive()
1149
1150        #def pulse_progress
1151
1152       
1153        def execute(self,cmd,blocked=False,app=None,widget=None):
1154               
1155                if not blocked:
1156                        p=multiprocessing.Process(target=self._execute,args=(cmd,))
1157                        #p.daemon=True
1158                        GLib.timeout_add(1000,self.check_output,p,app,widget)
1159                        p.start()
1160                       
1161                if blocked:
1162                       
1163                        if not self.mprocess.is_alive():
1164                                self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
1165                                #self.mprocess.daemon=True
1166                                self.mprocess.start()
1167                                GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
1168                        else:
1169                                self.open_dialog("Warning",_("<b>%s</b> is being executed. Please wait until it finishes.")%self.mprocess_app_name )
1170               
1171        #def execute
1172
1173
1174        def _execute(self,cmd):
1175               
1176               
1177                subprocess.call(cmd,shell=True,preexec_fn=lambda: signal.signal(signal.SIGPIPE,signal.SIG_DFL))
1178               
1179                #os.system(cmd)
1180               
1181        #def _execute
1182
1183       
1184        def close_window(self,widget,data):
1185               
1186                if self.mprocess.is_alive():
1187                        ret=self.open_dialog("Warning",_("<b>%s</b> is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
1188               
1189                        if ret==Gtk.ResponseType.CANCEL:
1190                                return -1
1191                               
1192                        self.mprocess.terminate()
1193                        self.mprocess=multiprocessing.Process()
1194               
1195                Gtk.main_quit()
1196                print("")
1197               
1198        #def close_window
1199
1200               
1201        def open_dialog(self,title,text,show_cancel=False):
1202
1203                label = Gtk.Label()
1204                label.set_markup(text)
1205                if show_cancel:
1206                        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))
1207                else:
1208                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
1209                hbox = Gtk.HBox()
1210                img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
1211                hbox.pack_start(img,True,True,5)
1212                hbox.pack_start(label,True,True,10)
1213                hbox.show_all()
1214                dialog.vbox.pack_start(hbox,True,True,10)
1215                dialog.set_border_width(6)
1216                response = dialog.run()
1217                dialog.destroy()
1218                return response
1219               
1220        #def open_dialog
1221
1222       
1223        def get_state(self,app):
1224
1225                try:
1226                        configured=self.client.get_state("","ZCenterVariables",app["ID"])
1227                        return configured
1228                except:
1229                        return 0
1230               
1231        #def get_state
1232
1233       
1234        def set_configured(self,app,key):
1235               
1236                if app in self.app_parser.app_list:
1237                       
1238                        try:
1239                                self.client.set_configured(key,"ZCenterVariables",app)
1240                        except Exception as e:
1241                                print e
1242                               
1243                else:
1244                        print("[!] %s is not installed"%app)
1245               
1246                sys.exit(0)
1247                               
1248        #def set_configured
1249
1250       
1251        def set_non_configured(self,app,key):
1252               
1253                if app in self.app_parser.app_list:
1254                       
1255                        try:
1256                                self.client.set_non_configured(key,"ZCenterVariables",app)
1257                        except:
1258                                pass
1259                               
1260                else:
1261                        print("\t[!] %s is not installed"%app)
1262               
1263                sys.exit(0)
1264               
1265        #def set_non_configured
1266       
1267        def set_failed(self,app,key):
1268               
1269                if app in self.app_parser.app_list:
1270                       
1271                        try:
1272                                self.client.set_failed(key,"ZCenterVariables",app)
1273                        except:
1274                                pass
1275                               
1276                else:
1277                        print("\t[!] %s is not installed"%app)
1278               
1279                sys.exit(0)
1280               
1281        #def set_non_configured
1282
1283       
1284        def set_custom_text(self,app,text,key):
1285               
1286                if app in self.app_parser.app_list:
1287                       
1288                        try:
1289                                self.client.set_custom_text(key,"ZCenterVariables",app,text)
1290                        except:
1291                                pass
1292                               
1293                else:
1294                        print("\t[!] %s is not installed"%app)
1295               
1296                sys.exit(0)
1297               
1298        #def set_custom_text
1299
1300       
1301        def add_pulsating_color(self,key,app):
1302               
1303                try:
1304                        self.client.add_pulsating_color(key,"ZCenterVariables",app)
1305                except:
1306                        pass
1307                       
1308                sys.exit(0)
1309               
1310        #def add_pulsating_color
1311
1312       
1313        def remove_pulsating_color(self,key,app):
1314               
1315                try:
1316                        self.client.remove_pulsating_color(key,"ZCenterVariables",app)
1317                except:
1318                        pass
1319               
1320                sys.exit(0)
1321               
1322        #def add_pulsating_color
1323
1324       
1325        def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
1326               
1327                try:
1328                        self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
1329                except Exception as e:
1330                        print e
1331                       
1332                sys.exit(0)
1333               
1334        #def add_zc_notification
1335
1336       
1337        def remove_zc_notification(self,key,app):
1338               
1339                try:
1340                        self.client.remove_zc_message(key,"ZCenterVariables",app)
1341                except Exception as e:
1342                        print e
1343                       
1344                sys.exit(0)
1345               
1346        #def remove_zc_notification
1347
1348
1349        def usage(self):
1350               
1351                print("USAGE:")
1352                print("\tzero-center [ OPTION [ APP ] ]")
1353                print("Options:")
1354                print("\tset-configured APP") 
1355                print("\tset-non-configured APP") 
1356                print("\tset-custom-text APP TEXT") 
1357                print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
1358                print("\tremove-zero-center-notification APP") 
1359                print("\tadd-pulsating-color APP") 
1360                print("\tremove-pulsating-color APP") 
1361                print("\tnon-animated")
1362                print("\tanimated")
1363                print("\thelp")
1364                print("")
1365                sys.exit(0)
1366               
1367        #def usage
1368       
1369
1370def check_root():
1371        try:
1372                f=open("/etc/n4d/key","r")
1373                key=f.readline().strip("\n")
1374                f.close()
1375                return key
1376        except:
1377                print("[!] You need root privileges to execute this option [!]")
1378                sys.exit(1)
1379
1380if __name__=="__main__":
1381       
1382
1383        zc=ZeroCenter()
1384        zc.drawing_mode=True
1385
1386        if len(sys.argv)>=2:
1387               
1388                if sys.argv[1] not in zc.commands:
1389                        zc.usage()
1390                        sys.exit(1)
1391                       
1392                if sys.argv[1] == "help":
1393                        zc.usage()
1394                       
1395                if sys.argv[1] == "set-configured":
1396                        key=check_root()
1397                        zc.set_configured(sys.argv[2],key)
1398                       
1399                if sys.argv[1] == "set-non-configured":
1400                        key=check_root()
1401                        zc.set_non_configured(sys.argv[2],key)
1402                       
1403                if sys.argv[1] == "set-failed":
1404                        key=check_root()
1405                        zc.set_failed(sys.argv[2],key)
1406                       
1407                if sys.argv[1] == "set-custom-text":
1408                        key=check_root()
1409                        zc.set_custom_text(sys.argv[2],sys.argv[3],key)
1410                       
1411                if sys.argv[1] == "add-zero-center-notification":
1412                        key=check_root()
1413                       
1414                        try:
1415                                app=sys.argv[2]
1416                        except:
1417                                zc.usage()
1418                        try:
1419                                text=sys.argv[3]
1420                        except:
1421                                zc.usage()
1422                        try:
1423                                text_es=sys.argv[4]
1424                        except Exception as e:
1425                                print e
1426                                text_es=""
1427                        try:
1428                                text_qcv=sys.argv[5]
1429                        except Exception as e:
1430                                print e
1431                                text_qcv=""
1432                       
1433                        zc.add_zc_notification(key,app,text,text_es,text_qcv)
1434                       
1435                if sys.argv[1] == "remove-zero-center-notification":
1436                       
1437                        key=check_root()
1438                       
1439                        try:
1440                                app=sys.argv[2]
1441                        except:
1442                                zc.usage()
1443                               
1444                        zc.remove_zc_notification(key,app)
1445                       
1446                if sys.argv[1] == "add-pulsating-color":
1447                        key=check_root()
1448                        try:
1449                                app=sys.argv[2]
1450                        except:
1451                                zc.usage()
1452                               
1453                        zc.add_pulsating_color(key,app)
1454                               
1455                if sys.argv[1] == "remove-pulsating-color":
1456                        key=check_root()
1457                       
1458                        try:
1459                                app=sys.argv[2]
1460                        except:
1461                                zc.usage()
1462                               
1463                        zc.remove_pulsating_color(key,app)
1464                       
1465
1466                if sys.argv[1]=="animated":
1467                        zc.drawing_mode=True
1468                       
1469                if sys.argv[1]=="non-animated":
1470                        zc.drawing_mode=False
1471               
1472       
1473       
1474        zc.start_gui()
Note: See TracBrowser for help on using the repository browser.