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

Last change on this file since 159 was 159, checked in by mabarracus, 5 years ago

Fixed warnings

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