source: n4d-nfs/trunk/fuentes/install/usr/share/n4d/python-plugins/NfsManager.py @ 1116

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

adding project files

File size: 4.3 KB
Line 
1import subprocess
2import re
3import os
4import tempfile
5from jinja2 import Environment
6from jinja2.loaders import FileSystemLoader
7from jinja2 import Template
8
9
10class NfsManager:
11       
12        def __init__(self):
13               
14                self.nfs_dir="/etc/exports.d/"
15                self.nfs_file=self.nfs_dir+"net.exports"
16                self.default_options="rw,sync,no_subtree_check"
17                self.regex_pattern="^(/\w+)(\s+)(((\d{1,3}\.){3}\d{1,3})\((.*)\)(\s+|$))+"
18                self.file_header="#\n# File generated by NfsManager plugin. Do not edit\n#\n\n"
19               
20                self.default_mount_options="rw,hard,intr,nosuid"
21                self.tpl_env = Environment(loader=FileSystemLoader('/usr/share/n4d/templates/nfs'))
22               
23                # LLX TESTING
24                self.nfs_file="/tmp/exports"
25                #
26               
27               
28        #def __init__
29               
30               
31        def parse_exports_file(self,f=None):
32               
33                if f==None:
34                        f=self.nfs_file
35                       
36                       
37                if not os.path.isfile(f):
38                        return {}
39               
40               
41               
42                f=open(f)
43                lines=f.readlines()
44                f.close()
45               
46                exports={}
47               
48                for line in lines:
49                       
50                        ret=re.match(self.regex_pattern,line)
51                        if ret:
52                                dir,ip_list=ret.group(1),ret.group(3)
53                               
54                                for info in ip_list.split(" "):
55                                        info=info.strip("\n")
56                                        info=info.split("(")
57                                        ip=info[0]
58                                        options=info[1].strip(")")
59                                       
60                                        if dir not in exports:
61                                                exports[dir]={}
62                                       
63                                        exports[dir][ip]=options
64                                       
65                return exports
66
67       
68        #def parse_exports_file
69       
70
71        def export_directories(self):
72               
73                #ret=os.system("exportfs -ra")
74                p=subprocess.Popen(["export","-ra"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
75                ret=p.communicate()
76               
77                if p.poll()==0:
78               
79                        return {"status":True , "msg": ""}
80                       
81                else:
82                       
83                        return {"status":False, "msg":ret[1]}
84               
85        #def export_directories
86
87       
88        def add_share(self,dir,ip,options=None):
89               
90                if options==None:
91                        options=self.default_options
92                       
93                exports=self.parse_exports_file()
94               
95                if dir not in exports:
96                        exports[dir]={}
97                                       
98                exports[dir][ip]=options
99                return self.write_exports_file(exports)
100               
101        #def add_share
102       
103       
104        def remove_ip_from_share(self,share,ip):
105               
106                exports=self.parse_exports_file()
107               
108                if share in exports:
109                        if ip in exports[share]:
110                                exports[share].pop(ip)
111                               
112                                self.write_exports_file(exports)
113                               
114                                return {"status":True,"msg":""}
115                       
116                        else:
117                                return {"status":False,"msg":"IP not found"}
118                               
119                else:
120                        return {"status":True,"msg":"Share dir. not found"}
121                       
122               
123        #def remove_ip_from_share
124       
125       
126       
127        def write_exports_file(self,exports,f=None):
128               
129                if f==None:
130                        f=self.nfs_file
131                       
132                file_lines=[]
133                file_lines.append(self.file_header)
134                       
135                for dir in exports:
136                        line="%s\t\t%s\n"
137                        ip_list=""
138                        for ip in exports[dir]:
139                                ip_list+="%s(%s) "%(ip,exports[dir][ip])
140                        ip_list=ip_list.rstrip(" ")
141                        file_lines.append(line%(dir,ip_list))
142                       
143                file_lines.append("\n")
144               
145                f=open(f,"w")
146                for line in file_lines:
147                        f.write(line)
148                f.close()
149               
150                return {"status":True,"msg":""}
151                       
152        #def write_exports_file
153       
154       
155        def configure_mount_on_boot(self,source,target,options=None):
156               
157                if options==None:
158                        options=self.default_mount_options
159                       
160               
161                template_cname = self.tpl_env.get_template("mount.skel")
162                list_variables = {}
163                list_variables["SRC"]=source
164                list_variables["DEST"]=target
165                list_variables["OPTIONS"]=options
166               
167                string_template = template_cname.render(list_variables).encode('UTF-8')
168               
169                fd, tmpfilepath = tempfile.mkstemp()
170                new_export_file = open(tmpfilepath,'w')
171                new_export_file.write(string_template)
172                new_export_file.close()
173                os.close(fd)
174               
175                p=subprocess.Popen(["systemd-escape",target.lstrip("/")],stdout=subprocess.PIPE)
176                file_name=p.communicate()[0].strip("\n")+".mount"
177                file_dest="/lib/systemd/system/"+file_name
178                print tmpfilepath
179                print target.lstrip("/")
180                print file_dest
181               
182                n4d_mv(tmpfilepath,file_dest,True,'root','root','0644',False )
183               
184                os.system("systemctl daemon-reload")
185                o=subprocess.Popen(["systemctl","enable",file_name],stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
186                o2=subprocess.Popen(["systemctl","start",file_name],stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
187               
188                ret=(o,o2)
189               
190                return {"status":True,"msg":ret}
191               
192        #def configure_mount_on_boot
193
194       
195       
196#class NfsManager
197
198if __name__=="__main__":
199       
200        nfsman=NfsManager()
201       
202        #nfsman.add_share("/net","172.20.8.5")
203        nfsman.parse_exports_file()
204        nfsman.remove_ip_from_share("/net","1.2.3.4")
205        nfsman.add_share("/pepito","2.3.4.4","one,two,three")
206        nfsman.configure_mount_on_boot("server:/net","/net/server-sync")
Note: See TracBrowser for help on using the repository browser.