Difference between revisions of "Zimbra Desktop 2 Storage Migration"

m (Fix mediawiki syntax)
(Added sourcecode for Java gzip/gunzip)
Line 16: Line 16:
 
* The file store uses different names for the same mail items
 
* 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
 
* 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 can't be synchronized directly like that
+
* 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
 
* Zimbra Desktop 1 seems to store some strange items
  
 
== Scripts ==
 
== Scripts ==
  
To be written...
+
=== Java gzip implementation ===
 +
 
 +
<pre>
 +
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);
 +
            }
 +
        }
 +
    }
 +
}
 +
</pre>
 +
 
 +
=== Java gunzip implementation ===
 +
 
 +
<pre>
 +
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);
 +
            }
 +
        }
 +
    }
 +
}
 +
</pre>
 +
 
 +
=== Makefile ===
 +
 
 +
<pre>
 +
%.class: %.java
 +
        javac $<
 +
 
 +
%.manifest: %.java
 +
        echo "Main-Class: $(shell basename $<)" > $@
 +
 
 +
%.jar: %.manifest %.class
 +
        jar -cfm $@ $+
 +
 
 +
all: gunzip.jar gzip.jar
 +
</pre>

Revision as of 16:17, 25 February 2010

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
Jump to: navigation, search