Home | History | Annotate | Download | only in ctitools
      1 #
      2 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
      3 # Use is subject to license terms.
      4 #
      5 # ident	"@(#)README	1.8	09/06/18 SMI"
      6 #
      7 
      8 #
      9 # This is free software; you can redistribute it and/or modify it
     10 # under the terms of the "Artistic License" which is located in 
     11 # the file named "Artistic" which is included with this software.
     12 #
     13 
     14 ===============================================================================
     15 
     16 Common Test Infrastructure (CTI) for Test Environment Toolkit (TET)
     17 
     18 CTI for TET is a common set of tools, utilities and application interfaces
     19 which support TET test development and execution.
     20 
     21 ===============================================================================
     22 
     23 *** WARNING: INSTALLING THIS PACKAGE MAKES YOUR SYSTEM INHERENTLY INSECURE!
     24 *** Read the 'Important Security Notes' below for details.
     25 
     26 ===============================================================================
     27 
     28 
     29 CTI Directory Structure 
     30 
     31 Makefiles - contains the standard Makefiles that can be used with test suites
     32 to define most of the building process when using make.
     33 
     34 bin - compiled binary and shell standalone executable utilities.
     35 
     36 examples - example test suites provided to show the use of the CTI interfaces
     37 and CTI command line execution.
     38 
     39 include - CTI header files that are to be included in code.
     40 
     41 lib - compiled and shell script libraries that are linked or sourced into test
     42 scripts to gain access to the CTI API.
     43 
     44 src/defines - Solaris define files used to identify newer versions of Solaris.
     45 
     46 src/lib - source code for the libraries that are built into the above lib
     47 directory.
     48 
     49 src/utils - the CTI command line utility and it's associated tools.  As well
     50 as the build, clean and exec tools, the kmodtool interface and setuid programs
     51 for root and user test suite execution.
     52 
     53 src/scripts - tools to assist in the building and packaging of CTI for TET.
     54 
     55 ===============================================================================
     56 
     57 bin/run_test.ksh (src/utils/run_test.ksh)
     58 
     59 The run_test wrapper is used to execute test suites and passes the 
     60 configuration program the following arguments:
     61 
     62         -F  : Configuration parameter file (name=value pairs)
     63 	-S  : Do the setup only
     64 	-E  : Do the execute only using the prior setup
     65 	-C  : Do the cleanup only for the prior setup
     66 	-L  : Log directory
     67 	-R  : List of remote machines (only for distributed test)
     68 	-I  : Ignore html/sorted_result creation
     69 	-j  : Journal file (-j - goes to stdout)
     70 	-s  : scenario file (tcc option)
     71 	-x  : execute mode config file (tcc option)
     72 
     73 	Following tcc options are passed directly to the 'tcc' command
     74 	without being processed by run_test :
     75 		b, c, e, i, f , g, I, l, n, t, v, y
     76 
     77 ===============================================================================
     78 
     79 src/scripts/build_tet.ksh
     80 
     81 The build_tet.ksh script will build the TET-Lite and Distributed TET versions
     82 of TET along with the CTI software under $TET_ROOT. If the $WS_ROOT 
     83 environment variable is set, the built code will also be copied to 
     84 $WS_ROOT/proto and be ready for package generation. The 
     85 /src/scripts/solpatch.ksh script is used by build_tet.ksh to patch TET so 
     86 newer versions of Solaris are identified during the build process.
     87 
     88 	Usage: ksh build_tet.ksh <mode>
     89 
     90 	Where <mode> is one of the following arguments :
     91 		lite - to build TET Lite
     92 		inet - to build Distributed TET
     93 
     94 /src/scripts/build_tet_pkg.pl
     95 
     96 The build_tet_pkg.pl script creates TET-Lite or Distributed TET packages from
     97 the built code in $WS_ROOT/proto and stores the packages (SUNWstc-tetlite or
     98 SUNWstc-dtet) in the $WS_ROOT/packages directory.
     99 
    100 	Usage: perl build_tet_pkg.pl [-p <pkgdef_dir>] [-P <proto_dir>]
    101 		[-s pkg_spool_dir] mode
    102 
    103 	Where mode is one of the following arguments :
    104 		lite - to build the lite packages (SUNWtetlite)
    105 		inet - to build the distributed tet packages (SUNWdtet)
    106 
    107 Example:
    108 
    109 % setenv WS_ROOT /test/ws
    110 % setenv TET_ROOT $WS_ROOT/src/tools/tet
    111 % cd $TET_ROOT/contrib/ctitools/src/scripts
    112 % build_tet.ksh inet
    113 % build_tet_pkg.pl inet
    114 
    115 The build and package scripts need to be run on sparc and i386 build servers
    116 to produce sparc and i386 packages.  32-bit sparc, 64-bit sparcv9, 32-bit i386
    117 and 64-bit amd64 binaries are produced. Four runs are required to produce all
    118 combinations of sparc, i386, TET-Lite and Distributed TET packages.
    119 
    120 ===============================================================================
    121 
    122 bin/build_suite_pkg (utils/build_suite_pkg.pl)
    123 
    124 The build_suite_pkg.pl script uses the standard Makefiles with the package
    125 directive to build a package of the current test suite. Script execution can
    126 be modified by supplying custom packaging files and information. This script
    127 can also remove the package with -R suitename.
    128 
    129 	Usage:	build_suite_pkg.pl [ -p <pkgdef_dir>] [ -P <proto_dir>]
    130 		[ -s <pkg_spool_dir> ] <-R | -S> suitedir
    131 
    132 		suitedir - The location of the compiled test suite.
    133 
    134 	This compilation is done with the standard makefiles by using
    135 	the 'package' directive, e.g :
    136 	
    137 		$ /usr/ccs/bin/make package
    138 
    139 	To remove the package, e.g :
    140 
    141 		$ /usr/ccs/bin/make unpackage
    142 
    143 ===============================================================================
    144 
    145 Supported development CTI libraries (languages) :
    146 
    147 CTI support libraries are written for ksh, C, Perl, Java and Python.
    148 
    149 The ksh files to be sourced in are :
    150 
    151 	lib/ctiutils.ksh - Common tetlite CTI API interfaces.
    152 	lib/ctidutils.ksh - Distributed CTI API interfaces.
    153 
    154 The C libraries are :
    155 
    156 	lib/libCommonTest.so - Common tetlite and distributed interfaces
    157 		depending on packages installed.
    158 	lib/libCommonTest_s.so - Provides a modified cti_delete() and 
    159 		cti_deleteall() functions that use shared variables
    160 		with the TET libraries.
    161 	lib/libCommonTest_script.so - Shell script like helpers for C
    162 	lib/libCommonTest_thr.so - Threaded CTI interfaces.
    163 
    164 The Perl files to be soureced in are:
    165 
    166 	lib/ctiutils.pl - Common tetlite CTI API interfaces.
    167 
    168 The Java library :
    169 
    170 	lib/CommonTest.jar - Common tetlite and distributed interfaces
    171 		depending on packages installed.
    172 
    173 The Python modules are :
    174 
    175 	lib/ctiutils.py - Common tetlite CTI API interfaces.
    176 	lib/ctidutils.py - Distributed CTI API interfaces.
    177 
    178 	To use these modules, you will need set your PYTHONPATH variable
    179 	to $CTI_ROOT/lib
    180 
    181 ===============================================================================
    182 
    183 bin/build_tool  (Source - src/utils/build_tool.ksh)
    184 bin/clean_tool  (Source - src/utils/clean_tool.ksh)
    185 
    186 The build_tool and clean_tool scripts can be used as TCC build and clean tools 
    187 (respectively) to support options in scenario test case names. Both scripts
    188 perform shell variable expansion.
    189 
    190 bin/exec_tool	(Source - src/utils/exec_tool.ksh)
    191 
    192 The exec_tool supports two options: su and kmod.  The "su" option allows a test
    193 case to be run with an arbitary UID, for example:
    194 
    195         /foo/bar/tc1:su=root{3-5}
    196         /foo/bar/tc2:su=uucp
    197 
    198 The "kmod" or "kernel" option specifies that the test case is a kernel module.
    199 This enhancement provides facilities for TET test cases to be written and run 
    200 directly in the kernel, for example:
    201 
    202         /foo/bar/tc3:kmod{1,4-7,10}
    203 
    204 The build and clean tools are simple scripts that basically strip out the above
    205 options from scenario test case names such that the usual TCC build and clean
    206 tools such as make can still be used.
    207 
    208 For more detailed information, please read the comments at the top of each
    209 script.
    210 
    211 NOTE: these scripts are available in the $CTI_ROOT/bin directory.
    212 
    213 ===============================================================================
    214 
    215 lib/[amd64|sparcv9]/libkmodapi.a	(Source - src/lib/C/kmodapi.c)
    216 bin/kmodtool				(Source - src/utils/kmodtool.c)
    217 
    218 Include Files
    219 
    220 include/kmod_support.h
    221 include/tet_kmodapi.h
    222 
    223 The kmodtool and libkmodapi.a library provide support for TET kernel test 
    224 cases.
    225 Kernel test cases look very similar to TET user-level test cases.  They can 
    226 call (some) TET APIs and thus use facilities provided by TET.  These test 
    227 cases are kernel modules which run directly in the kernel, and they can be 
    228 specified in the same scenarios as user-level test cases.
    229 
    230 The file src/lib/kmodapi.c contains the source for some TET APIs available in
    231 the kernel.  Not all TET C routines are available in the kernel.  Some of them
    232 like tet_fork() are not provided simply because they don't make sense in the 
    233 kernel.
    234 
    235 Kernel test cases must include the header file <tet_kmodapi.h> (as opposed to
    236 the standard <tet_api.h>) which is available in $CTI_ROOT/include directory.
    237 They must also be linked with the archive library likmodapi.a (as opposed to
    238 the standard libapi.a) located in $CTI_ROOT/lib.
    239 
    240 The file kmodtool.c is a "fake" user-level test case which acts as a
    241 proxy agent for kernel test case.  To run a kernel test case, you must use
    242 the $CTI_ROOT/bin/exec_tool script as the TCC exec tool.  This can be done 
    243 by adding an entry such as :
    244 
    245 	TET_EXEC_TOOL=${TET_ROOT}/contrib/ctitools/bin/exec_tool
    246 
    247 in tetexec.cfg.  You must also specify the TET_SU_TOOL and TET_KMOD_TOOL
    248 configuration variables, e.g.:
    249 
    250 	TET_SU_TOOL=${TET_ROOT}/contrib/ctitools/bin/sutool
    251 	TET_KMOD_TOOL=${TET_ROOT}/contrib/ctitools/bin/kmodtool
    252 
    253 The sutool utility is needed because kmodtool needs to run as root to modload 
    254 the kernel test case.
    255 
    256 When the exec_tool encounters a scenario test case name such as
    257 
    258 	/foo/bar/mytestcase:kmod
    259 
    260 which has the "kmod" or "kernel" option set, it calls on the sutool utility
    261 to start the user-level kmodtool test case as root, passing in the path
    262 to the kernel test case as argument.  In turn, kmodtool creates a Solaris door
    263 server and then modloads the kernel test case.  During the initialization
    264 phase, the kernel test case sets up a kernel door server and then contacts
    265 kmodtool via kmodtool's door.  Thus these two doors provide a two-way
    266 communication channel between the kernel test case and kmodtool.
    267 
    268 kmodtool acts as proxy agent for the kernel test case because to the TET Test
    269 Case Manager (TCM) the user-level kmodtool is the test case that it is actually
    270 running.  When the TCM executes a test purpose function inside kmodtool, this
    271 function then forwards the request, via the door, to the test case in the 
    272 kernel.
    273 When the call reaches the kernel door server, it in turn calls the actual test
    274 purpose routine in the kernel test case. Conversely, when the kernel test case
    275 calls a kernel TET API (kmodapi.c), the routine forwards the request up to
    276 kmodtool's door server in userland. kmodtool's door server in turn calls the
    277 actual TET API on behalf of the kernel test case.
    278 
    279 This allows you to write test cases that run directly in the kernel and yet
    280 still use many of TET's facilities, such as calling tet_getvar() from
    281 inside the kernel to get configuration variables specified in tetexec.cfg,
    282 or running a distributed kernel test on several remote machines with remote
    283 parts doing synchronization and communication among each other.  And the
    284 same scenario processing facility also applies to kernel tests.  For example,
    285 it's possible to do this
    286 
    287 	:parallel,20:
    288 	/foo/bar/tc1:kernel
    289 	:endparallel:
    290 
    291 which runs 20 instances of the tc1 kernel test case in parallel (this of course
    292 means that all 20 instances of tc1 run within the same address space, which
    293 means tc1 has to be written in such a way that these instances don't interfere
    294 with each other when accessing global kernel resources).  And kernel test cases
    295 can be mixed and matched with userland test cases, for example:
    296 
    297 	:timed_loop,3600:
    298 	  :distributed,1-4,7:
    299 	    :random:
    300 	      /foo/bar/user-tc{3,5,7}
    301 	      /foo/bar/kernel-tc:kmod{1-3}
    302 	    :endrandom:
    303 	  :enddistributed:
    304 	:endtimed_loop:
    305 
    306 As mentioned previously, not all TET functions are available in the kernel.
    307 Some like tet_fork() are not provided because they don't make sense in the
    308 kernel.  While some have slightly different interfaces from the actual TET
    309 version.  In particular those that return an allocated buffer such as
    310 tet_getvar() and tet_remgetlist().  For these routines, you must pass a
    311 buffer that you allocate yourself prior to the call.  This requirement was made
    312 to help remind callers to deallocate those buffers when they are done and
    313 to minimize the chance they forget, which would cause a kernel memory leak.
    314 For a list of TET APIs available in the kernel see the the header file
    315 $CTI_ROOT/include/tet_kmodapi.h.
    316 
    317 ===============================================================================
    318 
    319 bin/sutool	(Source - src/utils/sutool.c)
    320 
    321 sutool is a simple tool, akin to su or sudo, that allows an arbitrary command
    322 to be executed as the specified user (including root).  Unlike su or sudo,
    323 this program does NOT ask for any password.  It changes the UID, EUID,
    324 saved-UID, GID, EGID, saved-GID, and supplementary group list of the process
    325 to those of the specified user's prior to executing the command.
    326 
    327 WARNING: This program is a major security risk.  Do not use if security is an
    328 issue and/or remove the installed binary from the package installation.
    329 
    330 ===============================================================================
    331 
    332 *** Important Security Notes:
    333 
    334 The CTI-TET packages install three (3) binaries with the setuid bit set.
    335 At least one of these programs makes the system completely insecure by 
    336 allowing any local user on the system to acquire 'root' privileges and 
    337 obtain unrestricted access to the system.  These files are:
    338 
    339 $CTI_ROOT/bin/sutool
    340 $CTI_ROOT/bin/gosu
    341 $CTI_ROOT/bin/gouser
    342 
    343 Each of these is installed with the permissions "4555".
    344 
    345 In order to disable the setuid bit on these programs and make your
    346 system more secure, become 'root' and issue the command
    347 	# chmod 555 <program-name>
    348 
    349 However, be warned that changing the permissions this way could
    350 interfere with the intended use of these programs and may negatively 
    351 impact expected CTI-TET functionality.  Consequently, you must 
    352 remember to do
    353 	# chmod 4555 <program-name>
    354 before attempting to use CTI-TET, or you could encounter strange
    355 and hard-to-debug test failures.
    356 
    357