source: llx-network-config/trunk/fuentes/install-files/usr/share/llx-network-config/llx-network-config.py @ 1151

Last change on this file since 1151 was 1151, checked in by mabarracus, 3 years ago

fix squid3->squid

  • Property svn:executable set to *
File size: 11.3 KB
Line 
1#!/usr/bin/env python
2
3import os
4import os.path
5import multiprocessing
6import time
7import random
8import xmlrpclib
9import cairo
10import grp
11import sys
12import lliurex.net
13import traceback
14import gi
15gi.require_version('Gtk','3.0')
16gi.require_version('PangoCairo','1.0')
17
18from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
19
20import signal
21signal.signal(signal.SIGINT, signal.SIG_DFL)
22
23import gettext
24#gettext.textdomain('zero-center')
25_ = gettext.gettext
26
27class NetworkConfig:
28       
29        def __init__(self):
30               
31                self.client=xmlrpclib.ServerProxy("https://localhost:9779")
32                self.process=multiprocessing.Process()
33                try:
34                        if self.client.get_variable("","VariablesManager","INTERFACE_REPLICATION")!=None:
35                                self.open_dialog(_("Network Configuration"),_("Network reconfiguration is only allowed on independent servers"),"dialog-information")
36                        else:
37                                self.start_gui()
38                except:
39                        pass
40               
41               
42        #def init
43       
44        def start_gui(self):
45               
46                builder=Gtk.Builder()
47                builder.set_translation_domain("llx-network-config")
48                if os.path.exists("./rsrc/network-config.glade"):
49                        builder.add_from_file("./rsrc/network-config.glade")
50                else:
51                        builder.add_from_file("/usr/share/llx-network-config/rsrc/network-config.glade")
52                self.window=builder.get_object("window1")
53               
54               
55               
56                self.window.connect("destroy",self.window_close)
57                self.window.show()
58               
59                self.internal_speed_label=builder.get_object("internal_iface_speed_label")
60                self.external_speed_label=builder.get_object("external_iface_speed_label")
61
62                self.internal_combobox=builder.get_object("internal_combobox")
63                self.internal_combobox.set_name("Button")
64                self.external_combobox=builder.get_object("external_combobox")
65               
66                self.internal_ip_entry=builder.get_object("srvip_entry")
67                self.internal_mask_entry=builder.get_object("internal_mask_entry")
68               
69                self.external_ip_entry=builder.get_object("external_ip_entry")
70                self.external_mask_entry=builder.get_object("external_mask_entry")
71                self.external_gateway_entry=builder.get_object("external_gateway_entry")
72               
73               
74                self.dns1_entry=builder.get_object("dns1_entry")
75                self.dns2_entry=builder.get_object("dns2_entry")
76                self.dhcp_radiobutton=builder.get_object("dhcp_radiobutton")
77                self.dhcp_radiobutton.connect("toggled",self.radio_button_changed)
78                self.manual_radiobutton=builder.get_object("manual_radiobutton")
79                self.manual_expander=builder.get_object("manual_expander")
80                self.manual_expander.set_sensitive(False)
81               
82                self.apply_button=builder.get_object("apply_button")
83                self.apply_button.connect("clicked",self.apply_clicked)
84                self.apply_button.set_name("Button")
85               
86                self.progress_window=builder.get_object("window2")
87                self.progress_bar=builder.get_object("progressbar")
88               
89                ret=self.set_default_gui_values()
90                if ret[0]:
91                        Gtk.main()
92                else:
93                        self.open_dialog(_("Network Configuration"),_("Error getting values.")+"\n[<b>"+str(ret[1])+"</b>]")
94               
95        #def start_gui
96       
97        def set_default_gui_values(self):
98
99
100                try:
101                        var=self.client.get_variables("","VariablesManager")
102                        internal=var["INTERNAL_INTERFACE"]["value"]
103                        external=var["EXTERNAL_INTERFACE"]["value"]
104                        dns1=var["DNS_EXTERNAL"]["value"][0]
105                        dns2=var["DNS_EXTERNAL"]["value"][1]
106                       
107               
108                        self.iiface_model=Gtk.ListStore(str)
109                        self.eiface_model=Gtk.ListStore(str)
110                       
111                        self.internal_combobox.set_model(self.iiface_model)
112                        self.external_combobox.set_model(self.eiface_model)
113                        rendi=Gtk.CellRendererText()
114                        self.internal_combobox.pack_start(rendi,True)
115                        self.internal_combobox.add_attribute(rendi,"text",0)
116                        self.internal_combobox.connect("changed",self.get_link_speed,0)
117                        rende=Gtk.CellRendererText()
118                        self.external_combobox.pack_start(rende,True)
119                        self.external_combobox.add_attribute(rende,"text",0)
120                        self.external_combobox.connect("changed",self.get_link_speed,1)
121                        self.interfaces=lliurex.net.get_devices_info()         
122                       
123                        count=0
124                        i_id=0
125                        e_id=0
126                        for item in self.interfaces:
127                                if "eth" in item["name"]:
128                                        self.iiface_model.append([item["name"]])
129                                        if item["name"]==internal:
130                                                i_id=count
131                                        self.eiface_model.append([item["name"]])
132                                        if item["name"]==external:
133                                                e_id=count
134                                count+=1
135                               
136                               
137                                       
138                        self.internal_combobox.set_active(i_id)
139                        if len(self.iiface_model)>1:
140                                self.external_combobox.set_active(e_id)
141                        else:
142                                self.external_combobox.set_active(0)
143                               
144
145                        if self.is_static(external):
146                                self.manual_radiobutton.set_active(True)
147                               
148
149
150                        ip=lliurex.net.get_ip(internal)
151                        mask=lliurex.net.get_netmask(internal)
152                       
153                        self.internal_ip_entry.set_text(ip)
154                        self.internal_mask_entry.set_text(mask)
155
156                               
157                               
158                        ip=lliurex.net.get_ip(external)
159                        self.external_mask_entry.set_text(lliurex.net.get_netmask(external))
160                        self.external_gateway_entry.set_text(lliurex.net.get_default_gateway()[1])
161                        ip=ip.split(".")
162                        self.external_ip_entry.set_text(".".join(ip))
163                       
164                        self.dns1_entry.set_text(dns1)
165                        self.dns2_entry.set_text(dns2)
166                       
167                       
168
169                               
170                        return [True,""]
171                               
172                except Exception as e:
173
174                        top = traceback.extract_stack()[-1]
175                        f=top[0]
176                        line=str(top[1])
177                        txt="%s at line %s : %s"%(f,line,str(e))
178                       
179                        return [False,txt]
180                       
181               
182               
183        #def set_default_gui_values
184       
185        def get_link_speed(self,widget,id):
186               
187                tree_iter = widget.get_active_iter()
188                if tree_iter != None:
189                        model = widget.get_model()
190                        try:
191                                speed=lliurex.net.get_device_info(model[tree_iter][0])["Speed"][0]
192                        except:
193                                speed="Unknown speed"
194                        if id==0:
195                                self.internal_speed_label.set_text(speed)
196                        else:
197                                self.external_speed_label.set_text(speed)
198                               
199               
200        #def get_link_speed
201       
202        def is_static(self,eth):
203               
204                ret=False
205               
206                try:
207               
208                        f=open("/etc/network/interfaces")
209                        lines=f.readlines()
210                        f.close()
211                       
212                        for line in lines:
213                                if eth in line:
214                                        if "static" in line:
215                                                ret=True
216                       
217                except:
218                       
219                        pass
220                       
221                return ret
222               
223        #def is_static
224
225       
226        def get_gui_values(self):
227               
228                var={}
229                try:
230                        tmp=self.client.get_variables("","VariablesManager")
231                        var["srv_domain_name"]=tmp["INTERNAL_DOMAIN"]["value"]
232                        var["srv_name"]=tmp["HOSTNAME"]["value"]
233                       
234                        var["masterkey"]=self.get_n4d_key()
235                        var["remote_ip"]="localhost"
236                       
237                        iter=self.internal_combobox.get_active_iter()
238                        if iter!=None:
239                                var["internal_iface"]=self.iiface_model.get(iter,0)[0]
240                        else:
241                                var["internal_iface"]=None
242                        iter=self.external_combobox.get_active_iter()
243                        if iter!=None:
244                                var["external_iface"]=self.eiface_model.get(iter,0)[0]
245                        else:
246                                var["external_iface"]=None
247
248                        var["srv_ip"]=self.internal_ip_entry.get_text()
249                        var["internal_mask"]=self.internal_mask_entry.get_text()
250                        var["external_ip"]=self.external_ip_entry.get_text()
251                        var["external_mask"]=self.external_mask_entry.get_text()
252                        var["external_gateway"]=self.external_gateway_entry.get_text()
253                        var["dns1"]=self.dns1_entry.get_text()
254                        var["dns2"]=self.dns2_entry.get_text()
255                                       
256                       
257                        if self.dhcp_radiobutton.get_active():
258                                var["external_mode"]="dhcp"
259                        else:
260                                var["external_mode"]="manual"
261               
262                        return var
263               
264                except Exception as e:
265                        top = traceback.extract_stack()[-1]
266                        f=top[0]
267                        line=str(top[1])
268                        txt="%s at line %s : %s"%(f,line,str(e))
269                        return txt
270               
271        #def get_gui_values
272       
273        def test_values(self,var):
274               
275                if var["masterkey"]==None:
276                        return [False,_("You don't have root privileges to run this program")]
277               
278                if var["internal_iface"]==var["external_iface"]:
279                        return [False,_("Internal and external interfaces must be different")]
280                       
281                lst=[]
282                lst.append((_("Internal IP"),var["srv_ip"]))
283                lst.append((_("Internal mask"),var["internal_mask"]))
284                lst.append((_("External IP"),var["external_ip"]))
285                lst.append((_("External mask"),var["external_mask"]))
286                lst.append((_("Gateway"),var["external_gateway"]))
287                lst.append((_("DNS #1"),var["dns1"]))
288                lst.append((_("DNS #2"),var["dns1"]))
289                       
290                for val in ( lst ):
291                        txt,item=val
292                        if not lliurex.net.is_valid_ip(item):
293                                return [False,_("'<b>%s</b>' must be a valid ip"%txt)]
294                               
295                return [True,None]
296               
297        #def test_values
298
299       
300        def get_n4d_key(self):
301               
302                try:
303                        f=open("/etc/n4d/key","r")
304                        key=f.readline().strip("\n")
305                        f.close()
306                        return key
307                except:
308                        None
309                       
310        #def get_n4d_key
311
312
313        def execute(self):
314
315                msg="* Executing 015-network ... "
316                sys.stdout.write(msg)
317                execfile("/usr/share/zero-server-wizard/types/independent/actions/015-network.py",locals())
318                print("OK")
319                msg="* Executing slapd open ports configuration ... "
320                sys.stdout.write(msg)
321                self.client.open_ports_slapd(self.template["masterkey"],"SlapdManager",self.template["srv_ip"])
322                print("OK")
323                msg="* Executing 050-dnsmasq ... "
324                sys.stdout.write(msg)
325                execfile("/usr/share/zero-server-wizard/types/independent/actions/050-dnsmasq.py",locals())
326                print("OK")
327                msg="* Executing 060-proxy ... "
328                sys.stdout.write(msg)
329                execfile("/usr/share/zero-server-wizard/types/independent/actions/060-proxy.py",locals())
330                print("OK")
331                msg="* Restarting services ... "
332                sys.stdout.write(msg)
333                #os.system("/usr/sbin/upstart-manager disable network-manager")
334                #os.system("stop network-manager")
335                os.system("systemctl stop NetworkManager.service")
336                os.system("systemctl mask NetworkManager.service")                     
337                #os.system("/etc/init.d/networking restart")
338                os.system("systemctl restart networking.service")               
339                #os.system("/etc/init.d/dnsmasq restart")
340                os.system("systemctl restart dnsmasq.service")         
341                #os.system("sudo service squid restart")
342                os.system("systemctl restart squid.service")           
343                #os.system("sudo service n4d restart")
344                os.system("systemctl restart n4d.service")             
345                print("OK")
346                print("")
347                print(" ** RECONFIGURATION FINISHED ** ")
348
349        #def execute
350
351
352        def apply_clicked(self,widget):
353               
354                var=self.get_gui_values()
355                if type(var)!=type(dict()):
356                        self.open_dialog(_("Network Configuration"),_("Error getting values.")+"\n[<b>"+str(var)+"</b>]")
357                ret=self.test_values(var)
358               
359                if ret[0]:
360                       
361                        self.template=var
362                        self.process=multiprocessing.Process(target=self.execute)
363                        #t.daemon=True
364                        self.process.start()
365                        GLib.timeout_add(100,self.show_progress)
366                       
367                else:
368
369                        self.open_dialog(_("Network Configuration"),ret[1])
370               
371               
372        #def apply_clicked
373       
374        def show_progress(self):
375               
376               
377                self.progress_window.show()
378                self.progress_bar.pulse()
379               
380                if not self.process.is_alive():
381                       
382                        self.progress_window.hide()
383                        self.open_dialog(_("Network Configuration"),_("Configuration finished."),"dialog-information")
384                       
385                return self.process.is_alive()
386               
387        #def show_progress
388
389        def radio_button_changed(self,widget,force=False):
390               
391                if force:
392                        status=force
393                       
394                else:
395                        status=not self.dhcp_radiobutton.get_active()   
396               
397               
398                self.manual_expander.set_sensitive(status)
399                self.manual_expander.set_expanded(status)
400               
401        #def radio_button_changed
402       
403        def window_close(self,widget):
404               
405                Gtk.main_quit()
406               
407        #def window_close
408       
409        def open_dialog(self,title,text,icon="emblem-important",show_cancel=False):
410
411                label = Gtk.Label()
412                label.set_markup(text)
413                if show_cancel:
414                        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))
415                else:
416                        dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
417                hbox = Gtk.HBox()
418                img=Gtk.Image.new_from_icon_name(icon,Gtk.IconSize.DIALOG)
419                hbox.pack_start(img,True,True,5)
420                hbox.pack_start(label,True,True,10)
421                hbox.show_all()
422                dialog.vbox.pack_start(hbox,True,True,10)
423                dialog.set_border_width(6)
424                response = dialog.run()
425                dialog.destroy()
426                return response
427               
428        #def open_dialog
429       
430
431       
432#class NetworkConfig
433
434
435
436if __name__=="__main__":
437       
438        nc=NetworkConfig()
Note: See TracBrowser for help on using the repository browser.