Для начала я скачал последнюю версию программы отсюда: 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 $
Установка закончена.