source: lliurex-enterprise-mount/trunk/fuentes/install-files/usr/share/lliurex-enterprise-mount/scripts/lliurex-enterprise-mount-common @ 1012

Last change on this file since 1012 was 1012, checked in by jrpelegrina, 4 years ago

First release to xenial

  • Property svn:executable set to *
File size: 5.8 KB
Line 
1#!/usr/bin/env python
2import os
3import pwd
4import sys
5import glob
6import subprocess
7
8OWNDOMAIN=0
9EXTERNALDOMAIN=1
10
11class EnterpriseMountCommon:
12       
13       
14       
15        def __init__(self):
16               
17                self.mount_volume_skel='<volume fstype="cifs" server="%s" path="%s" mountpoint="%s" options="nodev,nosuid,sec=ntlm%s" />'
18               
19                try:
20                        self.user_name=os.environ["PAM_USER"]
21                except:
22                        self.user_name=os.environ["USER"]
23                       
24                self.user_uid,self.user_gid,self.user_home=self.get_user_info(self.user_name)
25               
26                self.odomain_dir="%s/.lliurex-enterprise-mount/own-domain/"%self.user_home
27                self.edomain_dir="%s/.lliurex-enterprise-mount/external-domains/"%self.user_home
28               
29               
30               
31        #def __init__
32       
33        def get_user_info(self,uname):
34
35                for user in pwd.getpwall():
36                        if user.pw_name==uname:
37                                if user.pw_uid>1000000:
38                                        return(str(user.pw_uid),str(user.pw_gid),user.pw_dir)
39
40                info=pwd.getpwnam(uname)
41                return(str(info.pw_uid),str(info.pw_gid),info.pw_dir)
42               
43        #def get_user_info
44       
45        def get_windows_home_directory(self,user_name=None):
46               
47               
48                if user_name==None:
49                        user_name=os.environ["PAM_USER"]
50               
51                if not os.path.exists("/opt/pbis/bin/find-user-by-name"):
52                        return None
53               
54                command = subprocess.Popen(['/opt/pbis/bin/find-user-by-name', user_name], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
55                stdout, stderr = command.communicate()
56                user_SID = None
57                result = None
58               
59                for out in stdout.split('\n'):
60                        if out.startswith('SID'):
61                                user_SID = out.split(':')[1].strip()
62                stderr, stdout, command = None, None, None
63               
64                if user_SID != None:
65                        command = subprocess.Popen(['/opt/pbis/bin/find-objects', '--by-sid', user_SID], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
66                        stdout, stderr = command.communicate()
67
68                        for out in stdout.split('\n'):
69                                if out.startswith('Windows home directory'):
70                                        result = out.split(':')[1].strip()
71                       
72                        ret=result.replace("\\", "/")
73                        ret+="/%s"%user_name.upper()
74
75                        return ret
76                       
77                return None
78
79        #def get_windows_home_directory
80       
81       
82        def create_home(self):
83               
84                if not os.path.exists(self.user_home):
85                        os.makedirs(self.user_home)
86                        os.system("cp -r /etc/skel/. %s"%self.user_home)
87                        os.system("chown -R %s:%s %s"%(self.user_uid,self.user_gid,self.user_home))
88                        os.system("chmod 700 %s"%self.user_home)
89               
90        #def create_home
91       
92       
93        def parse_domains(self,dtype=0):
94               
95                mount_list=[]
96               
97                file_list=[]
98                if dtype==OWNDOMAIN:
99                        file_list=glob.glob(self.odomain_dir+"*")
100                if dtype==EXTERNALDOMAIN:
101                        file_list=glob.glob(self.edomain_dir+"*")
102                       
103                for f in file_list:
104                       
105                        if f.endswith(".credentials"):
106                                continue
107                       
108                        x=open(f)
109                        lines=x.readlines()
110                        x.close()
111                       
112                        for line in lines:
113                                try:
114                                        line=line.strip("\n")
115                                        server,share,mount_point=line.split(",")
116                                        mount={}
117                                        mount["server"]=server
118                                        mount["share"]=share
119                                        mount["mount_point"]=mount_point
120                                        if dtype==EXTERNALDOMAIN:
121                                                mount["credentials_file"]=f+".credentials"
122                                               
123                                        mount_list.append(mount)
124                                       
125                                except Exception as e:
126                                        #print e,"1111",dtype, line
127                                        pass
128                               
129                return mount_list
130               
131        #def parse_owndomains
132       
133        def generate_xml(self):
134               
135                '''
136                # LISTS
137                self.own_domains # DIC {server,share,mount_point}
138                self.external_domains # DIC {server,share,mount_point,credentials_file}
139                self.common_share # DIC {server,share,mount_point}
140               
141                # STR OR NONE
142                self.user_share
143                '''
144
145                first='<pam_mount>\n\
146        <mkmountpoint enable="1" remove="true"/>\n'
147                last='</pam_mount>\n'
148                ret=first
149               
150                # COMMON SHARE
151               
152                for mitem in self.common_share:
153                       
154                        try:
155                                ret+="\t"
156                                ret+=self.mount_volume_skel%(mitem["server"],mitem["share"],mitem["mount_point"],"")
157                                ret+="\n"
158                        except Exception as e:
159                                #print e
160                                pass
161                               
162               
163                # WINDOWS SHARE
164               
165                if self.user_share!=None:
166                        ret+="\t"
167                        tmp=self.user_share.split("/")
168                        server=tmp[2]
169                        path=tmp[3]
170                        user_path=self.user_home+"/"+path
171                        mountpoint=user_path
172                        ret+=self.mount_volume_skel%(server,path,user_path,"")
173                        ret+="\n"
174                       
175               
176                # OWN_DOMAINS
177               
178                for mitem in self.own_domains:
179                       
180                        try:
181                                ret+="\t"
182                                if os.path.exists(mitem["mount_point"]) and os.stat(mitem["mount_point"]).st_uid!=self.user_uid:
183                                        mitem["mount_point"]=self.user_home+"/"+mitem["mount_point"]
184                                ret+=self.mount_volume_skel%(mitem["server"],mitem["share"],mitem["mount_point"],"")
185                                ret+="\n"
186                        except:
187                                pass
188                               
189               
190                # EXTERNAL DOMAINS
191               
192                for mitem in self.external_domains:
193                       
194                        try:
195                                ret+="\t"
196                                if os.path.exists(mitem["mount_point"]) and os.stat(mitem["mount_point"]).st_uid!=self.user_uid:
197                                        mitem["mount_point"]=self.user_home+"/"+mitem["mount_point"]
198                                ret+=self.mount_volume_skel%(mitem["server"],mitem["share"],mitem["mount_point"],",credentials="+mitem["credentials_file"])
199                                ret+="\n"
200                        except Exception as e:
201                                #print e
202                                pass
203                               
204               
205                ret+=last
206               
207                file_path=self.user_home+"/.pam_mount.conf.xml"
208                f=open(file_path,"w")
209                f.write(ret)
210                f.close()
211                os.system("chown %s:%s %s"%(self.user_uid,self.user_gid,file_path))
212                os.system("chmod 600 %s"%file_path)
213               
214               
215        #def generate_xml
216       
217        def main(self,common_share_path=None):
218               
219               
220                self.create_home()
221                #if it doesn't exist
222               
223                self.own_domains=self.parse_domains(OWNDOMAIN)
224                self.external_domains=self.parse_domains(EXTERNALDOMAIN)
225               
226                self.common_share=[]
227                if common_share_path!=None:
228                        if os.path.exists(common_share_path):
229                                try:
230                                        #if it exists, it should contain a self.common_share redefinition
231                                        execfile(common_share_path)
232                                except Exception as e:
233                                        pass
234               
235                self.user_share=self.get_windows_home_directory(self.user_name)
236                #or at least try to , None if it fails
237               
238                self.generate_xml()
239               
240        #def main
241       
242       
243       
244       
245if __name__=="__main__":
246       
247        emc=EnterpriseMountCommon()
248        csf=None
249        os.system("touch /tmp/hola")   
250        if len(sys.argv)>1:
251                csf=sys.argv[1]
252               
253        try:
254                emc.main(csf)
255        except Exception as e:
256                #f=open("/tmp/loggggg","w")
257                #f.write(str(e))
258                #f.close()
259                pass
260       
Note: See TracBrowser for help on using the repository browser.