#!/bin/bash # =================================================== # # llxcfg-template # # # # Escrito por Luis García # # para LliureX. Marzo 2006 # # # # Utilidad para procesamiento de plantillas # # =================================================== # # set -e # variables LLXCFG_TMPL="llxcfg-tmpl v 0.1" usage(){ echo "Usage: $0 [--no-gpp] {TEMPLATE_FILE|-} [INCLUDE_FILE1 INCLUDE_FILE2 ... ]" >&2 exit 0 } expand_var_list(){ local TEMPLATE_FILE="$1" shift sed_var_list_command $@ |sed -f - "$TEMPLATE_FILE" } sed_var_list_command(){ local VAR_NAME SED_CMD for VAR_NAME in $@; do SED_CMD="s%_@_${VAR_NAME}_@_%${!VAR_NAME}%g;" echo ${SED_CMD} done } list_expand_vars(){ local SOURCE_FILE VAR_LIST0 VAR_LIST VAR_NAME SOURCE_FILE="$1" VAR_LIST0=`sed -ne "s%.*_@_\([^[:space:]]*\)_@_.*%\1%p" ${SOURCE_FILE}` VAR_LIST="" for VAR_NAME in ${VAR_LIST0}; do echo " ${VAR_LIST} " |grep -q " ${VAR_NAME} " || VAR_LIST="${VAR_LIST} ${VAR_NAME}" done echo "${VAR_LIST}" } gen_include_file(){ cat << EOF #define LLXTMPL #define LLXTMPL_HEADER(x) x## Automatically generated with ${LLXCFG_TMPL}. Date: #date %F %R:%S ## #define LLXTMPL_TESTVAR(x) x != EOF } expand_template(){ local SOURCE_FILE EXTRA_INCLUDES INCLUDE_FILE TEMP_FILE TEMP_FILE1 TEMP_FILE2 INC_FILE OLD_SOURCE EXPAND_VARS SOURCE_FILE="$1" shift EXTRA_INCLUDES="$@" INCLUDE_FILE="`tempfile`" TEMP_FILE1="`tempfile`" TEMP_FILE2="`tempfile`" # generamos include file gen_include_file > ${INCLUDE_FILE} # añadimos los ficheros extra si existen for INC_FILE in ${EXTRA_INCLUDES}; do [ -f ${INC_FILE} ] && cat ${INC_FILE} >> ${INCLUDE_FILE} done # obtenemos la lista de variables referenciadas en la plantilla, # las leemos y procesamos la plantilla # se hace en un bucle mientras queden variables por expandir # lo que permite usar variables que contienen otras variables ... cat ${SOURCE_FILE} > ${TEMP_FILE1} SOURCE_FILE="${TEMP_FILE1}" TEMP_FILE="${TEMP_FILE2}" EXPAND_VARS="`list_expand_vars ${SOURCE_FILE}`" while [ "${EXPAND_VARS}" ]; do eval `/usr/sbin/llxcfg-showvars ${EXPAND_VARS}` expand_var_list "${SOURCE_FILE}" ${EXPAND_VARS} > ${TEMP_FILE} OLD_SOURCE=${SOURCE_FILE} SOURCE_FILE=${TEMP_FILE} TEMP_FILE=${OLD_SOURCE} EXPAND_VARS="`list_expand_vars ${SOURCE_FILE}`" done # procesamos la plantilla con gpp, si produce errores la devolvemos tal cual SOURCE_PATH="`dirname ${SOURCE_FILE}`" if [ -z "$NO_GPP" ] ; then gpp -I${SOURCE_PATH} --include ${INCLUDE_FILE} ${SOURCE_FILE} > ${TEMP_FILE} && SOURCE_FILE="${TEMP_FILE}" fi cat ${SOURCE_FILE} rm -f ${INCLUDE_FILE} rm -f ${TEMP_FILE1} rm -f ${TEMP_FILE2} return 0 } ######## # main # ######## if [ "$1" = "--no-gpp" ] ; then NO_GPP="Y" shift fi TMPL_FILE="$1" DELETE_FILE="" [ "${TMPL_FILE}" ] || usage if [ "${TMPL_FILE}" = "-" ] ; then TMPL_FILE="$(tempfile)" DELETE_FILE="$TMPL_FILE" cat - > "${TMPL_FILE}" fi [ -f "${TMPL_FILE}" ] || usage shift INCLUDE_LIST="$@" expand_template ${TMPL_FILE} ${INCLUDE_LIST} if [ "$DELETE_FILE" ] ; then rm -f "$DELETE_FILE" fi exit 0