#!/bin/bash

# This script works well for converting entire home directories from mbox to Maildir. It will walk down 3 levels deep.
# Also subscribe all folders converted using Dovecot standard, and creates Mozilla/Thunderbird "basic" folders
# For users who don't already have them. 
# Rick Johnson - rjohnson@medata.com - 1/20/2004

# Requires the perfect_maildir.pl script. Assumes mbox and Maildir directories will exist within home. Minor edits can relocate.

# Execute from the path that contains user home/mail directories. Modify variables below to suit.

# v0.1 - Initial release

# Path to perfect_maildir.pl script
script="/home/perfect_maildir.pl"
# Who to convert - either single directories or * for all users
convert="rjohnson"
# INBOX Location - exclude trailing slash
spool="/var/spool/mail"
# Maildir name - relative to parent path
maildir="Maildir"
# mbox Mailbox name
mbox="mail"
# home location
home="/home"
# Shall we subscribe?
subscribe=1
# Subscribe to dirs as well?
subscribedir=1
# Create default folders for existing boxes?
createexist=1
# Create default folders for new boxes"
createnew=1

for listing in $convert
do 
	homedir="${home}/${listing}"
	subscriptions="$homedir/$maildir/.subscriptions"
	echo "Converting mailbox for $homedir"
	if [ -d "$homedir" ]
	then
		cd "$homedir"
		pwd
		if [ ! -d "$maildir" ]
		then
			mkdir -p $maildir/new $maildir/tmp $maildir/cur
		fi
		if [ -d "$maildir" ]
		then
			$script $maildir/ < ${spool}/${listing}
			if [ $subscribe -ne 0 ]
			then
				echo "INBOX" > $subscriptions
				echo "Subscribing to INBOX"
			fi
			# Test for existing mbox - convert if existing, otherwise create new below.
			if [ -d "$homedir/$mbox" ]
			then
				echo "Previous Mail structure, let's convert it."
				cd "$homedir/$mbox"
				level1=( * ) 
				a=0
				until [ $a = ${#level1[@]} ]
				do
					workinga="${level1[${a}]}"
#					echo "Working on $workinga"
					if [ -d "$workinga" ]
					then
						echo "$workinga is a directory, let's create structure, then traverse."
						mkdir -p "$homedir/$maildir/.$workinga/cur" "$homedir/$maildir/.$workinga/new" "$homedir/$maildir/.$workinga/tmp"
						if [ $subscribedir -ne 0 ]
						then
							echo "Subscribing to directory $workinga"
							echo "$workinga" >> $subscriptions
						fi
						cd "$workinga"
						level2=( * )
						b=0
						until [ $b = ${#level2[@]} ]
						do
							workingb="${level2[${b}]}"
#							echo "Working on $workingb"
							if [ -d "$workingb" ]
							then
								echo "$workingb is a directory, let's create structure, then traverse."
								mkdir -p "$homedir/$maildir/.$workinga.$workingb/cur" "$homedir/$maildir/.$workinga.$workingb/new" "$homedir/$maildir/.$workinga.$workingb/tmp"
								if [ $subscribedir -ne 0 ]
								then
									echo "Subscribing to directory $workinga.$workingb"
									echo "$workinga.$workingb" >> $subscriptions
								fi
								cd "$workingb"
								level3=( * )
								c=0
								until [ $c = ${#level3[@]} ]
								do
									workingc="${level3[${c}]}"
#									echo "Working on $workingc"
 									mkdir -p "$homedir/$maildir/.$workinga.$workingb.$workingc/cur" "$homedir/$maildir/.$workinga.$workingb.$workingc/new" "$homedir/$maildir/.$workinga.$workingb.$workingc/tmp"
									$script "${homedir}/$maildir/.$workinga.$workingb.$workingc/" < "${homedir}/$mbox/$workinga/$workingb/$workingc"
									if [ $subscribe -ne 0 ]
									then
										echo "$workinga.$workingb.$workingc" >> $subscriptions
										echo "Subscribing to $workinga.$workingb.$workingc"
									fi
									c=$(($c+1))
								done
								echo "Done inside ${workingb}." 
								cd "${homedir}/$mbox/${workinga}"
							else
								mkdir -p "$homedir/$maildir/.$workinga.$workingb/cur" "$homedir/$maildir/.$workinga.$workingb/new" "$homedir/$maildir/.$workinga.$workingb/tmp"
								$script "${homedir}/$maildir/.$workinga.$workingb/" < "${homedir}/$mbox/$workinga/$workingb"
								if [ $subscribe -ne 0 ]
								then
									echo "Subscribing to $workinga.$workingb"
									echo "$workinga.$workingb" >> $subscriptions
								fi
							fi
						b=$(($b+1))
						done
						echo "Done inside $workinga." 
						cd "$homedir/$mbox"
					else
						mkdir -p "$homedir/$maildir/.$workinga/cur" "$homedir/$maildir/.$workinga/new" "$homedir/$maildir/.$workinga/tmp"
						$script "${homedir}/$maildir/.$workinga/" < "${homedir}/$mbox/$workinga"
						if [ $subscribe -ne 0 ]
						then
							echo "Subscribing to $workinga"
							echo "$workinga" >> $subscriptions
						fi
					fi
				a=$(($a+1))
				done
				cd $homedir
				
				# Create basic folders if they don't already exist

				if [ $createexist -ne 0 ]
				then
					for basic in Drafts Sent Templates Trash
					do
						if [ ! -f $homedir/$mbox/${basic} ]
						then
							mkdir -p $homedir/$maildir/.${basic}/cur $homedir/$maildir/.${basic}/new $homedir/$maildir/.${basic}/tmp
							if [ $subscriptions -ne 0 ]
							then
								echo "Subscribing to ${basic}"
								echo "${basic}" >> $subscriptions
							fi
						fi
					done
				# If the user already has a Junk or Spam folder, don't create a new one, otherwise create Junk.
					if [ ! -f $homedir/$mbox/Spam -o ! -f $homedir/$mbox/Junk ]
					then
						mkdir -p $homedir/$maildir/.Junk/cur $homedir/$maildir/.Junk/new $homedir/$maildir/.Junk/tmp
						echo "Junk" >> $subscriptions
					fi
				fi
	 		elif [ $createnew -ne 0 ]
			then 
				for basic in Drafts Sent Templates Trash
				do
					if [ ! -f $homedir/$mbox/${basic} ]
					then
						mkdir -p $homedir/$maildir/.${basic}/cur $homedir/$maildir/.${basic}/new $homedir/$maildir/.${basic}/tmp
						if [ $subscriptions -ne 0 ]
						then
							echo "Subscribing to ${basic}"
							echo "${basic}" >> $subscriptions
						fi
					fi
				done
				# If the user already has a Junk or Spam folder, don't create a new one, otherwise create Junk.
				if [ ! -f $homedir/$mbox/Spam -o ! -f $homedir/$mbox/Junk ]
				then
					mkdir -p $homedir/$maildir/.Junk/cur $homedir/$maildir/.Junk/new $homedir/$maildir/.Junk/tmp
					echo "Junk" >> $subscriptions
				fi
			fi
			chown -R $listing $maildir
			chmod -R go-rwx $maildir
			cd /home
		else
			echo "$maildir directory creation failed"
			exit 1
		fi
	else
		echo "Home directory $homedir doesn't exist?"
		exit 1
	fi
done
exit 0
