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

Last change on this file since 647 was 647, checked in by daduve, 4 years ago

Ading file

File size: 4.9 KB
Line 
1#!/usr/bin/env python
2import os
3import sys
4from jinja2 import Environment
5from jinja2.loaders import FileSystemLoader
6import tempfile
7import fnmatch
8       
9class OpenSysCloneExport: 
10       
11        def __init__(self):
12                #self.tftppath = '/var/lib/tftpboot/ltsp/OpenSysClone'
13                #tftppath exclusive for OpenSysClone
14                self.tftppath = '/net/OpenSysClone/opensysclone-system/OpenSysClone'           
15                self.export_options = 'ro,insecure,no_root_squash,async,no_subtree_check'
16                self.templates_path="/usr/share/n4d/templates/OpenSysClone/"
17                self.pxe_path = "/var/www/ipxeboot/pxemenu.d/70-OpenSysClone.php"
18                self.export_nfs_iso_path = "/etc/exports.d/"
19                #Obsolete name, at this time the file dissapear with PXE line is erased
20                #self.export_nfs_iso_name = "opensysclone_iso.exports"
21                self.export_nfs_iso_name = "opensysclone_nfs.exports"
22        #def init
23
24        def startup(self,options):
25                pass
26        #def startup
27
28        def sanity_check(self):
29                if not os.path.exists(self.tftppath):
30                        os.mkdir(self.tftppath)
31        #def sanity_check
32
33        def mount_iso(self,iso_path):
34                if os.path.exists(iso_path) :
35                        self.sanity_check()
36                        result = os.system('umount "%s"'%(self.tftppath))
37                        result = os.system('mount -o loop "%s" "%s"'%(iso_path,self.tftppath))
38                        return [True,'Mounted']
39                        if result == 0 or result == 32 or result == 8192:
40                                return [True,'Mounted']
41                        else:
42                                return [False,'Mount failed']
43                return [False,'path not exists']
44        #def mount_iso
45
46        def add_entry_exportfs(self):
47               
48                inetwork=objects["VariablesManager"].get_variable("INTERNAL_NETWORK")
49                imask=objects["VariablesManager"].get_variable("INTERNAL_MASK")
50                if inetwork == None or imask == None:
51                        return False
52               
53                # Now is time for .exports file
54                result = os.system('mkdir -p %s'%self.export_nfs_iso_path)
55                try:
56                        fich = open(self.export_nfs_iso_path+"/"+self.export_nfs_iso_name,"w")
57                        fich.write(self.tftppath+"\t"+inetwork+"/"+str(imask)+"("+str(self.export_options)+")\n")
58                        fich.close()
59                        os.system('service nfs-kernel-server restart')
60                except Exception as e:
61                        return [False,'Export failed: '+str(e)]
62               
63                if result == 0 :
64                        return [True,'Exported']
65                else:
66                        return [False,'Export failed']
67        #def add_entry_exportfs
68
69        def del_entry_exportfs(self):
70                # I am not sure about this mechanism
71                result = os.system('rm -f "%s"'%self.export_nfs_iso_path+"/"+self.export_nfs_iso_name)
72                result2 =os.system('service nfs-kernel-server restart')
73                if result == 0 :
74                        return [True,'Delete export entry']
75                else:
76                        return [False,'Delete failed']
77        #def del_entry_exportfs
78       
79       
80        def find(self,pattern, path):
81       
82        #Function to find any file in directory, and returns array with your pattern files
83               
84                valor = [ ]
85                for root, dirs, files in os.walk(path):
86                        for name in files:
87                                if fnmatch.fnmatch(name, pattern):
88                                        #valor.append(os.path.join(root, name))
89                                        valor.append(name)
90                return valor
91
92        def write_pxe(self,name):
93                try:   
94                        # save_path, name_file, hdd_disk, final_action
95                        environment_variables = {}
96                       
97                        # Get the values from free server
98                        environment_variables["SRV_IP"] = objects["VariablesManager"].get_variable("SRV_IP")
99                        environment_variables["NAME_ISO"] = name
100                        environment_variables["EXPORT_PATH"]= self.tftppath
101                        environment_variables["TFTP_PATH"] = os.path.join(self.tftppath,'casper','vmlinuz')
102                        environment_variables["VMLINUZ_PATH"]= os.path.join('OpenSysClone','casper','vmlinuz')
103                        #os.system('ls "%s" | grep initrd'%(self.tftppath+"/"+"casper"))
104                        #buscamos el initrd dentro del directorio tenga la extension que tenga
105                       
106                        INITRD = self.find('initrd*z', '%s'%(self.tftppath))
107                        print ("El initrd encontrado es: %s"%INITRD)
108                       
109                        #POR DEFECTO EL INITRD QUE SE VA A USAR ES EL PRIMERO DE LA LIST ENCONTRADO
110                        environment_variables["INITRD_PATH"] = os.path.join('OpenSysClone','casper',INITRD[ 0 ])
111                       
112                        # Create temporal environment for jinja
113                        env = Environment(loader=FileSystemLoader(self.templates_path))
114                        tmpl = env.get_template('export-iso.tpl')
115                       
116                        # Render the template with diferent values             
117                        textrendered=tmpl.render(environment_variables)
118                       
119                        #Create a temporal for nsswitch
120                        tmp,filename=tempfile.mkstemp()
121                        f = open(filename,'w')
122                        f.writelines(textrendered)
123                        f.close()
124                       
125                        # Using the ultimate chmod
126                        self.uchmod(filename,0644)
127                       
128                        # Copy unitaria
129                        shutil.copy(filename,self.pxe_path)
130                        return [True,str(self.pxe_path)]
131               
132                except Exception as e:
133
134                        return [False,str(e)]
135        #def write_pxe
136
137        def uchmod(self,file,mode):
138               
139                try:
140                #Method to change file attributes
141               
142                        prevmask = os.umask(0)
143                        os.chmod(file,mode)
144                        os.umask(prevmask)
145                       
146                except Exception as e:
147
148                        return [False,str(e)]   
149        #def uchmod
150
151        def export_iso(self,iso_path,name):
152                result = self.mount_iso(iso_path)
153                if not result[0]:
154                        return [False,result[1]]
155                result = self.add_entry_exportfs()
156                if not result[0]:
157                        return [False,result[1]]
158                result = self.write_pxe(name)
159                if not result[0]:
160                        return [False,result[1]]
161                return [True,'Export iso correctly']
162       
163#class OpenCloneSysExport
164
Note: See TracBrowser for help on using the repository browser.