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

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

fixing translation

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