From: sven.vermeulen@siphos.be (Sven Vermeulen) Date: Mon, 20 Nov 2017 14:29:30 +0100 Subject: [refpolicy] [PATCH v2 1/7] Add gentemplates.sh to extract template content In-Reply-To: <20171120132936.25695-1-sven.vermeulen@siphos.be> References: <20171120132936.25695-1-sven.vermeulen@siphos.be> Message-ID: <20171120132936.25695-2-sven.vermeulen@siphos.be> To: refpolicy@oss.tresys.com List-Id: refpolicy.oss.tresys.com Some of the templates in the reference policy generate new booleans and tunables, based on the $1, $2, ... parameters passed on. To allow segenxml, which generates the necessary documentation on booleans, to keep track of template-generated booleans as well, we need to allow it to substitute template calls with the actual template content. The gentemplates.sh script is a helper script that will extract template code and store it as files (one file per template). These files are then later on used by the segenxml tool. Signed-off-by: Sven Vermeulen --- support/gentemplates.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 support/gentemplates.sh diff --git a/support/gentemplates.sh b/support/gentemplates.sh new file mode 100755 index 00000000..7f20505e --- /dev/null +++ b/support/gentemplates.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +showHelp() { + echo "Usage: $(basename $0) --generate --sourcedir= --targetdir=" + echo " $(basename $0) -g -s -t " + echo ""; + echo "The $(basename $0) script will fetch all template definitions from the interface files" + echo "located in the selected source directory, and write one file per template into the" + echo "target directory." + echo ""; + echo "Supported options:" + echo " --generate (-g) Generate template files" + echo " --sourcedir= (-s )" + echo " Source directory to recursively search for interfaces/templates" + echo " --targetdir= (-t )" + echo " Target directory to store template definitions in" +} + +flagGenerate=0; +SOURCEDIR=""; +TARGETDIR=""; + +params=$(getopt -n $(basename $0) -s sh -o gs:t: --long generate,sourcedir:,targetdir: -- "$@") +if [ $? -ne 0 ] ; then + showHelp; + exit 1; +fi + +eval set -- "${params}" +while [ $# -gt 0 ] ; do + case "$1" in + (-g) flagGenerate=1;; + (-s) SOURCEDIR="$2"; shift;; + (-t) TARGETDIR="$2"; shift;; + (--) break;; + (-*) echo "$(basename $0): error: Unrecognized option $1" 1>&2; exit 1;; + (*) break;; + esac + shift; +done + +if [ ${flagGenerate} -ne 1 ] || [ -z "${SOURCEDIR}" ] || [ -z "${TARGETDIR}" ] ; then + showHelp; + exit 1; +fi + +if [ ! -d "${SOURCEDIR}" ] ; then + echo "Directory ${SOURCEDIR} does not exist" + exit 2; +fi + +if [ ! -d "${TARGETDIR}" ] ; then + echo "Directory ${TARGETDIR} does not exist" + exit 3; +fi + +for ifile in $(find ${SOURCEDIR} -type f -name '*.if'); do + for interface in $(grep -E '^template\(' ${ifile} | sed -e 's:^template(`\([^'\'']*\)'\''\s*,\s*`:\1:g'); do + # Generate the interface + sed -n "/^template(\`${interface}',\`/,/^')/p" ${ifile} | grep -v "^template" | grep -v "^')" > ${TARGETDIR}/${interface}.iftemplate; + done +done -- 2.13.6