Установка Cyrus-imapd в Slackware Linux

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

Для начала я скачал последнюю версию программы отсюда: http://ftp.andrew.cmu.edu/pub/cyrus/

wget -c http://ftp.andrew.cmu.edu/pub/cyrus/cyrus-imapd-2.3.8.tar.gz

Далее распаковал архив:

$ tar -zxf cyrus-imapd-2.3.8.tar.gz
$ cd cyrus-imapd-2.3.8
$ ls

acap/            configure*    imap/          master/        SIEVE/
aclocal.m4       configure.in  IMAP-Cyrus/    netnews/       SIEVE-Cyrus/
amssync/         contrib/      imtest/        notifyd/       SMakefile
autom4te.cache/  COPYRIGHT     install-sh*    perl/          snmp/
cmulocal/        CVS/          installsieve/  ptclient/      syslog/
cmulocal-old/    cyradm/       lib/           pwcheck/       timsieved/
config.guess     depot/        makedepend/    README         tools/
config.h.in      doc/          Makefile.in    README.andrew
config.sub       et/           man/           sieve/

$

Как видно, в архиве присутствует командный сценарий .configure, значит процедура установки будет обычной.

Далле я ознакомился с документацией из каталога doc/, запустил программу .configure с опцией --help, чтобы в общих чертах понять что куда будет ставиться и поддержку каких модулей необходимо включать.

Перед тем как подготовить скрипты, я установил программу в системный каталог opt/, чтобы выяснить, будут ли какие-либо конфликтные файлы с уже имеющимися в системе, например, файлы руководств.

К сожалению, в интернете готовых скриптов, коотрые бы мне подошли для сборки пакета, я не нашёл, тем не менее я воспользовался найденными материалами, только пришлось их править.

В случае моей сборки пакета понадобятся уже установленные в системе: cyrus-sasl, db4, openssl и perl.


Итак, привожу содержание скриптов.

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

$ cd cyrus-imapd
$ ls

cyrus-imapd-2.3.8.tar.gz  cyrus.setup  mutt.config.gz  slack-desc
cyrus-imapd.SlackBuild    doinst.sh    rc.cyrus        slack-required

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

1. cyrus-imapd.SlackBuild

#!/bin/sh
#############################
## Build script for: cyrus-imapd
## Creator:
## Date: 27 Jul 07
## Builds package: Yes
## Source location: http://cyrusimap.web.cmu.edu/
## Build script version: 1
## Requirements:
##
## Notes:
##

set -e

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

NAME=cyrus-imapd
VERSION=2.3.8
ARCH=${ARCH:-i486}
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

CFLAGS=${SLKCFLAGS}

export CFLAGS="-O2 -march=i486 -mtune=i686"


# XXX: prepare directories and unpack sources
#
PKGNAME=$NAME

PKG=$TMP/package-$PKGNAME
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


# XXX: Prepare the package framework:
#
cd $PKG

mkdir $PKG/etc
mkdir $PKG/install
mkdir -p {$PKG/usr/bin,$PKG/usr/include,$PKG/usr/lib,$PKG/usr/libexec/cyrus,$PKG/usr/man,$PKG/usr/sieve}
mkdir -p $PKG/usr/doc/$PKGNAME-$VERSION $PKG/usr/share/$PKGNAME-$VERSION
mkdir -p {$PKG/var/imap,$PKG/var/spool}

cd $TMP
rm -rf $PKGNAME-$VERSION

tar xvf $CWD/$PKGNAME-$VERSION.tar.gz
cd $PKGNAME-$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
#
./configure \
  --prefix=/usr \
  --with-service-path=/usr/libexec/cyrus \
  --with-sasl \
  --with-libwrap \
  --with-openssl \
  --with-perl \
  --with-bdb-incdir=/usr/include/db4
make

make install DESTDIR=$PKG
tar cf - -C $PKG/usr/share man | (cd $PKG/usr; tar xf -)
rm -rf $PKG/usr/share/man
cp COPYRIGHT README* $PKG/usr/doc/$PKGNAME-$VERSION
cp -R doc $PKG/usr/doc/$PKGNAME-$VERSION
cp -R master/conf $PKG/usr/share/$PKGNAME-$VERSION/sample-config
cp -R tools $PKG/usr/share/$PKGNAME-$VERSION
cp $CWD/mutt.config.gz $PKG/usr/share/$PKGNAME-$VERSION
find $PKG/usr/doc/$PKGNAME-$VERSION $PKG/usr/share/$PKGNAME-$VERSION -name CVS -print0 | xargs -r0 rm -rf

## XXX: convert hardlinks to symlinks
#
( cd $PKG/usr/bin
  find . -type f -name "*test" | grep -v im | while read BINFILE; do
    rm $BINFILE
    ln -s imtest $BINFILE
  done

  cd $PKG/usr/libexec/cyrus
  rm -f pop3proxyd
  ln -s pop3d pop3proxyd
  rm -f proxyd
  ln -s imapd proxyd
  rm -f lmtpproxyd
  ln -s lmtpd lmtpproxyd
)

## XXX: Change man pages files extension to use man pages in right way in Slackware Linux
#
find $PKG/usr/man -type f -not -name '*.gz' -print0 | xargs -0 gzip
chmod -R u+w $PKG

## XXX: Rename man pages with the same name in system
#
mv $PKG/usr/man/man8/imapd.8.gz $PKG/usr/man/man8/cyrus-imapd.8.gz
mv $PKG/usr/man/man8/master.8.gz $PKG/usr/man/man8/cyrus-master.8.gz
mv $PKG/usr/man/man8/quota.8.gz $PKG/usr/man/man8/cyrus-quota.8.gz

## XXX: Create example imapd.conf file
#
touch ${PKG}/etc/imapd.conf.new

cat >> $PKG/etc/imapd.conf.new <<'EOF'
configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus
#hashimapspool: true
#unixhierarchysep: yes
sasl_pwcheck_method: auxprop
EOF

## XXX: Create nesessary files and directories
#
cat $TMP/$PKGNAME-$VERSION/master/conf/normal.conf > $PKG/etc/cyrus.conf.new
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/slack-required > $PKG/install/slack-required
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cat $CWD/cyrus.setup > $PKG/usr/share/$PKGNAME-$VERSION/tools/cyrus.setup
chmod 755 $PKG/usr/share/$PKGNAME-$VERSION/tools/cyrus.setup

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

mkdir $PKG/etc/pam.d
cat >> $PKG/etc/pam.d/imap.new <<'EOF'
#
# The PAM configuration file for the Shadow `imap' service
#
# This file is used when Cyrus IMAPD uses saslauthd and saslauthd was executed
# with `-a pam' option.
#

# The standard Unix authentication modules, used with
# NIS (man nsswitch) as well as normal /etc/passwd and
# /etc/shadow entries.
auth     include     common-auth
account  include     common-account
#session  include     common-session
EOF

## XXX: Perl garbage
#
PERLVERSION=`perl -e 'printf "%vd\n", $^V'`
PERLLOCALPOD=usr/lib/perl5/$PERLVERSION/${ARCH}-linux/perllocal.pod
PERLLOCAL=`cat $PKG/$PERLLOCALPOD`
sed 's/^/#/' >> $PKG/install/doinst.sh << EOF

cat >> $PERLLOCALPOD << '__END_OF_APPEND'
$PERLLOCAL

__END_OF_APPEND
EOF
rm -f $PKG/$PERLLOCALPOD


# 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:
#
if [ $UID = 0 ]; then
  cd $PKG
  makepkg -l y -c n $TMP/$PKGNAME-$VERSION-${ARCH}-$BUILD.tgz
fi

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

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

а) Несмотря на то, что архитектура мой машины i686, в скрипте я указал

ARCH=${ARCH:-i486}

по той причине, что в дальнейшем будут устанавливаться библиотеки для perl в каталог usr/lib/perl5/$PERLVERSION/i486-linux/.

б)

----
# XXX: Prepare the package framework:
#
cd $PKG

mkdir $PKG/etc
mkdir $PKG/install
mkdir -p {$PKG/usr/bin,$PKG/usr/include,$PKG/usr/lib,$PKG/usr/libexec/cyrus,$PKG/usr/man,$PKG/usr/sieve}
mkdir -p $PKG/usr/doc/$PKGNAME-$VERSION $PKG/usr/share/$PKGNAME-$VERSION
mkdir -p {$PKG/var/imap,$PKG/var/spool}
----

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

( Кстати, можно было пойти несколько другим путём, подготовить архив с этими каталогами и далее воспользоваться программой explodepkg.)

в)

----
## XXX: Change man pages files extension to use man pages in right way in Slackware Linux
#
find $PKG/usr/man -type f -not -name '*.gz' -print0 | xargs -0 gzip
chmod -R u+w $PKG

## XXX: Rename man pages with the same name in system
#
mv $PKG/usr/man/man8/imapd.8.gz $PKG/usr/man/man8/cyrus-imapd.8.gz
mv $PKG/usr/man/man8/master.8.gz $PKG/usr/man/man8/cyrus-master.8.gz
mv $PKG/usr/man/man8/quota.8.gz $PKG/usr/man/man8/cyrus-quota.8.gz
----

Здесь файлам руководств присваивается расширение .gz для совместимости в Slackware Linux, и переименовываются те файлы, которые уже есть в системе.

г)

----
## XXX: Create example imapd.conf file
#
touch ${PKG}/etc/imapd.conf

cat >> $PKG/etc/imapd.conf <<'EOF'
configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus operator
sasl_pwcheck_method: saslauthd
EOF
----

Таким образом, непосредственно из скрипта, создаётся один из необходимых файлов imapd.conf.


2. doinst.sh

#!/bin/sh
#

NAME=cyrus-imapd
VERSION=2.3.8
PKGNAME=$NAME
SETUP=/usr/share/$PKGNAME-$VERSION/tools/cyrus.setup

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/cyrus.conf.new
config etc/imapd.conf.new
config etc/pam.d/imap.new
config etc/rc.d/rc.cyrus.new

# Run the setup script for this package
echo Running $SETUP
$SETUP
#

В скрипте выполняется проверка на наличие старых конфигурационных файлов и запускается скрипт cyrus.setup для завершения установки.


3. cyrus.setup

#!/bin/sh
#

NAME=cyrus-imapd
VERSION=2.3.8
PKGNAME=$NAME
TOOLS=/usr/share/$PKGNAME-$VERSION/tools

CYRUSER=cyrus
CYRGROUP=mail
CYRUSERDESCR="Cyrus IMAPd"
CYRDIR=/var/imap
CYRSHELL=/bin/bash

CYRUSERUID=10143
CYRUSERGID=12

# Confirm that the "mail" groups exist.
if grep -q "^$CYRGROUP:" /etc/group; then
  echo "Group '$CYRGROUP' already exists; good" >&2
else
  echo "Group '$CYRGROUP' does not exist; adding it to /etc/group" >&2
  echo "$CYRGROUP::$CYRUSERGID:" >> /etc/group	
fi

# Confirm that the "cyrus" user exists.
if grep -q "^$CYRUSER:" /etc/passwd; then
  echo "User '$CYRUSER' already exists; good" >&2
else
  echo "User '$CYRUSER' does not exist; adding it to /etc/passwd" >&2
  echo "$CYRUSER:x:$CYRUSERUID:$CYRUSERGID:$CYRUSERDESCR:$CYRDIR:$CYRSHELL" >> /etc/passwd
  echo "$CYRUSER:*:9797:0:::::" >> /etc/shadow	
fi

chown -R $CYRUSERUID:$CYRUSERGID /var/imap
chmod 750 /var/imap
chown -R $CYRUSERUID:$CYRUSERGID /var/spool/imap
chmod 750 /var/spool/imap
chown -R $CYRUSERUID:$CYRUSERGID /usr/sieve
chmod 750 /usr/sieve

su cyrus -c $TOOLS/mkimap

cat << EOM
Remember to install Cyrus SASL library linked against Berkley DB 4.x.
And remember to run saslauthd.

And one more thing: get the MTA supporting LMTP (Postfix is a good one).
EOM

В данном скрипте выполняется проверка на наличие необходимых пользователя и группы для работы программы, в случае отсутствия эти пользователь и группа создаются. Далее устанавливаются необходимые разрешения для рабочих каталогов и запускается программа mkimap, которая завершит конфигурирование и подготовку этих каталогов, а также создаст все остальные необходимые директории для дальнейшей работы.


4. 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------------------------------------------------------|
cyrus-imapd: Cyrus IMAPD
cyrus-imapd:
cyrus-imapd: IMAP (Internet Message Access Protocol) is an Internet standards-track
cyrus-imapd: protocol for accessing messages (mail, bboards, news, etc).
cyrus-imapd: The Cyrus IMAP server differs from other IMAP server implementations
cyrus-imapd: in that it is generally intended to be run on sealed servers, where
cyrus-imapd: normal users are not permitted to log in. The mailbox database is
cyrus-imapd: stored in parts of the filesystem that are private to the Cyrus IMAP
cyrus-imapd: system. All user access to mail is through the IMAP, POP3, or KPOP
cyrus-imapd: protocols.
cyrus-imapd:


5. rc.cyrus Скрипт инициализации в Slackware Linux

#!/bin/sh
#
# Slackware init script for Cyrus IMAPD server
# Written by 
# Last revision on 20 July 2007
#

COMMAND='/usr/libexec/cyrus/master -d'

cyrus_start() {
  if [ -x /usr/libexec/cyrus/master ]; then
    echo "Starting Cyrus IMAPD daemon:  $COMMAND"
    eval "$COMMAND"
  fi
}

cyrus_stop() {
  if [ -f /var/run/cyrus-master.pid ]; then
    echo "Stopping Cyrus IMAPD daemon"
    kill `cat /var/run/cyrus-master.pid`
    #pkill -x master
    rm /var/run/cyrus-master.pid
  else
    echo "Cyrus IMAPD daemon is stopped"
  fi
}

cyrus_restart() {
  cyrus_stop
  sleep 1
  cyrus_start
}

case "$1" in
  start)
    cyrus_start
    ;;
  stop)
    cyrus_stop
    ;;
  restart)
    cyrus_restart
    ;;
  *)
    echo "usage $0 start|stop|restart"
esac


6. Файл slack-required. Здесь указываются зависимости.

cyrus-sasl
db4
openssl
perl

В каталоге имеется архив mutt.config.gz с файлом mutt.config. Этот файл содержит настройки, для переноса почтового ящика на IMAP сервер. Можно его не устанавливать, но тогда надо найти и удалить следующую строчку из скрипта cyrus-imapd.SlackBuild:

----
cp $CWD/mutt.config.gz $PKG/usr/share/$PKGNAME-$VERSION
----

Содержание файла mutt.config следующее:

# This file contains some Mutt settings letting you move whole mailbox to IMAP
# server.

# this mailbox will be opened on start
# note: /INBOX is independent for each user, this is safe global setting
set spoolfile = "imap://localhost/INBOX"

# folder where your mailboxes (=local_mailbox, for example) will be stored
# default is $HOME/Mail
#set folder   = "imap://localhost/"

# username used for login to IMAP server; this is safe default
set imap_user = $USER
# password for user; since each user should have his own password you cannot
# give global default here, but user can give it in ~/.muttrc (chmod 600!)
#set imap_pass = ""

# list of authentication methods used to login to IMAP server; "login" is the
# only one I found working with my current Cyrus IMAPD config
set imap_authenticators = "login"

# vim:ft=muttrc


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

$ sh cyrus-imapd.SlackBuild

получается готовый для установки в системе пакет cyrus-imapd-2.3.8-i486-ak.tgz


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

$ installpkg cyrus-imapd-2.3.8-i486-ak.tgz

$ ls /var/log/packages/ | grep cyrus-imapd
cyrus-imapd-2.3.8-i486-ak
$ 


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


Назад

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