source: open-sysclone/trunk/fuentes/open-sysclone-server.install/usr/share/n4d/python-plugins/OpenSysClone.py @ 2505

Last change on this file since 2505 was 2505, checked in by daduve, 3 years ago

Start NFS service if it's down

File size: 11.3 KB
Line 
1
2import sys
3import tempfile
4import threading
5import os
6import glob
7from jinja2 import Environment
8from jinja2.loaders import FileSystemLoader
9
10
11class OpenSysClone:
12
13        # Templates variables
14        TEMPLATES_PATH="/usr/share/n4d/templates/OpenSysClone/"
15        SAVE_IMAGE_TPL="SaveImage.tpl"
16        PXE_DESTINATION="/var/www/ipxeboot/pxemenu.d/70-OpenSysClone.php"
17        PATH_FILE="/net/OpenSysClone/"
18        USER_PATH_FILE="imagenes"
19        NAME_FILE="autoname"
20        HDD_DISK="sda1"
21        FINAL_ACTION="poweroff"
22        MIN_CLIENTS = "8"
23        MAX_WAIT = "100"
24        UDP_PATH="/net/OpenSysClone/prueba"
25        INTERFACE="eth0"
26        HOST_OPERATION="hostnamesaver.sh"
27        EXPORT_NFS_PATH="/etc/exports.d/"
28        EXPORT_NFS_NAME="opensysclone_nfs.exports"
29       
30
31        def __init__(self):
32                pass
33        #def init
34       
35        def startup(self,options):
36                if objects["VariablesManager"].get_variable('OPENSYSCLONE_SQUASHFS_PROTOCOL') is None:
37                        objects["VariablesManager"].init_variable('OPENSYSCLONE_SQUASHFS_PROTOCOL')
38
39        #def startup
40
41        def write_menu_pxe(self, aux_save_image_tpl=SAVE_IMAGE_TPL, aux_user_path_file = USER_PATH_FILE, aux_name_file = NAME_FILE , aux_hdd_disk = HDD_DISK ,aux_final_action=FINAL_ACTION, aux_host_operation=HOST_OPERATION):
42                       
43                try:   
44                        # save_path, name_file, hdd_disk, final_action
45                        environment_variables = {}
46                        aux_path_file=self.PATH_FILE+aux_user_path_file
47                       
48                        # Get the values from free server
49                        if  objects.has_key("VariablesManager"):
50                                environment_variables=objects["VariablesManager"].get_variable_list(["SRV_IP","OPENSYSCLONE_SQUASHFS_PROTOCOL"])
51                               
52                                #Prepare PATH to TFTP or HTTP protocol
53                                protocolo=objects["VariablesManager"].get_variable("OPENSYSCLONE_SQUASHFS_PROTOCOL")
54                               
55                                if protocolo=="http":
56                                        path_squashfs="ipxeboot/opensysclone-system"
57                                else:
58                                        path_squashfs="opensysclone-system"
59                       
60                       
61                        environment_variables["PATH_SQUASHFS"]=path_squashfs
62                        environment_variables["PATH_FILE"]=aux_path_file
63                        environment_variables["NAME_FILE"]=aux_name_file
64                        environment_variables["HDD_DISK"]=aux_hdd_disk
65                        environment_variables["FINAL_ACTION"]=aux_final_action
66                        environment_variables["HOST_OPERATION"]=aux_host_operation
67                       
68                       
69                        path_to_work=tempfile.mkdtemp()
70                        filename=path_to_work+"OpenSysClone.pxe"
71                       
72                        # Create temporal environment for jinja
73                        env = Environment(loader=FileSystemLoader(OpenSysClone.TEMPLATES_PATH))
74                        tmpl = env.get_template(aux_save_image_tpl)
75                       
76                        # Render the template with diferent values             
77                        textrendered=tmpl.render(environment_variables)
78                       
79                        #Create a temporal for nsswitch
80                        tmp,filename=tempfile.mkstemp()
81                        f = open(filename,'w')
82                        f.writelines(textrendered)
83                        f.close()
84                       
85                        # Using the ultimate chmod
86                        self.uchmod(filename,0644)
87                       
88                        # Copy unitaria
89                        shutil.copy(filename,OpenSysClone.PXE_DESTINATION)
90                        COMMENT_END = "PXE menu is prepared with protocol %s for SQUASHFS, your requirements have writed in this file %s" %(protocolo,OpenSysClone.PXE_DESTINATION)
91                        return [True,str(COMMENT_END),[protocolo,OpenSysClone.PXE_DESTINATION]]
92               
93                except Exception as e:
94
95                        return [False,str(e)]   
96       
97       
98        #def write_menu_pxe
99       
100       
101       
102        def del_menu_pxe(self, AUX_PXE_DESTINATION=PXE_DESTINATION):
103               
104                try:   
105                        # Remove obsolete file for PXE menu
106                        if os.path.isfile(AUX_PXE_DESTINATION):
107                                os.remove (AUX_PXE_DESTINATION)
108                                COMMENT_END = "Remove obsolete file %s for PXE menu" %(AUX_PXE_DESTINATION)
109                       
110                                return [True, str(COMMENT_END),[AUX_PXE_DESTINATION]]
111                        else:
112                                COMMENT_END = "PXE file was delete before"
113                                return [True, str(COMMENT_END)]
114                       
115                except Exception as e:
116
117                                return [False,str(e)]
118        #def del_menu_pxe
119       
120       
121       
122        def nfs_export_start (self, AUX_USER_PATH_FILE=USER_PATH_FILE):
123               
124                try:
125                        AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
126                        # Get the values from free server
127                        if  objects.has_key("VariablesManager"):
128                                INTERNAL_NETWORK_VARIABLES=objects["VariablesManager"].get_variable_list(["INTERNAL_NETWORK","INTERNAL_MASK"])
129                               
130                        #Export file to write or read OpenSysClone in the server to network range
131                        #With new file arguments
132                        if os.path.dirname(AUX_PATH_FILE):
133                                result = os.system('mkdir -p %s'%self.EXPORT_NFS_PATH)
134                                try:
135                                        fich = open(self.EXPORT_NFS_PATH+"/"+self.EXPORT_NFS_NAME,"w")
136                                        fich.write(str(AUX_PATH_FILE)+"\t"+str(INTERNAL_NETWORK_VARIABLES["INTERNAL_NETWORK"])+"/"+str(INTERNAL_NETWORK_VARIABLES["INTERNAL_MASK"])+"(rw,insecure,no_root_squash,async,no_subtree_check)\n")
137                                        fich.close()
138                                except Exception as e:
139                                        return [False,'Export failed: '+str(e)]
140                                #cmd='exportfs -o rw,insecure,no_root_squash,async,no_subtree_check  %s/%s:%s'%(INTERNAL_NETWORK_VARIABLES["INTERNAL_NETWORK"],INTERNAL_NETWORK_VARIABLES["INTERNAL_MASK"],AUX_PATH_FILE)
141                                #cmd='service nfs-kernel-server restart'
142                                #Comprueba que el servicoo de NFS esta arrancado por defecto
143                                test=os.system("pidof nfsd")
144                                if test!=0 :
145                                        cmd2='service nfs-kernel-server restart'
146                                        os.system(cmd2)
147                                cmd='exportfs -ra'
148                                #print cmd
149                                os.system(cmd)
150                                COMMENT_END = "NFS is sharing %s to my internal network %s/%s" %(AUX_PATH_FILE,INTERNAL_NETWORK_VARIABLES["INTERNAL_NETWORK"],INTERNAL_NETWORK_VARIABLES["INTERNAL_MASK"])
151                                return [True, str(COMMENT_END)]
152                        else:
153                                return [False,str(e)]
154                               
155                except Exception as e:
156
157                        return [False,str(e)]
158        #def nfs_export
159       
160       
161       
162        def nfs_export_stop (self,AUX_USER_PATH_FILE=USER_PATH_FILE):
163       
164                        #Restart nfs service to restart default parameters and stop extra parameters
165               
166                #try:   
167                #       os.system('service nfs-kernel-server restart')
168                #       COMMENT_END = "The NFS system is restarted with defaults parameters and suprimed OpeSysClone shared parameters"
169                #       return [True, str(COMMENT_END)]
170                       
171                #except Exception as e:
172
173                #       return [False,str(e)]   
174                try:
175                        AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
176                       
177                        # Get the values from free server
178                        if  objects.has_key("VariablesManager"):
179                                INTERNAL_NETWORK_VARIABLES=objects["VariablesManager"].get_variable_list(["INTERNAL_NETWORK","INTERNAL_MASK"])
180                               
181                       
182                        #Cancel the export file to write or read OpenSysClone in the server to network range
183                        #Deleting file with arguments and restarting the service
184                       
185                        if os.path.dirname(AUX_PATH_FILE):
186                                result = os.system("rm -f %s"%self.EXPORT_NFS_PATH+"/"+self.EXPORT_NFS_NAME)
187                                os.system('service nfs-kernel-server restart')
188                                #os.system('exportfs -u  %s/%s:%s'%(INTERNAL_NETWORK_VARIABLES["INTERNAL_NETWORK"],INTERNAL_NETWORK_VARIABLES["INTERNAL_MASK"],AUX_PATH_FILE))
189                                COMMENT_END = "NFS is NOT SHARING %s to my internal network %s/%s" %(AUX_PATH_FILE,INTERNAL_NETWORK_VARIABLES["INTERNAL_NETWORK"],INTERNAL_NETWORK_VARIABLES["INTERNAL_MASK"])
190                                return [True, str(COMMENT_END)]
191                        else:
192                                return [False,str(e)]
193                               
194                except Exception as e:
195
196                        return [False,str(e)]
197               
198               
199        #def nfs_export_stop
200       
201       
202        def uchmod(self,file,mode):
203               
204                try:
205                #Method to change file attributes
206               
207                        prevmask = os.umask(0)
208                        os.chmod(file,mode)
209                        os.umask(prevmask)
210                       
211                except Exception as e:
212
213                        return [False,str(e)]   
214        #def uchmod
215       
216       
217        def aux_send_multicast_file (self, AUX_USER_PATH_FILE=USER_PATH_FILE, AUX_NAME_FILE=NAME_FILE, AUX_MIN_CLIENTS=MIN_CLIENTS, AUX_MAX_WAIT=MAX_WAIT,AUX_INTERFACE=INTERFACE,AUX_UDP_PATH=UDP_PATH):
218       
219                        try:
220                                #Method to restart nfs service to restart default parameters and stop extra parameters
221                                AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
222                                os.system('killall udp-sender')
223                                #Inicializo el puerto de UDP que debe ser 2232 para la primera particion y +2 para cada una de las siguientes
224                                AUX_UDP_PORT=2232
225                                INSTRUCTION = ''
226                               
227                                #Obtengo las particiones a clonar y las meto en una lista
228                                tmp=set()
229                               
230                                for item in glob.glob(AUX_UDP_PATH+"/*.gz.*"):
231                                        #Para obtener las particiones he de eliminar primero la primera parte del path puesto que puede llevar puntos y luego no haria bien el split
232                                        item=item.replace(AUX_UDP_PATH+"/","")
233                                        #Corto por el primer punto y me quedo con la primera parte
234                                        item=item.split(".")[0]
235                                        #Elimino las cadenas iguales
236                                        tmp.add(item)
237                               
238                                AUX_PARTITIONS_LIST=sorted(tmp)
239                               
240                                print AUX_PARTITIONS_LIST
241                               
242                                #Recorro la lista de particiones y creo la instruccion
243                               
244                                for PARTITION in AUX_PARTITIONS_LIST :
245                                        INSTRUCTION += 'cat %s/%s*.gz.* | udp-sender --full-duplex --retries-until-drop 100 --min-clients %s --max-wait %s --interface %s --nokbd --mcast-all-addr 224.0.0.1 --portbase %s --ttl 1;'%((AUX_UDP_PATH),(PARTITION),(AUX_MIN_CLIENTS),(AUX_MAX_WAIT),(AUX_INTERFACE),(AUX_UDP_PORT))
246                                        AUX_UDP_PORT=AUX_UDP_PORT+2
247                               
248                                os.system ('%s'%INSTRUCTION)
249                                COMMENT_END = "Instruction in server for MULTICAST is: %s" %(INSTRUCTION)
250                       
251                                #print COMMENT_END
252                       
253                                return [True, str(COMMENT_END)]
254                       
255                        except Exception as e:
256
257                                return [False,str(e)]
258                       
259                        #os.system('cat %(AUX_UDP_PATH)s/*.gz.* | udp-sender --full-duplex --min-clients %(AUX_MIN_CLIENTS)s --max-wait %(AUX_MAX_WAIT)s --interface %(AUX_INTERFACE)s --nokbd --mcast-all-addr 224.0.0.1 --portbase %(AUX_UDP_PORT)s --ttl 1' % locals ())
260                       
261        #def aux_send_multicast_file
262       
263       
264        def send_multicast_file (self, AUX_USER_PATH_FILE=USER_PATH_FILE, AUX_NAME_FILE=NAME_FILE, AUX_MIN_CLIENTS=MIN_CLIENTS, AUX_MAX_WAIT=MAX_WAIT):
265               
266                        #Method to execute multiprocess
267                       
268                        try:
269                                AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
270                                # Get the values from free server
271                                if  objects.has_key("VariablesManager"):
272                                        INTERFACE=objects["VariablesManager"].get_variable("INTERNAL_INTERFACE")
273                               
274                       
275                                #Get the UDP path to export in multicast mode
276                                UDP_PATH=AUX_PATH_FILE+"/"+AUX_NAME_FILE
277                               
278                                if os.path.exists(UDP_PATH):
279                               
280                                        COMMENT_END = "UDP is in multicast mode for my internal network interface %s" %(INTERFACE)
281                                       
282                                       
283                                        #Instructions to execute multiprocess
284                                        t = threading.Thread(target=self.aux_send_multicast_file,args=(AUX_PATH_FILE,AUX_NAME_FILE,AUX_MIN_CLIENTS,AUX_MAX_WAIT,INTERFACE,UDP_PATH))
285                                        t.daemon=True
286                                        t.start()
287                                        return [True, str(COMMENT_END)]
288                                else:
289                                        COMMENT_END = "Your image don't exists in this directory"
290                                        return [False,str(COMMENT_END)]
291                                       
292                        except Exception as e:
293
294                                return [False,str(e)]
295                       
296        #def send_multicast_file
297       
298       
299        def list_img (self, AUX_USER_PATH_FILE=USER_PATH_FILE):
300               
301                #Method to list our ISOS in Server
302               
303                try:
304                        AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
305                        LIST_DIR=os.listdir(AUX_PATH_FILE)
306               
307                        return [True,LIST_DIR]
308
309                except Exception as e:
310
311                                return [False,str(e)]
312                               
313        def check_path (self, AUX_USER_PATH_FILE=USER_PATH_FILE):
314               
315                #Method to make our dir to save images
316               
317                try:
318                        AUX_PATH_FILE=self.PATH_FILE+AUX_USER_PATH_FILE
319                       
320                        if os.path.exists(AUX_PATH_FILE):
321                                COMMENT_END = "Path file exists, do nothing"
322                                return [True, str(COMMENT_END)]
323                        else:
324                                os.makedirs(AUX_PATH_FILE,0777)
325                                os.chmod(AUX_PATH_FILE,0777)
326                                COMMENT_END = "Path file is created now %s" %(AUX_PATH_FILE)
327                                return [True, str(COMMENT_END)]                 
328
329                except Exception as e:
330
331                                return [False,str(e)]
332                               
333                               
334        def del_image (self, DIR_FILE_DELETE):
335               
336                #Method to delete our save images
337               
338                try:
339                        AUX1_PATH_FILE=self.PATH_FILE+self.USER_PATH_FILE
340                        AUX_PATH_FILE=AUX1_PATH_FILE+"/"+DIR_FILE_DELETE
341                       
342                        if os.path.exists(AUX_PATH_FILE):
343                                os.system('rm -R  %s'%(AUX_PATH_FILE))
344                                COMMENT_END = "Path file is deleted %s" %(AUX_PATH_FILE)
345                                return [True, str(COMMENT_END)]
346                        else:
347                                COMMENT_END = "Path file isn't exists %s" %(AUX_PATH_FILE)
348                                return [True, str(COMMENT_END)]                 
349
350                except Exception as e:
351
352                                return [False,str(e)]
353                               
354        #def list_img
355       
356       
357       
358
359
360         
Note: See TracBrowser for help on using the repository browser.