#!/bin/bash set -e CONFDIR="${CONFDIR:-/etc/exim4}" DONOTRUN='true' UPEX4CT_outputfile="${CONFDIR}/exim4.conf.template" usage() { cat <&2 exit 1 fi eval set -- ${TEMP} while test "$1" != "--"; do case $1 in -h|--help) usage exit 0 ;; -o|--output) shift UPEX4CT_outputfile="$1" ;; -n|--nobackup) NOBACKUP=1 ;; -r|--run) DONOTRUN='false' ;; esac shift done shift # No non-option arguments allowed. if [ "$#" -ne 0 ]; then echo "No non option arguments ($@) allowed" >&2 usage >&2 exit 1 fi # run-parts emulation, stolen from Branden's /etc/X11/Xsession # Addition: Use file.rul instead if file if it exists. run_parts () { # reset LC_COLLATE unset LANG LC_COLLATE LC_ALL if [ -z "$1" ]; then errormessage "$0: internal run_parts called without an argument" fi if [ ! -d "$1" ]; then errormessage "$0: internal run_parts called, but $1 does not exist or is not a directory." fi for F in $(ls $1 | grep -v /.svn); do if expr "$F" : '[[:alnum:]_-]\+$' > /dev/null 2>&1; then if [ -f "$1/$F" ] ; then if [ -f "$1/${F}.rul" ] ; then echo "$1/${F}.rul" else echo "$1/$F" fi fi fi done; } # also from Branden errormessage () { # pretty-print messages of arbitrary length (no trailing newline) echo "$*" | fold -s -w ${COLUMNS:-80} >&2; } cat_parts() { if [ -z "$1" ]; then errormessage "$0: internal cat_parts called without an argument" fi if [ ! -d "$1" ]; then errormessage "$0: internal cat_parts called, but $1 does not exist or is not a directory." fi for file in $(run_parts $1); do echo "#####################################################" echo "### $file" echo "#####################################################" cat $file echo "#####################################################" echo "### end $file" echo "#####################################################" done } if [ "$DONOTRUN" = "true" ]; then errormessage "This program overwrites conffiles. Do not run unless you have consulted the manpage." >&2 echo "Terminating..." >&2 exit 1 fi if [ -e "${UPEX4CT_outputfile}" ] && [ -z "$NOBACKUP" ]; then if [ -e "${UPEX4CT_outputfile}.bak.$$" ]; then echo >&2 "ERR: ${UPEX4CT_outputfile}.bak.$$ already exists, aborting" exit 1 fi fi NEWTEMPLATE=$(tempfile -m644 -p ex4) if [ -f "${UPEX4CT_outputfile}" ] ; then chmod --reference="${UPEX4CT_outputfile}" "$NEWTEMPLATE" fi # generate .template. Ugly - better alternative? SAVEWD="$(pwd)" cd ${CONFDIR}/conf.d for i in main acl router transport retry rewrite auth ; do cat_parts $i done > "$NEWTEMPLATE" cd "$SAVEWD" if [ -e "${UPEX4CT_outputfile}" ] && [ -z "$NOBACKUP" ] ; then mv "${UPEX4CT_outputfile}" \ "${UPEX4CT_outputfile}.bak.$$" fi mv "$NEWTEMPLATE" "${UPEX4CT_outputfile}"