Add gentemplates.sh to extract template content

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 <sven.vermeulen@siphos.be>
This commit is contained in:
Sven Vermeulen 2018-03-25 13:56:35 +02:00 committed by Chris PeBenito
parent e2bae7b65d
commit 9d8bb4eb93
1 changed files with 62 additions and 0 deletions

62
support/gentemplates.sh Executable file
View File

@ -0,0 +1,62 @@
#!/bin/sh
showHelp() {
echo "Usage: $(basename $0) --generate --sourcedir=<sourcedir> --targetdir=<targetdir>"
echo " $(basename $0) -g -s <sourcedir> -t <targetdir>"
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=<sourcedir> (-s <sourcedir>)"
echo " Source directory to recursively search for interfaces/templates"
echo " --targetdir=<targetdir> (-t <targetdir>)"
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