252 lines
7.2 KiB
Python
Executable File
252 lines
7.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import subprocess
|
|
import random
|
|
import re
|
|
|
|
alphabet = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789-_'
|
|
a_length = len(alphabet)
|
|
|
|
""" ACL support attribute """
|
|
ACL4_SUPPORT_ALLOW_ACL = 0x00000001
|
|
ACL4_SUPPORT_DENY_ACL = 0x00000002
|
|
ACL4_SUPPORT_AUDIT_ACL = 0x00000004
|
|
ACL4_SUPPORT_ALARM_ACL = 0x00000008
|
|
|
|
class RandomGen(object):
|
|
|
|
|
|
""" List of ACE possible who fields """
|
|
ace_who=["OWNER@","GROUP@","EVERYONE@","ANONYMOUS@","AUTHENTICATED@"]
|
|
|
|
""" List of GID than can be used to do the tests """
|
|
gList=[]
|
|
gListSize = len(gList)
|
|
uList = []
|
|
uListSize = len(uList)
|
|
|
|
fList=[]
|
|
fListSize = len(fList)
|
|
|
|
""" Create a user in available groups to do the tests """
|
|
def createUser(self,username):
|
|
group = self.gList[random.randint(0,len(self.gList)-1)][0]
|
|
opts = "-g" + group + " -p" + "1pilot" + " -m " + username
|
|
u = subprocess.getoutput('/usr/sbin/useradd '+ opts)
|
|
if u != "":
|
|
print("create user " + username + "failed" + u)
|
|
|
|
def createFile(self,path,n):
|
|
for i in range(n):
|
|
fName = 'file' + str(i)
|
|
u = subprocess.getoutput('touch ' + path + '/'+ fName)
|
|
self.fList.append(fName)
|
|
|
|
def createGroup(self, grpname, gid):
|
|
u = subprocess.getoutput('/usr/sbin/groupadd -g' + gid + " " + grpname)
|
|
if u != "":
|
|
print(u)
|
|
|
|
def createNGroup(self, n):
|
|
for i in range(n):
|
|
gName = 'grp' + str(i)
|
|
gid = str(500+i)
|
|
self.createGroup(gName, gid)
|
|
|
|
|
|
""" Random creation of n user """
|
|
def createNUser(self,n):
|
|
for i in range(n):
|
|
userName= "user" + str(i)
|
|
self.createUser(userName)
|
|
|
|
""" clean all users created to do the tests """
|
|
def cleanUsers(self):
|
|
for name in self.uList:
|
|
u = subprocess.getoutput('/usr/sbin/userdel -r '+ name)
|
|
self.uList = []
|
|
|
|
""" clean all users created to do the tests """
|
|
def cleanGroups(self):
|
|
for name in self.gList:
|
|
u = subprocess.getoutput('/usr/sbin/groupdel '+ name[0])
|
|
self.gList = []
|
|
|
|
""" Retrieve the list of user from /etc/passwd file """
|
|
def getUserList(self):
|
|
f = open('/etc/passwd','r')
|
|
lines = f.readlines()
|
|
for line in lines:
|
|
splitedline = line.split(':')
|
|
userName = splitedline[0]
|
|
gid = splitedline[3]
|
|
# TO FIX: verify that the group is OK (in the right range)
|
|
NameOK = re.match("user",userName)
|
|
# We keep only usernames starting with "user"
|
|
if NameOK != None:
|
|
self.uList.append(userName)
|
|
f.close()
|
|
|
|
def getFileList(self,path):
|
|
u = subprocess.getoutput('ls ' + path)
|
|
tmp = u.split('\n')
|
|
for i in range (len(tmp)-1):
|
|
NameOK = re.match("file",tmp[i])
|
|
if NameOK != None:
|
|
self.fList.append(tmp[i])
|
|
|
|
def getNUserList(self,nb):
|
|
f = open('/etc/passwd','r')
|
|
lines = f.readlines()
|
|
n = 0
|
|
for line in lines:
|
|
splitedline = line.split(':');
|
|
userName = splitedline[0]
|
|
gid = splitedline[3]
|
|
# TO FIX: verify that the group is OK (in the right range)
|
|
NameOK = re.match("user",userName)
|
|
# We keep only usernames starting with "user"
|
|
if NameOK != None:
|
|
self.uList.append(userName)
|
|
n = n+1
|
|
if n==nb:
|
|
break;
|
|
f.close()
|
|
|
|
""" Get group list """
|
|
def getGroupList(self):
|
|
f = open('/etc/group','r')
|
|
lines = f.readlines()
|
|
for line in lines:
|
|
splitedline = line.split(':');
|
|
groupName = splitedline[0]
|
|
gid = splitedline[2]
|
|
NameOK = re.match("grp",groupName)
|
|
if NameOK != None:
|
|
self.gList.append([groupName,gid])
|
|
f.close()
|
|
|
|
""" Get a list of n group """
|
|
def getNGroupList(self,nb):
|
|
f = open('/etc/group','r')
|
|
lines = f.readlines()
|
|
n = 0
|
|
for line in lines:
|
|
splitedline = line.split(':');
|
|
groupName = splitedline[0]
|
|
gid = splitedline[2]
|
|
NameOK = re.match("grp",groupName)
|
|
if NameOK != None:
|
|
self.gList.append([groupName,gid])
|
|
n = n+1
|
|
if n==nb:
|
|
break;
|
|
f.close()
|
|
|
|
def printUserList(self):
|
|
print(self.uList)
|
|
|
|
def printGroupList(self):
|
|
print(self.gList)
|
|
|
|
""" Create a random name of random length """
|
|
def createOneNameRandomLength(self,maxlength):
|
|
outputString =""
|
|
l=random.randint(0,maxlength)
|
|
for i in range(l):
|
|
a = random.randint(0,a_length-1)
|
|
outputString =outputString + alphabet[a]
|
|
return outputString
|
|
|
|
""" Create a random name of fixed length """
|
|
def createOneName(self,lenght):
|
|
outputString =""
|
|
for i in range(length):
|
|
a = random.randint(0,a_length-1)
|
|
outputString = outputString + alphabet[a]
|
|
return outputString
|
|
|
|
""" Create Random User List with fixed length user names """
|
|
def createRandomUserList(self,listlength,usernamelength):
|
|
userlist = []
|
|
for i in range(listlength):
|
|
user = createOneName(lenght)
|
|
userlist.append(user)
|
|
return userlist
|
|
|
|
""" Create Random ACE for a file and a given usr """
|
|
def createRandomACE(self,user):
|
|
type = ace_type[random.randint(0,len(ace_type))]
|
|
flag = ace_flags[random.randint(0,len(ace_flags))]
|
|
mask = ace_mask[random.randint(0,len(ace_mask))]
|
|
who = ace_who[random.randint(0,len(ace_who))]
|
|
return nfsace4(type, flag, mask, who)
|
|
|
|
""" Create Random ACL for a file with a fixed number a entries """
|
|
def createRandomACL(self,acl_size):
|
|
acl = []
|
|
userList = uList
|
|
userListSize = uListSize
|
|
for i in range(acl_size):
|
|
n = random.randint(0,userListSize-1)
|
|
usr = userList.pop(n)
|
|
newace = createRandomACE(usr)
|
|
acl.append(newace)
|
|
return acl
|
|
|
|
""" Return a mode string like 'xwr' or 'x' """
|
|
def createRandomMode(self):
|
|
out_str = ""
|
|
while (out_str == ""):
|
|
if random.randint(0,1) == 1:
|
|
out_str += 'x'
|
|
if random.randint(0,1) == 1:
|
|
out_str += 'w'
|
|
if random.randint(0,1) == 1:
|
|
out_str += 'r'
|
|
return out_str
|
|
|
|
""" Create a random ACL operation (delete / remove / modify on user / group ) """
|
|
def randomOp(self,path):
|
|
a = random.randint(1,4)
|
|
mode = self.createRandomMode()
|
|
file = self.fList[random.randint(0,len(self.fList)-1)]
|
|
if a == 1: # creation/modification
|
|
user = self.uList[random.randint(0,len(self.uList)-1)]
|
|
u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
|
|
|
|
if a == 2: # with group
|
|
group = self.gList[random.randint(0,len(self.gList)-1)][0]
|
|
u = subprocess.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
|
|
|
|
if a == 3: # deletation
|
|
user = self.uList[random.randint(0,len(self.uList)-1)]
|
|
u = subprocess.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
|
|
|
|
if a == 4: # with group
|
|
group = self.gList[random.randint(0,len(self.gList)-1)][0]
|
|
u = subprocess.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
|
|
|
|
# request on a unexisting group
|
|
'''if a == 5:
|
|
group = self.createOneNameRandomLength(16)
|
|
print 'setfacl -x g:' + group + " " + path + "/" + file
|
|
u = commands.getoutput('setfacl -x g:' + group + " " + path + "/" + file)
|
|
if a == 6:
|
|
user = self.createOneNameRandomLength(16)
|
|
u = commands.getoutput('setfacl -x u:' + user + " " + path + "/" + file)
|
|
|
|
if a == 7: # creation/modification
|
|
user = self.createOneNameRandomLength(16)
|
|
u = commands.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + file)
|
|
|
|
if a == 8: # with group
|
|
group = self.createOneNameRandomLength(16)
|
|
u = commands.getoutput('setfacl -m g:' + group + ':' + mode + " " + path + "/" + file)
|
|
|
|
if a == 9: #Copying the ACL of one file to another
|
|
file2 = self.fList[random.randint(0,len(self.fList)-1)]
|
|
u = commands.getoutput('getfacl ' + path + "/" + file + "| setfacl --set-file=- " + path + "/" + file2)
|
|
if u!="":
|
|
print u'''
|
|
|