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

Last change on this file since 1566 was 1566, checked in by jrpelegrina, 3 years ago

WIP in message of installation services in slave server

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