source: zero-server-wizard/trunk/fuentes/install-files/usr/share/zero-server-wizard/independent.py @ 6048

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

adding ldap users deletion disclaimer

File size: 15.9 KB
Line 
1import os
2import os.path
3import xmlrpclib
4import datetime
5import subprocess
6import sys
7import multiprocessing
8from cStringIO import StringIO
9
10
11import lliurex.net
12try:
13        import gi
14        gi.require_version('Gtk', '3.0')
15        from gi.repository import Gtk,Gdk,GLib
16except:
17        pass
18
19import gettext
20gettext.textdomain('zero-server-wizard')
21_=gettext.gettext
22
23
24DNS1="172.27.111.5"
25DNS2="172.27.111.6"
26
27class Independent:
28       
29       
30        def __init__(self,core,server_conf=None):
31               
32                self.id="INDEPENDENT"
33                self.scripts_path="/usr/share/zero-server-wizard/types/independent/actions/"
34                self.template={}
35                if server_conf!=None:
36                        try:
37                                for item in server_conf["variables"]:
38                                        self.template[item]=None
39                        except:
40                                pass
41                               
42
43               
44                self.core=core
45               
46        #def __init__
47       
48        def start_gui(self,standalone=False):
49               
50                self.standalone=standalone
51               
52                builder=self.core.builder
53
54               
55                self.apply_button=builder.get_object("apply_button")
56                self.internal_speed_label=builder.get_object("internal_iface_speed_label")
57                self.external_speed_label=builder.get_object("external_iface_speed_label")
58                self.password_entry=builder.get_object("password_entry")
59                self.password_entry1=builder.get_object("password_entry1")
60                self.password_entry.connect("changed",self.password_changed)
61                self.password_entry1.connect("changed",self.password_changed)
62                self.srv_name_entry=builder.get_object("srv_name_entry")
63                self.srv_domain_entry=builder.get_object("srv_domain_entry")
64                self.internal_combobox=builder.get_object("internal_combobox")
65                self.internal_combobox.set_name("Button")
66                self.external_combobox=builder.get_object("external_combobox")
67               
68                self.internal_ip_entry=builder.get_object("srvip_entry")
69                self.internal_mask_entry=builder.get_object("internal_mask_entry")
70                self.external_ip_entry=builder.get_object("external_ip_entry")
71                self.external_mask_entry=builder.get_object("external_mask_entry")
72                self.external_gateway_entry=builder.get_object("external_gateway_entry")
73                self.dns1_entry=builder.get_object("dns1_entry")
74                self.dns2_entry=builder.get_object("dns2_entry")
75                self.pass_label=builder.get_object("pass_label")
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                self.apply_button.connect("clicked",self.apply_clicked)
82                self.apply_button.set_sensitive(False)
83                self.apply_button.set_name("Button")
84               
85               
86                self.set_default_gui_values()
87               
88
89                if standalone:
90                       
91                        Gtk.main()
92
93               
94        #def start_gui
95       
96        def radio_button_changed(self,widget):
97
98                self.manual_expander.set_sensitive(not self.dhcp_radiobutton.get_active())
99                self.manual_expander.set_expanded(not self.dhcp_radiobutton.get_active())
100               
101        #def radio_button_changed
102       
103        def password_changed(self,widget):
104               
105                if self.password_entry.get_text()!=self.password_entry1.get_text():
106                        self.pass_label.set_markup("<span fgcolor='red'>" + _("Passwords do not match") +"</span>")
107                        self.apply_button.set_sensitive(False)
108                else:
109                        self.pass_label.set_markup("")
110                        self.apply_button.set_sensitive(True)
111                       
112
113               
114        #def
115       
116        def set_default_gui_values(self):
117               
118                self.iiface_model=Gtk.ListStore(str)
119                self.eiface_model=Gtk.ListStore(str)
120               
121                self.internal_combobox.set_model(self.iiface_model)
122                self.external_combobox.set_model(self.eiface_model)
123                rendi=Gtk.CellRendererText()
124                self.internal_combobox.pack_start(rendi,True)
125                self.internal_combobox.add_attribute(rendi,"text",0)
126                self.internal_combobox.connect("changed",self.get_link_speed,0)
127                rende=Gtk.CellRendererText()
128                self.external_combobox.pack_start(rende,True)
129                self.external_combobox.add_attribute(rende,"text",0)
130                self.external_combobox.connect("changed",self.get_link_speed,1)
131                self.interfaces=lliurex.net.get_devices_info()         
132               
133               
134                for item in self.interfaces:
135                        if "eth" in item["name"]:
136                                self.iiface_model.append([item["name"]])
137                                self.eiface_model.append([item["name"]])
138                               
139                       
140                self.internal_combobox.set_active(0)
141                if len(self.iiface_model)>1:
142                        self.external_combobox.set_active(1)
143                else:
144                        self.external_combobox.set_active(0)
145                       
146               
147                self.srv_domain_entry.set_text(self.template.setdefault("srv_domain_name","aula1"))
148                self.internal_ip_entry.set_text(self.template.setdefault("srv_ip","10.2.1.254"))
149                self.internal_mask_entry.set_text(self.template.setdefault("internal_mask","255.255.255.0"))
150                self.dns1_entry.set_text(DNS1)
151                self.dns2_entry.set_text(DNS2)
152               
153                try:
154                       
155                        f=open("/etc/hostname")
156                        line=f.readline().strip("\n")
157                        f.close()
158                        self.srv_name_entry.set_text(self.template.setdefault("srv_name",line))
159                except:
160                        pass
161                       
162               
163               
164        #def set_default_gui_values
165       
166        def apply_clicked(self,widget):
167               
168
169                self.get_gui_values()
170               
171               
172        #def apply_clicked
173       
174        def get_gui_values(self):
175               
176                iter=self.internal_combobox.get_active_iter()
177                if iter!=None:
178                        self.template["internal_iface"]=self.iiface_model.get(iter,0)[0]
179                else:
180                        self.template["internal_iface"]=None
181                iter=self.external_combobox.get_active_iter()
182                if iter!=None:
183                        self.template["external_iface"]=self.eiface_model.get(iter,0)[0]
184                else:
185                        self.template["external_iface"]=None
186               
187                self.template["adminpassword"]=self.password_entry.get_text()
188                self.template["srv_name"]=self.srv_name_entry.get_text()
189                self.template["srv_name"]=''.join(e for e in self.template["srv_name"] if e.isalnum())
190                self.template["srv_domain_name"]=self.srv_domain_entry.get_text()
191                self.template["srv_domain_name"]=''.join(e for e in self.template["srv_domain_name"] if e.isalnum())
192                self.template["srv_ip"]=self.internal_ip_entry.get_text()
193                self.template["internal_mask"]=self.internal_mask_entry.get_text()
194                if self.dhcp_radiobutton.get_active():
195                        self.template["external_mode"]="dhcp"
196
197                else:
198                        self.template["external_mode"]="manual"
199
200                self.template["external_ip"]=self.external_ip_entry.get_text()
201                self.template["external_mask"]=self.external_mask_entry.get_text()
202                self.template["external_gateway"]=self.external_gateway_entry.get_text()
203                self.template["dns1"]=self.dns1_entry.get_text()
204                self.template["dns2"]=self.dns2_entry.get_text()
205               
206                self.check_values()
207       
208       
209        def check_values(self):
210               
211
212                        error_msg=""
213                        '''
214                        if self.template["internal_iface"]==self.template["external_iface"]:
215                                error_msg+="* External and internal interfaces must be different.\n"
216                        '''
217                        if not lliurex.net.is_valid_ip(self.template["srv_ip"]):
218                                error_msg+="* " + _("Internal IP must be a valid IP.")+"\n"
219
220                        if not lliurex.net.is_valid_ip(self.template["internal_mask"]):
221                                error_msg+="* " + _("Internal mask must be a valid IP.") + "\n"
222                               
223                        if self.template["srv_name"]=="":
224                                error_msg+="* " + _("Server name cannot be an empty string.") + "\n"
225                        if self.template["srv_domain_name"]=="":
226                                error_msg+="* " + _("Server domain name cannot be an empty string.") +"\n"
227                       
228                       
229                        if self.template["external_mode"]=="manual":
230
231                                if self.template["external_ip"]=='' or not lliurex.net.is_valid_ip(self.template["external_ip"]):
232                                        error_msg+="* " + _("External IP must be a valid IP.")+"\n"
233                                if self.template["external_mask"]=="" or not lliurex.net.is_valid_ip(self.template["external_mask"]):
234                                        error_msg+="* " + _("External mask must be a valid IP.")+"\n"
235                                if self.template["external_gateway"]=="" or not lliurex.net.is_valid_ip(self.template["external_gateway"]):
236                                        error_msg+="* " + _("External gateway must be a valid IP.")+"\n"
237                               
238                               
239                        if self.template["dns1"]=="" or not lliurex.net.is_valid_ip(self.template["dns1"]):
240                                error_msg+="* " + _("DNS1 must be a valid IP.")+"\n"
241                        if self.template["dns2"]=="" or not lliurex.net.is_valid_ip(self.template["dns2"]):
242                                error_msg+="* " + _("DNS2 must be a valid IP.")+"\n"
243                               
244                        if error_msg!="":
245                                builder = Gtk.Builder()
246                                if os.path.exists("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/warning.glade"):
247                                        builder.add_from_file("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/warning.glade")
248                                else:
249                                        builder.add_from_file("/usr/share/zero-server-wizard/rsrc/warning.glade")
250                                       
251                                       
252                                window=builder.get_object("window1")
253                                msg_label=builder.get_object("msg_label")
254                                close_button=builder.get_object("close_button")
255                                def hide(widget):
256                                        window.destroy()
257                                close_button.connect("clicked",hide)
258                                msg_label.set_text(error_msg.strip("\n"))
259                                window.show()                           
260                       
261                        else:
262                               
263                                builder=Gtk.Builder()
264                                if os.path.exists("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/progress_window.glade"):
265                                        builder.add_from_file("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/progress_window.glade")
266                                else:
267                                        builder.add_from_file("/usr/share/zero-server-wizard/rsrc/progress_window.glade")                               
268                                       
269                                       
270                                self.error_msg=None
271                                window=builder.get_object("window1")
272                                review_textview=builder.get_object("textbuffer1")
273                                exec_textview=builder.get_object("textbuffer2")
274                                apply_button=builder.get_object("apply_button")
275                                close_button=builder.get_object("close_button")
276                                pbar=builder.get_object("progressbar1")
277                                terminal_box=builder.get_object("scrolledwindow2")
278                                understand_cb=builder.get_object("understand_checkbutton")
279                               
280                                                               
281                                #ret_textview=builder.get_object("ret_textview")
282                                widgets=[close_button,pbar]
283                                self.pulsating=False
284                               
285                               
286                                msg=""
287                               
288                                msg+="[ "+"SERVER NAME"+" ] = " + self.template["srv_name"] + "\n"
289                                msg+="[ "+"SERVER DOMAIN NAME"+" ] = " + self.template["srv_domain_name"] + "\n"
290                                msg+="[ "+"INTERNAL INTERFACE"+" ] = " + self.template["internal_iface"] + "\n"
291                                msg+="[ "+"INTERNAL IP"+" ] = " + self.template["srv_ip"] + "\n"
292                                msg+="[ "+"INTERNAL MASK"+" ] = " + self.template["internal_mask"] + "\n"
293                                msg+="[ "+"EXTERNAL INTERFACE"+" ] = " + self.template["external_iface"] + "\n"
294                                msg+="[ "+"EXTERNAL MODE"+" ] = " + self.template["external_mode"] + "\n"
295                                if self.template["external_mode"]!="dhcp":
296                                        msg+="[ "+"EXTERNAL IP"+" ] = " + self.template["external_ip"] + "\n"
297                                        msg+="[ "+"EXTERNAL MASK"+" ] = " + self.template["external_mask"] + "\n"
298                                        msg+="[ "+"EXTERNAL GATEWAY"+" ] = " + self.template["external_gateway"] + "\n"
299                                msg+="[ "+"DNS"+" ] = " + str(self.template["dns1"]) + ", " + str(self.template["dns2"])+ "\n"
300                                       
301
302                               
303                                review_textview.set_text(msg)
304                                       
305                               
306                               
307                                def pulsating():
308                                        pbar.pulse()
309                                       
310                                        try:
311                                                f=open("/tmp/.zsw-log","r")
312                                                tmp="".join(f.readlines())
313                                                if self.msg_thread!=tmp:
314                                                        self.msg_thread=tmp
315                                                        exec_textview.set_text(tmp)
316                                                       
317                                                f.close()
318                                        except:
319                                                pass
320                                               
321                                       
322                                       
323                                        if not os.path.exists("/tmp/.zsw-on"):
324                                                pbar.set_fraction(1)
325                                                close_button.set_sensitive(True)
326                                               
327                                               
328                                               
329                                                if os.path.exists("/tmp/.zsw-error"):
330                                               
331                                                        f=open("/tmp/.zsw-error","r")
332                                                        self.error_msg=f.readline()
333                                                        f.close()
334                                                        os.remove("/tmp/.zsw-error")
335                                               
336                                                        builder = Gtk.Builder()
337                                                        if os.path.exists("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/warning.glade"):
338                                                                builder.add_from_file("/srv/svn/pandora/zero-server-wizard/trunk/install-files/usr/share/zero-server-wizard/rsrc/warning.glade")
339                                                        else:
340                                                                builder.add_from_file("/usr/share/zero-server-wizard/rsrc/warning.glade")
341                                                               
342                                                               
343                                                        window2=builder.get_object("window1")
344                                                        msg_label=builder.get_object("msg_label")
345                                                        close_button2=builder.get_object("close_button")
346                                                        def hide(widget):
347                                                                window2.destroy()
348                                                        close_button2.connect("clicked",hide)
349                                                        msg_label.set_markup("<b>"+self.error_msg+"</b>")
350                                                        window2.set_title("Error")
351                                                        window2.show() 
352                                                       
353                                                        return False
354                                                       
355                                                else:
356                                                        label = Gtk.Label(_("Initialization complete. A reboot is required."))
357                                                        dialog = Gtk.Dialog("Zero Server Wizard", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
358                                                        img=Gtk.Image.new_from_stock(Gtk.STOCK_APPLY,Gtk.IconSize.DIALOG)
359                                                        hbox=Gtk.HBox()
360                                                        hbox.pack_start(img,True,True,5)
361                                                        hbox.pack_start(label,True,True,5)
362                                                        hbox.show_all()
363                                                        dialog.vbox.pack_start(hbox,True,True,10)
364                                                        label.show()
365                                                        dialog.set_border_width(6)
366                                                        response = dialog.run()
367
368                                                        sys.exit(0)
369                                               
370                                               
371                                               
372                                        return True
373                               
374                                def apply_clicked(widget,cb):
375                                        self.pulsating=True
376                                        f=open("/tmp/.zsw-on","w")
377                                        f.close()
378                                        self.msg_thread=""
379                                        self.prv_msg=None
380                                        widget.set_sensitive(False)
381                                        cb.set_sensitive(False)
382                                        t=multiprocessing.Process(target=self.execute,args=(self.template,True,))
383                                        #t.daemon=True
384                                        t.start()
385                                        close_button.set_sensitive(False)
386                                        GLib.timeout_add(100,pulsating)
387                                       
388                                def destroy(uno,dos):
389                                        try:
390                                                if self.pulsating:
391                                                        return True
392                                                else:
393                                                        window.destroy()
394                                        except:
395                                                pass
396                                               
397
398                                       
399                                #def apply_clicked
400                               
401                               
402                                def close(widget):
403                                        window.destroy()
404
405                               
406                                def understand_changed(widget,button):
407                                       
408                                        button.set_sensitive(widget.get_active())
409                                       
410                                #def understand_changed
411
412
413                                understand_cb.connect("toggled",understand_changed,apply_button)
414                                apply_button.connect("clicked",apply_clicked,understand_cb)
415                                close_button.connect("clicked",close)
416                                window.connect("delete_event",destroy)
417                               
418                                window.show()
419                               
420                                pass
421                                #def init_done
422                               
423
424        #def check_values
425       
426        def get_link_speed(self,widget,id):
427               
428                tree_iter = widget.get_active_iter()
429                if tree_iter != None:
430                        model = widget.get_model()
431                        try:
432                                speed=lliurex.net.get_device_info(model[tree_iter][0])["Speed"][0]
433                        except:
434                                speed="Unknown speed"
435                        if id==0:
436                                self.internal_speed_label.set_text(speed)
437                        else:
438                                self.external_speed_label.set_text(speed)
439                               
440               
441        #def get_link_speed
442       
443        def external_mode_signal(self,widget):
444               
445                self.manual_external_box.set_sensitive(not self.dhcp_radiobutton.get_active())
446               
447        #def ems
448       
449       
450        def close_window(self,widget):
451                if self.standalone:
452                        Gtk.main_quit()
453               
454               
455        #def close_window
456       
457       
458        def execute(self,template,gui=False):
459               
460                print("[INDEPENDENT] Executing independent configuration...")
461                       
462                #self.template=template
463                self.log("Executing Independent configuration...")
464
465                self.core.template=dict(self.core.template.items() + self.template.items())
466                self.template=self.core.template
467               
468                if not self.template.has_key("remote_ip"):
469                        self.template["remote_ip"]="localhost"
470               
471               
472                if os.path.exists("/tmp/.zsw-log"):
473                        os.remove("/tmp/.zsw-log")
474               
475                for f in sorted(os.listdir("/usr/share/zero-server-wizard/types/independent/actions/")):
476                        if os.path.isfile(self.scripts_path+f):
477                               
478                                try:
479                                        if f.endswith(".py"):
480                                                self.log("Excuting " + f + " ...")
481                                                print("[INDEPENDENT] Executing " + f + " ...")
482                                                if not gui:
483                                                        execfile(self.scripts_path+f,locals())
484                                                else:
485                                                       
486                                                        #.set_text(ret_textview.get_buffer().get_text(ret_textview.get_buffer().get_start_iter(),ret_textview.get_buffer().get_end_iter(),True)+ "\npor aqui")
487                                                        #msg+=("[INDEPENDENT] Executing " + f + " ... ")
488                                                        f_=open("/tmp/.zsw-log","a")
489                                                        f_.write("[INDEPENDENT] Executing " + f + " ... ")
490                                                        f_.close()
491                                                        execfile(self.scripts_path+f,locals())
492                                                        f_=open("/tmp/.zsw-log","a")
493                                                        f_.write(" OK\n")
494                                                        f_.close()
495                                                       
496
497
498                                                       
499                                except Exception as e:
500                                        print "[ERROR!] " + str(e)
501
502                                        try:
503                                                f=open("/tmp/.zsw-error","w")
504                                                f.write(e.message)
505                                                f.close()
506                                        except:
507                                                pass
508                                       
509                                        if os.path.exists("/tmp/.zsw-on"):
510                                                os.remove("/tmp/.zsw-on")
511                                        return False
512               
513                if gui:
514                        if os.path.exists("/tmp/.zsw-on"):
515                                os.remove("/tmp/.zsw-on")
516               
517                return True     
518               
519        #def execute
520       
521        def log(self,line):
522               
523                independent_log="/tmp/independent"
524                f=open(independent_log,"a")
525                f.write( "[ "+datetime.datetime.today().strftime("%d/%m/%y %H:%M:%S") + " ] " + line + "\n")
526                f.close()
527               
528               
529        #def log
530       
531       
532       
533       
534#class Independent
Note: See TracBrowser for help on using the repository browser.