1618fd23eb57032b650d30c46513c079840b79839mridgeimport commands
2618fd23eb57032b650d30c46513c079840b79839mridgeimport random
3618fd23eb57032b650d30c46513c079840b79839mridgeimport re
4618fd23eb57032b650d30c46513c079840b79839mridge
5618fd23eb57032b650d30c46513c079840b79839mridgealphabet = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789-_'
6618fd23eb57032b650d30c46513c079840b79839mridgea_length = len(alphabet)
7618fd23eb57032b650d30c46513c079840b79839mridge
8618fd23eb57032b650d30c46513c079840b79839mridge""" ACL support attribute """
9618fd23eb57032b650d30c46513c079840b79839mridgeACL4_SUPPORT_ALLOW_ACL = 0x00000001
10618fd23eb57032b650d30c46513c079840b79839mridgeACL4_SUPPORT_DENY_ACL = 0x00000002
11618fd23eb57032b650d30c46513c079840b79839mridgeACL4_SUPPORT_AUDIT_ACL = 0x00000004
12618fd23eb57032b650d30c46513c079840b79839mridgeACL4_SUPPORT_ALARM_ACL = 0x00000008
13618fd23eb57032b650d30c46513c079840b79839mridge
14618fd23eb57032b650d30c46513c079840b79839mridgeclass RandomGen(object):
15618fd23eb57032b650d30c46513c079840b79839mridge
16618fd23eb57032b650d30c46513c079840b79839mridge
17618fd23eb57032b650d30c46513c079840b79839mridge	"""  List of ACE possible who fields """
18618fd23eb57032b650d30c46513c079840b79839mridge	ace_who=["OWNER@","GROUP@","EVERYONE@","ANONYMOUS@","AUTHENTICATED@"]
19618fd23eb57032b650d30c46513c079840b79839mridge
20618fd23eb57032b650d30c46513c079840b79839mridge	""" List of GID than can be used to do the tests """
21618fd23eb57032b650d30c46513c079840b79839mridge	gList=[]
22618fd23eb57032b650d30c46513c079840b79839mridge	gListSize = len(gList)
23618fd23eb57032b650d30c46513c079840b79839mridge	uList = []
24618fd23eb57032b650d30c46513c079840b79839mridge	uListSize = len(uList)
2537550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
26618fd23eb57032b650d30c46513c079840b79839mridge	fList=[]
27618fd23eb57032b650d30c46513c079840b79839mridge	fListSize = len(fList)
2837550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
29618fd23eb57032b650d30c46513c079840b79839mridge	""" Create a user in available groups to do the tests """
30618fd23eb57032b650d30c46513c079840b79839mridge	def createUser(self,username):
31618fd23eb57032b650d30c46513c079840b79839mridge		group = self.gList[random.randint(0,len(self.gList)-1)][0]
32618fd23eb57032b650d30c46513c079840b79839mridge		opts = "-g" + group + " -p" + "1pilot" + " -m " + username
33618fd23eb57032b650d30c46513c079840b79839mridge		u = commands.getoutput('/usr/sbin/useradd '+ opts)
34618fd23eb57032b650d30c46513c079840b79839mridge		if u != "":
35618fd23eb57032b650d30c46513c079840b79839mridge			print "create user " + username + "failed" + u
36618fd23eb57032b650d30c46513c079840b79839mridge
37618fd23eb57032b650d30c46513c079840b79839mridge	def createFile(self,path,n):
38618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(n):
39618fd23eb57032b650d30c46513c079840b79839mridge			fName = 'file' + str(i)
40618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('touch ' + path + '/'+ fName)
41618fd23eb57032b650d30c46513c079840b79839mridge			self.fList.append(fName)
4237550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
43618fd23eb57032b650d30c46513c079840b79839mridge	def createGroup(self, grpname, gid):
44618fd23eb57032b650d30c46513c079840b79839mridge		u = commands.getoutput('/usr/sbin/groupadd -g' + gid + " " + grpname)
45618fd23eb57032b650d30c46513c079840b79839mridge		if u != "":
46618fd23eb57032b650d30c46513c079840b79839mridge			print u
4737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
48618fd23eb57032b650d30c46513c079840b79839mridge	def createNGroup(self, n):
49618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(n):
50618fd23eb57032b650d30c46513c079840b79839mridge			gName = 'grp' + str(i)
51618fd23eb57032b650d30c46513c079840b79839mridge			gid = str(500+i)
52618fd23eb57032b650d30c46513c079840b79839mridge			self.createGroup(gName, gid)
5337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
54618fd23eb57032b650d30c46513c079840b79839mridge
55618fd23eb57032b650d30c46513c079840b79839mridge	""" Random creation of n user """
56618fd23eb57032b650d30c46513c079840b79839mridge	def createNUser(self,n):
57618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(n):
58618fd23eb57032b650d30c46513c079840b79839mridge			userName= "user" + str(i)
59618fd23eb57032b650d30c46513c079840b79839mridge			self.createUser(userName)
60618fd23eb57032b650d30c46513c079840b79839mridge
61618fd23eb57032b650d30c46513c079840b79839mridge	""" clean all users created to do the tests """
62618fd23eb57032b650d30c46513c079840b79839mridge	def cleanUsers(self):
63618fd23eb57032b650d30c46513c079840b79839mridge		for name in self.uList:
64618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('/usr/sbin/userdel -r '+ name)
65618fd23eb57032b650d30c46513c079840b79839mridge		self.uList = []
66618fd23eb57032b650d30c46513c079840b79839mridge
67618fd23eb57032b650d30c46513c079840b79839mridge	""" clean all users created to do the tests """
68618fd23eb57032b650d30c46513c079840b79839mridge	def cleanGroups(self):
69618fd23eb57032b650d30c46513c079840b79839mridge		for name in self.gList:
70618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('/usr/sbin/groupdel '+ name[0])
71618fd23eb57032b650d30c46513c079840b79839mridge		self.gList = []
7237550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
73618fd23eb57032b650d30c46513c079840b79839mridge	""" Retrieve the list of user from /etc/passwd file """
74618fd23eb57032b650d30c46513c079840b79839mridge	def getUserList(self):
75618fd23eb57032b650d30c46513c079840b79839mridge		f = open('/etc/passwd','r')
76618fd23eb57032b650d30c46513c079840b79839mridge		lines = f.readlines()
77618fd23eb57032b650d30c46513c079840b79839mridge		for line in lines:
78618fd23eb57032b650d30c46513c079840b79839mridge			splitedline = line.split(':')
79618fd23eb57032b650d30c46513c079840b79839mridge			userName = splitedline[0]
80618fd23eb57032b650d30c46513c079840b79839mridge			gid = splitedline[3]
81618fd23eb57032b650d30c46513c079840b79839mridge		# TO FIX: verify that the group is OK (in the right range)
82618fd23eb57032b650d30c46513c079840b79839mridge			NameOK = re.match("user",userName)
83618fd23eb57032b650d30c46513c079840b79839mridge			# We keep only usernames starting with "user"
84618fd23eb57032b650d30c46513c079840b79839mridge			if NameOK != None:
85618fd23eb57032b650d30c46513c079840b79839mridge				self.uList.append(userName)
86618fd23eb57032b650d30c46513c079840b79839mridge		f.close()
87618fd23eb57032b650d30c46513c079840b79839mridge
88618fd23eb57032b650d30c46513c079840b79839mridge	def getFileList(self,path):
89618fd23eb57032b650d30c46513c079840b79839mridge		u = commands.getoutput('ls ' + path)
90618fd23eb57032b650d30c46513c079840b79839mridge		tmp = u.split('\n')
91618fd23eb57032b650d30c46513c079840b79839mridge		for i in range (len(tmp)-1):
92618fd23eb57032b650d30c46513c079840b79839mridge			NameOK = re.match("file",tmp[i])
93618fd23eb57032b650d30c46513c079840b79839mridge			if NameOK != None:
94618fd23eb57032b650d30c46513c079840b79839mridge				self.fList.append(tmp[i])
9537550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
96618fd23eb57032b650d30c46513c079840b79839mridge	def getNUserList(self,nb):
97618fd23eb57032b650d30c46513c079840b79839mridge		f = open('/etc/passwd','r')
98618fd23eb57032b650d30c46513c079840b79839mridge		lines = f.readlines()
99618fd23eb57032b650d30c46513c079840b79839mridge		n = 0
100618fd23eb57032b650d30c46513c079840b79839mridge		for line in lines:
101618fd23eb57032b650d30c46513c079840b79839mridge			splitedline = line.split(':');
102618fd23eb57032b650d30c46513c079840b79839mridge			userName = splitedline[0]
103618fd23eb57032b650d30c46513c079840b79839mridge			gid = splitedline[3]
104618fd23eb57032b650d30c46513c079840b79839mridge		# TO FIX: verify that the group is OK (in the right range)
105618fd23eb57032b650d30c46513c079840b79839mridge			NameOK = re.match("user",userName)
106618fd23eb57032b650d30c46513c079840b79839mridge			# We keep only usernames starting with "user"
107618fd23eb57032b650d30c46513c079840b79839mridge			if NameOK != None:
108618fd23eb57032b650d30c46513c079840b79839mridge				self.uList.append(userName)
109618fd23eb57032b650d30c46513c079840b79839mridge				n = n+1
110618fd23eb57032b650d30c46513c079840b79839mridge			if n==nb:
111618fd23eb57032b650d30c46513c079840b79839mridge				break;
112618fd23eb57032b650d30c46513c079840b79839mridge		f.close()
113618fd23eb57032b650d30c46513c079840b79839mridge
114618fd23eb57032b650d30c46513c079840b79839mridge	""" Get group list """
115618fd23eb57032b650d30c46513c079840b79839mridge	def getGroupList(self):
116618fd23eb57032b650d30c46513c079840b79839mridge		f = open('/etc/group','r')
117618fd23eb57032b650d30c46513c079840b79839mridge		lines = f.readlines()
118618fd23eb57032b650d30c46513c079840b79839mridge		for line in lines:
119618fd23eb57032b650d30c46513c079840b79839mridge			splitedline = line.split(':');
120618fd23eb57032b650d30c46513c079840b79839mridge			groupName = splitedline[0]
121618fd23eb57032b650d30c46513c079840b79839mridge			gid = splitedline[2]
122618fd23eb57032b650d30c46513c079840b79839mridge			NameOK = re.match("grp",groupName)
123618fd23eb57032b650d30c46513c079840b79839mridge			if NameOK != None:
124618fd23eb57032b650d30c46513c079840b79839mridge				self.gList.append([groupName,gid])
125618fd23eb57032b650d30c46513c079840b79839mridge		f.close()
126618fd23eb57032b650d30c46513c079840b79839mridge
127618fd23eb57032b650d30c46513c079840b79839mridge	""" Get a list of n group """
128618fd23eb57032b650d30c46513c079840b79839mridge	def getNGroupList(self,nb):
129618fd23eb57032b650d30c46513c079840b79839mridge		f = open('/etc/group','r')
130618fd23eb57032b650d30c46513c079840b79839mridge		lines = f.readlines()
131618fd23eb57032b650d30c46513c079840b79839mridge		n = 0
132618fd23eb57032b650d30c46513c079840b79839mridge		for line in lines:
133618fd23eb57032b650d30c46513c079840b79839mridge			splitedline = line.split(':');
134618fd23eb57032b650d30c46513c079840b79839mridge			groupName = splitedline[0]
135618fd23eb57032b650d30c46513c079840b79839mridge			gid = splitedline[2]
136618fd23eb57032b650d30c46513c079840b79839mridge			NameOK = re.match("grp",groupName)
137618fd23eb57032b650d30c46513c079840b79839mridge			if NameOK != None:
138618fd23eb57032b650d30c46513c079840b79839mridge				self.gList.append([groupName,gid])
139618fd23eb57032b650d30c46513c079840b79839mridge				n = n+1
140618fd23eb57032b650d30c46513c079840b79839mridge			if n==nb:
141618fd23eb57032b650d30c46513c079840b79839mridge				break;
142618fd23eb57032b650d30c46513c079840b79839mridge		f.close()
143618fd23eb57032b650d30c46513c079840b79839mridge
14437550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman	def printUserList(self):
145618fd23eb57032b650d30c46513c079840b79839mridge		print self.uList
14637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
14737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman	def printGroupList(self):
148618fd23eb57032b650d30c46513c079840b79839mridge		print self.gList
149618fd23eb57032b650d30c46513c079840b79839mridge
150618fd23eb57032b650d30c46513c079840b79839mridge	""" Create a random name of random length """
151618fd23eb57032b650d30c46513c079840b79839mridge	def createOneNameRandomLength(self,maxlength):
152618fd23eb57032b650d30c46513c079840b79839mridge		outputString =""
153618fd23eb57032b650d30c46513c079840b79839mridge		l=random.randint(0,maxlength)
154618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(l):
155618fd23eb57032b650d30c46513c079840b79839mridge			a = random.randint(0,a_length-1)
156618fd23eb57032b650d30c46513c079840b79839mridge			outputString =outputString  + alphabet[a]
157618fd23eb57032b650d30c46513c079840b79839mridge		return outputString
158618fd23eb57032b650d30c46513c079840b79839mridge
159618fd23eb57032b650d30c46513c079840b79839mridge	""" Create a random name of fixed length """
160618fd23eb57032b650d30c46513c079840b79839mridge	def createOneName(self,lenght):
161618fd23eb57032b650d30c46513c079840b79839mridge		outputString =""
162618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(length):
163618fd23eb57032b650d30c46513c079840b79839mridge			a = random.randint(0,a_length-1)
164618fd23eb57032b650d30c46513c079840b79839mridge			outputString = outputString + alphabet[a]
165618fd23eb57032b650d30c46513c079840b79839mridge		return outputString
166618fd23eb57032b650d30c46513c079840b79839mridge
167618fd23eb57032b650d30c46513c079840b79839mridge	""" Create Random User List with fixed length user names """
168618fd23eb57032b650d30c46513c079840b79839mridge	def createRandomUserList(self,listlength,usernamelength):
169618fd23eb57032b650d30c46513c079840b79839mridge		userlist = []
170618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(listlength):
171618fd23eb57032b650d30c46513c079840b79839mridge			user = createOneName(lenght)
172618fd23eb57032b650d30c46513c079840b79839mridge			userlist.append(user)
17337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman		return userlist
174618fd23eb57032b650d30c46513c079840b79839mridge
175618fd23eb57032b650d30c46513c079840b79839mridge	""" Create Random ACE for a file and a given usr """
176618fd23eb57032b650d30c46513c079840b79839mridge	def createRandomACE(self,user):
177618fd23eb57032b650d30c46513c079840b79839mridge		type = ace_type[random.randint(0,len(ace_type))]
178618fd23eb57032b650d30c46513c079840b79839mridge		flag = ace_flags[random.randint(0,len(ace_flags))]
179618fd23eb57032b650d30c46513c079840b79839mridge		mask = ace_mask[random.randint(0,len(ace_mask))]
180618fd23eb57032b650d30c46513c079840b79839mridge		who = ace_who[random.randint(0,len(ace_who))]
181618fd23eb57032b650d30c46513c079840b79839mridge		return nfsace4(type, flag, mask, who)
182618fd23eb57032b650d30c46513c079840b79839mridge
183618fd23eb57032b650d30c46513c079840b79839mridge	""" Create Random ACL for a file with a fixed number a entries """
184618fd23eb57032b650d30c46513c079840b79839mridge	def createRandomACL(self,acl_size):
185618fd23eb57032b650d30c46513c079840b79839mridge		acl = []
186618fd23eb57032b650d30c46513c079840b79839mridge		userList = uList
187618fd23eb57032b650d30c46513c079840b79839mridge		userListSize = uListSize
188618fd23eb57032b650d30c46513c079840b79839mridge		for i in range(acl_size):
189618fd23eb57032b650d30c46513c079840b79839mridge			n = random.randint(0,userListSize-1)
190618fd23eb57032b650d30c46513c079840b79839mridge			usr = userList.pop(n)
191618fd23eb57032b650d30c46513c079840b79839mridge			newace = createRandomACE(usr)
192618fd23eb57032b650d30c46513c079840b79839mridge			acl.append(newace)
193618fd23eb57032b650d30c46513c079840b79839mridge		return acl
194618fd23eb57032b650d30c46513c079840b79839mridge
195618fd23eb57032b650d30c46513c079840b79839mridge	""" Return a mode string like 'xwr' or 'x' """
196618fd23eb57032b650d30c46513c079840b79839mridge	def createRandomMode(self):
197618fd23eb57032b650d30c46513c079840b79839mridge		out_str = ""
198618fd23eb57032b650d30c46513c079840b79839mridge		while (out_str == ""):
199618fd23eb57032b650d30c46513c079840b79839mridge                        if random.randint(0,1) == 1:
200618fd23eb57032b650d30c46513c079840b79839mridge			        out_str += 'x'
201618fd23eb57032b650d30c46513c079840b79839mridge		        if random.randint(0,1) == 1:
202618fd23eb57032b650d30c46513c079840b79839mridge			        out_str += 'w'
203618fd23eb57032b650d30c46513c079840b79839mridge		        if random.randint(0,1) == 1:
204618fd23eb57032b650d30c46513c079840b79839mridge			        out_str += 'r'
205618fd23eb57032b650d30c46513c079840b79839mridge		return out_str
20637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
207618fd23eb57032b650d30c46513c079840b79839mridge	""" Create a random ACL operation (delete / remove / modify on user / group ) """
208618fd23eb57032b650d30c46513c079840b79839mridge	def randomOp(self,path):
209618fd23eb57032b650d30c46513c079840b79839mridge		a = random.randint(1,4)
210618fd23eb57032b650d30c46513c079840b79839mridge		mode = self.createRandomMode()
211618fd23eb57032b650d30c46513c079840b79839mridge		file = self.fList[random.randint(0,len(self.fList)-1)]
212618fd23eb57032b650d30c46513c079840b79839mridge		if a == 1:	# creation/modification
213618fd23eb57032b650d30c46513c079840b79839mridge			user = self.uList[random.randint(0,len(self.uList)-1)]
214618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
215618fd23eb57032b650d30c46513c079840b79839mridge
216618fd23eb57032b650d30c46513c079840b79839mridge		if a == 2:	# with group
217618fd23eb57032b650d30c46513c079840b79839mridge			group = self.gList[random.randint(0,len(self.gList)-1)][0]
218618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
219618fd23eb57032b650d30c46513c079840b79839mridge
220618fd23eb57032b650d30c46513c079840b79839mridge		if a == 3:	# deletation
221618fd23eb57032b650d30c46513c079840b79839mridge			user = self.uList[random.randint(0,len(self.uList)-1)]
222618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
22337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
224618fd23eb57032b650d30c46513c079840b79839mridge		if a == 4:	# with group
225618fd23eb57032b650d30c46513c079840b79839mridge			group = self.gList[random.randint(0,len(self.gList)-1)][0]
226618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
22737550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
228618fd23eb57032b650d30c46513c079840b79839mridge		# request on a unexisting group
22937550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman		'''if a == 5:
230618fd23eb57032b650d30c46513c079840b79839mridge			group = self.createOneNameRandomLength(16)
231618fd23eb57032b650d30c46513c079840b79839mridge			print 'setfacl -x g:' + group + " " + path + "/" + file
232618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
23337550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman		if a == 6:
234618fd23eb57032b650d30c46513c079840b79839mridge			user = self.createOneNameRandomLength(16)
235618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
23637550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
237618fd23eb57032b650d30c46513c079840b79839mridge		if a == 7:	# creation/modification
238618fd23eb57032b650d30c46513c079840b79839mridge			user = self.createOneNameRandomLength(16)
239618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
240618fd23eb57032b650d30c46513c079840b79839mridge
241618fd23eb57032b650d30c46513c079840b79839mridge		if a == 8:	# with group
242618fd23eb57032b650d30c46513c079840b79839mridge			group = self.createOneNameRandomLength(16)
243618fd23eb57032b650d30c46513c079840b79839mridge			u = commands.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
244618fd23eb57032b650d30c46513c079840b79839mridge
245618fd23eb57032b650d30c46513c079840b79839mridge		if a == 9:     	#Copying the ACL of one file to another
246618fd23eb57032b650d30c46513c079840b79839mridge			file2 = self.fList[random.randint(0,len(self.fList)-1)]
247618fd23eb57032b650d30c46513c079840b79839mridge              		u = commands.getoutput('getfacl ' + path + "/" + file + "| setfacl --set-file=- " + path + "/" + file2)
248618fd23eb57032b650d30c46513c079840b79839mridge		if u!="":
249618fd23eb57032b650d30c46513c079840b79839mridge			print u'''
25037550cf5a86c7ca7424a2a318dd64e550f13f5dfChris Dearman
251