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

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

reading local variable if n4d is down

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