- spec cleanup

This commit is contained in:
Michal Hlavinka 2009-11-26 13:32:56 +00:00
parent e7fa91917f
commit 094b4f7118
9 changed files with 58 additions and 515 deletions

View File

@ -1,94 +0,0 @@
diff -Naur cyrus-imapd-2.3.1.orig/lib/imapoptions cyrus-imapd-2.3.1/lib/imapoptions
--- cyrus-imapd-2.3.1.orig/lib/imapoptions 2005-12-13 20:36:11.000000000 +0100
+++ cyrus-imapd-2.3.1/lib/imapoptions 2006-01-13 10:17:26.000000000 +0100
@@ -198,9 +198,12 @@
grant the user the ability to delete a mailbox. If a user has this
right, they will automatically be given the new 'x' right. */
-{ "duplicate_db", "berkeley-nosync", STRINGLIST("berkeley", "berkeley-nosync", "skiplist") }
+{ "duplicate_db", "skiplist", STRINGLIST("berkeley", "berkeley-nosync", "skiplist") }
/* The cyrusdb backend to use for the duplicate delivery suppression
- and sieve. */
+ and sieve.
+.PP
+ Note: This Invoca RPM build uses \fIskiplist\fR by default instead of
+ \fIberkeley-nosync\fR for \fBduplicate_db\fR. */
{ "duplicatesuppression", 1, SWITCH }
/* If enabled, lmtpd will suppress delivery of a message to a mailbox if
@@ -220,12 +223,15 @@
result in greater responsiveness for the client, especially when
expunging a large number of messages. */
-{ "flushseenstate", 0, SWITCH }
+{ "flushseenstate", 1, SWITCH }
/* If enabled, changes to the seen state will be flushed to disk
immediately, otherwise changes will be cached and flushed when the
mailbox is closed. This option may be used to fix the problem of
previously read messages being marked as unread in Microsoft
- Outlook, at the expense of a loss of performance/scalability. */
+ Outlook, at the expense of a loss of performance/scalability.
+.PP
+ Note: This Invoca RPM build uses \fI1\fR by default instead of
+ \fI0\fR for \fBflushseenstate\fR. */
{ "foolstupidclients", 0, SWITCH }
/* If enabled, only list the personal namespace when a LIST "*" is performed.
@@ -735,8 +741,11 @@
/* Unix domain socket that ptloader listens on.
(defaults to configdir/ptclient/ptsock) */
-{ "ptscache_db", "berkeley", STRINGLIST("berkeley", "skiplist") }
-/* The cyrusdb backend to use for the pts cache. */
+{ "ptscache_db", "skiplist", STRINGLIST("berkeley", "skiplist") }
+/* The cyrusdb backend to use for the pts cache.
+.PP
+ Note: This Invoca RPM build uses \fIskiplist\fR by default instead of
+ \fIberkeley\fR for \fBptscache_db\fR. */
{ "ptscache_timeout", 10800, INT }
/* The timeout (in seconds) for the PTS cache database when using the
@@ -813,9 +822,12 @@
{ "seenstate_db", "skiplist", STRINGLIST("flat", "berkeley", "skiplist") }
/* The cyrusdb backend to use for the seen state. */
-{ "sendmail", "/usr/lib/sendmail", STRING }
+{ "sendmail", "/usr/sbin/sendmail", STRING }
/* The pathname of the sendmail executable. Sieve invokes sendmail
- for sending rejections, redirects and vacation responses. */
+ for sending rejections, redirects and vacation responses.
+.PP
+ Note: This Invoca RPM build uses \fI/usr/sbin/sendmail\fR by default
+ instead of \fI/usr/lib/sendmail\fR for \fBsendmail\fR. */
{ "servername", NULL, STRING }
/* This is the hostname visible in the greeting messages of the POP,
@@ -842,9 +854,12 @@
/* Maximum number of sieve scripts any user may have, enforced at
submission by timsieved(8). */
-{ "sievedir", "/usr/sieve", STRING }
+{ "sievedir", "/var/lib/imap/sieve", STRING }
/* If sieveusehomedir is false, this directory is searched for Sieve
- scripts. */
+ scripts.
+.PP
+ Note: This Invoca RPM build uses \fI/var/lib/imap/sieve\fR by default
+ instead of \fI/usr/sieve\fR for \fBsievedir\fR. */
{ "sievenotifier", NULL, STRING }
/* Notifyd(8) method to use for "SIEVE" notifications. If not set, "SIEVE"
@@ -934,8 +949,11 @@
have filenames with the hashed value of the certificate (see
openssl(XXX)). */
-{ "tlscache_db", "berkeley-nosync", STRINGLIST("berkeley", "berkeley-nosync", "skiplist") }
-/* The cyrusdb backend to use for the TLS cache. */
+{ "tlscache_db", "skiplist", STRINGLIST("berkeley", "berkeley-nosync", "skiplist") }
+/* The cyrusdb backend to use for the TLS cache.
+.PP
+ Note: This Invoca RPM build uses \fIskiplist\fR by default instead of
+ \fIberkeley-nosync\fR for \fBtlscache_db\fR. */
{ "tls_cert_file", NULL, STRING }
/* File containing the certificate presented for server authentication

View File

@ -1,14 +0,0 @@
--- cyrus-imapd-2.3.7/imap/message.c 2006-10-28 22:18:08.000000000 +0200
+++ cyrus-imapd-2.3.7/imap/message.c.nobarenewlinescheck 2006-10-28 22:21:55.000000000 +0200
@@ -256,8 +256,9 @@
r = IMAP_MESSAGE_CONTAINSNULL;
}
else if (*p == '\n') {
- if (!sawcr && (inheader || !allow_null))
- r = IMAP_MESSAGE_CONTAINSNL;
+ /* Do *NOT* check for RFC compliant line breaks (bare newlines) */
+ /* if (!sawcr && (inheader || !allow_null))
+ r = IMAP_MESSAGE_CONTAINSNL; */
sawcr = 0;
if (blankline) {
inheader = 0;

View File

@ -31,7 +31,4 @@ The following steps should lead you to a running Cyrus IMAP server:
info priority with something like 'mail.info /var/log/maillog' in
/etc/syslog.conf.
Read the file "README.buildoptions" in this directory to find out which
build time options have been used to build this package.
Enjoy!

View File

@ -1,10 +0,0 @@
The programs provided here in the contrib directory are taken from
various places on the net. Sometimes I even don't know where I found
them and the license may also be unclear. If the creator of one of the
scripts doesn't like to see it included in this contrib section, let
me know and I'll remove it from the package.
I have never used any of the scripts here so I really don't know how
they work or whether there are better ways to complete a task. I've
been told that there are better tools to migrate from UW-IMAP. So be
warned, use at your own risk.

View File

@ -2,7 +2,7 @@
Name: cyrus-imapd
Version: 2.3.15
Release: 7%{?dist}
Release: 8%{?dist}
%define ssl_pem_file %{_sysconfdir}/pki/%{name}/%{name}.pem
@ -13,10 +13,8 @@ Release: 7%{?dist}
%define _cyrusgroup mail
%define _cyrexecdir %{_exec_prefix}/lib/%{name}
%define _cyrusconf master/conf/prefork.conf
Summary: A high-performance mail server with IMAP, POP3, NNTP and SIEVE support
License: MIT
License: BSD
Group: System Environment/Daemons
URL: http://cyrusimap.web.cmu.edu/
Source0: ftp://ftp.andrew.cmu.edu/pub/cyrus/%{name}-%{version}.tar.gz
@ -40,15 +38,13 @@ Source19: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/cpmsg
Source20: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/folderxfer
Source21: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/inboxfer
Source22: http://email.uoa.gr/download/cyrus/cyrus_sharedbackup/cyrus_sharedbackup-0.1.tar.gz
Source23: cyrus-imapd-README.RPM
Source24: cyrus-imapd-README.HOWTO-recover-mailboxes.db
Source24: README.HOWTO-recover-mailboxes.db
Source25: cyrus-imapd.cron-daily
Source26: cyrus-procmailrc
Source27: cyrus-imapd-procmail+cyrus.mc
Source28: cyrus-imapd.rpm_set_permissions
Source29: cyrus-imapd-sendmail-8.12.9-cyrusv2.m4
Source30: cyrus-imapd-README.contrib
Source33: cyrus-imapd-README.skiplist_recovery
Source33: README.skiplist_recovery
Patch0: cyrus-imapd-2.2.12-no_transfig.patch
Patch1: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.12/cyrus-imapd-2.3.12p2-autocreate-0.10-0.diff
Patch2: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.12/cyrus-imapd-2.3.12p2-autosieve-0.6.0.diff
@ -70,8 +66,8 @@ Patch21: cyrus-imapd-2.3.15-nodebug.patch
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: autoconf >= 2.59
BuildRequires: cyrus-sasl-devel >= 2.1.15-1, perl-devel, tcp_wrappers
BuildRequires: autoconf
BuildRequires: cyrus-sasl-devel, perl-devel, tcp_wrappers
BuildRequires: db4-devel, openssl-devel, pkgconfig
BuildRequires: flex, bison, groff, automake
BuildRequires: openldap-devel
@ -83,7 +79,7 @@ Requires(preun): chkconfig, initscripts, coreutils
Requires(postun): initscripts
Requires: %{name}-utils = %{version}-%{release}
Requires: cyrus-sasl-lib >= 2.1.15, file >= 3.35-1, db4-utils
Requires: file, db4-utils
Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
%description
@ -159,21 +155,37 @@ one running the server.
%patch20 -p1 -b .bufov
%patch21 -p1 -b .nodebug
# add additional sources
mkdir doc/{m4,contrib}
%{__install} -m 644 %{SOURCE10} %{SOURCE15} %{SOURCE16} %{SOURCE17} \
%{SOURCE18} %{SOURCE19} %{SOURCE20} %{SOURCE21} doc/contrib/
%{__install} -m 644 %{SOURCE24} %{SOURCE33} %{SOURCE8} %{SOURCE9} doc/
%{__install} -m 644 %{SOURCE26} %{SOURCE4} %{SOURCE27} %{SOURCE29} doc/m4/
# only to update config.* files
automake -a -f -c || :
aclocal -I cmulocal
autoheader
autoconf -f
# Modify docs master --> cyrus-master
%{__perl} -pi -e "s@master\(8\)@cyrus-master(8)@" man/*5 man/*8 lib/imapoptions
%{__sed} -i -e 's|\([^-]\)master|\1cyrus-master|g;s|^master|cyrus-master|g;s|Master|Cyrus-master|g;s|MASTER|CYRUS-MASTER|g' \
man/master.8 doc/man.html
# Modify path in perl scripts
find . -type f -name "*.pl" | xargs %{__perl} -pi -e "s@/usr/local/bin/perl@%{__perl}@"
# modify lmtp socket path in .conf files
%{__perl} -pi -e "s@/var/imap/@%{_var}/lib/imap/@" master/conf/*.conf doc/cyrusv2.mc doc/m4/%{name}-sendmail-8.12.9-cyrusv2.m4
# enable idled in .conf files to prevent error messages
%{__perl} -pi -e "s/# idled/ idled/" master/conf/*.conf
%build
CPPFLAGS="-I%{_includedir}/et"; export CPPFLAGS
CPPFLAGS="$RPM_OPT_FLAGS -I%{_includedir}/et -I%{_includedir}/kerberosIV"; export CPPFLAGS
CFLAGS="$RPM_OPT_FLAGS -fPIC"; export CFLAGS
if pkg-config openssl; then
CPPFLAGS="$(pkg-config --cflags-only-I openssl) $CPPFLAGS"; export CPPFLAGS
CFLAGS="$(pkg-config --cflags openssl) $CFLAGS"; export CFLAGS
LDFLAGS="$(pkg-config --libs-only-L openssl) $LDFLAGS"; export LDFLAGS
fi
CPPFLAGS="-I%{_includedir}/kerberosIV $CPPFLAGS"; export CPPFLAGS
CCDLFLAGS="-rdynamic"; export CCDLFLAGS
%ifnarch ppc ppc64
LDFLAGS="$LDFLAGS -pie"; export LDFLAGS
@ -202,52 +214,13 @@ LDFLAGS="$LDFLAGS -pie"; export LDFLAGS
%{__make}
%{__make} -C notifyd notifytest
# Modify docs master --> cyrus-master
pushd man
%{__perl} -pi -e "s@master\(8\)@cyrus-master(8)@" $(ls *5 *8)
popd
pushd doc
%{__perl} -pi -e "s@master@cyrus-master@g;" man.html
popd
pushd doc/man
%{__perl} -pi -e "s@master\(8\)@cyrus-master(8)@;" $(ls *html)
popd
# Modify path in perl scripts
%{__perl} -pi -e "s@/usr/local/bin/perl@%{__perl}@" $(find . -type f -name "*.pl")
%install
%{__rm} -rf %{buildroot}
# Fix permissions on perl programs
find . -type f -name "*.pl" -exec %{__chmod} 755 {} \;
# Cleanup of doc dir
find doc perl -name CVS -type d | xargs -r %{__rm} -fr
find doc perl -name .cvsignore -type f | xargs -r %{__rm} -f
find doc -name "*~" -type f | xargs -r %{__rm} -f
find doc -name "*.html.*" -type f | xargs -r %{__rm} -f
%{__rm} -f doc/Makefile.dist*
%{__rm} -f doc/text/htmlstrip.c
%{__install} -m 644 %{SOURCE23} doc/README.RPM
%{__install} -m 644 %{SOURCE24} doc/README.HOWTO-recover-mailboxes.db
%{__install} -m 644 %{SOURCE33} doc/README.skiplist_recovery
%{__install} -m 644 %{SOURCE8} doc/README.autocreate
%{__install} -m 644 %{SOURCE9} doc/README.autosievefolder
%{__install} -d doc/m4
%{__install} -m 644 %{SOURCE26} doc/m4/cyrus-procmailrc
%{__install} -m 644 %{SOURCE4} doc/m4/cyrus-user-procmailrc.template
%{__install} -m 644 %{SOURCE27} doc/m4/%{name}-procmail+cyrus.mc
%{__install} -m 644 %{SOURCE29} doc/m4/%{name}-sendmail-8.12.9-cyrusv2.m4
# modify lmtp socket path in .conf files
%{__perl} -pi -e "s@/var/imap/@%{_var}/lib/imap/@" master/conf/*.conf doc/cyrusv2.mc doc/m4/%{name}-sendmail-8.12.9-cyrusv2.m4
# enable in .conf files to prevent error messages
%{__perl} -pi -e "s/# idled/ idled/" master/conf/*.conf
%install
%{__rm} -rf %{buildroot}
# This hack is needed to install the perl files correctly
# This is needed to install the perl files correctly
pushd perl/imap
%{__perl} Makefile.PL PREFIX=%{buildroot}%{_prefix} INSTALLDIRS=vendor
popd
@ -283,21 +256,7 @@ done
%{__install} -m 755 %{SOURCE13} %{buildroot}%{_cyrexecdir}/cvt_cyrusdb_all
%{__install} -m 755 %{SOURCE28} %{buildroot}%{_cyrexecdir}/rpm_set_permissions
%{__install} -m 644 %{SOURCE14} %{buildroot}%{_datadir}/%{name}/rpm/magic
%{__install} -m 644 %{SOURCE10} doc/contrib/
%{__install} -m 644 %{SOURCE15} doc/contrib/imapcreate
%{__install} -m 644 %{SOURCE16} doc/contrib/cyrus_ldap_quota
%{__install} -m 644 %{SOURCE17} doc/contrib/batchreconstruct
%{__install} -m 644 %{SOURCE18} doc/contrib/bsd2cyrus
%{__install} -m 644 %{SOURCE19} doc/contrib/cpmsg
%{__install} -m 644 %{SOURCE20} doc/contrib/folderxfer
%{__install} -m 644 %{SOURCE21} doc/contrib/inboxfer
%{__install} -m 644 %{SOURCE30} doc/contrib/README
# fix permissions on perl .so files
find %{buildroot}%{_libdir}/perl5/ -type f -name "*.so" -exec %{__chmod} 755 {} \;
# Install config files
%{__install} -p -m 644 %{_cyrusconf} %{buildroot}%{_sysconfdir}/cyrus.conf
%{__install} -p -m 644 master/conf/prefork.conf %{buildroot}%{_sysconfdir}/cyrus.conf
%{__install} -p -m 644 %{SOURCE6} %{buildroot}%{_sysconfdir}/imapd.conf
%{__install} -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/pam.d/pop
%{__install} -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/pam.d/imap
@ -306,10 +265,21 @@ find %{buildroot}%{_libdir}/perl5/ -type f -name "*.so" -exec %{__chmod} 755 {}
%{__install} -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/pam.d/lmtp
%{__install} -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/pam.d/nntp
%{__install} -p -m 644 %{SOURCE7} %{buildroot}%{_sysconfdir}/pam.d/csync
%{__install} -p -m 644 %{SOURCE12} %{buildroot}%{_sysconfdir}/sysconfig/%{name}
%{__install} -p -m 644 %{SOURCE5} %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
%{__install} -p -m 755 %{SOURCE25} %{buildroot}%{_sysconfdir}/cron.daily/%{name}
%{__install} -p -m 755 %{SOURCE11} %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name}
%{__install} -p -m 644 %{SOURCE12} %{buildroot}%{_sysconfdir}/sysconfig/%{name}
%{__install} -p -m 755 %{SOURCE25} %{buildroot}%{_sysconfdir}/cron.daily/%{name}
# Cleanup of doc dir
find doc perl -name CVS -type d | xargs -r %{__rm} -rf
find doc perl -name .cvsignore -type f | xargs -r %{__rm} -f
%{__rm} -f doc/Makefile.dist*
%{__rm} -f doc/text/htmlstrip.c
%{__rm} -f doc/text/Makefile
%{__rm} -rf doc/man
# fix permissions on perl .so files
find %{buildroot}%{_libdir}/perl5/ -type f -name "*.so" -exec %{__chmod} 755 {} \;
# fix conflicts with uw-imap
mv %{buildroot}%{_mandir}/man8/imapd.8 %{buildroot}%{_mandir}/man8/imapd.8cyrus
@ -330,24 +300,12 @@ touch %{buildroot}%{ssl_pem_file}
# Rename 'master' binary and manpage to avoid clash with postfix
%{__mv} -f %{buildroot}%{_cyrexecdir}/master %{buildroot}%{_cyrexecdir}/cyrus-master
%{__mv} -f %{buildroot}%{_mandir}/man8/master.8 %{buildroot}%{_mandir}/man8/cyrus-master.8
%{__mv} -f doc/man/master.8.html doc/man/cyrus-master.8.html
%{__perl} -pi -e 's/master/cyrus-master/g' %{buildroot}%{_mandir}/man8/cyrus-master.8
%{__perl} -pi -e 's/Master/Cyrus-master/g' %{buildroot}%{_mandir}/man8/cyrus-master.8
%{__perl} -pi -e 's/MASTER/CYRUS-MASTER/g' %{buildroot}%{_mandir}/man8/cyrus-master.8
%{__perl} -pi -e 's/master/cyrus-master/g' doc/man/cyrus-master.8.html
%{__perl} -pi -e 's/Master/Cyrus-master/g' doc/man/cyrus-master.8.html
%{__perl} -pi -e 's/MASTER/CYRUS-MASTER/g' doc/man/cyrus-master.8.html
# Rename 'fetchnews' binary and manpage to avoid clash with leafnode
%{__mv} -f %{buildroot}%{_cyrexecdir}/fetchnews %{buildroot}%{_cyrexecdir}/cyrfetchnews
%{__mv} -f %{buildroot}%{_mandir}/man8/fetchnews.8 %{buildroot}%{_mandir}/man8/cyrfetchnews.8
%{__mv} -f doc/man/fetchnews.8.html doc/man/cyrfetchnews.8.html
%{__perl} -pi -e 's/fetchnews/cyrfetchnews/g' %{buildroot}%{_mandir}/man8/cyrfetchnews.8
%{__perl} -pi -e 's/Fetchnews/Cyrfetchnews/g' %{buildroot}%{_mandir}/man8/cyrfetchnews.8
%{__perl} -pi -e 's/FETCHNEWS/CYRFETCHNEWS/g' %{buildroot}%{_mandir}/man8/cyrfetchnews.8
%{__perl} -pi -e 's/fetchnews/cyrfetchnews/g' doc/man/cyrfetchnews.8.html
%{__perl} -pi -e 's/Fetchnews/Cyrfetchnews/g' doc/man/cyrfetchnews.8.html
%{__perl} -pi -e 's/FETCHNEWS/CYRFETCHNEWS/g' doc/man/cyrfetchnews.8.html
%{__perl} -pi -e 's|fetchnews|cyrfetchnews|g;s|Fetchnews|Cyrfetchnews|g;s/FETCHNEWS/CYRFETCHNEWS/g' \
%{buildroot}%{_mandir}/man8/cyrfetchnews.8
# compress manpages
[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress
@ -365,29 +323,23 @@ done
%{__rm} -f %{buildroot}%{_cyrexecdir}/pop3proxyd
find %{buildroot} -name "perllocal.pod" -exec %{__rm} -f {} \;
find %{buildroot} -name ".packlist" -exec %{__rm} -f {} \;
%{__rm} -f doc/text/Makefile
%{__rm} -f %{buildroot}%{_mandir}/man8/syncnews.8*
%{__rm} -f doc/man/syncnews.8.html
find %{buildroot}%{perl_vendorarch} -name "*.bs" -exec %{__rm} -f {} \;
%clean
%{__rm} -rf %{buildroot}
%pre
# Let postun know whether cyrus-imapd was running
if [ -e /var/lock/subsys/cyrus-imapd ]; then
/sbin/service %{name} stop >/dev/null 2>&1 || :
touch /var/lock/subsys/cyrus-imapd
fi
# Create 'cyrus' user on target host
/usr/sbin/groupadd -g %{gid} -r saslauth 2> /dev/null || :
/usr/sbin/useradd -c "Cyrus IMAP Server" -d %{_var}/lib/imap -g %{_cyrusgroup} \
-G saslauth -s /sbin/nologin -u %{uid} -r %{_cyrususer} 2> /dev/null || :
%post
/sbin/chkconfig --add %{name}
# Force synchronous updates, usually only on ext2 filesystems
for i in %{_var}/lib/imap/{user,quota} %{_var}/spool/imap
do
chattr -R +S $i 2>/dev/null ||:
done
chattr -R +S $i %{_var}/lib/imap/{user,quota} %{_var}/spool/imap 2>/dev/null ||:
# Create SSL certificates
exec > /dev/null 2> /dev/null
@ -421,13 +373,8 @@ if [ $1 != 0 ]; then
/sbin/service %{name} condrestart >/dev/null 2>&1 || :
fi
%pre utils
# Create 'cyrus' user on target host
/usr/sbin/groupadd -g %{gid} -r saslauth 2> /dev/null || :
/usr/sbin/useradd -c "Cyrus IMAP Server" -d %{_var}/lib/imap -g %{_cyrusgroup} \
-G saslauth -s /sbin/nologin -u %{uid} -r %{_cyrususer} 2> /dev/null || :
%post utils
# FIXME: remove when setup > 2.8.10 is released
# Add service entries if necessary
if ! %{__grep} -q ^csync %{_sysconfdir}/services; then
echo -e 'csync\t\t2005/tcp\t\t\t# Cyrus IMAP Replication Daemon' >> %{_sysconfdir}/services
@ -573,6 +520,9 @@ fi
%{_mandir}/man1/*
%changelog
* Thu Nov 26 2009 Michal Hlavinka <mhlavink@redhat.com> - 2.3.15-8
- spec cleanup
* Tue Nov 24 2009 Michal Hlavinka <mhlaivnk@redhat.com> - 2.3.15-7
- rebuild with new db4 (#540093)
- spec cleanup

View File

@ -1,127 +0,0 @@
#!/usr/bin/perl
use Cyrus::IMAP::Admin;
# This script was created by Kevin J. Menard, Jr. <kmenard@wpi.edu>.
# It requires root privileges to write to a file in /etc. Best use is
# to set this up as cron job. Works for me. Hope it does for you.
# Any questions/complaints/praise/whatever, send 'em to the address
# above. -- 08/16/2001
# These are the variables you might want to tweak.
my $quota_attr = "mailQuota";
my $mail_attr = "mailRoutingAddress";
my $user = "cyrus";
my $passwd = "blah";
# These are the ones that you shouldn't have to.
my @entries = ();
my $index = 0;
my $counter = 0;
my $old_timestamp = 0;
my $timestamp = "199412161032Z";
# Open the /etc/cyrus_ldap_quota_time file; it's a long name, but
# shouldn't interfere with existing files :) This file contains 1 line,
# the generalized time format of the last time the script ran. This is
# used for the search, so we only update quotas that have been modified
# since then.
{
if (-e "/etc/cyrus_ldap_quota_time")
{
open(TIME_FILE, "/etc/cyrus_ldap_quota_time") or die "could not
open the time file: $!\n";
while(<TIME_FILE>) { $old_timestamp = $_; }
close(TIME_FILE);
}
# Now we deal with the case where the file doesn't exist, that is to
# say the first time the script was run.
unless ($old_timestamp == 0) { $timestamp = $old_timestamp; }
# Now that we have that information, we can overwrite the file with
# the new timestamp. Maybe this overkill, but this is only a
# temporary solution anyway.
open(TIME_FILE, ">/etc/cyrus_ldap_quota_time") or die "could not
create file: $!\n";
my @time = (localtime)[0..5];
printf TIME_FILE $time[5] + 1900;
printf TIME_FILE "%02d", $time[4] + 1;
for (my $i = 3; $i >= 0; $i--) { printf TIME_FILE "%02d", $time[$i];}
print TIME_FILE 'Z';
close(TIME_FILE);
}
# This is where we do the search and then parse the results into a
# useable form. In this case, an arry of hash entries.
{
# Okay, this very ugly line sets up the LDAP search, and the strips
# away the meaningless stuff. This could be prettier, but I didn't
# want to add a dependency for an LDAP module, and everyone should
# have LDAP search. The greps are just to make things simpler.
(my $query = "ldapsearch -x '(&(modifyTimestamp>=$timestamp)($quota_attr=*))' $quota_attr $mail_attr
| grep -v ^# | grep -v ^dn | grep -v ^version | grep -v ^search | grep -v ^result | grep -v ^\$") =~ s!\n!!;
# Now actually do the commands in the above line.
my $result = `$query`;
# Split the output into an array, one entry per line.
my @output = split(/\n/, $result);
# Now go through each line . . .
foreach (@output)
{
# Split on the attribute:value boundary.
(my $key, my $value) = split(/: /);
# Handle mailRoutingAddress; strip away everything after '@'.
if ($value =~ m!@!)
{
($value, undef) = split (/@/, $value);
}
# Add each doctored up attribute:value pair to the entries array.
$entries[$index]{$key} = $value;
# A crude hack to make sure each of the two attributes makes it
# into one of the entries array element.
if ($counter % 2)
{
$index++;
}
$counter++;
}
}
# Now here's the actual interaction with Cyrus IMAPd. It's all pretty
# self-explanatory.
{
my $imap = Cyrus::IMAP::Admin->new('localhost') or die "imap:
cannot connect to server: $!\n";
$imap->send(undef, undef, "LOGIN %s %s", $user, $passwd) or die
"could not send user:pass to the server: $!\n";
for (my $i = 0; $i <= $#entries; $i++)
{
$imap->setquota("user." . $entries[$i]{$mail_attr}, "STORAGE",
$entries[$i]{$quota_attr})
or die "imap: could not set quota for
user.$entries[$i]{$mail_attr}: $!\n";
}
$imap=undef;
}

View File

@ -1,159 +0,0 @@
#!/usr/bin/perl -w
#
# imapcreate: create IMAP mailboxes with quotas
# Reads user names from standard input.
# launch without argument for a short help.
#
# originally found on http://cyrus-utils.sourceforge.net
# (could not find any copyright info, thought)
#
# enhanced by Clément "nodens" Hermann <clement.hermann@free.fr>
#
# I'd like to consider this as GPL'd (cf www.gnu.org), but won't add any copyright without the original author's consent.
#
use Getopt::Long;
use Cyrus::IMAP::Admin;
use strict;
my $debug;
my $user;
my $pass;
my $quota;
my @part;
my $useunixhierarchy;
my @mailboxes;
my $delete;
my $cyrus;
sub usage {
print <<EOU;
imapcreate - create IMAP mailboxes with quotas
usage:
imapcreate [-d] [-u user] [-p pass] [-m mailbox1[,mailbox2][,mailbox<n>]]
[-q quota] [-t partition:list] [-s] [-v] <server>
Options:
-t : the partition to use. Default to the \"default\" partition
-q ; the quota, if a quota is needed. It is normally in KiloBytes, but you can use m,M,g or G suffix to use MB or GB instead, e.g 10k, 2048M or 100g
-m : a comma-separated mailbox list
-u : your cyrus admin user (usually cyrus or cyradm)
-p : your cyrus admin password (if not provided, it will be asked for)
-s : use the unix hierarchy separator (see imapd.conf(1))
-d : delete mailboxes instead of creating them
-v : run in debug mode, and print information on stdout
If no password is submitted with -p, we'll prompt for one.
if no mailbox name is specified with -m, read user names from standard input
examples:
imapcreate -u cyradm -m foo,bar,joe -q 50000 -t p1:p2 mail.testing.umanitoba.ca
cat list.txt | imapcreate -u cyradm -p 'cyruspass' -q 50M mail.testing.umanitoba.ca
EOU
exit 1;
}
# Create a mailbox... usage : &CreateMailBox(user,partition[,quota]).
# You have to be authentified already. We use "$cyrus" as the connection name.
# partition can be 'default'
sub CreateMailBox {
my $mbuser = $_[0];
my $mbpart = $_[1];
my $mbquota = $_[2];
print "Creating $mbuser on $mbpart\n" if $debug;
if ($mbpart eq 'default') {
$cyrus->createmailbox($mbuser);
}
else {
$cyrus->createmailbox($mbuser, $mbpart);
}
warn $cyrus->error if $cyrus->error;
# Set the quota
if ($mbquota) {
print "Setting quota for $mbuser to $mbquota\n" if $debug;
$cyrus->setquota($mbuser, 'STORAGE', $mbquota);
warn $cyrus->error if $cyrus->error;
}
}
# Delete a mailbox. Usage: $DeleteMailBox($user)
# Assuming we use $user as the admin.
sub DeleteMailBox {
my $mbuser = $_[0];
my $delacl = "c";
print "Deleting $mbuser\n" if $debug;
$cyrus->setaclmailbox($mbuser, $user, $delacl);
$cyrus->deletemailbox($mbuser);
warn $cyrus->error if $cyrus->error;
}
GetOptions("d|delete" => \$delete, "u|user=s" => \$user, "p|pass=s" => \$pass, "m|mailboxes=s" => \@mailboxes, "q|quota=s" => \$quota,
"t|part=s" => \@part, "s|UnixHierarchy" => \$useunixhierarchy, "v|verbose" => \$debug );
@part = split(/:/, join(':', @part));
push @part, 'default' unless @part;
my $pn = 0;
@mailboxes = split(/,/, join(',', @mailboxes));
my $server = shift(@ARGV) if (@ARGV);
usage unless $server;
# quotas formatting:
if ($quota) {
if ($quota =~ /^(\d+)([mk]?)$/i) {
my $numb = $1;
my $letter = $2;
if ($letter =~ /^m$/i) {
$quota = $numb * 1024;
print "debug: quota=$quota\n" if $debug;
} elsif ($letter =~ /^k$/i) {
$quota = $numb;
print "debug: quota=$quota\n" if $debug;
} else {
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
# $quota = $numb;
# print "debug: quota=$quota\n" if $debug;
}
} else {
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
}
}
# Authenticate
$cyrus = Cyrus::IMAP::Admin->new($server);
$cyrus->authenticate(-mechanism => 'login', -user => $user,
-password => $pass);
die $cyrus->error if $cyrus->error;
# if there isn't any mailbox defined yet, get them from standard input
if (! (defined $mailboxes[0])) {
# For all users
while (<>) {
chomp;
my $mbox = $_;
push @mailboxes, $mbox;
}
}
# create/delete mailboxes for each user
foreach my $mailbox (@mailboxes) {
if ($useunixhierarchy) {
$mailbox = 'user/' . $mailbox;
} else {
$mailbox = 'user.' . $mailbox;
}
if ($delete) {
&DeleteMailBox($mailbox)
} else {
# Select the partition
my $pt = $part[$pn];
$pn += 1;
$pn = 0 unless $pn < @part;
&CreateMailBox($mailbox,$pt,$quota)
}
}