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

Last change on this file since 820 was 820, checked in by hectorgh, 4 years ago

fixing zero-server-wizard

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