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

Last change on this file since 4243 was 4243, checked in by hectorgh, 2 years ago

minor changes

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