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