@@ -17,8 +17,6 @@
/nfs/nfs_stress/nfs05_make_tree
/nfs/nfslock01/nfs_flock
/nfs/nfslock01/nfs_flock_dgen
-/nfsv4/acl/acl1
-/nfsv4/locks/locktests
/rpc/basic_tests/rpc01/rpc1
/rpc/basic_tests/rpc01/rpc_server
/sctp/sctp_big_chunk
deleted file mode 100644
@@ -1,26 +0,0 @@
-#
-# network/nfsv4 test suite Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, July 2009
-#
-
-top_srcdir ?= ../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-include $(top_srcdir)/include/mk/generic_trunk_target.mk
deleted file mode 100644
@@ -1,29 +0,0 @@
-#
-# network/nfsv4/acl testcases Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, September 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-
-LDLIBS += $(ACL_LIBS)
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
deleted file mode 100644
@@ -1,21 +0,0 @@
-ACL testing
-Aurélien Charbon - Bull SA
-
-# GOAL :
-Testing ACL conformance, ACL limits, and ACL robustness
-
-# REQUIREMENTS :
-ACL support must be present on the remote host
-attr and acl packages must be install for the stestsuite to build/run.
-This testsuite is not built by the default make in the LTP root directory
-
-acl1: verify the conformance ok access regarding the ACL of files and directory.
-stress: multiprocess application to stress the ACL
-
-setacl_stress.py: python script that does lots of setfacl function
-
-test_long_acl.py: try to "build" ACLs of different length. Stop when the specified maximum length is reached.
-
-To run the test:
-make (builds the binaries)
-./runtest (executes the sequence of tests)
deleted file mode 100644
@@ -1,373 +0,0 @@
-/*
- * Aurélien Charbon - Bull SA
- * ACL testing basic program
- * Purpose: setting an acl on a file a verifies that the accesses are right
- */
-
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "config.h"
-#include "tst_res_flags.h"
-
-#ifdef HAVE_LIBACL
-
-#include <sys/acl.h>
-
-#define OP_READ 0x1
-#define OP_WRITE 0x2
-#define OP_EXEC 0x4
-
-acl_t testacl;
-/* the "typical" acl used for the test */
-
-static char *permtab[] =
- { "---", "r--", "-w-", "rw-", "--x", "r-x", "-wx", "rwx" };
-
-struct statstore {
- /* number of passed tests */
- int ok;
- /* number of failed tests */
- int failed;
-} aclstat;
-
-int do_file_op(char *filename)
-{
- int exe;
- int result;
- uid_t uid;
- result = 0;
- FILE *fptr;
- char str[256] = "./";
-
- uid = geteuid();
- strcat(str, filename);
-
- exe = execl(str, NULL, NULL);
- if (exe == -1 && errno != EACCES)
- result = result + OP_EXEC;
-
- fptr = fopen(filename, "r");
- if (fptr != NULL) {
- result = result + OP_READ;
- fclose(fptr);
- }
-
- fptr = fopen(filename, "r+");
- if (fptr != NULL) {
- result = result + OP_WRITE;
- fclose(fptr);
- }
-
- return result;
-}
-
-/* acl with user entries used for the test */
-acl_t test_acl_user_create(void)
-{
- char acl_text[] =
- "u::rwx,u:user1:rwx,u:user2:rw-,u:user3:r--,u:user4:r-x,u:user5:---,g::r-x,o::r-x,m::rwx";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-/* acl with group entries used for the test */
-
-acl_t test_acl_grp_create(void)
-{
- char acl_text[] =
- "u::rwx,g:grp1:rwx,g:grp2:rw-,g:grp3:r--,g:grp4:r-x,g:grp5:---,g::---,o::r-x,m::rwx";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-acl_t test_acl_default_create(void)
-{
- char acl_text[] =
- "u::rwx,u:user1:rwx,u:user2:rw-,u:user3:r--,u:user4:r-x,u:user5:---,g::r-x,m::rwx,o::r-x";
- acl_t acl;
- acl = acl_from_text(acl_text);
- return acl;
-}
-
-static void report(testnum, expected, result, fail)
-int testnum; /* test number */
-int expected; /* expected result */
-int result; /* actual result */
-int fail; /* fail or warning */
-{
- char *res;
- if (expected == result) {
- res = "[OK]";
- aclstat.ok++;
- } else {
- res = "[FAILED]";
- aclstat.failed++;
- }
- printf("\ttest #%d - Expected: %s - Obtained: %s - %s\n", testnum,
- permtab[expected], permtab[result], res);
-
- fflush(stdout);
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-static void test1(char *file)
-{
- int result;
- if (seteuid((uid_t) 601) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE || OP_EXEC */
- report(1, OP_READ + OP_WRITE + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testgroup
- * - try to read with test user
- * - try to write with test user
- *
- */
-
-static void test2(char *file)
-{
- int result;
- if (seteuid((uid_t) 602) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE */
- report(2, OP_READ + OP_WRITE, result);
- seteuid((uid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-
-static void test3(char *file)
-{
- int result;
- if (seteuid((uid_t) 603) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ */
- report(3, OP_READ, result);
- seteuid((uid_t) 0);
- }
-}
-
-/*
- * set read-write acl on the file for the testuser
- * - try to read
- * - try to write
- */
-
-static void test4(char *file)
-{
- int result;
- if (seteuid((uid_t) 604) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_EXEC */
- report(4, OP_READ + OP_EXEC, result);
- seteuid((uid_t) 0);
- }
-}
-
-static void test5(char *file)
-{
- int result;
- if (seteuid((uid_t) 605) == 0) {
- result = do_file_op(file);
- /* expected result = 0x0 */
- report(5, 0x00, result);
- seteuid((uid_t) 0);
- }
-}
-
-static void testgrp1(char *file)
-{
- int result;
- if (setegid((gid_t) 601) == 0) {
- if (seteuid((uid_t) 601) == 0) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE || OP_EXEC */
- report(1, OP_READ + OP_WRITE + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
- }
-}
-
-/*
- * set acl in order the file is only readable for the testgroup
- * - try to read with test user
- * - try to write with test user
- *
- */
-
-static void testgrp2(char *file)
-{
- int result;
- if ((setegid((gid_t) 602) == 0) && (seteuid((uid_t) 602) == 0)) {
- result = do_file_op(file);
- /* expected result = OP_READ || OP_WRITE */
- report(2, OP_READ + OP_WRITE, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set acl in order the file is only readable for the testuser
- * - try to read
- * - try to write
- */
-
-static void testgrp3(char *file)
-{
- int result;
- if ((setegid((gid_t) 603) == 0) && (seteuid((uid_t) 603) == 0)) {
- result = do_file_op(file);
- /* expected result = OP_READ */
- report(3, OP_READ, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/*
- * set read-write acl on the file for the testuser
- * - try to read
- * - try to write
- */
-
-static void testgrp4(char *file)
-{
- int result;
- if (setegid((gid_t) 604) == 0) {
- if (seteuid((uid_t) 604) == 0)
- result = do_file_op(file);
- /* expected result = OP_READ || OP_EXEC */
- report(4, OP_READ + OP_EXEC, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-static void testgrp5(char *file)
-{
- int result;
- if (setegid((gid_t) 605) == 0) {
- if (seteuid((uid_t) 605) == 0)
- result = do_file_op(file);
- /* expected result = 0x0 */
- report(5, 0x00, result);
- seteuid((uid_t) 0);
- setegid((gid_t) 0);
- }
-}
-
-/* testing default acl */
-void test_acl_default(char *dir, acl_t acl)
-{
- /* set default acl on directory */
- /* create a file in this directory */
- /* compare the file's acl and the parent directory's one */
- int res;
- acl_t acl1, acl2;
-
- res = acl_set_file(dir, ACL_TYPE_DEFAULT, acl);
- acl1 = acl_get_file(dir, ACL_TYPE_DEFAULT);
- if (res == -1)
- printf("path = %s **** errno = %d", dir, errno);
- char *path = strcat(dir, "/testfile");
- fopen(path, "w+");
- char *cmd = malloc(256);
-
- strcpy(cmd, "chmod 7777 ");
- printf(cmd, NULL);
- strcat(cmd, dir);
- system(cmd);
- acl2 = acl_get_file(path, ACL_TYPE_ACCESS);
-
- test1(path);
- test2(path);
- test3(path);
- test4(path);
- test5(path);
-}
-
-static void showstats(void)
-{
- printf("\nACL TESTS RESULTS: %d passed, %d failed\n\n", aclstat.ok,
- aclstat.failed);
-}
-
-int main(int argc, char *argv[])
-{
- int result;
- aclstat.ok = 0;
- aclstat.failed = 0;
- acl_t testacl;
- printf("Test acl with entries on users\n");
- testacl = test_acl_user_create();
-
- /* set the right acl for the test */
- result = acl_set_file(argv[1], ACL_TYPE_ACCESS, testacl);
- if (result == -1) {
- printf("setting acl on file %s failed\nBad NFS configuration",
- argv[1]);
- exit(1);
- }
- test1(argv[1]);
- test2(argv[1]);
- test3(argv[1]);
- test4(argv[1]);
- test5(argv[1]);
- acl_free(testacl);
- printf("\nTest of default acl:\n");
-
- testacl = test_acl_default_create();
- test_acl_default(argv[2], testacl);
-
- printf("\nTest acl with entries concerning groups\n");
- testacl = test_acl_grp_create();
- result = acl_set_file(argv[1], ACL_TYPE_ACCESS, testacl);
- if (result == -1)
- printf("setting acl on file %s failed\n", argv[1]);
-
- testgrp1(argv[1]);
- testgrp2(argv[1]);
- testgrp3(argv[1]);
- testgrp4(argv[1]);
- testgrp5(argv[1]);
-
- acl_free(testacl);
-
- showstats();
- return 1;
-}
-#else
-int main(void)
-{
- printf("The acl library was missing upon compilation.\n");
- return TCONF;
-}
-#endif /* HAVE_LIBACL */
deleted file mode 100755
@@ -1,10 +0,0 @@
-#!/usr/bin/env python3
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-test = RandomGen()
-test.getGroupList()
-test.cleanGroups()
deleted file mode 100755
@@ -1,12 +0,0 @@
-#!/usr/bin/env python3
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-test = RandomGen()
-test.getUserList()
-test.getGroupList()
-test.cleanUsers()
-test.cleanGroups()
deleted file mode 100755
@@ -1,21 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-
-from random_gen import *
-from optparse import OptionParser
-
-parser = OptionParser()
-parser.add_option("-u", "--users", dest="nu",type="int",help="number of users to create")
-parser.add_option("-g", "--group",dest="ng",type="int",help="number of groups to create")
-
-(options, args) = parser.parse_args()
-
-''' Measuring time to add an ACE to a list regarding the number of ACE already in the list'''
-''' Doing the measurement on 100 files '''
-test=RandomGen()
-test.createNGroup(options.ng)
-test.getGroupList()
-test.createNUser(options.nu)
deleted file mode 100755
@@ -1,251 +0,0 @@
-#!/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'''
-
deleted file mode 100755
@@ -1,70 +0,0 @@
-#!/bin/sh
-#
-# @(#)runtests
-#
-# runtests script for ACL testing
-REMOTEHOST=nfsserver
-MAXLENGTH=30 # maximum ACL length - NB: the current NFSv4 acl implementation does not allow ACL greater than one page (about 35 entries with 6 character user name length and 10 character domain name)
-NFSMNTDIR=/mnt/nfs-acl
-echo "Test on NFS server $REMOTEHOST"
-ACLTESTDIR=testdir
-ACLTESTFILE=testfile
-
-USER_NB=20 # total number of users to create
-GRP_NB=20 # total number of groups to create
-FILE_NB=10 # total number of files for the test
-
-# creation of users on the local machine
-for i in 1 2 3 4 5
-do
- groupadd -g 60$i grp$i
- useradd -u 60$i user$i
-done
-
-# creation of users on the remote machine (removed only at the end of the tests)
-rsh -n $REMOTEHOST python3 $PWD/create_users.py -u 50 -g 50
-
-echo "Starting ACL testing"
-
-echo "Starting BASIC tests"
-
-echo "Creating testing file and directory"
-touch $NFSMNTDIR/$ACLTESTFILE
-mkdir $NFSMNTDIR/$ACLTESTDIR
-if test ! -d $NFSMNTDIR/$ACLTESTDIR
-then
- echo "Can't make directory $ACLTESTDIR"
- exit 1
-fi
-
-# File and Directory tree creation test
-echo "Execute acl1 $NFSMNTDIR/$ACLTESTFILE $NFSMNTDIR/$ACLTESTDIR"
-./acl1 $NFSMNTDIR/$ACLTESTFILE $NFSMNTDIR/$ACLTESTDIR
-#./stress $ACLTESTFILE
-for i in 1 2 3 4 5
- do
- userdel user$i
- groupdel grp$i
- done
-
-echo "Basic tests finished"
-
-echo "LONG ACL TEST"
-echo "creating necessary users and groups"
-python3 create_users.py -u 50 -g 50
-echo "creating necessary users and groups on the remote host"
-mkdir $NFSMNTDIR/lacl-testdir
-python3 test_long_acl.py -l $MAXLENGTH -p $NFSMNTDIR/lacl-testdir
-rm -rf $NFSMNTDIR/lacl-testdir
-echo "Long ACL test OK with $MAXLENGTH entries"
-echo "ACL STRESSING TEST"
-python3 setacl_stress.py -n 100 -u $USER_NB -g $GRP_NB -f $FILE_NB -p $NFSMNTDIR
-
-# remove local an remote users
-python3 cleanusers.py
-python3 cleangroups.py
-rsh -n $REMOTEHOST python3 $PWD/cleanusers.py
-
-echo "Test OK"
-
-exit 0
deleted file mode 100755
@@ -1,32 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists stressing script
- To lauch on the first client
- Aurelien Charbon - Bull SA
-'''
-
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-()'
-t_alphabet=len(alphabet)
-
-test = RandomGen()
-
-parser = OptionParser()
-parser.set_defaults(nbfiles=5,nbusers=5,nbgroups=5,nloop=100 )
-parser.add_option("-n","--nloop", dest="nloop",type="int", help="number of loop to do in the test")
-parser.add_option("-p", "--path", dest="path",help="path on which the test is executed")
-parser.add_option("-f", "--nbfiles", dest="nbfiles",type="int",help="nb of files to do the test (default=5)")
-parser.add_option("-u", "--nbusers", dest="nbusers",type="int",help="nb of users (default=5)")
-parser.add_option("-g", "--nbgrp", dest="nbgroups",type="int",help="nb of groups (default=5)")
-(options, args) = parser.parse_args()
-
-test.createFile(options.path,options.nbfiles)
-test.getNUserList(options.nbusers)
-test.getNGroupList(options.nbgroups)
-for i in range (options.nloop):
- test.randomOp(options.path)
deleted file mode 100755
@@ -1,122 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-from random_gen import *
-import subprocess
-import os
-import threading
-import time
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-() ~'
-t_alphabet=len(alphabet)
-
-def test_acl_default(path):
-
-# set default acl on the test directory
- u = subprocess.getoutput('mkdir ' + path + "/" + testdir)
- u = subprocess.getoutput('getfacl ' + path + "/" + testdir)
- acl=[]
- for i in range (len(splitedresult)-1):
- splitedline = splitedresult[i].split('::')
- name = splitedline[0]
- entry = splitedline[1]
- acl.append(name,entry)
-# create a file in this directory
- u = subprocess.getoutput('touch ' + path + "/" + testdir + testfile)
-# get the file's ACL and verify
- u = subprocess.getoutput('getfacl ' + path + "/" + testdir + testfile)
- splitedresult = u.split('\n')
- acl2=[]
- for i in range (len(splitedresult)-1):
- splitedline = splitedresult[i].split('::')
- name = splitedline[0]
- entry = splitedline[1]
- acl2.append(name,entry)
-
- result_final = True
- while i < len(acl2):
- result = False
- while j < len(acl2) and result == False:
- if acl2[i] == acl[j]:
- result = True
- if result == False:
- result_final = False
-
-''' Measuring time to add an ACE to a list regarding the number of ACE already in the list'''
-''' Doing the measurement on 100 files '''
-def test_acl_long():
- path = '/mnt/nfs/test-acl'
- test = RandomGen()
- test.createFile(path,100)
- test.getUserList()
- t0=time.time()
- for test_file in test.fList:
- for user in test.uList:
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + test_file)
- t1=time.time()
- print(t1-t0)
-
-def test_nfs_acl():
- print("test acl 10000\n")
- test = RandomGen()
- f = open('/tmp/acl-result-10000','w')
- path = '/mnt/nfs/test-acl'
- for i in range(10000):
- print("test avec " + str(i) + " ACE")
- test.getUserList()
- testfile = 'testfile' + str(i)
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- t0=time.time()
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
- t1=time.time()
- f.write(str(i) + "\t" + str(t1-t0)+"\n")
- f.close()
-
-
-def test_nfs_getfacl():
- # mesures sur le getfacl
- test = RandomGen()
-
- path = '/mnt/nfs/test-acl' # NFS mounted directory
- u = subprocess.getoutput('rm ' + path + "/*") # clean directory
- print("test acl getfacl\n")
- f = open('/tmp/acl-result-getfacl','w')
- for i in range(37):
-
- test.getUserList()
- testfile = 'testfile' + str(i)
-
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- print("setfacl " + str(i) + " " + u)
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
-
- t1=time.time()
- u = subprocess.getoutput('getfacl ' + path + "/" + testfile)
- print("getfacl - " + str(i) + u + "\n")
- t2=time.time()
- f.write(str(i) + "\t" + str(t2-t1)+"\n")
- f.close()
-
-
-def main():
- # test getFileList
- path = '/mnt/nfs/test-acl'
- test = RandomGen()
- test.getFileList(path)
- print(test.fList)
-main()
-
-
-
-
-
deleted file mode 100755
@@ -1,44 +0,0 @@
-#!/usr/bin/env python3
-'''
- Access Control Lists testing based on newpynfs framework
- Aurelien Charbon - Bull SA
-'''
-from random_gen import *
-from optparse import OptionParser
-import subprocess
-import os
-import threading
-import time
-import random
-
-alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789_-() ~'
-t_alphabet=len(alphabet)
-
-
-
-def test_longacl(l,path):
- # mesures sur le getfacl
- test = RandomGen()
-
- u = subprocess.getoutput('rm ' + path + "/*") # clean directory
- print("test acl getfacl\n")
- for i in range(l):
- test.getUserList()
- testfile = 'testfile' + str(i)
- u = subprocess.getoutput('touch ' + path + "/" + testfile)
- print("setfacl with " + str(i) + " entries\n " + u)
- for j in range(i):
- user = test.uList.pop()
- mode = test.createRandomMode()
- u = subprocess.getoutput('setfacl -m u:' + user + ':' + mode + " " + path + "/" + testfile)
- if u != "":
- print("setfacl -m u:" + user + ':' + mode + " " + path + "/" + testfile)
- print(u)
-def main():
- parser = OptionParser()
- parser.add_option("-l", "--length", dest="length",type="int",help="max lentgh of ACL")
- parser.add_option("-p", "--path", dest="path",help="path of test file")
- (options, args) = parser.parse_args()
- test_longacl(options.length,options.path)
-main()
-
deleted file mode 100644
@@ -1,33 +0,0 @@
-#
-# network/nfsv4/locks testcases Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Ngie Cooper, July 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/testcases.mk
-
-MAKE_TARGETS := locktests
-
-LDLIBS += -lpthread
-
-$(MAKE_TARGETS): $(patsubst $(abs_srcdir)/%.c,%.o,$(wildcard $(abs_srcdir)/*.c))
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
deleted file mode 100644
@@ -1,169 +0,0 @@
-COMPILE : make
-RUN LOCAL: ./locktests -n <number of concurent process> -f <test file> [-T]
-
-
-GOAL : This test is aimed at stressing the fcntl locking functions.
-A master process sets a lock on a file region (byte range locking).
-Several slave processes try to perform operations on this region, such
-as: read, write, set a new lock ...
-The expected results of these operations are known.
-If the operation's result is the same as the expected one, the test
-succeeds, otherwise it fails.
-
-
-HISTORY : This program was been written to stress NFSv4 locks.
-
-Slaves are concurrent processes or threads.
--n <num> : Number of threads to use (mandatory).
--f <file> : Run the test on a test file defined by the -f option (mandatory).
--T : Use threads instead of processes (optional).
-
-
-
-* RUN NETWORK *
-
-Test server:
-./locktests -n <number of concurent processes> -f <test file> -c <number of clients>
-
-Test clients:
-./locktests --server <server host name>
-
-
-Multiple clients options
-_______________________
-
-These options have been developed to test NFSv4 locking when multiple
-clients try to use the same file. It uses a test server and several test
-clients.
-
- --------------
- | |
- | NFS SERVER |
- | |
- --------------
- |
- |
- -----------------------------------------------
- | | |
- | | |
- ------------------ ------------------- ------------------
- | NFS Client 1 | | NFS Client 1 | | NFS Client 1 |
- | running | | running | | running |
- | a CLIENT TEST | | the SERVER TEST | | a CLIENT TEST |
- ------------------ ------------------- ------------------
-
-See the DEPLOY file to know how to configure client test on each client.
-
-Server options are:
-
--n <num> : Number of threads to use (mandatory).
--f <file> : Run the test on given test file defined by the -f option (mandatory).
--c <num> : Number of clients to connect before starting the tests.
-
-
-Client options
-______________
---server <server hostname>
-
-
-* EXAMPLES *
-============
-
-Local testing:
-./locktests -n 50 -f /file/system/to/test
-
-Multiple clients:
--on the test server (called host1):
- ./locktest -n 50 -f /network/file/system/to/test -c 3
- (Server waiting for 3 clients to be connected)
-
--test clients:
- ./locktest --server host1
-
-
-HOW TO UNDERSTAND TEST RESULTS
-==============================
-Ten tests are performed:
- 1. WRITE ON A READ LOCK
- 2. WRITE ON A WRITE LOCK
- 3. READ ON A READ LOCK
- 4. READ ON A WRITE LOCK
- 5. SET A READ LOCK ON A READ LOCK
- 6. SET A WRITE LOCK ON A WRITE LOCK
- 7. SET A WRITE LOCK ON A READ LOCK
- 8. SET A READ LOCK ON A WRITE LOCK
- 9. READ LOCK THE WHOLE FILE BYTE BY BYTE
- 10. WRITE LOCK THE WHOLE FILE BYTE BY BYTE
-
-
-For each test, the MASTER process takes a lock (READ/WRITE LOCK) and
-the SLAVE processes try to perform the following operations on the
-locked section:
-
- - WRITE
- - READ
- - SET A WRITE LOCK
- - SET A WRITE LOCK
-
-If a slave process performs its test operation without error it prints
-"=", otherwise it prints "x".
-
-An operation performed "without error" means:
-
- - The operation (write, read, fcntl ...) returns no error code, and
- - errno is not changed.
-
-However, "the slave performs its test operation without error" does NOT
-mean the "result is correct". For example, a slave process is NOT
-allowed to set a READ LOCK on an already-set WRITE LOCK. When such
-operations are performed, the correct and expected result is that the
-tested function returns the EAGAIN error code.
-
-When all tests have been processed, the result of each process for each
-test is compared with the table of expected results, and a new table is
-displayed:
-
-For example:
- 200 processes of 200 successfully ran test : READ ON A READ LOCK
- 200 processes of 200 successfully ran test : SET A READ LOCK ON A WRITE LOCK
-
-This result lists the process/thread both on local and remote machines.
-
-Note that the testing locks with thread on multiple clients is disabled
-because it does not make sense: 2 different clients obviously run at
-least 2 different processes (thread information cannot be shared
-between this thread over the network).
-
-EXPECTED RESULTS
-================
-Here is the table of expected results, depending on :
- - Slave test operations (READ, WRITE, SET A WRITE LOCK ... )
- - Master Operation (SET A READ/A WRITE LOCK )
- - Slave types (Processes, threads)
- - Locking profile (POSIX locking, Mandatory locking)
-
-
-================================================================================================
- | Master process/thread |
-===================================|===========================================================|
-Slave type | Test operation | advisory locking | mandatory locking |
-___________________________________|______________________________|____________________________|
- | | read lock write lock | read lock write lock |
-___________________________________|______________________________|____________________________|
-thread | set a read lock | Allowed Allowed | Allowed Allowed |
- | set a write lock | Allowed Allowed | Allowed Allowed |
- | read | Allowed Allowed | Allowed Allowed |
- | write | Allowed Allowed | Allowed Allowed |
-===================================+==============================+============================|
-process | set a read lock | Allowed Denied | Allowed Denied |
- | set a write lock | Denied Denied | Denied Denied |
- | read | Allowed Allowed | Denied Allowed |
- | write | Allowed Allowed | Denied Denied |
-================================================================================================
-
-
-**************
-Bull SA - 2006 - http://nfsv4.bullopensource.org
-Tony Reix: tony.reix@bull.net
-Aurélien Charbon: aurelien.charbon@ext bull.net
-**************
deleted file mode 100644
@@ -1,3 +0,0 @@
-* 08/02/06 copyediting (bryce)
-* 03/01/06 remove unicode and translate comments in english.
-* 21/12/05 free alocated memory before exiting
deleted file mode 100644
GIT binary patch
literal 0
HcmV?d00001
literal 12354
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
deleted file mode 100644
@@ -1,37 +0,0 @@
-locktest.py script aims to help deploying and running locktests over multiple NFS
-clients accessing the same server.
-
-The source code of NFS client test is in ./deploy/locktests.tar.gz
-
-Setting up lock test with several test machines.
-================================================
-./locktests.py --setup -c <machine1> [machine2 ...] -s <my_nfs_server>:</>
-
---setup : Option to setup the test
--c <machine> [...] : Setup test on these clients
--s <server>:<mountpoint> : NFS server to use, followed by full directory to mount
-
-
-Example:
-./locktests.py --setup -c client1 client2 client3 -s NFS_Server:/exported/directory
-
-
-Running lock test over several test machines.
-=============================================
-Run test on already configured test machines.
-./locktests.py -n <pid> -f <file> -c <machine1> [machine2 ...]
-
--n <process_id> : Process number each test machine will lauch to perform the test
--f <file> : Test file. That must be the same on each machine
--c <machine> [...] : Clients. run tests from this clients
-
-
-Example:
-./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2
-
-
-
-_________________________________
- Vincent ROQUETA - Bull SA - 2005
- vincent.roqueta@ext.bull.net
-
deleted file mode 100644
@@ -1,1034 +0,0 @@
-/* *************************************************
- * *********** README ******************************
- * *************************************************
- *
- * COMPILE : make
- * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
- *
- * GOAL : This test tries to stress the fcntl locking functions. A
- * master process sets a lock on a file region (this is called "byte
- * range locking"). Some slave processes try to perform operations on
- * this region, such as read, write, set a new lock ... The expected
- * results of these operations are known. If the operation result is
- * the same as the expected one, the test suceeds, else it fails.
- *
- *
- *
- * Slaves are concurent processes or thread.
- * -n <num> : Number of threads to use (mandatory).
- * -f <file> : Run the test on given test file defined by the -f option (mandatory).
- * -c <num> : Number of clients to connect before starting the tests.
- *
- * HISTORY : This program was written to stress NFSv4 locks.
- * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
- *
- *
- * Vincent ROQUETA 2005 - vincent.roqueta@ext.bull.net
- * BULL S.A.
- */
-
-#include "locktests.h"
-
-int MAXLEN = 64;
-int MAXTEST = 10;
-extern int maxClients;
-extern int fdServer;
-
-char message[M_SIZE];
-int slaveReader;
-int masterReader;
-int slaveWriter;
-
-/* Which lock will be applied by the master process on test startup */
-int LIST_LOCKS[] = { READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- READLOCK, WRITELOCK,
- BYTELOCK_READ, BYTELOCK_WRITE
-};
-
-/* The operations the slave processes will try to perform */
-int LIST_TESTS[] = { WRONLY, WRONLY,
- RDONLY, RDONLY,
- READLOCK, WRITELOCK,
- WRITELOCK, READLOCK,
- BYTELOCK_READ, BYTELOCK_WRITE
-};
-
-/* List of test names */
-char *LIST_NAMES_TESTS[] = { "WRITE ON A READ LOCK",
- "WRITE ON A WRITE LOCK",
- "READ ON A READ LOCK",
- "READ ON A WRITE LOCK",
- "SET A READ LOCK ON A READ LOCK",
- "SET A WRITE LOCK ON A WRITE LOCK",
- "SET A WRITE LOCK ON A READ LOCK",
- "SET A READ LOCK ON A WRITE LOCK",
- "READ LOCK THE WHOLE FILE BYTE BY BYTE",
- "WRITE LOCK THE WHOLE FILE BYTE BY BYTE"
-};
-
-/* List of expected test results, when slaves are processes */
-int LIST_RESULTS_PROCESS[] = { SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, ECHEC,
- ECHEC, ECHEC,
- SUCCES, SUCCES
-};
-
-/* List of expected test results, when slaves are threads */
-int LIST_RESULTS_THREADS[] = { SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, SUCCES,
- SUCCES, SUCCES,
- ECHEC, ECHEC
-};
-
-int *LIST_RESULTS = NULL;
-char *eType = NULL;
-
-int TOTAL_RESULT_OK[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
-void *slave(void *data);
-int (*finish) (int a);
-
-int finishProcess(int a)
-{
- exit(a);
-}
-
-int (*load) (void);
-
-struct dataPub dp;
-
-/* Functions to access tests/tests names/tests results*/
-int testSuiv(int n)
-{
- return LIST_TESTS[n];
-}
-
-int resAttSuiv(int n)
-{
- return LIST_RESULTS[n];
-}
-
-char *nomTestSuiv(int n)
-{
- return LIST_NAMES_TESTS[n];
-}
-
-int lockSuiv(int n)
-{
- return LIST_LOCKS[n];
-}
-
-/* Verify the test result is the expected one */
-int matchResult(int r, int n)
-{
-
- P("r=%d\n", r);
- if (r == LIST_RESULTS[n])
- return 1;
- else
- return 0;
-}
-
-/* Increments the number of process which have successfully passed the test */
-void counter(int r, int n)
-{
- TOTAL_RESULT_OK[n] += matchResult(r, n);
-}
-
-/* Special case for test 'lock file byte byte by byte'.
- * We ensure each byte is correctly locked.
- */
-void validationResults(int n)
-{
- int i, u, l, fsize;
- struct flock request;
-
- fsize = dp.nclnt * (maxClients + 1);
- TOTAL_RESULT_OK[n] = 0;
- l = FALSE;
- u = TRUE;
-
- /* If the expected operation result is a success, we will have to increase the number of correct results */
- if (LIST_RESULTS[n]) {
- l = TRUE;
- u = FALSE;
- }
-
- for (i = 0; i < fsize; i++) {
- request.l_type = F_WRLCK;
- request.l_whence = SEEK_SET;
- request.l_start = i;
- request.l_len = 1;
- fcntl(dp.fd, F_GETLK, &request);
- /* Ensure the lock is correctly set */
- if (request.l_type != F_UNLCK)
- TOTAL_RESULT_OK[n] += l;
- else
- TOTAL_RESULT_OK[n] += u;
- }
-}
-
-int initTest(void)
-{
-
- P("Master opens %s\n", dp.fname);
- dp.fd = open(dp.fname, OPENFLAGS, MANDMODES);
- if (dp.fd < 0) {
- perror("lock test : can't open test file :");
- finish(1);
- }
- P("fd=%d\n", dp.fd);
- return 0;
-}
-
-struct dataChild *initClientFork(int i)
-{
- struct dataPriv *dpr;
- struct dataChild *df;
-
- /* Initialize private data fields */
- dpr = malloc(sizeof(struct dataPriv));
- df = malloc(sizeof(struct dataChild));
- dpr->whoami = i;
- df->dp = &dp;
- df->dpr = dpr;
- /* Initialize master to client pipe */
- dp.lclnt[i] = malloc(sizeof(int) * 2);
- if (pipe(dp.lclnt[i]) < 0) {
- perror("Impossible to create pipe\n");
- exit(1);
- }
- P("Initialization %d\n", i);
- write(0, ".", 1);
- return df;
-}
-
-int initialize(int clnt)
-{
-
- /* Initialize private data fields */
- printf("Init\n");
- dp.nclnt = clnt;
- dp.lclnt = malloc(sizeof(int *) * clnt);
- dp.lthreads = malloc(sizeof(pthread_t) * clnt);
-
- /* Initialize client to master pipe */
- if (pipe(dp.master) < 0) {
- perror("Master pipe creation error\n");
- exit(1);
- }
- printf("%s initialization\n", eType);
- load();
- initTest();
-
- return 0;
-}
-
-void cleanClient(struct dataChild *df)
-{
- int i;
- i = df->dpr->whoami;
- free(dp.lclnt[i]);
- free(df->dpr);
- free(df);
-}
-
-void clean(void)
-{
- free(dp.lthreads);
- free(dp.lclnt);
-}
-
-int loadProcess(void)
-{
- int i;
- struct dataChild *df;
- for (i = 0; i < dp.nclnt; i++) {
- df = initClientFork(i);
- if (!fork()) {
- P("Running slave num: %d\n", df->dpr->whoami);
- write(0, ".", 1);
- slave((void *)df);
- cleanClient(df);
- exit(0);
- }
- }
- return 0;
-}
-
-void lockWholeFile(struct flock *request)
-{
- request->l_whence = SEEK_SET;
- request->l_start = 0;
- /* Lock the whole file */
- request->l_len = 0;
-}
-
-void selectTest(int n, struct s_test *test)
-{
-
- test->test = testSuiv(n);
- test->resAtt = resAttSuiv(n);
- test->nom = nomTestSuiv(n);
- test->type = lockSuiv(n);
-}
-
-/* Final test report */
-int report(int clnt)
-{
- int rc = 0;
- int i;
- int totalClients;
- totalClients = clnt * (maxClients + 1);
- printf
- ("\n%s number : %d - Remote clients: %d local client 1 - Total client %d - Total concurent tests: %d\n",
- eType, clnt, maxClients, maxClients + 1, totalClients);
- printf("%s number running test successfully :\n", eType);
- for (i = 0; i < MAXTEST; i++) {
- if (TOTAL_RESULT_OK[i] != totalClients)
- rc = 1;
-
- printf("%d %s of %d successfully ran test : %s\n",
- TOTAL_RESULT_OK[i], eType, totalClients,
- LIST_NAMES_TESTS[i]);
- }
- return rc;
-}
-
-int serverSendLocal(void)
-{
- int i;
- /* Synchronize slave processes */
- /* Configure slaves for test */
-
- for (i = 0; i < dp.nclnt; i++)
- write(dp.lclnt[i][1], message, M_SIZE);
- return 0;
-
-}
-
-void serverSendNet(void)
-{
- writeToAllClients(message);
-}
-
-int serverReceiveNet(void)
-{
- int i, c;
- for (c = 0; c < maxClients; c++) {
- for (i = 0; i < dp.nclnt; i++) {
- serverReceiveClient(c);
- }
- }
- return 0;
-}
-
-int serverReceiveLocal(void)
-{
- int i;
- for (i = 0; i < dp.nclnt; i++)
- read(masterReader, message, M_SIZE);
- return 0;
-}
-
-int clientReceiveLocal(void)
-{
- read(slaveReader, message, M_SIZE);
- return 0;
-}
-
-int clientSend(void)
-{
- write(slaveWriter, message, M_SIZE);
- return 0;
-}
-
-int serverSend(void)
-{
- serverSendNet();
- serverSendLocal();
- return 0;
-}
-
-int serverReceive(void)
-{
- serverReceiveNet();
- serverReceiveLocal();
- return 0;
-}
-
-/* binary structure <-> ASCII functions used to ensure data will be correctly used over
- * the network, especially when multiples clients do not use the same hardware architecture.
- */
-int serializeTLock(struct s_test *tLock)
-{
- memset(message, 0, M_SIZE);
- sprintf(message, "T:%d:%d:%d::", tLock->test, tLock->type,
- tLock->resAtt);
- return 0;
-}
-
-void unSerializeTLock(struct s_test *tLock)
-{
- sscanf(message, "T:%d:%d:%d::", &(tLock->test), &(tLock->type),
- &(tLock->resAtt));
- memset(message, 0, M_SIZE);
-
-}
-
-void serializeFLock(struct flock *request)
-{
- int len, pid, start;
- memset(message, 0, M_SIZE);
- len = (int)request->l_len;
- pid = (int)request->l_pid;
- start = (int)request->l_start;
- /* Beware to length of integer conversions ... */
- sprintf(message, "L:%hd:%hd:%d:%d:%d::",
- request->l_type, request->l_whence, start, len, pid);
-}
-
-void serializeResult(int result)
-{
- memset(message, 0, M_SIZE);
- sprintf(message, "R:%d::", result);
-
-}
-
-void unSerializeResult(int *result)
-{
- sscanf(message, "R:%d::", result);
-}
-
-void unSerializeFLock(struct flock *request)
-{
- int len, pid, start;
- sscanf(message, "L:%hd:%hd:%d:%d:%d::",
- &(request->l_type), &(request->l_whence), &start, &len, &pid);
- request->l_start = (off_t) start;
- request->l_len = (off_t) len;
- request->l_pid = (pid_t) pid;
-}
-
-int serverSendLockClient(struct flock *request, int client)
-{
- serializeFLock(request);
- return serverSendClient(client);
-}
-
-int serverSendLockLocal(struct flock *request, int slave)
-{
- serializeFLock(request);
- return write(dp.lclnt[slave][1], message, M_SIZE);
-}
-
-int getLockSection(struct flock *request)
-{
- memset(message, 0, M_SIZE);
- clientReceiveLocal();
- unSerializeFLock(request);
- return 0;
-}
-
-int sendLockTest(struct s_test *tLock)
-{
- serializeTLock(tLock);
- serverSend();
- return 0;
-}
-
-int getLockTest(struct s_test *tLock)
-{
- clientReceiveLocal();
- unSerializeTLock(tLock);
- return 0;
-}
-
-int sendResult(int result)
-{
- serializeResult(result);
- clientSend();
- return 0;
-}
-
-int getResults(int ntest)
-{
- int i, c;
- int result = 0;
- /* Add remote test results */
- for (c = 0; c < maxClients; c++) {
- for (i = 0; i < dp.nclnt; i++) {
- serverReceiveClient(c);
- unSerializeResult(&result);
- counter(result, ntest);
-
- }
- }
- /* Add local test results */
- for (i = 0; i < dp.nclnt; i++) {
- read(masterReader, message, M_SIZE);
- unSerializeResult(&result);
- counter(result, ntest);
- }
-
- return 0;
-}
-
-#ifdef DEBUG
-#define P(a,b) memset(dbg,0,16);sprintf(dbg,a,b);write(0,dbg,16);
-#endif
-
-/* In the case of a network use, the master of the client application si only
- * a 'repeater' of information. It resends server-master instructions to its own slaves.
- */
-void masterClient(void)
-{
- fd_set fdread;
- struct timeval tv;
- int n, i, r, m, start;
-#ifdef DEBUG
- char dbg[16];
-#endif
- struct flock lock;
- int t;
-
- masterReader = dp.master[0];
- FD_ZERO(&fdread);
- tv.tv_sec = 50;
- tv.tv_usec = 0;
- n = fdServer > masterReader ? fdServer : masterReader;
- printf("Master Client - fdServer=%d\n", fdServer);
- while (1) {
- /* Add slave and server pipe file descriptors */
- FD_ZERO(&fdread);
- FD_SET(fdServer, &fdread);
- FD_SET(masterReader, &fdread);
- r = select(n + 1, &fdread, NULL, NULL, &tv);
- if (r < 0) {
- perror("select:\n");
- continue;
- }
- if (r == 0) {
- exit(0);
- }
-
- if (FD_ISSET(fdServer, &fdread)) {
- /* We just have received information from the server.
- * We repeat it to slaves.
- */
- i = readFromServer(message);
- t = message[0];
- switch (t) {
- case 'L':
- /* Lock instruction. We need to send a different section to lock to each process */
- unSerializeFLock(&lock);
- start = lock.l_start;
- for (i = 0; i < dp.nclnt; i++) {
- lock.l_start = start + i;
- serializeFLock(&lock);
- write(dp.lclnt[i][1], message, M_SIZE);
- }
- printf("\n");
- continue;
- case 'T':
- /* Test instruction. Ensure server is not sending the END(ish) instruction to end tests */
- /* To be rewritten asap */
- m = atoi(&(message[2]));
- if (m == END)
- break;
- if (m == CLEAN)
- printf("\n");
-
- serverSendLocal();
- continue;
- }
- break;
- } else {
- /* Else, we read information from slaves and repeat them to the server */
- for (i = 0; i < dp.nclnt; i++) {
- r = read(masterReader, message, M_SIZE);
- r = write(fdServer, message, M_SIZE);
- if (r < 0)
- perror("write : ");
-
- }
- continue;
- }
- }
-
- /* Receive the END(ish) instruction */
-
- /* Repeat it to the slaves */
- printf("Exitting...\n");
- serverSendLocal();
-
- /* Ok, we can quit */
- printf("Bye :)\n");
-
-}
-
-int master(void)
-{
- int i, n, bl;
- int clnt;
- char tmp[MAXLEN], *buf;
-#ifdef DEBUG
- char dbg[16];
-#endif
- struct flock request;
- struct s_test tLock;
- enum state_t state;
- int offset;
- /* A test sentence written in the file */
- char phraseTest[] =
- "Ceci est une phrase test ecrite par le maitre dans le fichier";
- bl = -1;
- clnt = dp.nclnt;
- masterReader = dp.master[0];
- state = SELECT;
- /* Start with the first test ;) */
- n = 0;
- printf("\n--------------------------------------\n");
- while (1) {
- switch (state) {
- case SELECT:
- /* Select the test to perform */
- printf("\n");
- E("Master: SELECT");
- selectTest(n, &tLock);
- state = tLock.type;
- bl = 0;
- if (n < MAXTEST) {
- memset(tmp, 0, MAXLEN);
- sprintf(tmp, "TEST : TRY TO %s:",
- LIST_NAMES_TESTS[n]);
- write(0, tmp, strlen(tmp));
- } else
- state = END;
- P("state=%d\n", state);
- n += 1;
- continue;
-
- case RDONLY:
- case WRONLY:
-
- case READLOCK:
- P("Read lock :%d\n", state);
- request.l_type = F_RDLCK;
- state = LOCK;
- continue;
-
- case WRITELOCK:
- P("Write lock :%d\n", state);
- request.l_type = F_WRLCK;
- state = LOCK;
- continue;
-
- case LOCK:
- /* Apply the wanted lock */
- E("Master: LOCK");
- write(dp.fd, phraseTest, strlen(phraseTest));
- lockWholeFile(&request);
- if (fcntl(dp.fd, F_SETLK, &request) < 0) {
- perror("Master: can't set lock\n");
- perror("Echec\n");
- exit(0);
- }
- E("Master");
- state = SYNC;
- continue;
-
- case BYTELOCK_READ:
- bl = 1;
- request.l_type = F_RDLCK;
- state = SYNC;
- continue;
-
- case BYTELOCK_WRITE:
- bl = 1;
- request.l_type = F_WRLCK;
- state = SYNC;
- continue;
-
- case BYTELOCK:
- /* The main idea is to lock all the bytes in a file. Each slave process locks one byte.
- *
- * We need :
- * - To create a file of a length equal to the total number of slave processes
- * - send the exact section to lock to each slave
- * - ensure locks have been correctly set
- */
-
- /* Create a string to record in the test file. Length is exactly the number of sub process */
- P("Master: BYTELOCK: %d\n", state);
- buf = malloc(clnt * (maxClients + 1));
- memset(buf, '*', clnt);
- write(dp.fd, buf, clnt);
- free(buf);
-
- /* Each slave process re-writes its own field to lock */
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 1;
-
- /* Start to send sections to lock to remote process (network clients) */
- for (i = 0; i < maxClients; i++) {
- /* Set the correct byte to lock */
- offset = (i + 1) * clnt;
- request.l_start = (off_t) offset;
- serverSendLockClient(&request, i);
- }
-
- /* Now send sections to local processes */
- for (i = 0; i < clnt; i++) {
- request.l_start = i;
- serverSendLockLocal(&request, i);
- }
- state = RESULT;
- continue;
-
- case SYNC:
- sendLockTest(&tLock);
- if (bl) {
- state = BYTELOCK;
- continue;
- }
-
- if (n < MAXTEST + 1)
- state = RESULT;
- else
- state = END;
- continue;
-
- case RESULT:
- /* Read results by one */
- getResults(n - 1);
- if (bl)
- validationResults(n - 1);
- state = CLEAN;
- continue;
-
- case CLEAN:
- /* Ask the clients to stop testing ... */
- tLock.test = CLEAN;
- serializeTLock(&tLock);
- serverSend();
- /* ... and wait for an ack before closing */
- serverReceive();
- /* Ignore message content : that is only an ack */
-
- /* close and open file */
- close(dp.fd);
- initTest();
- state = SELECT;
- continue;
- case END:
- tLock.test = END;
- serializeTLock(&tLock);
- serverSend();
- sleep(2);
- break;
-
- printf("(end)\n");
- exit(0);
-
- }
- break;
- }
-
- return report(clnt);
-}
-
-/* Slave process/thread */
-
-void *slave(void *data)
-{
- struct dataChild *df;
- int i, a, result, ftest;
- struct s_test tLock;
- struct flock request;
- char tmp[16];
-#ifdef DEBUG
- char dbg[16];
-#endif
- char *phraseTest = "L'ecriture a reussi";
- int len;
- enum state_t state;
-
- result = -1;
- ftest = -1;
- len = strlen(phraseTest);
- df = (struct dataChild *)data;
- i = df->dpr->whoami;
- P("Slave n=%d\n", i);
- slaveReader = dp.lclnt[i][0];
- slaveWriter = dp.master[1];
- state = SYNC;
- errno = 0;
- memset(tmp, 0, 16);
- while (1) {
- switch (state) {
- case SELECT:
- case SYNC:
- getLockTest(&tLock);
- state = tLock.test;
- P("Slave State=%d\n", state);
-
- continue;
- case RDONLY:
- /* Try to read a file */
- P("TEST READ ONLY %d\n", RDONLY);
- if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open:");
- continue;
- }
- P("fd=%d\n", ftest);
- a = read(ftest, tmp, 16);
- if (a < 16)
- result = ECHEC;
- else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case WRONLY:
- /* Try to write a file */
- P("TEST WRITE ONLY %d\n", WRONLY);
- if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open read only:");
- continue;
- }
- P("fd=%d\n", ftest);
- if (write(ftest, phraseTest, len) < len)
- result = ECHEC;
- else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case LOCK:
-
- case READLOCK:
- /* Try to read a read-locked section */
- P("READ LOCK %d\n", F_RDLCK);
- if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("Open read-write:");
- continue;
- }
-
- P("fd=%d\n", ftest);
- /* Lock the whole file */
- request.l_type = F_RDLCK;
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 0;
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("RDONLY: fcntl");
- result = ECHEC;
- } else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case WRITELOCK:
- /* Try to write a file */
- P("WRITE LOCK %d\n", F_WRLCK);
- if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("\nOpen:");
- continue;
- }
- /* Lock the whole file */
- P("fd=%d\n", ftest);
- request.l_type = F_WRLCK;
- request.l_whence = SEEK_SET;
- request.l_start = 0;
- request.l_len = 0;
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("\nWRONLY: fcntl");
- result = ECHEC;
- } else
- result = SUCCES;
- state = RESULT;
- continue;
-
- case BYTELOCK_READ:
- P("BYTE LOCK READ: %d\n", state);
- state = BYTELOCK;
- continue;
-
- case BYTELOCK_WRITE:
- P("BYTE LOCK WRITE: %d\n", state);
- state = BYTELOCK;
- continue;
-
- case BYTELOCK:
- /* Wait for the exact section to lock. The whole file is sent by the master */
- P("BYTE LOCK %d\n", state);
- getLockSection(&request);
- if ((ftest = open(dp.fname, O_RDWR | O_NONBLOCK)) < 0) {
- result = ECHEC;
- state = RESULT;
- if (dp.verbose)
- perror("\nOpen:");
- continue;
- }
-
- if (fcntl(ftest, F_SETLK, &request) < 0) {
- if (dp.verbose || errno != EAGAIN)
- perror("\nBTLOCK: fcntl");
- result = ECHEC;
- state = RESULT;
- continue;
- }
- /* Change the character at the given position for an easier verification */
- a = lseek(ftest, request.l_start, SEEK_SET);
- write(ftest, "=", 1);
- result = SUCCES;
- state = RESULT;
- continue;
-
- case RESULT:
- if (result == SUCCES)
- write(0, "=", 1);
- else
- write(0, "x", 1);
- P("RESULT: %d\n", result);
- sendResult(result);
- state = SYNC;
- continue;
-
- case CLEAN:
- close(ftest);
- /* Send CLEAN Ack */
- sendResult(result);
- state = SYNC;
- continue;
-
- case END:
- E("(End)\n");
- finish(0);
- printf("Unknown command\n");
- finish(1);
-
- }
- }
-
-}
-
-char *nextArg(int argc, char **argv, int *i)
-{
- if (((*i) + 1) < argc) {
- (*i) += 1;
- return argv[(*i)];
- }
- return NULL;
-}
-
-int usage(void)
-{
- printf("locktest -n <number of process> -f <test file> [-T]\n");
- printf("Number of child process must be higher than 1\n");
- exit(0);
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- int rc = 0;
- int i, nThread = 0;
- char *tmp;
- int type = 0;
- int clients;
- type = PROCESS;
- dp.fname = NULL;
- dp.verbose = 0;
- int server = 1;
- char *host;
-
- host = NULL;
- clients = 0;
-
- for (i = 1; i < argc; i++) {
-
- if (!strcmp("-n", argv[i])) {
- if (!(tmp = nextArg(argc, argv, &i)))
- usage();
- nThread = atoi(tmp);
- continue;
- }
-
- if (!strcmp("-f", argv[i])) {
- if (!(dp.fname = nextArg(argc, argv, &i)))
- usage();
- continue;
- }
- if (!strcmp("-v", argv[i])) {
- dp.verbose = TRUE;
- continue;
- }
- if (!strcmp("-c", argv[i])) {
- if (!(clients = atoi(nextArg(argc, argv, &i))))
- usage();
- continue;
- }
-
- if (!strcmp("--server", argv[i])) {
- if (!(host = nextArg(argc, argv, &i)))
- usage();
- server = 0;
- continue;
- }
- printf("Ignoring unknown option: %s\n", argv[i]);
- }
-
- if (server) {
- if (!(dp.fname && nThread))
- usage();
- if (clients > 0) {
- configureServer(clients);
- setupClients(type, dp.fname, nThread);
- }
- } else {
- configureClient(host);
- dp.fname = malloc(512);
- memset(dp.fname, 0, 512);
- getConfiguration(&type, dp.fname, &nThread);
- }
-
- if (dp.verbose)
- printf("By process.\n");
- load = loadProcess;
- eType = "process";
- finish = finishProcess;
- LIST_RESULTS = LIST_RESULTS_PROCESS;
- initialize(nThread);
- if (server) {
- rc = master();
- } else {
- masterClient();
- free(dp.fname);
- }
- clean();
-
- return rc;
-}
deleted file mode 100644
@@ -1,165 +0,0 @@
-/* *************************************************
- * *********** README ******************************
- * *************************************************
- *
- * COMPILE : make
- * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
- *
- * GOAL : This test tries to stress the fcntl locking functions. A
- * master process sets a lock on a file region (this is called "byte
- * range locking"). Some slave processes try to perform operations on
- * this region, such as read, write, set a new lock ... The expected
- * results of these operations are known. If the operation's result is
- * the same as the expected one, the test suceeds, else it fails.
- *
- * Slaves are either concurent processes or threads.
- * -n <num> : Number of threads to use (mandatory).
- * -f <file> : Run the test on a test file defined by the -f option (mandatory).
- * -T : Use threads instead of processes (optional).
- *
- * HISTORY : This program has been written to stress NFSv4 locks. -P
- * option was created to verify NFSv4 locking was thread-aware, and so,
- * locking behaviour over NFSv4 was POSIX correct both using threads and
- * process. This option may not be useful to stress.
- *
- * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
- *
- *
- * Vincent ROQUETA 2005 - vincent.roqueta@ext.bull.net
- * BULL S.A.
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#ifdef STDARG
-#include <stdarg.h>
-#endif
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/param.h>
-#include <sys/times.h>
-#ifdef MMAP
-#include <sys/mman.h>
-#endif
-#include <inttypes.h>
-#include <pthread.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/select.h>
-
-#ifdef O_SYNC
-#define OPENFLAGS (O_CREAT | O_RDWR | O_SYNC )
-#else
-#define OPENFLAGS (O_CREAT | O_RDWR )
-#endif
-#define OPENMODES (0600)
-#define MANDMODES (0600)
-/*(02666)*/
-
-#define SUCCES 1
-#define ECHEC 0
-
-#define TRUE 1
-#define FALSE 0
-
-#define PROCESS 0
-#define THREAD 1
-
-
-//#define DEBUG
-#ifdef DEBUG
- #define E(a) perror(a)
- #define P(a,b) printf(a,b)
-#else
- #define E(a)
- #define P(a,b)
-#endif
-
-
-
-#ifndef LOCKTESTS_H
-#define LOCKTESTS_H
-
-#define M_SIZE 512
-
-int writeToAllClients(char *foo);
-
-int serverReceiveNet();
-int clientReceiveNet();
-int serverReceiveClient(int n);
-int setupClients(int type, char *fname, int nThread);
-int serverCloseConnection();
-int getConfiguration(int *type, char *fname, int *nThread);
-int readFromServer(char *message);
-int serverSendClient(int n);
-
-
-enum state_t {
- CLEAN,
- RDONLY,
- RESULT,
- WRONLY,
- SELECT,
- LOCK,
- SYNC,
- END,
- READLOCK,
- WRITELOCK,
- BYTELOCK,
- BYTELOCK_READ,
- BYTELOCK_WRITE
-};
-
-/* Public data */
-struct dataPub {
- /* Number of clients */
- int nclnt;
- /* List of master to slave pipes */
- int **lclnt;
- /* Slave to master pipe */
- int master[2];
- /* Thread list */
- pthread_t *lthreads;
- /* test file name */
- char *fname;
- /* test file file-descriptor */
- int fd;
- /* Detailed error messages */
- int verbose;
-};
-
-/* private data */
-struct dataPriv {
- /* thread number */
- int whoami;
-};
-
-struct dataChild{
- struct dataPub *dp;
- struct dataPriv *dpr;
-};
-
-
-struct s_test {
- int test;
- int type;
- char *nom;
- int resAtt;
-
-};
-
-
-
-
-int configureServer(int max);
-int configureClient(char *s);
-
-#endif
deleted file mode 100755
@@ -1,236 +0,0 @@
-#!/usr/bin/env python3
-# This script aims to help to run locktests with several clients.
-#
-# Report bugs to Vincent ROQUETA : vincent.roqueta@ext.bull.net
-
-import encodings
-import shutil
-import os, sys
-import getopt, sys
-import string
-import socket
-from stat import *
-from sys import *
-from os import *
-
-NFS4_PATH="/mnt/nfsv4"
-NFS4_SERVER=""
-TEST_HOME="/home/vincent/locks/"
-testfile=NFS4_PATH+"/testfile"
-
-app="locktests"
-SRC="locktests.tar.gz"
-SRC_PATH="deploy"
-install="'tar xzf "+SRC+"; cd locks; make `"
-user="root"
-
-
-
-
-
-class Machine:
-
- def mkdir(self,dir):
- self.command="mkdir -p "+dir
- self.do()
- def rmdir(self,dir):
- self.command="rm -rf "+dir
- self.do()
-
- def printc(self):
- print("->"+self.command)
- print("\n")
-
-class Client(Machine):
-
- def __init__(self, machine):
- self.command=""
- self.machine=machine
- self.mountPath=NFS4_PATH
-
- def do(self):
- self.command="ssh "+user+"@"+self.machine+" "+self.command
- os.system(self.command)
-
- def isomount(self, dir):
- export=NFS4_SERVER
- mntpoint=NFS4_PATH
- self.command="'mkdir -p "+mntpoint+"; mount -t nfs4 "+export+" "+mntpoint+"'"
- self.do()
-
- def umount(self, dir):
- mntpoint=self.mountPath+"/"+dir
- self.command="umount "+mntpoint
- self.do()
- def install(self, path):
- self.command="'cd "+path+"; tar xzf "+SRC+"; cd locks; make'"
- self.do()
-
- def run(self, appli):
- self.command=appli
- self.do()
- def cp(self, fichier, path):
- command="scp "+fichier+" "+user+"@"+self.machine+":"+path
- os.system(command)
-
-
-class Serveur(Machine):
-
- def __init__(self, ip, exportPath):
- self.SERVEUR=ip
- self.exportPath=exportPath
-
- def do(self):
- self.command="ssh "+self.SERVEUR+" "+self.command
- os.system(self.command)
-
- def configure(self, dir):
- exportDir=self.exportPath+'/'+dir
- self. mkdir(exportDir)
-#self.printc()
- self.export(exportDir)
-#self.printc()
- def clean(self, dir):
- unexportDir=self.exportPath+'/'+dir
- self.unexport(unexportDir)
- self.rmdir(unexportDir)
-def usage():
- print("\n")
- print("usage:")
- print("locktests.py <-n process -f testfile ><--setup -s fs_server> -c host1, host2, host3 ... ")
- print("--setup : setup the configuration, deploy test on other test machines; This option also requires -c and -s")
- print("-c <machine> : host list to deploy/run/clean the test")
- print("-s <machine> : NFS server to use to setup the test")
- print("-n <num> : number of processes each test machine will lauch to perform the test")
- print("-f <file> : test file. This must be the same on each machine")
- print(" ")
- print("Example :")
- print("=========")
- print("*Setup machines for testing")
- print("./locktests.py --setup -c testmachine1 testmachine2 testmachine3 -s my_nfs_server:/")
- print("\n")
- print("*Run test on testmachine1,testmachine2 with 50 process on each machine using /mnt/nfsv4/testfile")
- print("./locktests.py -n 50 -f /mnt/nfsv4/testfile -c testmachine1 testmachine2")
- print("\n")
- print("_________________________________")
- print("Vincent ROQUETA - Bull SA - 2005\n")
-
- return 0
-
-
-
-def setup():
- path=os.path.abspath(".")
- fichier=SRC_PATH+"/"+SRC
- commande=""
- for i in clients:
- print("Setting up machine "+i)
- c=Client(i)
- c.mkdir(path)
- c.cp(fichier, path)
- c.install(path)
- c.isomount(NFS4_PATH)
- #Setup localhost
- print("Setting up localhost")
- commande="make; mkdir -p "+NFS4_PATH+" ; mount -t nfs4 "+NFS4_SERVER+" "+NFS4_PATH+" &"
- os.system(commande)
-
-
-def run():
- path=os.path.abspath(".")
- nbreClients=len(clients)
- hostname=socket.gethostname()
- # Lancement du serveur en local
- # Launch the server locally
- commande=path+"/"+app+" -n "+nbreProcess+" -f "+filename+" -c "+str(nbreClients)+" &"
- os.system(commande)
- commande=path+"/locks/"+app+" --server "+hostname
- for i in clients:
- c=Client(i)
- c.run(commande)
-
-def clean():
- for i in clients:
- client.umount(NFS4_PATH)
-
-
-
-
-
-
-args=sys.argv[1:]
-rge=list(range(len(args)))
-a=""
-r=True
-s=False
-nfsServer=False
-c=False
-f=False
-n=False
-clients=[]
-for i in rge:
- if args[i] in ("--install", "-i", "--setup"):
- r=False
- s=True
- continue
- if args[i] in ("-s", "--server"):
- a="nfsServer"
- nfsServer=True
- continue
- if args[i] in ("-h", "--help"):
- usage()
- sys.exit(1)
- if args[i] in ("--clients", "-c"):
- a="clients"
- c=True
- continue
- if args[i] == "-n":
- a="nbre"
- n=True
- continue
- if args[i] == "-f":
- a="file"
- f=True
- continue
-
- if a=="clients":
- clients.append(args[i])
- continue
- if a=="file":
- filename=args[i]
- continue
- if a=="nbre":
- nbreProcess=args[i]
- continue
- if a=="nfsServer":
- NFS4_SERVER=args[i]
- continue
-
-
- usage()
-# For ...
-if s:
- if (not c) or (not nfsServer):
- usage()
- sys.exit(1)
- print("Setup")
- print(NFS4_SERVER)
- setup()
- print("Setup complete")
-
-if r:
- if (not c) or (not f) or (not n):
- usage()
- sys.exit(1)
-
- print("Running test")
- run()
-
-
-
-
-
-
-
-
-
deleted file mode 100644
@@ -1,201 +0,0 @@
-#include "locktests.h"
-
-#include <netdb.h>
-#include <string.h>
-#define PORT 12346
-#define MAX_CONNECTION 16
-
-int maxClients;
-int *fdClient;
-char *server_name;
-int fdServer;
-extern char message[M_SIZE];
-
-int serverReceiveClient(int c)
-{
- char tmp[M_SIZE];
- int r, s;
- /* Ensure we read _exactly_ M_SIZE characters in the message */
- memset(message, 0, M_SIZE);
- memset(tmp, 0, M_SIZE);
- r = 0;
- s = 0;
-
- while (s < M_SIZE) {
- r = read(fdClient[c], tmp, M_SIZE - s);
- /* Loop until we have a complete message */
- strncpy(message + s, tmp, r);
- s += r;
- }
- return s;
-}
-
-int serverSendClient(int n)
-{
- return write(fdClient[n], message, M_SIZE);
-}
-
-int clientReceiveNet(void)
-{
- readFromServer(message);
- return 0;
-}
-
-int setupConnectionServer(void)
-{
- struct sockaddr_in local;
- int c;
- socklen_t size;
- int sock;
- struct sockaddr_in remote;
-
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- perror("socket");
- exit(1);
- }
- memset(&local, 0x00, sizeof(local));
- local.sin_family = AF_INET;
- local.sin_port = htons(PORT);
- local.sin_addr.s_addr = INADDR_ANY;
- memset(&(local.sin_zero), 0x00, 8);
-
- if (bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr)) ==
- -1) {
- perror("bind");
- exit(1);
- }
-
- if (listen(sock, MAX_CONNECTION) == -1) {
- perror("listen");
- return 1;
- }
- size = sizeof(struct sockaddr_in);
- for (c = 0; c < maxClients; c++) {
- if ((fdClient[c] =
- accept(sock, (struct sockaddr *)&remote, &size)) == -1) {
- perror("accept");
- return 1;
- }
-
- }
- return 0;
-}
-
-int writeToClient(int c, char *message)
-{
- return write(fdClient[c], message, 512);
-}
-
-int serverCloseConnection(void)
-{
- int c;
- for (c = 0; c < maxClients; c++)
- close(fdClient[c]);
- return 0;
-
-}
-
-int writeToAllClients(char *foo)
-{
- int c;
- for (c = 0; c < maxClients; c++)
- writeToClient(c, foo);
- return 0;
-}
-
-int setupClients(int type, char *fname, int nThread)
-{
- /*
- * Send parameters to all slaves :
- *
- * We must send :
- * - the position of the test file
- * - the number of slaves for each client
- * - The kind of slaves : process or thread
- */
- char message[512];
- sprintf(message, "%d:%s:%d::", type, fname, nThread);
- writeToAllClients(message);
- return 0;
-}
-
-int configureServer(int max)
-{
- maxClients = max;
- fdClient = malloc(sizeof(int) * max);
-
- setupConnectionServer();
-
- return 0;
-}
-
-int setupConnectionClient(void)
-{
-
- struct hostent *server;
- struct sockaddr_in serv_addr;
-
- if (!(server = gethostbyname(server_name))) {
- printf("erreur DNS\n");
- return 1;
- }
-
- fdServer = socket(AF_INET, SOCK_STREAM, 0);
- if (fdServer < 0) {
- perror("socket");
- return 1;
- }
-
- serv_addr.sin_addr = *(struct in_addr *)server->h_addr;
- serv_addr.sin_port = htons(PORT);
- serv_addr.sin_family = AF_INET;
- if (connect(fdServer, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
- < 0) {
- perror("connect");
- return 1;
- }
- return 0;
-}
-
-int readFromServer(char *message)
-{
- char tmp[M_SIZE];
- int r, s;
- /* Ensure we read exactly M_SIZE characters */
- memset(message, 0, M_SIZE);
- memset(tmp, 0, M_SIZE);
- r = 0;
- s = 0;
- while (s < M_SIZE) {
- r = read(fdServer, tmp, M_SIZE - s);
- /* Loop until we have a complete message */
- strncpy(message + s, tmp, r);
- s += r;
- }
- return s;
-}
-
-int getConfiguration(int *type, char *fname, int *nThread)
-{
- char conf[M_SIZE];
- char *p;
- int i;
- readFromServer(conf);
- p = strtok(conf, ":");
- printf("%s\n", p);
- *type = atoi(p);
- p = strtok(NULL, ":");
- i = strlen(p);
- strncpy(fname, p, i);
- p = strtok(NULL, ":");
- *nThread = atoi(p);
-
- return 0;
-}
-
-int configureClient(char *s)
-{
- server_name = s;
- setupConnectionClient();
- return 0;
-}
Reasons to drop: * outdated tests (from 2005) * not used (NFS kernel maintainers use pynfs [1]) * written in Python (we support C and shell, see [2]) [1] http://git.linux-nfs.org/?p=bfields/pynfs.git;a=summary [2] https://github.com/linux-test-project/ltp/issues/547 Signed-off-by: Petr Vorel <pvorel@suse.cz> --- @Chuck, Bruce: FYI RFC to drop NFS related legacy test suite from LTP. Kind regards, Petr testcases/network/.gitignore | 2 - testcases/network/nfsv4/Makefile | 26 - testcases/network/nfsv4/acl/Makefile | 29 - testcases/network/nfsv4/acl/README | 21 - testcases/network/nfsv4/acl/acl1.c | 373 ------ testcases/network/nfsv4/acl/cleangroups.py | 10 - testcases/network/nfsv4/acl/cleanusers.py | 12 - testcases/network/nfsv4/acl/create_users.py | 21 - testcases/network/nfsv4/acl/random_gen.py | 251 ---- testcases/network/nfsv4/acl/runtest | 70 -- testcases/network/nfsv4/acl/setacl_stress.py | 32 - testcases/network/nfsv4/acl/test_acl.py | 122 -- testcases/network/nfsv4/acl/test_long_acl.py | 44 - testcases/network/nfsv4/locks/Makefile | 33 - testcases/network/nfsv4/locks/README | 169 --- testcases/network/nfsv4/locks/VERSION | 3 - .../nfsv4/locks/deploy/locktests.tar.gz | Bin 12354 -> 0 bytes testcases/network/nfsv4/locks/deploy_info | 37 - testcases/network/nfsv4/locks/locktests.c | 1034 ----------------- testcases/network/nfsv4/locks/locktests.h | 165 --- testcases/network/nfsv4/locks/locktests.py | 236 ---- testcases/network/nfsv4/locks/netsync.c | 201 ---- 22 files changed, 2891 deletions(-) delete mode 100644 testcases/network/nfsv4/Makefile delete mode 100644 testcases/network/nfsv4/acl/Makefile delete mode 100644 testcases/network/nfsv4/acl/README delete mode 100644 testcases/network/nfsv4/acl/acl1.c delete mode 100755 testcases/network/nfsv4/acl/cleangroups.py delete mode 100755 testcases/network/nfsv4/acl/cleanusers.py delete mode 100755 testcases/network/nfsv4/acl/create_users.py delete mode 100755 testcases/network/nfsv4/acl/random_gen.py delete mode 100755 testcases/network/nfsv4/acl/runtest delete mode 100755 testcases/network/nfsv4/acl/setacl_stress.py delete mode 100755 testcases/network/nfsv4/acl/test_acl.py delete mode 100755 testcases/network/nfsv4/acl/test_long_acl.py delete mode 100644 testcases/network/nfsv4/locks/Makefile delete mode 100644 testcases/network/nfsv4/locks/README delete mode 100644 testcases/network/nfsv4/locks/VERSION delete mode 100644 testcases/network/nfsv4/locks/deploy/locktests.tar.gz delete mode 100644 testcases/network/nfsv4/locks/deploy_info delete mode 100644 testcases/network/nfsv4/locks/locktests.c delete mode 100644 testcases/network/nfsv4/locks/locktests.h delete mode 100755 testcases/network/nfsv4/locks/locktests.py delete mode 100644 testcases/network/nfsv4/locks/netsync.c