source: n4d-ldap/trunk/fuentes/install/usr/sbin/llx-netacl-fixer @ 149

Last change on this file since 149 was 149, checked in by hectorgh, 4 years ago

adding project files

  • Property svn:executable set to *
File size: 4.6 KB
Line 
1#!/usr/bin/env python
2
3import os
4import re
5import stat
6import subprocess
7import sys
8
9LOCAL_CONF_FOLDER="/var/lib/lliurex-folders/local/"
10
11NET="/net/server-sync/"
12
13STUDENTS_HOME = NET+ "home/students/"
14TEACHERS_HOME = NET + "home/teachers/"
15SHARE = NET+ "share/"
16TEACHERS_SHARE = NET+ "teachers_share/"
17EASY_SITES = NET + "easy-sites/"
18JCLIC_AULA = SHARE + "jclic-aula/"
19
20def get_acl_info(path):
21               
22        info={}
23        regex="(\w+:|\A)(user|group|mask|other):([a-zA-Z0-9\-]*):([r|w|x|\-]{1,3})\s*[#]*(\S+)*\Z"
24        os.environ["LANG"]="C"
25        p=subprocess.Popen(["getfacl",path],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
26        out=p.communicate()[0]
27               
28        info["acl"]=[]
29        info["perm"]=int(str(oct(stat.S_IMODE(os.lstat(path).st_mode))).lstrip("0"))
30        info["path"]=path
31               
32        for item in out.split("\n"):
33                       
34                #item=item.strip("\n")
35                x=re.match(regex,item)
36                       
37                if x!=None:
38                               
39                        special=x.group(1)
40                        type_=x.group(2)
41                        custom_group=x.group(3)
42                        acl=x.group(4)
43                        extra=x.group(5)
44                               
45                        if special.find("default")!=-1:
46                                mode="-d -m"
47                        else:
48                                mode="-m"
49                               
50                        if type_=="group":
51                                type_="g:"
52                        elif type_=="user":
53                                type_="u:"
54                        elif type_=="mask":
55                                type_="m:"
56                        elif type_=="other":
57                                type_="o:"
58                                       
59                               
60                        info["acl"].append([mode,type_+custom_group+":"+acl])
61                                       
62
63
64        return info
65               
66               
67def get_acl_from_llxconfig(path):
68       
69                path=path.rstrip("/")
70                ret={}
71               
72                for f in os.listdir(LOCAL_CONF_FOLDER):
73                        try:
74                                ff=open(LOCAL_CONF_FOLDER+f)
75                                txt="".join(ff.readlines())
76                                ff.close()
77                                orig_info=eval(txt)
78                                for item in orig_info:
79                                        if path == orig_info[item]["path"] or path+"/"==orig_info[item]["path"]:
80                                                #print orig_info[item]
81                                                return orig_info[item]
82                                       
83                        except Exception as e:
84                                print(e,"!!")
85       
86                return ret
87       
88
89def apply_acls(info,dir,filter=None):
90       
91        acls=[]
92       
93        if "acl" in info:
94               
95                try:
96                        for acl in info["acl"]:
97                                mode,rule=acl
98                                if mode.find("-d -m")!=-1:
99                                        acls.append(["-m",rule])
100                                        acls.append(["-d -m",rule])
101
102                        for path in os.listdir(dir):
103                                path=dir+path
104                                if not os.path.islink(path):
105                                       
106                                        if filter!=None:
107                                                if filter in path:
108                                                        #print "[!] Skipping" , path ,"..."
109                                                        continue
110                                       
111                                        for acl in acls:
112                                                mode,rule=acl
113                                                cmd='setfacl -RP %s %s "%s"'%(mode,rule,path)
114                                                #print ("\t* Setting acls to %s ..."%path)
115                                                os.system(cmd)
116                                               
117                except Exception as e:
118                        print(e)
119
120
121def fix_students():
122       
123        print("[*] Fixing %s ..."%STUDENTS_HOME)
124        #info=get_acl_info(STUDENTS_HOME)
125        info=get_acl_from_llxconfig(STUDENTS_HOME)
126        apply_acls(info,STUDENTS_HOME)
127       
128#def fix_students
129
130def fix_teachers():
131       
132        print("[*] Fixing %s ..."%TEACHERS_HOME)
133        #info=get_acl_info(TEACHERS_HOME)
134        info=get_acl_from_llxconfig(TEACHERS_HOME)
135        apply_acls(info,TEACHERS_HOME)
136       
137#def fix_teachers
138
139def fix_share():
140        print("[*] Fixing %s ..."%SHARE)
141        #info=get_acl_info(SHARE)
142        info=get_acl_from_llxconfig(SHARE)
143        filter=JCLIC_AULA.rstrip("/")
144        apply_acls(info,SHARE,filter)
145
146#def fix_share
147
148def fix_teachers_share():
149        print("[*] Fixing %s ..."%TEACHERS_SHARE)
150        #info=get_acl_info(TEACHERS_SHARE)
151        info=get_acl_from_llxconfig(TEACHERS_SHARE)
152        apply_acls(info,TEACHERS_SHARE)
153
154#def fix_share
155
156def fix_easy_sites():
157        print("[*] Fixing %s ..."%EASY_SITES)
158        #info=get_acl_info(EASY_SITES)
159        info=get_acl_from_llxconfig(EASY_SITES)
160        apply_acls(info,EASY_SITES)
161
162#def fix_share
163
164def fix_jclic_aula():
165        print("[*] Fixing %s ..."%JCLIC_AULA)
166        #info=get_acl_info(JCLIC_AULA)
167        info=get_acl_from_llxconfig(JCLIC_AULA)
168        apply_acls(info,JCLIC_AULA)
169
170#def fix_share
171
172def fix_all():
173       
174        fix_students()
175        fix_teachers()
176        fix_easy_sites()
177        fix_share()
178        fix_teachers_share()
179        fix_jclic_aula()
180       
181#def fix_all
182
183
184def usage():
185
186        print("USAGE:")
187        print("\tllx-netacl-fixer {base-dirs|students|teachers|share|teachers-share|easy-sites|jclic-aula|all}")
188        print("")
189        sys.exit(0)
190       
191       
192def warning():
193       
194        print("\n\t[!] THIS MIGHT TAKE A WHILE [!]\n")
195
196def done():
197       
198        print("\n\tDONE\n")
199        sys.exit(0)
200
201if __name__=="__main__":
202       
203        if len(sys.argv)<2:
204                usage()
205               
206       
207        help=["-h","--help","help"]
208       
209        if sys.argv[1] in help:
210                usage()
211        if sys.argv[1]=="students":
212                warning()
213                fix_students()
214                done()
215        if sys.argv[1]=="teachers":
216                warning()
217                fix_teachers()
218                done()
219        if sys.argv[1]=="share":
220                warning()
221                fix_share()
222                done()
223        if sys.argv[1]=="easy-sites":
224                warning()
225                fix_easy_sites()
226                done()
227        if sys.argv[1]=="teachers-share":
228                warning()
229                fix_teachers_share()
230                done()
231        if sys.argv[1]=="jclic-aula":
232                warning()
233                fix_jclic_aula()
234                done()
235       
236        if sys.argv[1]=="base-dirs":
237                warning()
238                os.system("service n4d restart")
239                done()
240       
241        if sys.argv[1]=="all":
242                warning()
243                fix_all()
244                os.system("service n4d restart")
245                done()
246               
247        usage()
248
Note: See TracBrowser for help on using the repository browser.