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

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

adding gettext domain

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