#!/bin/sh

# Script to backup/restore cyrus imap data for SuSE and Debian
# Tested with SuSE cyrus-imapd-2.2.3 and Debian cyrus-imapd-2.1.17

# different path and tool names for both systems are handled.

usage() {
	echo	"cyrusBackup -b|-r user datapath"
	exit 1
}

error() {	
	echo	"Error: $1"
	exit 2
}

backup() {
  if [ -d "/var/spool/cyrus/mail/${CBUSR::1}/user/$CBUSR" ] ; then
    udir="/var/spool/cyrus/mail/${CBUSR::1}/user"
  elif [ -d "/var/spool/imap/user/$CBUSR" ] ; then
    udir="/var/spool/imap/user"
  else
    error "User not found: $CBUSR"
  fi
  su cyrus -c "$CYRBIN/ctl_mboxlist -d" | grep "^user.$CBUSR" > $CBDAT/$CBUSR.lst
  tar -czf $CBDAT/$CBUSR.tgz --directory "$udir" --exclude="cyrus.*" "$CBUSR"
# tar -czf $CBDAT/$CBUSR.tgz --directory "$udir" "$CBUSR"
  exit 0
}

restore() {
  # the user should not exist ...
  if [ -d "/var/spool/cyrus/mail/${CBUSR::1}/user" ] ; then
    udir="/var/spool/cyrus/mail/${CBUSR::1}/user"
  elif [ -d "/var/spool/imap/user" ] ; then
    udir="/var/spool/imap/user"
  else
    error "Mail data store not found"
  fi
  [ -d "$udir/$CBUSR" ] && error "User exists (delete 1st with cyradm): $CBUSR"
  
  # do we have all backup files?
  [ -f "$CBDAT/$CBUSR.lst" -a -f "$CBDAT/$CBUSR.tgz" ] || error "Backup data not found: $CBUSR"
  
  # step 1: restore mail data files
  tar -xzf $CBDAT/$CBUSR.tgz --directory "$udir"
  
  # step 2: rebuild the cyrus.* index/cache files
  if [ -f "$CYRBIN/cyrreconstruct" ] ; then
    su cyrus -c "$CYRBIN/cyrreconstruct -r user.$CBUSR"
  else
    su cyrus -c "$CYRBIN/reconstruct -r user.$CBUSR"
  fi
  
  # step 3: enter in master mailbox db, repair/pack db
  su cyrus -c "$CYRBIN/ctl_mboxlist -u < $CBDAT/$CBUSR.lst"
  su cyrus -c "$CYRBIN/ctl_cyrusdb -r" 
  exit 0
}

# Main 1: get path for tools ...
if [ -f /usr/lib/cyrus/bin/ctl_mboxlist ] ; then
	CYRBIN=/usr/lib/cyrus/bin
else
	CYRBIN=/usr/sbin
fi

# Main 2: get arguments ...
CBOPT="$1" ; shift
CBUSR="$1" ; shift
CBDAT="$1" ; shift

[ -z "$CBDAT" -o -n "$1" ] && usage
[ -d "$CBDAT" ] || error "Not a folder: $CBDAT"
CBDAT=`readlink -f "$CBDAT"`

# Main 3: run it ...
[ "$CBOPT" = "-b" ] && backup
[ "$CBOPT" = "-r" ] && restore
error "Invalid option: $CBOPT"

#end
