Zimbra Desktop 2 Storage Migration
Zimbra Desktop 2 Storage Migration
These are unofficial notes on how the store for items in Zimbra Desktop 2 differs from that in Zimbra Desktop 1, designed to aid in migration.
The rationale behind this is:
- Zimbra Desktop 2 requires a totally fresh setup; no migration path from ZD1 is provided
- I am living in a country with slow and expensive bandwidth
- Our mail server is in a country with fast and cheap bandwidth
So my plan is:
- Install Zimbra Desktop 2 somewhere with fast and cheap bandwidth to our mail server
- Set up the same accounts as on Zimbra Desktop 1
- Use rsync to efficiently transfer the Zimbra Desktop 2 setup without having to retransmit all messages
Complications that mean the installations don't exactly match:
- The file store uses different names for the same mail items
- Zimbra Desktop 2 uses gzip for all mail items over (approximately) 150kb; Zimbra Desktop 1 doesn't
- The gzip compression doesn't seem to exactly match that produced by the command-line gzip tool at any setting, so we need to use the Java gzip classes to do compression
- Zimbra Desktop 1 seems to store some strange items
Scripts
Java gzip implementation
import java.util.zip.GZIPOutputStream; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; public class gzip { public static void main(String args[]) { if(args.length<=0) { System.out.println("Please enter the valid file name"); } else { try { String inFilename = args[0]; String outFilename = args[1]; GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(outFilename)); FileInputStream in = new FileInputStream(inFilename); // Transfer bytes from the input file to the gzip output stream byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.finish(); out.close(); } catch(IOException e) { System.out.println("Exception has been thrown" + e); } } } }
Java gunzip implementation
import java.util.zip.GZIPInputStream; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; public class gunzip { public static void main(String args[]) { if(args.length<=0) { System.out.println("Please enter the valid file name"); } else { try { String inFilename = args[0]; String outFilename = args[1]; GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(inFilename)); FileOutputStream out = new FileOutputStream(outFilename); // Transfer bytes from the compressed file to the output file byte[] buf = new byte[1024]; int len; while ((len = gzipInputStream.read(buf)) > 0) { out.write(buf, 0, len); } gzipInputStream.close(); out.close(); } catch(IOException e) { System.out.println("Exception has been thrown" + e); } } } }
Makefile
%.class: %.java javac $< %.manifest: %.java echo "Main-Class: $(shell basename $<)" > $@ %.jar: %.manifest %.class jar -cfm $@ $+ all: gunzip.jar gzip.jar