Oops, I attached the wrong version. Please discard the previous version I sent out.
regards, ~ Dairenn Lombard Systems Administration Department, Los Angeles BroadSpire, Inc. > -----Original Message----- > From: Dairenn Lombard [mailto:[EMAIL PROTECTED] > Sent: Wednesday, December 12, 2007 10:36 AM > To: qmailtoaster-list@qmailtoaster.com > Subject: RE: [qmailtoaster] Migration > > > Hello Sandip, > > I've attached a shell script I wrote for my company that can > automatically migrate a single domain from one qmail toaster > server to another using SCP (you need to create an RSA key > for the root user on the source server, and then add it to > the /root/.ssh/authorized_keys file on the destination server > in order to not have to keep re-entering your root > password/passphrase for every SCP operation). > > One warning is that if you decided to compile > vpopmail-toaster using one table for all domains rather than > one table per domain, this script wont work for you. > > Another issue has to do with the pathnames of directories on > toasters with lots of domain names. After so many domains > are added, instead of customer's e-mail being setup inside of > /home/vpopmail/domains/example.com it shifts to a > subdirectory in /home/vpopmail/domains/1/example.com with 1 > becoming 2, 2 becoming 3 (etc, etc.) as more and more domains > are added. When my script re-creates the account being > migrated on the new server, it then gets from vpopmail on the > destination server the new pathname as it exists on that > server, and then tries to go through and update a bunch of > things. Things like the dump file of that domain's mysql > table and various > .qmail* files. > > Unfortunately, I couldn't come up with a way of doing this to > the individual ".qmail" files that can appear in some user > directories where things like forward+save a local copy have > been enabled using qmailadmin. Therefore, my script simply > deletes these files, because if they exist but use the wrong > directory, extremely strange behavior results (no mail > showing up, duplicates of mail showing up, etc). > > You can comment out that part of the script which does delete > user's .qmail files, but you'll need to remember to change > those files by hand post-migration so that the > /home/vpopmail/domains directory referenced matches the > pathname of the domain you're currently working with. > > If anyone would like to improve my script, I would love to > know about it. > > > regards, > ~ Dairenn Lombard > Systems Administration Department, Los Angeles > BroadSpire, Inc. > > > > -----Original Message----- > From: Sandip Kumar Das, RDG Systems [mailto:[EMAIL PROTECTED] > Sent: Wednesday, December 05, 2007 4:47 AM > To: qmailtoaster-list@qmailtoaster.com > Subject: [qmailtoaster] Migration > > > Dear all, > > > How do i copy vpopmail domains & mailboxes of all users > manually from one server to another ? In old server domains > uids are 7797 ( checking /var/qmail/users/assign ) but in > new server domains uids are 89. If I manually created all old > domains in new server , the uids will be 89. and then how do > i copy all the users and their maildirectories from old > server to new server ? pl suggest. Am I to copy vpopmail > database from old to new ? > > Thanks in advance, > > Sandip
#!/bin/sh # /usr/local/sbin/toastercp.sh # Copy qmail toaster domains onto another qmail toaster. # # Usage: /usr/local/sbin/toastercp.sh domain.com remote.mail.server.hostname # # CAUTION - this is only going to work if BOTH vpopmail-toaster installs were # compiled with --disable-many-domains, otherwise, there will be a MySQL table # mismatch and IMAP/POP authencation will fail. It's Okay to enable many # domains, but again, BOTH servers must have already had vpopmail-toaster # installed that way, otherwise you need to manually convert the vpopmail # tables from one format to the other - which this script does not do. # # # Change Log: # Version - Feature # ----------------------------------------------------------------------------- # 1.02 - Older mysqldumps don't write dump files to include dropping # the tables being backed up, so now this script inserts that # (this may produce MySQL warnings, as newer mysqldumps will # have this, and therefore, complain that it can't drop a table # that doesn't exist. Because .qmail-default files don't # always exist, added find statements to not bother with it if # it is not there. When using cpio to build a skeleton of # files, find now looks for these files in the correct # directory. # 1.01 - Patches .qmail-default for the Unix pathname on the new mail # server if catchall is set to another local e-mail address # rather than catchall-to-bounce, catchall-to-delete, or # catchall-forward. Not doing this results in maildrop # creating duplicate messages in users' inboxes. # Removes individual user .qmail files to cause qmail to # re-create the file (sometimes, these files, when copied # causes unwanted behavior when using webmail other other # system features). The bad news is that this will delete # any non-vpopmail based forwards (such as rules like forward # and save a local copy). # 1.00 - Initial Release echo ; echo "toastercp.sh v1.02" echo "Copyright (c) 2007 BroadSpire, Inc." echo ; echo "Report bugs!! E-Mail them to [EMAIL PROTECTED]" ; echo echo "This script PUSHES existing domains from the origin mail server onto a NEW" echo "mail server, and requires this server's id_rsa.pub file in /root/.ssh to be" echo "copied into the authorized_keys2 file in the remote server's /root/.ssh" echo "directory. It is also necessary to have this server's hostname in the" echo "/etc/hosts.allow file on the remote mail server for sshd." ; echo SSH=`which ssh` GREP=`which grep` AWK=`which awk` TAIL=`which tail` CAT=`which cat` RM=`which rm` SED=`which sed` DUMP=`which mysqldump` CPIO=`which cpio` CP=`which cp` SCP=`which scp` CUT=`which cut` HEAD=`which head` FIND=`which find` # Get domain name from the command line syntax used... domain=$1 rhost=$2 # If operator entered no name at the shell prompt, ask for it. if [ -z "$domain" ] ; then echo -n "Enter the domain name to copy: " read domain fi # If operator entered no name at the shell prompt, ask for it. if [ -z "$rhost" ] ; then echo -n "Enter the destination mail server hostname: " read rhost fi # Make new account echo "Adding $domain to $rhost..." $SSH [EMAIL PROTECTED] "/home/vpopmail/bin/vadddomain -r $domain" if [ "$?" -ne "0" ] ; then echo "Uh oh, that didn't work; aborting." exit 1 fi echo "Determining local Unix pathname of $domain..." # I know this is ugly as sin, but I couldn't figure out a better way to get # the pathname into a variable and using awk failed due to a variable conflict. echo -n "/" > /var/tmp/.localunixpath.txt /home/vpopmail/bin/vdominfo $domain | $GREP "dir:" | $CUT -d "/" -f 2- | $HEAD -1 >> /var/tmp/.localunixpath.txt localdir=`$CAT /var/tmp/.localunixpath.txt` grep $domain /var/tmp/.localunixpath.txt > /dev/null if [ "$?" -ne "0" ] ; then echo "Could not determine local pathname for $domain. You sure $domain " echo "is on this server?" echo ; echo "Exiting" ; echo exit 1 fi $RM -f /var/tmp/.localunixpath.txt echo "Got it." echo ; echo "Determining remote Unix pathname of $domain..." echo -n "/" > /var/tmp/.remoteunixpath.txt $SSH [EMAIL PROTECTED] /home/vpopmail/bin/vdominfo $domain | $GREP "dir:" | $CUT -d "/" -f 2- | $HEAD -1 >> /var/tmp/.remoteunixpath.txt remotedir=`$CAT /var/tmp/.remoteunixpath.txt` grep $domain /var/tmp/.remoteunixpath.txt > /dev/null if [ "$?" -ne "0" ] ; then echo "Could not determine $domain Unix pathname on $rhost. Exiting." exit 1 fi $RM -f /var/tmp/.remoteunixpath.txt echo "Got it." echo ; echo "Exporting $domain MySQL vpopmail database table..." echo "$domain" > /var/tmp/.vpopmail-mysql-table.txt $SED -i s/\\./_/ /var/tmp/.vpopmail-mysql-table.txt mysqltable=`$CAT /var/tmp/.vpopmail-mysql-table.txt` $RM -f /var/tmp/.vpopmail-mysql-table.txt mysqlfile="/var/tmp/$domain.vpopmail.sql" # This is because older mysqldump versions don't generate this line on their # own; this now means newer dump files will have this line twice, generating # a warning during the remote server import process. echo "DROP TABLE IF EXISTS \`$mysqltable\`;" > $mysqlfile $DUMP vpopmail $mysqltable >> $mysqlfile echo ; echo "Changing $localdir to $remotedir in $mysqlfile..." $SED -i s:"$localdir":"$remotedir":g $mysqlfile if [ -f "$localdir/.qmail-toaster" ] ; then echo ; echo "Changing the same thing in .qmail-default..." $CP $localdir/.qmail-toaster /var/tmp/.qmail-toaster $SED -i s:"$localdir":"$remotedir":g /var/tmp/.qmail-toaster fi echo ; echo "Building list of Maildir directories and files..." cd $localdir $FIND ./ ! -name '*bspmail*' | $CPIO -co > /var/tmp/$domain.maildir.cpio echo ; echo "Sending file list and SQL dump to $rhost..." $SCP /var/tmp/$domain.maildir.cpio [EMAIL PROTECTED]:/var/tmp # Only delete the temp files if SCP exits successfully if [ "$?" -eq "0" ] ; then $RM -f /var/tmp/$domain.maildir.cpio fi $SCP $mysqlfile [EMAIL PROTECTED]:/var/tmp if [ "$?" -eq "0" ] ; then $RM -f $mysqlfile fi echo ; echo "Remotely building Maildir skeleton and send .qmail-default file..." $SSH [EMAIL PROTECTED] "cd $remotedir && cat /var/tmp/$domain.maildir.cpio | cpio -idmuR vpopmail:vchkpw" # Don't delete anything if something went wrong. if [ "$?" -eq "0" ] ; then $SSH [EMAIL PROTECTED] "rm -f /var/tmp/$domain.maildir.cpio" fi if [ -f "/var/tmp/.qmail-default" ] ; then $SCP -p /var/tmp/.qmail-default [EMAIL PROTECTED]:$remotedir if [ "$?" -eq "0" ] ; then $RM -f /var/tmp/.qmail-default fi fi echo ; echo "Remotely importing vpopmail MySQL database table for $domain" # mysqldump files already instruct MySQL server to drop tables if they already # exist before trying to create them again. $SSH [EMAIL PROTECTED] "mysql vpopmail < /var/tmp/$domain.vpopmail.sql" if [ "$?" -eq "0" ] ; then $SSH [EMAIL PROTECTED] "rm -f /var/tmp/$domain.vpopmail.sql" fi # Message migration... echo ; echo "Backing up existing e-mail messages..." $CP -a --target-directory=/var/tmp $localdir cd /var/tmp/$domain $FIND ./ -name '*bspmail*' | $CPIO -co > /var/tmp/$domain.messages.cpio cd /var/tmp $RM -rf $domain echo ; echo "Copying mail messages onto $rhost" echo "This could take a while if this domain is using lots of disk space." # Since huge amounts of text compresses very easily, and will improve transfer # speed. $SCP -C /var/tmp/$domain.messages.cpio [EMAIL PROTECTED]:/var/tmp # Don't delete unless SSH was successful. if [ "$?" -eq "0" ] ; then $RM -f /var/tmp/$domain.messages.cpio fi echo ; echo "Removing individual user .qmail files to prevent random unwanted behavior." $SSH [EMAIL PROTECTED] "find $remotedir -name .qmail -exec rm -f {} \;" $SSH [EMAIL PROTECTED] "cd $remotedir && cat /var/tmp/$domain.messages.cpio | cpio -idmuR vpopmail:vchkpw" if [ "$?" -eq "0" ] ; then $SSH [EMAIL PROTECTED] "rm -f /var/tmp/$domain.messages.cpio" fi echo ; echo "$domain copied to $rhost." ; echo
--------------------------------------------------------------------- QmailToaster hosted by: VR Hosted <http://www.vr.org> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]