Установка Postfix в Slackware Linux

Материал из Wiki Open book
(Перенаправлено с Установка в Slackware Linux)
Перейти к: навигация, поиск

Установить программу Postfix в Slackware Linux можно из исходных кодов способом, описанным ранее, но для удобства лучше сделать пакет. Тем не менее будет неплохо ознакомиться с предыдущей статьей.

Внимание! В этом способе я решил использовать Postfix как альтернативу MTA Sendmail и удалил пакет Sendmail из системы!

Если Вы мало знакомы с Postfix или по каким-либо причинам не хотите отказываться от привычной Вам MTA, установите программу, руководствуясь статьёй Установка Postfix из исходных кодов, чтобы поэксперементировать и понять, надо оно Вам или нет.


Пакет будет собран с поддержкой SASL и TLS. Соответственно, в системе должны быть установлены cyrus-sasl, openssl. Кроме того, требуется наличие pcre (библиотека Perl-совместимых регулярных выражений) и db4 (Библиотека баз данных Berkeley версии 4).


Я создал рабочую директорию postfix и поместил в неё архив с исходным кодом программы версии postfix-2.4.3, скрипты и файлы, необходимые для сборки пакета:

$ ls /usr/src/postfix
doinst.sh  postfix-2.4.3.tar.gz postfix.setup  postfix.SlackBuild
rc.postfix  slack-conflicts  slack-desc  slack-required
$


Скрипты и файл описания slack-desc я нашёл в интернете и немного их подправил.


Приведу содержание файлов, необходимых для сборки пакета:

1. postfix.SlackBuild

#!/bin/sh
#############################
## Build script for: postfix
## Creator:
## Date: 20 Jul 07
## Builds package: Yes
## Source location: http://www.postfix.org
## Build script version: 2
## Requirements:
##
## Notes:
##

set -e

# XXX: Set initial variables
#
CWD=`pwd`
if [ "$TMP" = "" ]; then
  TMP=/tmp
fi

NAME=postfix
VERSION=2.4.3
ARCH=${ARCH:-i686}
BUILD=ak

if [ "$ARCH" = "i386" ]; then
  SLKCFLAGS="-O2 -march=i386 -mtune=i686"
elif [ "$ARCH" = "i486" ]; then
  SLKCFLAGS="-O2 -march=i486 -mtune=i686"
elif [ "$ARCH" = "s390" ]; then
  SLKCFLAGS="-O2"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2"
fi

# build with OpenSSL (recommended)
BUILD_TLS=yes
# build with Cyrus SASL (recommended)
BUILD_SASL=yes
# build with PostgreSQL support
#BUILD_PGSQL=yes
# build with MySQL support
#BUILD_MYSQL=yes


# XXX: prepare directories and unpack sources
#
PKG=$TMP/package-$NAME
rm -rf $PKG

if [ ! -d $TMP ]; then
  mkdir -p $TMP # location to build the source
fi
if [ ! -d $PKG ]; then
  mkdir -p $PKG # place for the package to be built
fi

cd $TMP
rm -rf ${NAME}-${VERSION}
tar xvzf $CWD/${NAME}-${VERSION}.tar.gz
cd ${NAME}-${VERSION}

chown -R root.root .

find . -perm 444 -exec chmod 644 {} \;
find . -perm 777 -exec chmod 755 {} \;
find . -perm 555 -exec chmod 755 {} \;


# XXX: compile
#
CCARGS="-DHAS_PCRE"
AUXLIBS="-L/usr/lib -lpcre -ldl -lcrypt -lpthread" 
case "$BUILD_TLS" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DUSE_TLS"
    AUXLIBS="$AUXLIBS -lssl -lcrypto"
  ;;
esac
case "$BUILD_SASL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl"
    AUXLIBS="$AUXLIBS -lsasl2"
  ;;
esac
case "$BUILD_PGSQL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DHAS_PGSQL"
    AUXLIBS="$AUXLIBS -lpq"
  ;;
esac
case "$BUILD_MYSQL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DHAS_MYSQL -I/usr/include/mysql"
    AUXLIBS="$AUXLIBS -L/usr/lib/mysql -lmysqlclient -lz -lm"
  ;;
esac


## XXX: for Berkeley DB 4.x
#sed -i \
#    -e 's|/usr/include/db\([/"]\)|/usr/include/db4\1|' \
#    -e 's|-ldb\>|-ldb4|' \
#    makedefs


CFLAGS=${SLKCFLAGS}
make makefiles CC="gcc" CCARGS="$CCARGS" AUXLIBS="$AUXLIBS" OPT="${CFLAGS}" 
make

/bin/sh postfix-install \
	-non-interactive \
	install_root="${PKG}" \
	config_directory="/etc/postfix" \
	daemon_directory="/usr/libexec/postfix" \
	command_directory="/usr/sbin" \
	html_directory="/usr/doc/${NAME}-${VERSION}/html" \
	queue_directory="/var/spool/postfix" \
	sendmail_path="/usr/sbin/sendmail" \
        newaliases_path="/usr/bin/newaliases" \
        mailq_path="/usr/bin/mailq" \
	mail_owner="postfix" \
	setgid_group="postdrop" \
	manpage_directory="/usr/man" \
	sample_directory="/usr/doc/${NAME}-${VERSION}/samples" \
	readme_directory="/usr/doc/${NAME}-${VERSION}/readme"

install -c auxiliary/rmail/rmail ${PKG}/usr/bin/rmail
install -c auxiliary/qshape/qshape.pl ${PKG}/usr/bin/qshape.pl


## XXX: Change alias_maps and alias_database default directory to /etc/postfix and create empty alias.db
#
bin/postconf -c ${PKG}/etc/postfix -e \
        "alias_maps = hash:/etc/postfix/aliases" \
        "alias_database = hash:/etc/postfix/aliases"

touch ${PKG}/etc/postfix/aliases.db.new


## XXX: Change file postfix-files to use man pages in right way in Slackware Linux
#
awk '
  BEGIN{ FS = OFS = ":" }
  /^\$manpage_directory\//{ $1 = $1 ".gz" }
  { print $0 }
' $PKG/etc/postfix/postfix-files > $PKG/etc/postfix/postfix-files.tmp
mv $PKG/etc/postfix/postfix-files.tmp $PKG/etc/postfix/postfix-files
gzip -9 $PKG/usr/man/man?/*


## XXX: Add example parametres to the main.cf file to use SASL and TLS
#
cat >> $PKG/etc/postfix/main.cf <<'EOF'

# XXX Example:  SASL and TLS support  XXX
#

# Enable SASL authentication.
#
#smtpd_sasl_auth_enable = yes

# Permit relaying from users who have authenticated succesfully and accept
# mail for local and relay domains.
#
#smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination

# Saslauthd configuration will be looked in /usr/lib/sasl2/${appname}.conf
# file, as defined below.
#
#smtpd_sasl_path = postfix

# Advertise and allow AUTH only in TLS enabled channel.
#
#smtpd_tls_auth_only = yes

# Advertise STARTTLS to all clients.
#
#smtpd_use_tls = yes

# Path to private RSA key and X.509 certificate.
#
#smtpd_tls_key_file  = /etc/postfix/ssl/key.pem
#smtpd_tls_cert_file = /etc/postfix/ssl/cert.pem
EOF


## XXX: Create necessary files and directories
#
mkdir -p $PKG/usr/doc/${NAME}-${VERSION}
cp -a \
  COMPATIBILITY COPYRIGHT HISTORY \
  IPv6-ChangeLog LICENSE PORTING RELEASE_NOTES* \
  TLS_* \
  $PKG/usr/doc/${NAME}-${VERSION}

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/slack-conflicts > $PKG/install/slack-conflicts
cat $CWD/slack-required > $PKG/install/slack-required
cat $CWD/doinst.sh > $PKG/install/doinst.sh

mkdir $PKG/etc/rc.d
cat $CWD/rc.postfix > $PKG/etc/rc.d/rc.postfix.new

cat $CWD/postfix.setup > $PKG/etc/postfix/postfix.setup
chmod 755 $PKG/etc/postfix/postfix.setup

mkdir -p $PKG/usr/lib/sasl2
cat >> $PKG/usr/lib/sasl2/postfix.conf.new <<'EOF'
pwcheck_method: saslauthd
mech_list: plain login
EOF

mkdir -p $PKG/etc/pam.d
cat >> $PKG/etc/pam.d/smtp.new <<'EOF'
#
# The PAM configuration file for the `smtp' service.
# This file comes from postfix package.
#

auth     include     common-auth
account  include     common-account
EOF

for FILE in access aliases canonical generic header_checks main.cf master.cf relocated transport virtual; do
  mv $PKG/etc/postfix/$FILE $PKG/etc/postfix/$FILE.new
done


# XXX: end compile
#
## XXX: Strip binaries:
#
( cd $PKG
  find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
  find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
)
  
## XXX: Build the package:
#
cd $PKG
makepkg -l y -c n ${TMP}/${NAME}-${VERSION}-${ARCH}-${BUILD}.tgz

## XXX: Clean up the extra stuff:
#
if [ "$1" = "--cleanup" ]; then
  rm -rf ${TMP}/${NAME}-${VERSION}
  rm -rf $PKG
fi

Архитектура моей машины i686 поэтому я указал:

ARCH=${ARCH:-i686}

Версия компилятора gcc у меня 3.4.6, поэтому я использовал флаг -mtune=i686. Если версия компилятора gcc ниже 3.4.x, тогда следует указывать -mcpu=i686

Необходимо обратить внимание на следующее:

а)

----
# build with OpenSSL (recommended)
BUILD_TLS=yes
# build with Cyrus SASL (recommended)
BUILD_SASL=yes
# build with PostgreSQL support
#BUILD_PGSQL=yes
# build with MySQL support
#BUILD_MYSQL=yes

----

CCARGS="-DHAS_PCRE"
AUXLIBS="-L/usr/lib -lpcre -ldl -lcrypt -lpthread" 
case "$BUILD_TLS" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DUSE_TLS"
    AUXLIBS="$AUXLIBS -lssl -lcrypto"
  ;;
esac
case "$BUILD_SASL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl"
    AUXLIBS="$AUXLIBS -lsasl2"
  ;;
esac
case "$BUILD_PGSQL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DHAS_PGSQL"
    AUXLIBS="$AUXLIBS -lpq"
  ;;
esac
case "$BUILD_MYSQL" in
  [Nn][Oo]|'') : ;;
  *)
    CCARGS="$CCARGS -DHAS_MYSQL -I/usr/include/mysql"
    AUXLIBS="$AUXLIBS -L/usr/lib/mysql -lmysqlclient -lz -lm"
  ;;
esac
----

В этой части скрипта я определил те опции, с которыми будет производиться сборка программы и далее описал все флаги, необходимые для поддержки той или иной возможности. Информацию о флагах make я получил из примеров в каталоге README_FILES и документации в директории html.

б)

----
CFLAGS=${SLKCFLAGS}
make makefiles CC="gcc" CCARGS="$CCARGS" AUXLIBS="$AUXLIBS" OPT="${CFLAGS}" 
make

/bin/sh postfix-install \
	-non-interactive \
	install_root="${PKG}" \
	config_directory="/etc/postfix" \
	daemon_directory="/usr/libexec/postfix" \
	command_directory="/usr/sbin" \
	html_directory="/usr/doc/${NAME}-${VERSION}/html" \
	queue_directory="/var/spool/postfix" \
	sendmail_path="/usr/sbin/sendmail" \
        newaliases_path="/usr/bin/newaliases" \
        mailq_path="/usr/bin/mailq" \
	mail_owner="postfix" \
	setgid_group="postdrop" \
	manpage_directory="/usr/man" \
	sample_directory="/usr/doc/${NAME}-${VERSION}/samples" \
	readme_directory="/usr/doc/${NAME}-${VERSION}/readme"

----

Программе make передаются необходимые параметры сборки и указываются директории, куда будут скопированы файлы.

Программа postfix-install предназначена для интерактивной установки, но её также можно запускать и в неинтерактивном режиме, что и было сделано в скрипте с указанием параметров установки.

в)

----
bin/postconf -c ${PKG}/etc/postfix -e \
        "alias_maps = hash:/etc/postfix/aliases" \
        "alias_database = hash:/etc/postfix/aliases"
----

Этой командой в конфигурационный файл main.cf записывается, где нужно искать файлы почтовых псевдонимов.

г)

В дистрибутиве программы имеется файл postfix-files. В нём перечислены все директории и файлы, входящие в программу Postfix. Он предназначен для того, чтобы при завершении установки вызываемые командные сценарии могли сконфигурировать программу для дальнейшей работы. Чтобы эти скрипты могли отработать без ошибок, необходимо немного подправить файл!


В этом файле ссылки на файлы руководств не имеют расширения gz, а в Slackware Linux все файлы руководств имеют такое расширение. Когда при завешении установки вызывается командный сценарий, он не находит соответсвующих файлов и завершает работу с ошибкой.


Исправить файл postfix-files можно следующим образом, что и было сделано в скрипте postfix.Slackbuild

----
awk '
  BEGIN{ FS = OFS = ":" }
  /^\$manpage_directory\//{ $1 = $1 ".gz" }
  { print $0 }
' $PKG/etc/postfix/postfix-files > $PKG/etc/postfix/postfix-files.tmp
mv $PKG/etc/postfix/postfix-files.tmp $PKG/etc/postfix/postfix-files
gzip -9 $PKG/usr/man/man?/*
----

д)

----
## XXX: Add example parametres to the main.cf file to use SASL and TLS
#
cat >> $PKG/etc/postfix/main.cf <<'EOF'

# XXX Example:  SASL and TLS support  XXX
#

# Enable SASL authentication.
#
#smtpd_sasl_auth_enable = yes

# Permit relaying from users who have authenticated succesfully and accept
# mail for local and relay domains.
#
#smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination

# Saslauthd configuration will be looked in /usr/lib/sasl2/${appname}.conf
# file, as defined below.
#
#smtpd_sasl_path = postfix

# Advertise and allow AUTH only in TLS enabled channel.
#
#smtpd_tls_auth_only = yes

# Advertise STARTTLS to all clients.
#
#smtpd_use_tls = yes

# Path to private RSA key and X.509 certificate.
#
#smtpd_tls_key_file  = /etc/postfix/ssl/key.pem
#smtpd_tls_cert_file = /etc/postfix/ssl/cert.pem
EOF
----

Здесь в конфигурационный файл main.cf добавляются параметры, которые нужно будет указать в случае использования SASL и TLS. Аналогичным образом, прямо из скрипта postfix.Slackbuild создаются некоторые другие конфигурационные файлы.

е)

----
for FILE in access aliases canonical generic header_checks main.cf master.cf relocated transport virtual; do
  mv $PKG/etc/postfix/$FILE $PKG/etc/postfix/$FILE.new
done
----

Таким образом конфигурационные файлы переименовываются, на тот случай, чтобы при установке не заменить аналогичные файлы, если программа уже была установлена в системе.


2. doinst.sh

# Install conf files.

config() {
  NEW="$1"
  OLD="`dirname $NEW`/`basename $NEW .new`"
  # If there's no config file by that name, mv it over:
  if [ ! -r $OLD ]; then
    mv $NEW $OLD
  elif [ "`cat $OLD | md5sum`" = "`cat $NEW | md5sum`" ]; then # toss the redundant copy
    rm $NEW
  fi
  # Otherwise, we leave the .new copy for the admin to consider...
}

config etc/postfix/canonical.new
config etc/postfix/generic.new
config etc/postfix/main.cf.new
config etc/postfix/virtual.new
config etc/postfix/access.new
config etc/postfix/aliases.new
config etc/postfix/aliases.db.new
config etc/postfix/header_checks.new
config etc/postfix/master.cf.new
config etc/postfix/relocated.new
config etc/postfix/transport.new
config etc/rc.d/rc.postfix.new

config usr/lib/sasl2/postfix.conf.new
config etc/pam.d/smtp.new 

# Run the setup script for this package
echo Running /etc/postfix/postfix.setup
/etc/postfix/postfix.setup
#

В скрипте осуществляется проверка на наличие в системе аналогичных конфигурационных файлов программы. Соответственно, если файлы существуют и редактировались, то при установке пакета не будут заменяться, а будут скопированы с раширеним new.


3. slack-desc Файл описания пакета.

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

       |-----handy-ruler------------------------------------------------------|
postfix: Postfix (An alternative to the widely-used Sendmail program.)
postfix:
postfix: Postfix attempts to be fast, easy to administer, and secure,
postfix: while at the same time being sendmail compatible enough to not
postfix: upset existing users. Thus, the outside has a sendmail-ish
postfix: flavor, but the inside is completely different.
postfix:
postfix:
postfix:
postfix:
postfix:


4. rc.postfix Скрипт инициализацци Postfix в Slackware.

#!/bin/sh
#
# Slackware init script for postfix
# Written by 
# Last revision on 10 July 2007
#

PFUSER=postfix
PFDROP=postdrop
PFEXEC=/usr/sbin/postfix
PFLIBEXEC=/usr/libexec/postfix

# Continue only if Postfix appears to be properly installed.
if [ ! -x $PFEXEC -o ! -d $PFLIBEXEC ]; then
  echo "Postfix is not installed correctly" >&2
  exit 1
fi


check_env() {
  # Confirm that the Postfix user and groups exist.  If not, suggest that
  # the setup script be re-run.
  need_setup=0
  grep -q "^$PFUSER:" /etc/group || need_setup=1
  grep -q "^$PFDROP:" /etc/group || need_setup=1
  grep -q "^$PFUSER:" /etc/passwd || need_setup=1

  if [ $need_setup -eq 1 ]; then
    echo "Postfix is installed but has not been set up correctly." >&2
    echo "Please run the Postfix setup script: /etc/postfix/postfix.setup" >&2
    exit 1
  fi
}

start() {
  check_env
  echo -n "Starting Postfix MTA: "
  $PFEXEC start 2>/dev/null
  [ $? -eq 0 ] && echo ok || echo failed
}

stop() {
  echo -n "Stopping Postfix MTA: "
  $PFEXEC stop 2>/dev/null
  [ $? -eq 0 ] && echo ok || echo failed
}

restart() {
  stop
  start
}

reload() {
  echo -n "Reloading Postfix MTA: "
  $PFEXEC reload 2>/dev/null
  [ $? -eq 0 ] && echo ok || echo failed
}


case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  reload)
    reload
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|reload}"
    exit 1
    ;;
esac

exit 0


5. postfix.setup Скрипт вызывается при завершении установки пакета, для конфигурирования программы, а также может вызываться из сценария rc.postfix, если были обнаружены некоторые ошибки установки.

#!/bin/sh
#
# Slackware setup script for Postfix
# Written by 
# Last revision on 10 July 2007
#

PFUSER=postfix
PFDROP=postdrop
PFUSERDESCR="Postfix MTA"
PFDIR=/var/spool/postfix
PFSHELL=/bin/false
PFEXEC=/usr/sbin/postfix
PFLIBEXEC=/usr/libexec/postfix
PFINSTALL=/etc/postfix/post-install

PFUSERUID=10025
PFUSERGID=1025
PFUSERUGID=1026

# Continue only if Postfix appears to be properly installed.
if [ ! -x $PFEXEC -o ! -d $PFLIBEXEC ]; then
  echo "Postfix is not installed correctly" >&2
  exit 1
fi

echo "Setting up Postfix Mail Transfer Agent"

# Confirm that the "postfix" and "postdrop" groups exist.
if grep -q "^$PFUSER:" /etc/group; then
  echo "Group '$PFUSER' already exists; good" >&2
else
  echo "Group '$PFUSER' does not exist; adding it to /etc/group" >&2
  echo "$PFUSER::$PFUSERGID:$PFUSER" >> /etc/group	
  # groupadd $PFUSER || exit 1
fi

if grep -q "^$PFDROP:" /etc/group; then
  echo "Group '$PFDROP' already exists; good" >&2
else
  echo "Group '$PFDROP' does not exist; adding it to /etc/group" >&2
  echo "$PFDROP::$PFUSERUGID:" >> /etc/group
  # groupadd $PFDROP || exit 1
fi

# Confirm that the "postfix" user exists.
if grep -q "^$PFUSER:" /etc/passwd; then
  echo "User '$PFUSER' already exists; good" >&2
else
  echo "User '$PFUSER' does not exist; adding it to /etc/passwd" >&2
  echo "$PFUSER:x:$PFUSERUID:$PFUSERGID:$PFUSERDESCR:$PFDIR:$PFSHELL" >> /etc/passwd
  echo "$PFUSER:*:9797:0:::::" >> /etc/shadow	
  # useradd -c $PFUSERDESCR -d $PFDIR -g $PFUSER -s $PFSHELL $PFUSER || exit 1
fi

# Run the Postfix post-install program to set up files, permissions, and
# configuration parameters.
echo "Running $PFINSTALL"
$PFINSTALL upgrade-package first-install-reminder

echo "Finished setting up Postfix Mail Transfer Agent"
exit 0

В ходе работы скрипта создаются необходимые пользователь и группы, если их нет в системе.


6. Файлы slack-conflicts и slack-required В этих файлах указываются зависимости и конфликтные программы.

$ cat slack-conflicts
sendmail

$ cat slack-required
cyrus-sasl
db4
openssl
pcre


После выполнения команды

$ sh postfix.SlackBuild

получается готовый для установки в системе пакет postfix-2.4.3-i686-ak.tgz


Далее можно установить пакет и убедится, что он есть в системе.

$ installpkg postfix-2.4.3-i686-ak.tgz

$ ls /var/log/packages/ | grep postfix
postfix-2.4.3-i686-ak
$ 

При установке пакета, если процесс завершился успешно, на экране терминала должно отобразиться следующее:

$ installpkg postfix-2.4.3-i686-ak.tgz
Installing package postfix-2.4.3-i686-ak...
PACKAGE DESCRIPTION:
postfix: Postfix (An alternative to the widely-used Sendmail program.)
postfix:
postfix: Postfix attempts to be fast, easy to administer, and secure,
postfix: while at the same time being sendmail compatible enough to not
postfix: upset existing users. Thus, the outside has a sendmail-ish
postfix: flavor, but the inside is completely different.
postfix:
Executing install script for postfix-2.4.3-i686-ak...
Running /etc/postfix/postfix.setup
Setting up Postfix Mail Transfer Agent
Group 'postfix' already exists; good
Group 'postdrop' already exists; good
User 'postfix' already exists; good
Running /etc/postfix/post-install

    Warning: you still need to edit myorigin/mydestination/mynetworks
    parameter settings in /etc/postfix/main.cf.

    See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
    for information about dialup sites or about sites inside a firewalled
    network.

    BTW: Check your /etc/aliases file and be sure to set up aliases
    that send mail for root and postmaster to a real person, then run
    /usr/bin/newaliases.

Finished setting up Postfix Mail Transfer Agent


Установка закончена.


Назад

Инструменты
    
Личные инструменты