#!/bin/sh # # Copyright (C) 2008 Manuel Mausz (manuel@mausz.at) # http://manuel.mausz.at/coding/autoresponder/ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. cfx_conf="" debug=0 alwaysyes=0 nobackup=0 arbin="autoresponder.pl" arsql="autoresponder.sql" arbackup=".old" aruid="" argid="" archmod="0550" smrsh="/etc/smrsh /etc/mail/smrsh" #------------------------------------------------------------------------------- cfx_getconf() { file="$1" name="$2" var="$3" maybezero="$4" value=$(grep "$name" "$file" | tail -n 1 | cut -d"'" -f2 2>/dev/null) eval "$var=\"$value\"" if [ -z "$maybezero" ] && [ -z "$value" ] then echo "ERROR: Unable to get configuration value for $name from $cfx_conf" exit 1 fi } askuser() { yes=$1 if [ $yes -ne 1 ] then read -p "OK (y/n)? " ok if [ "$ok" != "y" ] then echo "Aborting..." exit fi fi } echodbg() { if [ "$debug" -eq 1 ] then echo "DEBUG: $*" fi } print_usage() { echo "Usage: ./autoresponder.run /path/to/confixx_main.conf" echo " ./autoresponder.run -- [-y] [-d] [-nb] /path/to/confixx_main.conf" echo "Options:" echo " -y, --yes enter yes to all questions" echo " -nb, --nobackup don't do any backups" echo " -d, --debug enable debug messages" } #------------------------------------------------------------------------------- echo "" echo "Running setup..." # fetch OS arch=$(uname -s) # parse additional commandline parameters while [ $# -gt 0 ] do case "$1" in -d|--debug) debug=1 ;; -y|--yes) alwaysyes=1 ;; -nb|--nobackup) nobackup=1 ;; *) if [ -z "$cfx_conf" ] then cfx_conf="$1" fi ;; esac shift done # disabled as it might confuse users # fallback to default path #[ -z "$cfx_conf" ] && cfx_conf="/root/confixx/confixx_main.conf" # check confixx config if [ -z "$cfx_conf" ] then print_usage exit 1 fi if [ ! -r "$cfx_conf" ] then echo "ERROR: Unable to read $cfx_conf. Maybe wrong path." echo "" print_usage exit 1 fi # check package file exists if [ ! -f "$arbin" ] || [ ! -f "$arsql" ] then echo "ERROR: Couldn't find package files. Setup run manually?" exit 1 fi # get some configuration values echo "Fetching confixx variables from $cfx_conf..." cfx_getconf "$cfx_conf" '$ServerID =' "cfx_serverid" cfx_getconf "$cfx_conf" '$dbType =' "cfx_db_type" cfx_getconf "$cfx_conf" '$dbServer =' "cfx_db_address" cfx_getconf "$cfx_conf" '$dbPort =' "cfx_db_port" cfx_getconf "$cfx_conf" '$db_address =' "cfx_db_dsn" cfx_getconf "$cfx_conf" '$dbUser =' "cfx_db_user" cfx_getconf "$cfx_conf" '$dbPw =' "cfx_db_pass" cfx_getconf "$cfx_conf" '$dbDB =' "cfx_db_name" cfx_getconf "$cfx_conf" '$bin_autorespond =' "cfx_bin_autorespond" cfx_getconf "$cfx_conf" '$bin_mysql =' "cfx_bin_mysql" 1 cfx_getconf "$cfx_conf" '$bin_psql =' "cfx_bin_psql" 1 cfx_getconf "$cfx_conf" '$bin_sendmail =' "cfx_bin_sendmail" cfx_getconf "$cfx_conf" '$mta =' "cfx_mta" cfx_getconf "$cfx_conf" '$mta_uid =' "cfx_mta_uid" 1 cfx_getconf "$cfx_conf" '$mta_gid =' "cfx_mta_gid" 1 cfx_getconf "$cfx_conf" '$MailConfigFile =' "cfx_mta_config" 1 cfx_getconf "$cfx_conf" '$passwdDir =' "cfx_passwd" echodbg "cfx_serverid = $cfx_serverid" echodbg "cfx_db_type = $cfx_db_type" echodbg "cfx_db_address = $cfx_db_address" echodbg "cfx_db_port = $cfx_db_port" echodbg "cfx_db_dsn = $cfx_db_dsn" echodbg "cfx_db_user = $cfx_db_user" echodbg "cfx_db_pass = $cfx_db_pass" echodbg "cfx_db_name = $cfx_db_name" echodbg "cfx_bin_autorespond = $cfx_bin_autorespond" echodbg "cfx_bin_sendmail = $cfx_bin_sendmail" echodbg "cfx_bin_mysql = $cfx_bin_mysql" echodbg "cfx_bin_psql = $cfx_bin_psql" echodbg "cfx_mta = $cfx_mta" echodbg "cfx_mta_uid = $cfx_mta_uid" echodbg "cfx_mta_gid = $cfx_mta_gid" echodbg "cfx_mta_config = $cfx_mta_config" echodbg "cfx_passwd = $cfx_passwd" #------------------------------------------------------------------------------- # check for an existing autoresponder backup echo "Checking for an existing autoresponder backup..." if [ $nobackup -eq 0 ] && [ -f "${cfx_bin_autorespond}${arbackup}" ] then echo "ERROR: Autoresponder backup ${cfx_bin_autorespond}${arbackup} already exist." echo " In order to run this setup you've to move or remove this file." exit 1 fi #------------------------------------------------------------------------------- # check/build database commandline echo "" echo "Checking database settings..." dbtool="" dbbin="" if [ "$cfx_db_type" = "mysql" ] then dbbin="$cfx_bin_mysql" dbtool='$cfx_bin_mysql -u"$cfx_db_user" -p"$cfx_db_pass" -D"$cfx_db_name"' if [ "$cfx_db_port" -ge 0 2>/dev/null ] then dbtool=$dbtool' -h"$cfx_db_address" -P"$cfx_db_port"' else dbtool=$dbtool' -S"$cfx_db_port"' fi elif [ "$cfx_db_type" = "pgsql" ] then # TODO this isn't tested! dbbin="$cfx_bin_psql" dbtool='$cfx_bin_psql -U"$cfx_db_user" -d"$cfx_db_name"' if [ "$cfx_db_port" -ge 0 2>/dev/null ] then dbtool=$dbtool' -h"$cfx_db_address" -p"$cfx_db_port"' else dbtool=$dbtool' -S"$cfx_db_port"' fi else echo "ERROR: Unknown database type ($cfx_db_type)." exit 1 fi if [ -z "$dbbin" ] then echo "ERROR: Database is $cfx_db_type but commandline tool (\$bin_mysql/\$bin_psql) is not defined." exit 1 fi # display results and ask user eval "cmdstr=\"$dbtool\"" echo "Found database type \"$cfx_db_type\". Trying to execute:" echo " $cmdstr < $arsql" askuser $alwaysyes # create password for pgsql and execute command if [ "$cfx_db_type" = "pgsql" ] then export PGPASSFILE="$HOME/.pgpasscfx" touch "$PGPASSFILE" chmod 0600 "$PGPASSFILE" echo "*:*:$cfx_db_name:$cfx_db_user:$cfx_db_pass" > "$PGPASSFILE" fi eval $dbtool < $arsql ret=$? [ ! -z "$PGPASSFILE" ] && [ -e "$PGPASSFILE" ] && rm -f "$PGPASSFILE" if [ $ret != 0 ] then echo "ERROR: Unable to create/update autoresponder database table." exit 1 fi echo "Created/updated database table successfully." #------------------------------------------------------------------------------- # first change file permissions chmod 0600 "$arbin" # replace placeholders in our autoresponder echo "" echo "Trying to replace the following variables in enhanced autoresponder:" echo " Database DSN = $cfx_db_dsn" echo " Database user = $cfx_db_user" echo " Database pass = $cfx_db_pass" echo " Confixx ServerID = $cfx_serverid" echo " Mailer Binary = $cfx_bin_sendmail" askuser $alwaysyes sed -i -e "s%INSERT VALUE OF \$db_address FROM confixx_main\.conf%${cfx_db_dsn}%" "$arbin" sed -i -e "s%INSERT VALUE OF \$dbUser FROM confixx_main\.conf%${cfx_db_user}%" "$arbin" sed -i -e "s%INSERT VALUE OF \$dbPw FROM confixx_main\.conf%${cfx_db_pass}%" "$arbin" sed -i -e "s%INSERT VALUE OF \$ServerID FROM confixx_main\.conf%${cfx_serverid}%" "$arbin" sed -i -e "s%INSERT VALUE OF \$bin_sendmail FROM confixx_main\.conf%${cfx_bin_sendmail}%" "$arbin" echo "Replaced variables successfully." #------------------------------------------------------------------------------- # check for old autoresponder echo "" echo "Trying to determine uid/gid/chmod from origin autoresponder..." if [ ! -f "$cfx_bin_autorespond" ] then echo "WARNING: Origin autoresponder ($cfx_bin_autorespond) doesn't exist." # the following block contains some ugly stuff if [ "$cfx_mta" = "postfix" ] then echo "Trying to determine values from postfix configuration..." defuser="" if [ -f "$cfx_mta_config" ] then defuser=$(awk -F'=' '{ if ($1 ~ /^\s*default_privs\s*/) { str=""; for(i=2; i<=NF; i++) { str=str""$i; if (i < NF) str=str""FS }; sub(/^ */, "", str); sub(/ *$/, "", str); print str }; }' "$cfx_mta_config") if [ $? != 0 ] then echo "ERROR: Unable to read setting 'default_privs' from $cfx_mta_config." exit 1 fi echo "Using value from setting 'default_privs' from $cfx_mta_config..." fi if [ -z "$defuser" ] then echo "WARNING: Unable to read postfix configuration ($cfx_mta_config)." echo "Fallback to unprivileged user (nobody)..." defuser="nobody" fi # someone know a better way to do this without using # arrays from bash? line=$(grep "$defuser" "$cfx_passwd") aruid=$(echo "$line" | awk -F':' '{print $3}') argid=$(echo "$line" | awk -F':' '{print $4}') else echo "Using values from confixx_main.conf..." aruid="$cfx_mta_uid" argid="$cfx_mta_gid" fi else echo "Using values from origin autoresponder..." if [ "$arch" = "Linux" ] then stat=$(stat -c '%u %g %a' "$cfx_bin_autorespond") else stat=$(stat -f "%u %g %OMp%OLp" "$cfx_bin_autorespond") fi aruid=$(echo "$stat" | awk '{print $1}') argid=$(echo "$stat" | awk '{print $2}') archmod=$(echo "$stat" | awk '{print $3}') fi # sanity check if [ -z "$aruid" ] || [ -z "$argid" ] then echo "ERROR: Unable to read uid and/or gid for user $defuser from $cfx_passwd." exit 1 fi # display results and ask user echo "Trying to install enhanced autoresponder using the following parameters:" echo " Destination = $cfx_bin_autorespond" [ $nobackup -eq 0 ] && echo " Backup = ${cfx_bin_autorespond}${arbackup}" echo " UID = $aruid" echo " GID = $argid" echo " CHMOD = $archmod" echo " shmrsh = $smrsh" askuser $alwaysyes # chown + chmod chown -h $aruid:$argid "$arbin" && chmod $archmod "$arbin" if [ $? != 0 ] then echo "ERROR: Unable to change ownership or change file permissions for file $arbin." exit 1 fi # create backup if [ $nobackup -eq 0 ] && [ -f "$cfx_bin_autorespond" ] then mv "$cfx_bin_autorespond" "${cfx_bin_autorespond}${arbackup}" if [ $? != 0 ] then echo "ERROR: Unable to create backup of origin autoresponder in ${cfx_bin_autorespond}${arbackup}." exit 1 fi fi # move enchanced autoresponder to destination mv "$arbin" "$cfx_bin_autorespond" if [ $? != 0 ] then echo "ERROR: Unable to move enhanced autoresponder from setup directory to $cfx_bin_autorespond." exit 1 fi # create symlinks for smrsh for dir in $smrsh; do if [ ! -d "$dir" ] || [ -e "$dir/$arbin" ] then continue fi ln -s "$cfx_bin_autorespond" "$dir/$arbin" echo "Created symlinks for smrsh in $dir." done # additional info for sendmail if [ "$cfx_mta" = "sendmail" ] then cat <<"EOF" NOTES FOR SENDMAIL ================== Sendmail is not passing the envelope sender (also known as the value of header "Return-Path") to the executable. Although it won't be a fatal error, the header should be checked to detect bounces more easily. In order to let sendmail pass the header, you need to modify your sendmail config (sendmail.cf) and add the char "P" to the field "F" in line "prog". e.g from: Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, .... to Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9P, S=EnvFromL/HdrFromL, .... "P" should already be defined as "HP?Return-Path: <$g>" (in sendmail.cf too). Don't forget to restart sendmail afterwards. EOF fi # we're done echo "" echo "Installation completed successfully."