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

Last change on this file since 1430 was 1430, checked in by jrpelegrina, 5 years ago

adding n4dvars support

  • Property svn:executable set to *
File size: 31.7 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                if not os.environ["MASTER_SERVER_IP"]:
1060                        self.open_dialog("Warning","<b>%s</b> ESTAS EN UN ESCLAVO")
1061                        return -1
1062               
1063                if app["ID"] in self.configured_apps:
1064                        ret=self.open_dialog("Warning",_("<b>%s</b> is already configured. Do you want to execute it again?")%self.get_name(app),True)
1065                        if ret==Gtk.ResponseType.CANCEL:
1066                                return -1
1067               
1068                if self.check_app_dependences(app):
1069               
1070                        cmd=""
1071                               
1072                        if "Using" in app:
1073                                cmd+=app["Using"].strip(" ").strip("\n") +" "
1074                                       
1075                        cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
1076                       
1077                        gt=False
1078                        if "Gnome-terminal" in app:
1079                                if app["Gnome-terminal"].lower()=="true":
1080                                        cmd='gnome-terminal --command="'+cmd+'"'
1081                                        gt=True
1082                                       
1083                        if not gt:
1084                                if "gnome-terminal" in app:
1085                                        if app["gnome-terminal"].lower()=="true":
1086                                                cmd='gnome-terminal --command="'+cmd+'"'
1087                               
1088                               
1089                       
1090                        blocked=False
1091                        print(' * Executing "' + cmd + '" ...')
1092                        if "Modal" in app:
1093                                if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
1094                                        GLib.timeout_add(250,self.pulse_progress)
1095                                        self.progress_bar.show()
1096                                       
1097                                        try:
1098                                                txt="Executing %s"%app["Name["+self.lang+"]"]
1099                                        except:
1100                                                txt="Executing %s"%app["Name"]
1101                                        self.progress_label.set_text(txt)
1102                                        self.progress_label.show()
1103                                        self.mprocess_app_name=app["Name"]
1104                                        blocked=True
1105                                else:
1106                                        self.open_dialog("Warning","<b>%s</b> is being executed. Please wait until it finishes."%self.mprocess_app_name )
1107                                        return -1
1108               
1109                        self.execute(cmd,blocked,app,widget)
1110                       
1111                else:
1112                       
1113                        self.open_dialog("Warning","<b>%s</b> dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
1114               
1115        #def app_clicked
1116       
1117       
1118        def check_output(self,process,app,button):
1119               
1120                if not process.is_alive():
1121                       
1122                        print "[ZeroCenter] %s has ended"%app["ID"]
1123                       
1124                        if "Service" in app:
1125                                if app["Service"].lower()=="true":
1126                                       
1127                                        try:
1128                                                self.get_states()
1129                       
1130                                                for cat in self.app_parser.apps:
1131                                                        for item in self.app_parser.apps[cat]:
1132                                                                item["gtk_button"].get_child().queue_draw()
1133                                               
1134                                                darea=button.get_child()
1135                                                darea.queue_draw()
1136                                               
1137                                        except Exception as e:
1138                                                pass
1139                                       
1140                return process.is_alive()
1141               
1142        #def check_output
1143       
1144       
1145        def pulse_progress(self):
1146               
1147                self.progress_bar.pulse()
1148                if not self.mprocess.is_alive():
1149                        self.progress_bar.hide()
1150                        self.progress_label.hide()
1151                return self.mprocess.is_alive()
1152
1153        #def pulse_progress
1154
1155       
1156        def execute(self,cmd,blocked=False,app=None,widget=None):
1157               
1158                if not blocked:
1159                        p=multiprocessing.Process(target=self._execute,args=(cmd,))
1160                        #p.daemon=True
1161                        GLib.timeout_add(1000,self.check_output,p,app,widget)
1162                        p.start()
1163                       
1164                if blocked:
1165                       
1166                        if not self.mprocess.is_alive():
1167                                self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
1168                                #self.mprocess.daemon=True
1169                                self.mprocess.start()
1170                                GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
1171                        else:
1172                                self.open_dialog("Warning",_("<b>%s</b> is being executed. Please wait until it finishes.")%self.mprocess_app_name )
1173               
1174        #def execute
1175
1176
1177        def _execute(self,cmd):
1178               
1179               
1180                subprocess.call(cmd,shell=True,preexec_fn=lambda: signal.signal(signal.SIGPIPE,signal.SIG_DFL))
1181               
1182                #os.system(cmd)
1183               
1184        #def _execute
1185
1186       
1187        def close_window(self,widget,data):
1188               
1189                if self.mprocess.is_alive():
1190                        ret=self.open_dialog("Warning",_("<b>%s</b> is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
1191               
1192                        if ret==Gtk.ResponseType.CANCEL:
1193                                return -1
1194                               
1195                        self.mprocess.terminate()
1196                        self.mprocess=multiprocessing.Process()
1197               
1198                Gtk.main_quit()
1199                print("")
1200               
1201        #def close_window
1202
1203               
1204        def open_dialog(self,title,text,show_cancel=False):
1205
1206                label = Gtk.Label()
1207                label.set_markup(text)
1208                if show_cancel:
1209                        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))
1210                else:
1211                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
1212                hbox = Gtk.HBox()
1213                img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
1214                hbox.pack_start(img,True,True,5)
1215                hbox.pack_start(label,True,True,10)
1216                hbox.show_all()
1217                dialog.vbox.pack_start(hbox,True,True,10)
1218                dialog.set_border_width(6)
1219                response = dialog.run()
1220                dialog.destroy()
1221                return response
1222               
1223        #def open_dialog
1224
1225       
1226        def get_state(self,app):
1227
1228                try:
1229                        configured=self.client.get_state("","ZCenterVariables",app["ID"])
1230                        return configured
1231                except:
1232                        return 0
1233               
1234        #def get_state
1235
1236       
1237        def set_configured(self,app,key):
1238               
1239                if app in self.app_parser.app_list:
1240                       
1241                        try:
1242                                self.client.set_configured(key,"ZCenterVariables",app)
1243                        except Exception as e:
1244                                print e
1245                               
1246                else:
1247                        print("[!] %s is not installed"%app)
1248               
1249                sys.exit(0)
1250                               
1251        #def set_configured
1252
1253       
1254        def set_non_configured(self,app,key):
1255               
1256                if app in self.app_parser.app_list:
1257                       
1258                        try:
1259                                self.client.set_non_configured(key,"ZCenterVariables",app)
1260                        except:
1261                                pass
1262                               
1263                else:
1264                        print("\t[!] %s is not installed"%app)
1265               
1266                sys.exit(0)
1267               
1268        #def set_non_configured
1269       
1270        def set_failed(self,app,key):
1271               
1272                if app in self.app_parser.app_list:
1273                       
1274                        try:
1275                                self.client.set_failed(key,"ZCenterVariables",app)
1276                        except:
1277                                pass
1278                               
1279                else:
1280                        print("\t[!] %s is not installed"%app)
1281               
1282                sys.exit(0)
1283               
1284        #def set_non_configured
1285
1286       
1287        def set_custom_text(self,app,text,key):
1288               
1289                if app in self.app_parser.app_list:
1290                       
1291                        try:
1292                                self.client.set_custom_text(key,"ZCenterVariables",app,text)
1293                        except:
1294                                pass
1295                               
1296                else:
1297                        print("\t[!] %s is not installed"%app)
1298               
1299                sys.exit(0)
1300               
1301        #def set_custom_text
1302
1303       
1304        def add_pulsating_color(self,key,app):
1305               
1306                try:
1307                        self.client.add_pulsating_color(key,"ZCenterVariables",app)
1308                except:
1309                        pass
1310                       
1311                sys.exit(0)
1312               
1313        #def add_pulsating_color
1314
1315       
1316        def remove_pulsating_color(self,key,app):
1317               
1318                try:
1319                        self.client.remove_pulsating_color(key,"ZCenterVariables",app)
1320                except:
1321                        pass
1322               
1323                sys.exit(0)
1324               
1325        #def add_pulsating_color
1326
1327       
1328        def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
1329               
1330                try:
1331                        self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
1332                except Exception as e:
1333                        print e
1334                       
1335                sys.exit(0)
1336               
1337        #def add_zc_notification
1338
1339       
1340        def remove_zc_notification(self,key,app):
1341               
1342                try:
1343                        self.client.remove_zc_message(key,"ZCenterVariables",app)
1344                except Exception as e:
1345                        print e
1346                       
1347                sys.exit(0)
1348               
1349        #def remove_zc_notification
1350
1351
1352        def usage(self):
1353               
1354                print("USAGE:")
1355                print("\tzero-center [ OPTION [ APP ] ]")
1356                print("Options:")
1357                print("\tset-configured APP") 
1358                print("\tset-non-configured APP") 
1359                print("\tset-custom-text APP TEXT") 
1360                print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
1361                print("\tremove-zero-center-notification APP") 
1362                print("\tadd-pulsating-color APP") 
1363                print("\tremove-pulsating-color APP") 
1364                print("\tnon-animated")
1365                print("\tanimated")
1366                print("\thelp")
1367                print("")
1368                sys.exit(0)
1369               
1370        #def usage
1371       
1372
1373def check_root():
1374        try:
1375                f=open("/etc/n4d/key","r")
1376                key=f.readline().strip("\n")
1377                f.close()
1378                return key
1379        except:
1380                print("[!] You need root privileges to execute this option [!]")
1381                sys.exit(1)
1382
1383if __name__=="__main__":
1384       
1385
1386        zc=ZeroCenter()
1387        zc.drawing_mode=True
1388
1389        if len(sys.argv)>=2:
1390               
1391                if sys.argv[1] not in zc.commands:
1392                        zc.usage()
1393                        sys.exit(1)
1394                       
1395                if sys.argv[1] == "help":
1396                        zc.usage()
1397                       
1398                if sys.argv[1] == "set-configured":
1399                        key=check_root()
1400                        zc.set_configured(sys.argv[2],key)
1401                       
1402                if sys.argv[1] == "set-non-configured":
1403                        key=check_root()
1404                        zc.set_non_configured(sys.argv[2],key)
1405                       
1406                if sys.argv[1] == "set-failed":
1407                        key=check_root()
1408                        zc.set_failed(sys.argv[2],key)
1409                       
1410                if sys.argv[1] == "set-custom-text":
1411                        key=check_root()
1412                        zc.set_custom_text(sys.argv[2],sys.argv[3],key)
1413                       
1414                if sys.argv[1] == "add-zero-center-notification":
1415                        key=check_root()
1416                       
1417                        try:
1418                                app=sys.argv[2]
1419                        except:
1420                                zc.usage()
1421                        try:
1422                                text=sys.argv[3]
1423                        except:
1424                                zc.usage()
1425                        try:
1426                                text_es=sys.argv[4]
1427                        except Exception as e:
1428                                print e
1429                                text_es=""
1430                        try:
1431                                text_qcv=sys.argv[5]
1432                        except Exception as e:
1433                                print e
1434                                text_qcv=""
1435                       
1436                        zc.add_zc_notification(key,app,text,text_es,text_qcv)
1437                       
1438                if sys.argv[1] == "remove-zero-center-notification":
1439                       
1440                        key=check_root()
1441                       
1442                        try:
1443                                app=sys.argv[2]
1444                        except:
1445                                zc.usage()
1446                               
1447                        zc.remove_zc_notification(key,app)
1448                       
1449                if sys.argv[1] == "add-pulsating-color":
1450                        key=check_root()
1451                        try:
1452                                app=sys.argv[2]
1453                        except:
1454                                zc.usage()
1455                               
1456                        zc.add_pulsating_color(key,app)
1457                               
1458                if sys.argv[1] == "remove-pulsating-color":
1459                        key=check_root()
1460                       
1461                        try:
1462                                app=sys.argv[2]
1463                        except:
1464                                zc.usage()
1465                               
1466                        zc.remove_pulsating_color(key,app)
1467                       
1468
1469                if sys.argv[1]=="animated":
1470                        zc.drawing_mode=True
1471                       
1472                if sys.argv[1]=="non-animated":
1473                        zc.drawing_mode=False
1474               
1475       
1476       
1477        zc.start_gui()
Note: See TracBrowser for help on using the repository browser.