196 lines
5.3 KiB
Bash
Executable File
196 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# author: G.R.Keech <rkeech@redhat.com>
|
|
# name: migrate-folders
|
|
# date: 2004-10-20
|
|
|
|
# This script assists in the conversion of mail boxes
|
|
# in mbox format to maildir format.
|
|
# See also migrate-users.
|
|
|
|
# Applicability.
|
|
#
|
|
# This script is intended for the common case on Red Hat systems
|
|
# where mail users have mail folders in their home directories
|
|
# under /home, and have inboxes in /var/spool/mail/
|
|
#==================================================================
|
|
# Change the value of the elements in this section as required.
|
|
|
|
#This is a list of folders, one per line. This does not
|
|
#include the inboxes. This might be prepared starting with
|
|
#the output of "find /home -type d".
|
|
FOLDERLIST=/root/migrate/folderlist
|
|
# folder is the existing mbox folder being migrated.
|
|
# It is a path under /home.
|
|
# eg if oldfolder is fred/personal, then folder is personal,
|
|
# user is fred.
|
|
|
|
#Specify the location of the new location for mail folders.
|
|
#This cannot be the same as the old location because it will
|
|
#create directory names that contend with existing file names.
|
|
NEWBASE=/var/spool/mail2
|
|
|
|
#The script to convert invidual mail folders to maildir format.
|
|
#http://perfectmaildir.home-dn.net/
|
|
FOLDERCONVERT=/usr/local/bin/perfect_maildir.pl
|
|
|
|
#This is a list of users to have their mail folders created.
|
|
#One user per line.
|
|
#Suggest create with cut -d: -f1 /etc/passwd > ~/migrate/u1
|
|
#then remove inappropriate entries by hand.
|
|
USERLIST=/root/migrate/userlist
|
|
|
|
# Detailed migration information is sent to this file
|
|
MIGRATELOG=/tmp/foldermigrationlog-$(date -I)
|
|
#=================================================================
|
|
echo
|
|
echo "Have you created the users' mail directories yet? (y/n)"
|
|
echo
|
|
read ans
|
|
if [ "$ans" != "y" ]
|
|
then
|
|
echo Good Bye.
|
|
echo use the migrate-users script first.
|
|
exit 0
|
|
fi
|
|
echo
|
|
echo This will copy existing mbox-style mail folders listed
|
|
echo in the file $FOLDERLIST. Maildir-style folders will
|
|
echo be created under $NEWBASE
|
|
echo
|
|
echo "Do you want to continue? (y/n)"
|
|
read ans
|
|
if [ "$ans" != "y" ]
|
|
then
|
|
echo Good Bye.
|
|
exit 0
|
|
fi
|
|
echo
|
|
echo Note: Detailed folder migration information will be sent to $MIGRATELOG
|
|
echo
|
|
echo Press enter to start
|
|
read ans
|
|
|
|
if [ ! -x ${FOLDERCONVERT} ]
|
|
then
|
|
echo Error: file ${FOLDERCONVERT} is not available to execute.
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d ${NEWBASE} ]
|
|
then
|
|
echo Error: directory $NEWBASE does not exist
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "${USERLIST}" ]
|
|
then
|
|
echo Error: user list file \"$USERLIST\" does not exist.
|
|
exit 1
|
|
fi
|
|
|
|
|
|
#-----------------------------------------------------------------
|
|
echo
|
|
echo Testing that the base of the folderlist entries corresponds to usernames
|
|
while read oldfolder
|
|
do
|
|
user="$(dirname "$oldfolder")"
|
|
if grep ^${user}: /etc/passwd &> /dev/null
|
|
then
|
|
echo -n .
|
|
else
|
|
echo User \"$user\": is bogus.
|
|
echo The string \"$user\" from the file \"$FOLDERLIST\" needs to
|
|
echo correspond exactly to a username. Edit the file accordingly.
|
|
exit 1
|
|
fi
|
|
done < $FOLDERLIST
|
|
echo
|
|
echo PASS
|
|
echo
|
|
nusers=$(wc -l $USERLIST | awk '{ print $1 }' )
|
|
n=1
|
|
#-----------------------------------------------------------------
|
|
# Iterate through user list and migrate folders.
|
|
while read user
|
|
do
|
|
#-----------------------------------------------------------------
|
|
# Step 1: Check stuff
|
|
if grep ^${user}: /etc/passwd &> /dev/null
|
|
then
|
|
echo -n "$n / $nusers : User \"$user\" is OK: "
|
|
n=$(( $n + 1 ))
|
|
echo "User \"$user\"" >> $MIGRATELOG
|
|
|
|
inbox=/var/spool/mail/${user}
|
|
|
|
if [ \( ! -f "${inbox}" \) -o \( ! -s "${inbox}" \) ]
|
|
then
|
|
echo User \"${user}\" has no inbox to convert.
|
|
else
|
|
#-----------------------------------------------------------------
|
|
# Step 2: Migrate user inboxes from /var/spool/mail/.
|
|
newdir="${NEWBASE}/${user}/"
|
|
$FOLDERCONVERT "$newdir" < "${inbox}" >> $MIGRATELOG 2>&1
|
|
chown -R ${user}:mail "${newdir}"
|
|
find "$newdir" -type f -exec chmod 600 {} \;
|
|
echo -n " inbox "
|
|
fi
|
|
#-----------------------------------------------------------------
|
|
# Step 3: Migrate other mail folders from user home directories.
|
|
while read oldfolder
|
|
do
|
|
folder=$(basename "${oldfolder}")
|
|
fuser="$(dirname "$oldfolder")"
|
|
|
|
if [ "$user" = "$fuser" ]
|
|
then
|
|
if [ ! -f "/home/${oldfolder}" ]
|
|
then
|
|
echo Error folder \"${folder}\" does not exist.
|
|
break
|
|
fi
|
|
|
|
if [ ! -d ${NEWBASE}/${fuser} ]
|
|
then
|
|
echo Error ${NEWBASE}/${fuser} does not exist.
|
|
break
|
|
fi
|
|
|
|
newdir="${NEWBASE}/${fuser}/.$folder"
|
|
mkdir -p "$newdir"/cur
|
|
mkdir -p "$newdir"/new
|
|
mkdir -p "$newdir"/tmp
|
|
chmod -R 770 "${newdir}"
|
|
$FOLDERCONVERT "$newdir" < "/home/$oldfolder" >> $MIGRATELOG 2>&1
|
|
chown -R ${user}:mail "${newdir}"
|
|
#chmod 600 "$newdir/cur/*"
|
|
find "$newdir" -type f -exec chmod 600 {} \;
|
|
|
|
echo "$folder" >> ${NEWBASE}/${fuser}/.subscriptions
|
|
chmod 600 ${NEWBASE}/${fuser}/.subscriptions
|
|
chown ${fuser}:mail ${NEWBASE}/${fuser}/.subscriptions
|
|
|
|
echo -n .
|
|
fi
|
|
done < $FOLDERLIST
|
|
echo
|
|
|
|
else
|
|
echo User "$user: is bogus."
|
|
fi
|
|
|
|
done < $USERLIST
|
|
|
|
echo
|
|
echo
|
|
echo To make the new base mail directory active, change the
|
|
echo mail_spool_directory setting for postfix using
|
|
echo postconf -e \"mail_spool_directory = ${NEWBASE}/\"
|
|
echo and change Dovecots default_mail_env setting in
|
|
echo /etc/dovecot.conf to
|
|
echo default_mail_env = maildir:${NEWBASE}/%u
|
|
echo
|
|
|