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

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

adding ldap users deletion disclaimer

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