From 4854dbad794b33d80619531fc9898153310a155f Mon Sep 17 00:00:00 2001
From: Philip Chan <philip.chan@monash.edu>
Date: Fri, 29 Jul 2016 16:25:17 +1000
Subject: [PATCH] copy skel files into user home

Former-commit-id: c09b07f607d28d539ac18097b0df7c85fa07cab0
---
 .../templates/provision_homedir.py.j2         | 44 +++++++++++++++----
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/roles/provision_homedir/templates/provision_homedir.py.j2 b/roles/provision_homedir/templates/provision_homedir.py.j2
index bf61ed84..270886a3 100644
--- a/roles/provision_homedir/templates/provision_homedir.py.j2
+++ b/roles/provision_homedir/templates/provision_homedir.py.j2
@@ -3,6 +3,7 @@ import ldap
 import traceback
 import os
 import stat
+import shutil
 
 class ldapSearchConfig:
     def __init__(self):
@@ -18,8 +19,7 @@ class genericUser:
         self.dn=""
         self.cn=""
         self.entry=""
-	self.uid=""
-
+        self.uid=""
 
 def get_users(server):
 #    ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,server.cacertfile)
@@ -42,7 +42,6 @@ def get_users(server):
         allusers[dn].entry=attrs
     return allusers
 
-
 def mk_homedir(path,uidNumber,gidNumber):
 	try:
 		statinfo = os.stat(path)
@@ -56,6 +55,35 @@ def mk_homedir(path,uidNumber,gidNumber):
 	else:
 		raise Exception("users homedirectory is not a directory %s"%path)
 
+# adapted from http://stackoverflow.com/questions/5994840/how-to-change-the-user-and-group-permissions-for-a-directory-by-name
+def recursive_chown(path,uidNumber,gidNumber):
+	si = os.stat(path)
+	# just a precaution before we recursively apply uid/gid to a path
+	if si.st_uid != uidNumber or si.st_gid != gidNumber:
+		raise Exception("user home %s uid %d != %d, gid %d != %d mismatch" % (path,si.st_uid,uidNumber,si.st_gid,gidNumber))
+	for root, dirs, files in os.walk(path):
+		for momo in dirs:
+			os.chown(os.path.join(root, momo), uidNumber, gidNumber)
+		for momo in files:
+			os.chown(os.path.join(root, momo), uidNumber, gidNumber)
+
+def mk_home_cp_skel(skelroot, path, uidNumber, gidNumber):
+	if skelroot is None:
+		# assumes NO trailing / on the home path or dead meat
+		skelroot = path.rsplit("/", 1)[0]
+	# fix this later if your common/skel is located elsewhere
+	skelpath = os.path.join(skelroot, 'common', 'skel')
+	if os.path.isdir(skelpath):
+		# copy the skel into the user $HOME
+		os.system("/bin/cp -r %s/* %s" % (skelpath, path))
+		os.system("/bin/cp %s/\.* %s" % (skelpath, path))
+		# ideally use this, but it assumes 'path' does not exist
+		# shutil.copytree(skelpath, path)
+		# chown to user ownership
+		recursive_chown(path, uidNumber, gidNumber)
+	else:
+		raise Exception("skel path is missing %s" % skelpath)
+
 s=ldapSearchConfig()
 s.ldapserver="{{ ldapURI }}"
 s.binddn="{{ ldapBindDN }}"
@@ -65,15 +93,15 @@ s.searchFilter = "{{ search_filter }}"
 homeDirEntry= "{{ homeDirEntry }}"
 mnthome = "{{ mnthome }}"
 
-
 users=get_users(s)
 for user in users:
 	try:
-                if mnthome != "":
-                    path=mnthome+"/"+users[user].entry[homeDirEntry][0].rsplit("/",1)[1]
-                else:
-                    path=users[user].entry[homeDirEntry][0]
+		if mnthome != "":
+			path=mnthome+"/"+users[user].entry[homeDirEntry][0].rsplit("/",1)[1]
+		else:
+			path=users[user].entry[homeDirEntry][0]
 		mk_homedir(path,int(users[user].entry['uidNumber'][0]),int(users[user].entry['gidNumber'][0]))
+		cp_skel(None, path, int(users[user].entry['uidNumber'][0]), int(users[user].entry['gidNumber'][0]))
 	except:
 		print traceback.format_exc()
 		pass
-- 
GitLab