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

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

missing imports

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