• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2import subprocess
3import random
4import re
5
6alphabet = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789-_'
7a_length = len(alphabet)
8
9""" ACL support attribute """
10ACL4_SUPPORT_ALLOW_ACL = 0x00000001
11ACL4_SUPPORT_DENY_ACL = 0x00000002
12ACL4_SUPPORT_AUDIT_ACL = 0x00000004
13ACL4_SUPPORT_ALARM_ACL = 0x00000008
14
15class RandomGen(object):
16
17
18	"""  List of ACE possible who fields """
19	ace_who=["OWNER@","GROUP@","EVERYONE@","ANONYMOUS@","AUTHENTICATED@"]
20
21	""" List of GID than can be used to do the tests """
22	gList=[]
23	gListSize = len(gList)
24	uList = []
25	uListSize = len(uList)
26
27	fList=[]
28	fListSize = len(fList)
29
30	""" Create a user in available groups to do the tests """
31	def createUser(self,username):
32		group = self.gList[random.randint(0,len(self.gList)-1)][0]
33		opts = "-g" + group + " -p" + "1pilot" + " -m " + username
34		u = subprocess.getoutput('/usr/sbin/useradd '+ opts)
35		if u != "":
36			print("create user " + username + "failed" + u)
37
38	def createFile(self,path,n):
39		for i in range(n):
40			fName = 'file' + str(i)
41			u = subprocess.getoutput('touch ' + path + '/'+ fName)
42			self.fList.append(fName)
43
44	def createGroup(self, grpname, gid):
45		u = subprocess.getoutput('/usr/sbin/groupadd -g' + gid + " " + grpname)
46		if u != "":
47			print(u)
48
49	def createNGroup(self, n):
50		for i in range(n):
51			gName = 'grp' + str(i)
52			gid = str(500+i)
53			self.createGroup(gName, gid)
54
55
56	""" Random creation of n user """
57	def createNUser(self,n):
58		for i in range(n):
59			userName= "user" + str(i)
60			self.createUser(userName)
61
62	""" clean all users created to do the tests """
63	def cleanUsers(self):
64		for name in self.uList:
65			u = subprocess.getoutput('/usr/sbin/userdel -r '+ name)
66		self.uList = []
67
68	""" clean all users created to do the tests """
69	def cleanGroups(self):
70		for name in self.gList:
71			u = subprocess.getoutput('/usr/sbin/groupdel '+ name[0])
72		self.gList = []
73
74	""" Retrieve the list of user from /etc/passwd file """
75	def getUserList(self):
76		f = open('/etc/passwd','r')
77		lines = f.readlines()
78		for line in lines:
79			splitedline = line.split(':')
80			userName = splitedline[0]
81			gid = splitedline[3]
82		# TO FIX: verify that the group is OK (in the right range)
83			NameOK = re.match("user",userName)
84			# We keep only usernames starting with "user"
85			if NameOK != None:
86				self.uList.append(userName)
87		f.close()
88
89	def getFileList(self,path):
90		u = subprocess.getoutput('ls ' + path)
91		tmp = u.split('\n')
92		for i in range (len(tmp)-1):
93			NameOK = re.match("file",tmp[i])
94			if NameOK != None:
95				self.fList.append(tmp[i])
96
97	def getNUserList(self,nb):
98		f = open('/etc/passwd','r')
99		lines = f.readlines()
100		n = 0
101		for line in lines:
102			splitedline = line.split(':');
103			userName = splitedline[0]
104			gid = splitedline[3]
105		# TO FIX: verify that the group is OK (in the right range)
106			NameOK = re.match("user",userName)
107			# We keep only usernames starting with "user"
108			if NameOK != None:
109				self.uList.append(userName)
110				n = n+1
111			if n==nb:
112				break;
113		f.close()
114
115	""" Get group list """
116	def getGroupList(self):
117		f = open('/etc/group','r')
118		lines = f.readlines()
119		for line in lines:
120			splitedline = line.split(':');
121			groupName = splitedline[0]
122			gid = splitedline[2]
123			NameOK = re.match("grp",groupName)
124			if NameOK != None:
125				self.gList.append([groupName,gid])
126		f.close()
127
128	""" Get a list of n group """
129	def getNGroupList(self,nb):
130		f = open('/etc/group','r')
131		lines = f.readlines()
132		n = 0
133		for line in lines:
134			splitedline = line.split(':');
135			groupName = splitedline[0]
136			gid = splitedline[2]
137			NameOK = re.match("grp",groupName)
138			if NameOK != None:
139				self.gList.append([groupName,gid])
140				n = n+1
141			if n==nb:
142				break;
143		f.close()
144
145	def printUserList(self):
146		print(self.uList)
147
148	def printGroupList(self):
149		print(self.gList)
150
151	""" Create a random name of random length """
152	def createOneNameRandomLength(self,maxlength):
153		outputString =""
154		l=random.randint(0,maxlength)
155		for i in range(l):
156			a = random.randint(0,a_length-1)
157			outputString =outputString  + alphabet[a]
158		return outputString
159
160	""" Create a random name of fixed length """
161	def createOneName(self,lenght):
162		outputString =""
163		for i in range(length):
164			a = random.randint(0,a_length-1)
165			outputString = outputString + alphabet[a]
166		return outputString
167
168	""" Create Random User List with fixed length user names """
169	def createRandomUserList(self,listlength,usernamelength):
170		userlist = []
171		for i in range(listlength):
172			user = createOneName(lenght)
173			userlist.append(user)
174		return userlist
175
176	""" Create Random ACE for a file and a given usr """
177	def createRandomACE(self,user):
178		type = ace_type[random.randint(0,len(ace_type))]
179		flag = ace_flags[random.randint(0,len(ace_flags))]
180		mask = ace_mask[random.randint(0,len(ace_mask))]
181		who = ace_who[random.randint(0,len(ace_who))]
182		return nfsace4(type, flag, mask, who)
183
184	""" Create Random ACL for a file with a fixed number a entries """
185	def createRandomACL(self,acl_size):
186		acl = []
187		userList = uList
188		userListSize = uListSize
189		for i in range(acl_size):
190			n = random.randint(0,userListSize-1)
191			usr = userList.pop(n)
192			newace = createRandomACE(usr)
193			acl.append(newace)
194		return acl
195
196	""" Return a mode string like 'xwr' or 'x' """
197	def createRandomMode(self):
198		out_str = ""
199		while (out_str == ""):
200				if random.randint(0,1) == 1:
201					out_str += 'x'
202				if random.randint(0,1) == 1:
203					out_str += 'w'
204				if random.randint(0,1) == 1:
205					out_str += 'r'
206		return out_str
207
208	""" Create a random ACL operation (delete / remove / modify on user / group ) """
209	def randomOp(self,path):
210		a = random.randint(1,4)
211		mode = self.createRandomMode()
212		file = self.fList[random.randint(0,len(self.fList)-1)]
213		if a == 1:	# creation/modification
214			user = self.uList[random.randint(0,len(self.uList)-1)]
215			u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
216
217		if a == 2:	# with group
218			group = self.gList[random.randint(0,len(self.gList)-1)][0]
219			u = subprocess.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
220
221		if a == 3:	# deletation
222			user = self.uList[random.randint(0,len(self.uList)-1)]
223			u = subprocess.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
224
225		if a == 4:	# with group
226			group = self.gList[random.randint(0,len(self.gList)-1)][0]
227			u = subprocess.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
228
229		# request on a unexisting group
230		'''if a == 5:
231			group = self.createOneNameRandomLength(16)
232			print 'setfacl -x g:' + group + " " + path + "/" + file
233			u = commands.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
234		if a == 6:
235			user = self.createOneNameRandomLength(16)
236			u = commands.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
237
238		if a == 7:	# creation/modification
239			user = self.createOneNameRandomLength(16)
240			u = commands.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
241
242		if a == 8:	# with group
243			group = self.createOneNameRandomLength(16)
244			u = commands.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
245
246		if a == 9:     	#Copying the ACL of one file to another
247			file2 = self.fList[random.randint(0,len(self.fList)-1)]
248              		u = commands.getoutput('getfacl ' + path + "/" + file + "| setfacl --set-file=- " + path + "/" + file2)
249		if u!="":
250			print u'''
251
252