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