[SVN] r254 - trunk/cyrus-imapd-2.2.12/debian/examples/editsieve
debian at incase.de
debian at incase.de
Sat Jan 14 18:33:06 UTC 2006
Author: sven
Date: Sat Jan 14 19:33:05 2006
New Revision: 254
URL: https://mail.incase.de/viewcvs?root=cyrus22?view=rev&rev=254
Log:
Add a small script which helps editing remote sieve scripts
Added:
trunk/cyrus-imapd-2.2.12/debian/examples/editsieve (with props)
Added: trunk/cyrus-imapd-2.2.12/debian/examples/editsieve
URL: https://mail.incase.de/viewcvs?root=cyrus22/trunk/cyrus-imapd-2.2.12/debian/examples/editsieve?view=auto&rev=254
==============================================================================
--- trunk/cyrus-imapd-2.2.12/debian/examples/editsieve (added)
+++ trunk/cyrus-imapd-2.2.12/debian/examples/editsieve Sat Jan 14 19:33:05 2006
@@ -1,0 +1,252 @@
+#!/bin/bash
+#
+# This script is copyright 2006 Sven Mueller <cyrus at incase.de>
+# Released under the terms of the GNU General public license
+# (GPL) version 2
+# Before distributing changed versions of the script, please ask
+# the original author to include your changes into the original
+# distribution files. Thanks.
+#
+umask 077
+
+# generic defaults
+
+DEFAULTDOMAIN=incase.de
+DEFAULTHOST=localhost
+DEFAULTCONFDIR="${HOME}/.editsieve"
+
+# report usage help
+function usage () {
+ echo "Usage: $0 -h"
+ echo " $0 --help"
+ echo " $0 [-c <confdir>] [-n <scriptname>] [-d <domain>|--domain <domain>] "
+ echo " [-p <password>] [-s <server>] <user>"
+ echo "Parameters:"
+ echo " -h|--help : Display this help"
+ echo " -c <dir> | --confdir <dir> : Directory to store configuration and other"
+ echo " data in (like the user's sieve script)."
+ echo " The directory will be created if necessary."
+ echo " Default: ${DEFAULTCONFDIR}"
+ echo " -d <domain>|--domain <domain> : Specify domain for the user."
+ echo " Default: ${DEFAULTDOMAIN}"
+ echo " -n <script>|--name <script> : Use <script> as the name of the script to"
+ if [ "$SCRIPTNAME" ]; then
+ echo " handle. Default: ${SCRIPTNAME}"
+ else
+ echo " handle. Default: <user>_<domain>"
+ fi
+ echo " -s <host> | --server <host> : Use <host> as the host to connect to."
+ echo " Default: ${DEFAULTHOST}"
+ echo " -p <pwd> | --password <pwd> : Deprecated: Define password to pass to"
+ echo " sieveshell (also on commandline). Using this"
+ echo " option might be convenient, but it is a"
+ echo " security risk. Default: Let sieveshell ask"
+ echo " <user> : User for which to edit the"
+ echo " sieve script. If specified as"
+ echo " user at do.main, use do.main as "
+ echo " the users domain."
+ echo "Note that a conflict between the domain specified with the"
+ echo "--domain parameter and a user specified in @do.main notation"
+ echo "will cause this script to abort."
+ echo
+}
+
+# Set initial values
+
+USER=""
+CONFDIR="${DEFAULTCONFDIR}"
+HOST="${DEFAULTHOST}"
+
+while [ $# -gt 0 ]; do
+ case "${1}" in
+ -d|--domain)
+ DOMAIN="${2}"
+ shift
+ shift
+ ;;
+ -c|--confdir)
+ CONFDIR="${2}"
+ shift
+ shift
+ ;;
+ -n|--script|--name)
+ SCRIPTNAME="${2}"
+ shift
+ shift
+ ;;
+ -p|--pass*)
+ PASSWORD="-p ${2}"
+ echo "WARNING: Passing passwords on the commandline is a potential security hazard."
+ shift
+ shift
+ ;;
+ -s|--server|--host)
+ HOST="$2"
+ shift
+ shift
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ *)
+ # If USER had already been set, reaching this point
+ # means a second user was named. If so: report an error
+ # and show usage help.
+ if [ "${USER}" != "" ]; then
+ usage
+ echo ""
+ echo "ERROR: Multiple users specified" >&2
+ exit 1
+ fi
+ USER=$1
+ shift
+ ;;
+ esac
+done
+
+# check wether a username had been specified
+if [ "${USER}" = "" ]; then
+ echo "ERROR: No user specified" >&2
+ usage
+ exit 1
+fi
+
+# If we can't create files inside ${CONFDIR}, try to create a directory named ${CONFDIR}
+if ! touch "${CONFDIR}"/testfile; then
+ if [ -e "${CONFDIR}" ]; then
+ echo "ERROR: ${CONFDIR} exists, but is no directory or link to a directory"
+ exit 1
+ fi
+ if ! mkdir "${CONFDIR}" ; then
+ echo "ERROR: ${CONFDIR} doesn't exist and can't be created"
+ exit 1
+ fi
+else
+ rm -f "${CONFDIR}/testfile"
+fi
+
+# check wether the domain had been specified
+if [ "${DOMAIN}" = "" ]; then
+ # if the user was specified as user at domain, use the domainpart from there
+ if echo "${USER}" | grep -q "@" ; then
+ DOMAIN=`echo "${USER}" | sed -e 's/.*@//'`
+ USER=`echo "${USER}" | sed -e 's/@.*//'`
+ else
+ # if no domain was specified and the username didn't include the domain,
+ # use the default domain.
+ DOMAIN="${DEFAULTDOMAIN}"
+ fi
+else
+ # DOMAIN had been specified. Check for username in user at domain form
+ if echo "${USER}" | grep -q "@" ; then
+ # Yes, user was specified as user at domain
+ UDOMAIN=`echo "${USER}" | sed -e 's/.*@//'`
+ USER=`echo "${USER}" | sed -e 's/@.*//'`
+ # check wether the domain specified using the --domain switch
+ # conflicts with the one given using the user at domain notation
+ if [ "${UDOMAIN}" != "${DOMAIN}" ]; then
+ # yes they conflict: Abort with suitable error message
+ echo "ERROR: Domain part specified in username but conflicts with"\
+ "domain specified in -d parameter" >&2
+ exit 1
+ fi
+ fi
+fi
+
+# Set SCRIPTNAME to ${USER}_${DOMAIN} if not already set
+SCRIPTNAME="${SCRIPTNAME:-${USER}_${DOMAIN}}"
+
+echo "Trying to fetch script for ${USER}@${DOMAIN} from ${HOST}"
+if sieveshell -a "${USER}@${DOMAIN}" -u "${USER}@${DOMAIN}" \
+ ${PASSWOIRD} -e "get ${SCRIPTNAME} ${CONFDIR}/${SCRIPTNAME}" ${HOST}
+then
+ # fetch was successfull, keep a copy for later
+ cp -f "${CONFDIR}/${SCRIPTNAME}" "${CONFDIR}/${SCRIPTNAME}.orig"
+else
+ # an error occured while downloading.
+ echo WARNING: Unable to download script >&2
+ if [ ! -f "${CONFDIR}/${SCRIPTNAME}" ]; then
+ # there is no pre-existing script in $CONFDIR,
+ # create a default script
+ echo starting with a default script. >&2
+ # <<-EOF is like <<EOF except that it removes
+ # as much whitespace from the beginning of lines
+ # as there is in the first line
+ cat > "${CONFDIR}/${SCRIPTNAME}" <<-EOF
+ # Mail rules for ${USER}@${DOMAIN}
+ #
+ # load fileinto extension
+ require ["fileinto"];
+ #
+ # file spam into special folder
+ if header :contains "X-Spam-Flag" "YES"
+ {
+ fileinto "INBOX.Z_SPAM.suspected";
+ stop;
+ }
+ #
+ EOF
+ echo -n "" > "${CONFDIR}/${SCRIPTNAME}.orig"
+ else
+ echo "${CONFDIR}/${SCRIPTNAME}.orig exists, using it." >&2
+ fi
+fi
+SYNTAXOK=0
+# if $EDITOR is non-empty, use that to call the editor.
+# otherwise, use vi
+EDITOR="${EDITOR:-vi}"
+while [ "$SYNTAXOK" = "0" ]; do
+ "${EDITOR}" "${CONFDIR}/${SCRIPTNAME}"
+ echo "trying to compile rules file"
+ if /usr/lib/cyrus/bin/sievec -C /etc/imapd.conf "${CONFDIR}/${SCRIPTNAME}" "${CONFDIR}/${SCRIPTNAME}.bc" ; then
+ # all fine, sievec was able to compile the script, syntax is thus OK
+ rm "${CONFDIR}/${SCRIPTNAME}.bc"
+ SYNTAXOK=1
+ else
+ # There was some error compiling the script, askü user what to do
+ echo "ERROR: Compiling the script failed."
+ echo "Press 'e'+return (or just return) to edit the file again,"
+ echo "Press 's'+return for a shell (returns to editor after shell exits)"
+ echo "Predd 'a'+return or CTRL-C to abort."
+ echo "Press 'i'+return to ignore"
+ VALID=0
+ while [ "$VALID" = "0" ]; do
+ read a || exit 1
+ if [ "$a" = "i" ] || [ "$a" = "I" ]; then
+ # asume sievec had no problem
+ VALID=1
+ SYNTAXOK=1
+ elif [ "$a" = "s" ] || [ "$a" = "S" ]; then
+ VALID=1
+ echo "The edited file can be found in ${CONFDIR}/${SCRIPTNAME}"
+ echo "After the shell terminates, you will be returned to the editor"
+ bash
+ elif [ "$a" = "a" ] || [ "$a" = "A" ]; then
+ exit 1
+ elif [ "$a" = "e" ] || [ "$a" = "E" ] || [ "$a" = "" ]; then
+ VALID=1
+ else
+ echo "INVALID CHOICE, try again."
+ fi
+ done
+ fi
+done
+echo "copying file ${SCRIPTNAME} to ${SCRIPTNAME}.edited"
+cp "${CONFDIR}/${SCRIPTNAME} ${CONFDIR}/${SCRIPTNAME}.edited"
+# check wether the file changed at all. If not, we can skip uploading
+echo trying diff
+if diff -q "${CONFDIR}/${SCRIPTNAME}.orig" "${CONFDIR}/${SCRIPTNAME}"; then
+ echo "Sieve rules unchanged, no upload needed."
+else
+ echo "Sieve rules changed, uploading and activating new file."
+ echo "${USER}@${DOMAIN}"
+ if sieveshell -a "${USER}@${DOMAIN}" -u "${USER}@${DOMAIN}" -e "put ${CONFDIR}/${SCRIPTNAME}
+activate ${SCRIPTNAME}" ${HOST} ; then
+ rm -f "${CONFDIR}/${SCRIPTNAME}.edited" ; echo "Upload OK"
+ else
+ echo "Upload failed! Leaving edited file in ${SCRIPTNAME}.edited"
+ fi
+ rm "${CONFDIR}/${SCRIPTNAME}.orig"
+fi
+
Propchange: trunk/cyrus-imapd-2.2.12/debian/examples/editsieve
------------------------------------------------------------------------------
svn:executable = *
More information about the Pkg-Cyrus-imapd-Debian-devel
mailing list