Download | Plain Text | No Line Numbers
- #!/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."
-