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

Last change on this file since 131 was 131, checked in by hectorgh, 5 years ago

adding project files

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