source: n4d-network/trunk/fuentes/n4d-nat-frontend.install/usr/share/n4d-nat-frontend/nat_manager.py @ 8211

Last change on this file since 8211 was 8211, checked in by hectorgh, 20 months ago

setting error_msg

File size: 8.7 KB
Line 
1import gi
2gi.require_version('Gtk','3.0')
3
4from gi.repository import Gtk, Gdk,GdkPixbuf,GObject,GLib
5
6import xmlrpclib
7import sys
8import os
9import os.path
10
11import signal
12
13signal.signal(signal.SIGINT, signal.SIG_DFL)
14
15import gettext
16gettext.textdomain('n4d-nat-frontend')
17_ = gettext.gettext
18
19MARGIN=20
20
21class NatManager:
22       
23        def __init__(self,ip="localhost"):
24               
25                status=self.read_key()
26                self.status_error=None
27                if not status:
28                        print("[!] You need root privileges to run this program [!]")
29                        label = Gtk.Label(_("You need root privileges to run nat-manager"))
30                        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
31                        dialog.vbox.pack_start(label,True,True,10)
32                        label.show()
33                        dialog.set_border_width(6)
34                        response = dialog.run()
35                        dialog.destroy()
36                        sys.exit(0)
37                self.client=xmlrpclib.ServerProxy("https://"+ip+":9779")
38                self.status={}
39                self.get_status_list()
40                self.build_gui()
41       
42        def read_key(self):
43               
44                try:
45                        f=open("/etc/n4d/key")
46                        self.key=f.readline().strip("\n")
47                        f.close()
48                        return True
49                except:
50                        return False
51
52        #def check_perms
53       
54        def get_status_list(self):
55               
56                try:
57                       
58                        ret=self.client.get_nat("","NetworkManager")
59                       
60                        self.status["nat"]=ret["status"]
61                        ret=self.client.get_routing("","NetworkManager")
62                        self.status["routing"]=ret["status"]
63                        self.status["nat_persistence"]=True
64                        self.status["routing_persistence"]=True
65                        proxy_status=self.client.get_variable("","VariablesManager","CLIENT_PROXY_ENABLED")
66                        if proxy_status==None:
67                                self.proxy_var_initialized=False
68                                proxy_status=True
69                        else:
70                                self.proxy_var_initialized=True
71                        self.status["proxy"]=proxy_status
72                       
73                except Exception as e:
74                        self.status_error=_("N4D error: ") + str(e)
75                        #set msg error
76               
77        #def get_status_list
78
79       
80        def build_gui(self):
81               
82                builder=Gtk.Builder()
83                self._set_css_info()
84                builder.set_translation_domain('n4d-nat-frontend')
85                if os.path.exists("/srv/svn/pandora/n4d-network/trunk/n4d-nat-frontend.install/usr/share/n4d-nat-frontend/rsrc/nat-manager.glade"):
86                        builder.add_from_file("/srv/svn/pandora/n4d-network/trunk/n4d-nat-frontend.install/usr/share/n4d-nat-frontend/rsrc/nat-manager.glade")
87                else:
88                        builder.add_from_file("/usr/share/n4d-nat-frontend/rsrc/nat-manager.ui")
89
90                self.window=Gtk.Window()
91                main_vbox=Gtk.VBox()
92                main_vbox.set_halign(Gtk.Align.FILL)
93               
94               
95               
96                vbox=Gtk.VBox()
97                vbox.set_halign(Gtk.Align.FILL)
98                vbox.set_margin_bottom(MARGIN)
99                vbox.set_margin_left(MARGIN)
100                vbox.set_margin_right(MARGIN)
101
102                pb=GdkPixbuf.Pixbuf.new_from_file("/usr/share/n4d-nat-frontend/rsrc/nat-manager.png")
103                img_banner=Gtk.Image.new_from_pixbuf(pb)
104                img_banner.props.halign=Gtk.Align.CENTER
105                img_banner.set_margin_top(0)
106                img_banner.set_margin_bottom(MARGIN)
107                main_vbox.pack_start(img_banner,False,False,0)
108
109                boxrou=Gtk.VBox()
110                lblrou=Gtk.Label()
111                lblrou.set_markup('<span size="medium">%s</span>'%_("Routing status"))
112                boxrou.add(lblrou)
113                self.lblrou_info=Gtk.Label()
114                lblrou.props.halign=Gtk.Align.START
115                self.lblrou_info.props.halign=Gtk.Align.START
116                self.lblrou_info.set_markup('<span size="small" color="grey">%s</span>'%_("Route traffic through server"))
117                boxrou.add(self.lblrou_info)
118                boxrou.props.halign=Gtk.Align.START
119
120                self.swtrou=Gtk.Switch()
121                self.swtrou.props.halign=Gtk.Align.END
122                self.swtrou.set_active(self.status["routing"])
123
124                tmp_hbox=Gtk.HBox()
125                tmp_hbox.pack_start(boxrou,False,False,0)
126                tmp_hbox.pack_end(self.swtrou,False,False,0)
127                vbox.pack_start(tmp_hbox,True,True,0)
128                vbox.pack_start(Gtk.Separator(),True,True,3)
129
130
131                boxnat=Gtk.VBox()
132                lblnat=Gtk.Label()
133                lblnat.set_markup('<span size="medium">%s</span>'%_("NAT status"))
134                lblnat.props.halign=Gtk.Align.START
135                boxnat.add(lblnat)
136                self.lblnat_info=Gtk.Label()
137                self.lblnat_info.props.halign=Gtk.Align.START
138                self.lblnat_info.set_markup('<span size="small" color="grey">%s</span>'%_("Redirect server ports to client ports"))
139                boxnat.add(self.lblnat_info)
140                boxnat.props.halign=Gtk.Align.START
141                self.swtnat=Gtk.Switch()
142                self.swtnat.props.halign=Gtk.Align.END
143                self.swtnat.set_active(self.status["nat"])
144               
145
146                tmp_hbox=Gtk.HBox()
147                tmp_hbox.pack_start(boxnat,False,False,0)
148                tmp_hbox.pack_end(self.swtnat,False,False,0)
149                vbox.pack_start(tmp_hbox,True,True,3)
150                vbox.pack_start(Gtk.Separator(),True,True,3)
151
152                boxpro=Gtk.VBox()
153                lblpro=Gtk.Label()
154                lblpro.props.halign=Gtk.Align.START
155                lblpro.set_markup('<span size="medium">%s</span>'%_("Proxy status"))
156                boxpro.add(lblpro)
157                self.lblpro_info=Gtk.Label()
158                self.lblpro_info.props.halign=Gtk.Align.START
159                self.lblpro_info.set_markup('<span size="small" color="grey">%s</span>'%_("Enable proxy in classroom clients"))
160                boxpro.add(self.lblpro_info)
161                self.swtpro=Gtk.Switch()
162                self.swtpro.props.halign=Gtk.Align.END
163                self.swtpro.set_active(self.status["proxy"])
164
165               
166                tmp_hbox=Gtk.HBox()
167                tmp_hbox.pack_start(boxpro,False,False,0)
168                tmp_hbox.pack_end(self.swtpro,False,False,0)
169                vbox.pack_start(tmp_hbox,True,True,3)
170
171                self.msg_label=builder.get_object("msg_label")
172
173                self.swtnat.connect("state-set",self.routing_changed)
174                self.swtrou.connect("state-set",self.routing_changed)
175                self.swtpro.connect("state-set",self.routing_changed)
176               
177                if not self.status["nat"] or not self.status["routing"]:
178                        self.swtpro.set_sensitive(False)
179
180                main_vbox.pack_start(vbox,True,True,0)
181                self.window.add(main_vbox)
182                self.window.resize(450,250)
183                self.window.set_resizable(False)
184                self.window.set_position(Gtk.WindowPosition.CENTER)
185                self.window.show_all()
186                self.window.connect("destroy",Gtk.main_quit)
187
188                if self.status_error!=None:
189                        self.msg_label.set_text(self.status_error)
190
191                Gtk.main()
192               
193        #def build_gui
194
195       
196        def routing_changed(self,*args):
197                widget=args[0]
198                state=args[-1]
199                if widget==self.swtrou:
200                        print("Routing change %s"%state)
201                        self.client.set_routing(self.key,"NetworkManager",state,self.status["routing_persistence"])
202
203                elif widget==self.swtnat:
204                        print("NAT change %s"%state)
205                        self.client.set_nat(self.key,"NetworkManager",state,self.status["nat_persistence"])
206                elif widget==self.swtpro:
207                        self.set_client_proxy(state)
208
209                if self.swtrou.get_active() and self.swtnat.get_active():
210                        self.swtpro.set_sensitive(True)
211                else:
212#                       self.set_client_proxy(True)
213#                       self.lblpro_info.set_markup('<span size="small" color="grey">%s</span>'%_("Actual state is enabled"))
214                        self.swtpro.set_sensitive(False)
215                        self.swtpro.set_state(True)
216        #def routing_changed
217       
218        def set_client_proxy(self,state):
219                print("Proxy change %s"%state)
220               
221                if not self.proxy_var_initialized:
222                        #INIT VALUE
223                        self.client.add_variable(self.key,"VariablesManager","CLIENT_PROXY_ENABLED",state,"","Variable to enable or disable proxy in classroom clients",[])
224                        self.proxy_var_initialized=True
225                        return True
226               
227                self.client.set_variable(self.key,"VariablesManager","CLIENT_PROXY_ENABLED",state)
228               
229        #def set_client_proxy
230       
231        def close_window(self,widget):
232                Gtk.main_quit()
233                sys.exit(0)
234        #def close_window
235       
236        def _set_css_info(self):
237       
238                css = b"""
239
240                GtkEntry{
241                        font-family: Roboto;
242                        border:0px;
243                        border-bottom:1px grey solid;
244                        margin-top:0px;
245                        padding-top:0px;
246                }
247                GtkGrid{
248                        background: red;
249                }
250
251                GtkLabel {
252                        font-family: Roboto;
253                }
254
255                #NOTIF_LABEL{
256                        background-color: #3366cc;
257                        font: 11px Roboto;
258                        color:white;
259                        border: dashed 1px silver;
260                        padding:6px;
261                }
262
263                #ERROR_LABEL{
264                        background-color: red;
265                        font: 11px Roboto;
266                        color:white;
267                        border: dashed 1px silver;
268                        padding:6px;
269                }
270
271                #ENTRY_LABEL{
272                        color:grey;
273                        padding:6px;
274                        padding-bottom:0px;
275                }
276
277                #PLAIN_BTN,#PLAIN_BTN:active{
278                        border:0px;
279                        padding:0px;
280                        background:white;
281                }
282               
283                #PLAIN_BTN_DISABLED,#PLAIN_BTN_DISABLED:active{
284                        border:0px;
285                        padding:0px;
286                        background:white;
287                        font:grey;
288                }
289
290                #COMPONENT{
291                        padding:3px;
292                        border: dashed 1px silver;
293
294                }
295
296                #WHITE_BACKGROUND {
297                        background-color:rgba(255,255,255,1);
298               
299                }
300
301                #BLUE_FONT {
302                        color: #3366cc;
303                        font: Roboto Bold 11;
304                       
305                }       
306               
307
308                #TASKGRID_FONT {
309                        color: #3366cc;
310                        font: Roboto 11;
311                       
312                }
313
314                #LABEL #LABEL_INSTALL{
315                        padding: 6px;
316                        margin:6px;
317                        font: 12px Roboto;
318                }
319
320                #LABEL_OPTION{
321               
322                        font: 48px Roboto;
323                        padding: 6px;
324                        margin:6px;
325                        font-weight:bold;
326                }
327
328                #ERROR_FONT {
329                        color: #CC0000;
330                        font: Roboto Bold 11;
331                }
332
333                #MENUITEM {
334                        padding: 12px;
335                        margin:6px;
336                        font: 24px Roboto;
337                        background:white;
338                }
339
340                #BLUEBUTTON {
341                        background-color: #3366cc;
342                        color:white;
343                        font: 11px Roboto Bold;
344                }
345
346                """
347                self.style_provider=Gtk.CssProvider()
348                self.style_provider.load_from_data(css)
349                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
350        #def set_css_info       
351       
352#class NatManager
353
354def usage():
355        print("USAGE:")
356        print("\tnat-manager [ -ip TEMPLATE_FILE -u USER -p PASSWORD ]")
357
358if __name__=="__main__":
359       
360        nm=NatManager()
361       
Note: See TracBrowser for help on using the repository browser.