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

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

adding error_msg

File size: 8.9 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                self._set_css_info()
83               
84                '''
85               
86                # THERE WAS AN OLD GUI WAS HERE.
87                # IT'S GONE NOW
88               
89                builder=Gtk.Builder()
90                builder.set_translation_domain('n4d-nat-frontend')
91                if os.path.exists("/srv/svn/pandora/n4d-network/trunk/n4d-nat-frontend.install/usr/share/n4d-nat-frontend/rsrc/nat-manager.glade"):
92                        builder.add_from_file("/srv/svn/pandora/n4d-network/trunk/n4d-nat-frontend.install/usr/share/n4d-nat-frontend/rsrc/nat-manager.glade")
93                else:
94                        builder.add_from_file("/usr/share/n4d-nat-frontend/rsrc/nat-manager.ui")
95                '''
96               
97                self.window=Gtk.Window()
98                main_vbox=Gtk.VBox()
99                main_vbox.set_halign(Gtk.Align.FILL)
100               
101               
102               
103                vbox=Gtk.VBox()
104                vbox.set_halign(Gtk.Align.FILL)
105                vbox.set_margin_bottom(MARGIN)
106                vbox.set_margin_left(MARGIN)
107                vbox.set_margin_right(MARGIN)
108
109                pb=GdkPixbuf.Pixbuf.new_from_file("/usr/share/n4d-nat-frontend/rsrc/nat-manager.png")
110                img_banner=Gtk.Image.new_from_pixbuf(pb)
111                img_banner.props.halign=Gtk.Align.CENTER
112                img_banner.set_margin_top(0)
113                img_banner.set_margin_bottom(MARGIN)
114                main_vbox.pack_start(img_banner,False,False,0)
115
116                boxrou=Gtk.VBox()
117                lblrou=Gtk.Label()
118                lblrou.set_markup('<span size="medium">%s</span>'%_("Routing status"))
119                boxrou.add(lblrou)
120                self.lblrou_info=Gtk.Label()
121                lblrou.props.halign=Gtk.Align.START
122                self.lblrou_info.props.halign=Gtk.Align.START
123                self.lblrou_info.set_markup('<span size="small" color="grey">%s</span>'%_("Route traffic through server"))
124                boxrou.add(self.lblrou_info)
125                boxrou.props.halign=Gtk.Align.START
126
127                self.swtrou=Gtk.Switch()
128                self.swtrou.props.halign=Gtk.Align.END
129                self.swtrou.set_active(self.status["routing"])
130
131                tmp_hbox=Gtk.HBox()
132                tmp_hbox.pack_start(boxrou,False,False,0)
133                tmp_hbox.pack_end(self.swtrou,False,False,0)
134                vbox.pack_start(tmp_hbox,True,True,0)
135                vbox.pack_start(Gtk.Separator(),True,True,3)
136
137
138                boxnat=Gtk.VBox()
139                lblnat=Gtk.Label()
140                lblnat.set_markup('<span size="medium">%s</span>'%_("NAT status"))
141                lblnat.props.halign=Gtk.Align.START
142                boxnat.add(lblnat)
143                self.lblnat_info=Gtk.Label()
144                self.lblnat_info.props.halign=Gtk.Align.START
145                self.lblnat_info.set_markup('<span size="small" color="grey">%s</span>'%_("Redirect server ports to client ports"))
146                boxnat.add(self.lblnat_info)
147                boxnat.props.halign=Gtk.Align.START
148                self.swtnat=Gtk.Switch()
149                self.swtnat.props.halign=Gtk.Align.END
150                self.swtnat.set_active(self.status["nat"])
151               
152
153                tmp_hbox=Gtk.HBox()
154                tmp_hbox.pack_start(boxnat,False,False,0)
155                tmp_hbox.pack_end(self.swtnat,False,False,0)
156                vbox.pack_start(tmp_hbox,True,True,3)
157                vbox.pack_start(Gtk.Separator(),True,True,3)
158
159                boxpro=Gtk.VBox()
160                lblpro=Gtk.Label()
161                lblpro.props.halign=Gtk.Align.START
162                lblpro.set_markup('<span size="medium">%s</span>'%_("Proxy status"))
163                boxpro.add(lblpro)
164                self.lblpro_info=Gtk.Label()
165                self.lblpro_info.props.halign=Gtk.Align.START
166                self.lblpro_info.set_markup('<span size="small" color="grey">%s</span>'%_("Enable proxy in classroom clients"))
167                boxpro.add(self.lblpro_info)
168                self.swtpro=Gtk.Switch()
169                self.swtpro.props.halign=Gtk.Align.END
170                self.swtpro.set_active(self.status["proxy"])
171
172               
173                tmp_hbox=Gtk.HBox()
174                tmp_hbox.pack_start(boxpro,False,False,0)
175                tmp_hbox.pack_end(self.swtpro,False,False,0)
176                vbox.pack_start(tmp_hbox,True,True,3)
177               
178                self.msg_label=Gtk.Label()
179                vbox.pack_start(self.msg_label,True,True,10)
180
181                self.swtnat.connect("state-set",self.routing_changed)
182                self.swtrou.connect("state-set",self.routing_changed)
183                self.swtpro.connect("state-set",self.routing_changed)
184               
185                if not self.status["nat"] or not self.status["routing"]:
186                        self.swtpro.set_sensitive(False)
187
188                main_vbox.pack_start(vbox,True,True,0)
189                self.window.add(main_vbox)
190                self.window.resize(450,250)
191                self.window.set_resizable(False)
192                self.window.set_position(Gtk.WindowPosition.CENTER)
193                self.window.show_all()
194                self.window.connect("destroy",Gtk.main_quit)
195
196                if self.status_error!=None:
197                        self.msg_label.set_markup("<span foreground='red'>"+self.status_error+"</span>")
198                else:
199                        self.msg_label.hide()
200
201                Gtk.main()
202               
203        #def build_gui
204
205       
206        def routing_changed(self,*args):
207                widget=args[0]
208                state=args[-1]
209                if widget==self.swtrou:
210                        print("Routing change %s"%state)
211                        self.client.set_routing(self.key,"NetworkManager",state,self.status["routing_persistence"])
212
213                elif widget==self.swtnat:
214                        print("NAT change %s"%state)
215                        self.client.set_nat(self.key,"NetworkManager",state,self.status["nat_persistence"])
216                elif widget==self.swtpro:
217                        self.set_client_proxy(state)
218
219                if self.swtrou.get_active() and self.swtnat.get_active():
220                        self.swtpro.set_sensitive(True)
221                else:
222#                       self.set_client_proxy(True)
223#                       self.lblpro_info.set_markup('<span size="small" color="grey">%s</span>'%_("Actual state is enabled"))
224                        self.swtpro.set_sensitive(False)
225                        self.swtpro.set_state(True)
226        #def routing_changed
227       
228        def set_client_proxy(self,state):
229                print("Proxy change %s"%state)
230               
231                if not self.proxy_var_initialized:
232                        #INIT VALUE
233                        self.client.add_variable(self.key,"VariablesManager","CLIENT_PROXY_ENABLED",state,"","Variable to enable or disable proxy in classroom clients",[])
234                        self.proxy_var_initialized=True
235                        return True
236               
237                self.client.set_variable(self.key,"VariablesManager","CLIENT_PROXY_ENABLED",state)
238               
239        #def set_client_proxy
240       
241        def close_window(self,widget):
242                Gtk.main_quit()
243                sys.exit(0)
244        #def close_window
245       
246        def _set_css_info(self):
247       
248                css = b"""
249
250                GtkEntry{
251                        font-family: Roboto;
252                        border:0px;
253                        border-bottom:1px grey solid;
254                        margin-top:0px;
255                        padding-top:0px;
256                }
257                GtkGrid{
258                        background: red;
259                }
260
261                GtkLabel {
262                        font-family: Roboto;
263                }
264
265                #NOTIF_LABEL{
266                        background-color: #3366cc;
267                        font: 11px Roboto;
268                        color:white;
269                        border: dashed 1px silver;
270                        padding:6px;
271                }
272
273                #ERROR_LABEL{
274                        background-color: red;
275                        font: 11px Roboto;
276                        color:white;
277                        border: dashed 1px silver;
278                        padding:6px;
279                }
280
281                #ENTRY_LABEL{
282                        color:grey;
283                        padding:6px;
284                        padding-bottom:0px;
285                }
286
287                #PLAIN_BTN,#PLAIN_BTN:active{
288                        border:0px;
289                        padding:0px;
290                        background:white;
291                }
292               
293                #PLAIN_BTN_DISABLED,#PLAIN_BTN_DISABLED:active{
294                        border:0px;
295                        padding:0px;
296                        background:white;
297                        font:grey;
298                }
299
300                #COMPONENT{
301                        padding:3px;
302                        border: dashed 1px silver;
303
304                }
305
306                #WHITE_BACKGROUND {
307                        background-color:rgba(255,255,255,1);
308               
309                }
310
311                #BLUE_FONT {
312                        color: #3366cc;
313                        font: Roboto Bold 11;
314                       
315                }       
316               
317
318                #TASKGRID_FONT {
319                        color: #3366cc;
320                        font: Roboto 11;
321                       
322                }
323
324                #LABEL #LABEL_INSTALL{
325                        padding: 6px;
326                        margin:6px;
327                        font: 12px Roboto;
328                }
329
330                #LABEL_OPTION{
331               
332                        font: 48px Roboto;
333                        padding: 6px;
334                        margin:6px;
335                        font-weight:bold;
336                }
337
338                #ERROR_FONT {
339                        color: #CC0000;
340                        font: Roboto Bold 11;
341                }
342
343                #MENUITEM {
344                        padding: 12px;
345                        margin:6px;
346                        font: 24px Roboto;
347                        background:white;
348                }
349
350                #BLUEBUTTON {
351                        background-color: #3366cc;
352                        color:white;
353                        font: 11px Roboto Bold;
354                }
355
356                """
357                self.style_provider=Gtk.CssProvider()
358                self.style_provider.load_from_data(css)
359                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
360        #def set_css_info       
361       
362#class NatManager
363
364def usage():
365        print("USAGE:")
366        print("\tnat-manager [ -ip TEMPLATE_FILE -u USER -p PASSWORD ]")
367
368if __name__=="__main__":
369       
370        nm=NatManager()
371       
Note: See TracBrowser for help on using the repository browser.