thomas: utils/admin convert-gdbm-dbload,1.1,1.2

cvs at kolab.org cvs at kolab.org
Wed May 9 20:05:58 CEST 2007


Author: thomas

Update of /kolabrepository/utils/admin
In directory doto:/tmp/cvs-serv32143

Modified Files:
	convert-gdbm-dbload 
Log Message:
Extended convert-gdbm-dbload to move folders and directly call db_load


Index: convert-gdbm-dbload
===================================================================
RCS file: /kolabrepository/utils/admin/convert-gdbm-dbload,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- convert-gdbm-dbload	2 May 2007 16:04:25 -0000	1.1
+++ convert-gdbm-dbload	9 May 2007 18:05:56 -0000	1.2
@@ -10,19 +10,34 @@
 """convert-gdbm-dbload
 
 Usage:
-  convert-gdbm-dbload pfbcache.db-gdbm | db_load pfbcache.db-db4
+  - make sure Kolab server is stopped
+  - open a root shell
+  - type the following commands:
 
-Read gdbm database and dump in a format suitable for db_load.
-db_load is part of Berkeley DB.
+    # cd /kolab/var/kolab/www/freebusy
+    # mv cache cache-old
+    # mkdir cache
+    # chown kolab-n.kolab-n cache
+    # su - kolab-n
+    $ cd /kolab/var/kolab/www/freebusy
+    $ %s cache-old cache
+    $ exit
+
+  - start Kolab
+
+Reads gdbm database and imports it using db_load.
+db_load is part of Berkeley DB and installed with Kolab 2.1.
 
 Requires python (tested with version 2.3) and the python-gdbm module.
 """
 
 __version__ = "$Revision$"
 
+import os
 import sys
 import binascii
 import gdbm
+import shutil
 
 
 def error(msg):
@@ -30,17 +45,52 @@
     sys.exit(1)
 
 
-def main(gdbmfile):
-    """Read gdbm database and dump in a format suitable for db_load."""
+def warning(msg):
+    sys.stderr.write('%s\n' % (msg,))
+
+
+def translate_foldername(folder):
+    """user.name at example.com/Fol/d.er -> example.com/user.name/Fol/d.er"""
     try:
+        at = folder.index('@')
+    except ValueError:
+        return None
+
+    user = folder[:at]
+    domain, path = folder[at+1:].split('/', 1)
+    return "%s/%s/%s" % (domain, user, path)
+
+
+def quote_folder(folder):
+    """example.com/user.name/Fol/d.er -> example^com/user^name/Fol/d^er"""
+    return folder.replace('.', '^')
+
+
+def copy_folder(source, target):
+    target = quote_folder(target)
+    targetdir = os.path.dirname(target)
+    if not os.path.isdir(targetdir):
+        os.makedirs(targetdir)
+    for ext in ['.pfb', '.pfb.acl', '.xpfb', '.xpfb.acl']:
+        if os.path.isfile(target+ext):
+            warning('Warning: %s already exists' % (target+ext,))
+        else:
+            shutil.copyfile(source+ext, target+ext)
+
+
+def convert_db(old, new):
+    pfbcache = 'pfbcache.db'
+    try:
+        gdbmfile = os.path.join(old, pfbcache)
         db = gdbm.open(gdbmfile)
     except gdbm.error, inst:
         if len(inst.args) == 2:
             error('Error opening %s: %s' % (gdbmfile, inst[1]))
         else:
             error('Error opening %s: %s' % (gdbmfile, inst))
+    db_load = os.popen("db_load '%s'" % os.path.join(new, pfbcache), 'w')
 
-    sys.stdout.write(
+    db_load.write(
         "VERSION=3\n"
         "format=bytevalue\n"
         "type=btree\n"
@@ -50,17 +100,48 @@
 
     k = db.firstkey()
     while k != None:
-        sys.stdout.write(" %s\n %s\n"
-                         % (binascii.hexlify(k), binascii.hexlify(db[k])))
+        folders = db[k].split(',')
+        folders.pop(0)
+
+        for folder in folders:
+            newfolder = translate_foldername(folder)
+            if newfolder:
+                if newfolder in folders:
+                    folders.remove(folder)
+                    sys.stdout.write("not overwriting %s (already exists\n"
+                                     % newfolder)
+                else:
+                    sys.stdout.write("copying folder %s\n" % folder)
+                    copy_folder(os.path.join(old, folder),
+                                os.path.join(new, newfolder))
+
+        folders.insert(0, '')
+        db_load.write(" %s\n %s\n"
+                      % (binascii.hexlify(k),
+                         binascii.hexlify(','.join(folders))))
         k = db.nextkey(k)
     db.close()
 
-    sys.stdout.write("DATA=END\n")
+    db_load.write("DATA=END\n")
+    db_load.close()
+
+
+def main(old, new):
+    """Read gdbm database and dump in a format suitable for db_load."""
+    try:
+        if not os.path.isdir(old):
+            error('Error: %s has to be the source directory' % (old,))
+        if not os.path.isdir(new) or os.listdir(new):
+            error('Error: %s has to be an empty directory' % (new,))
+    except OSError, inst:
+        error('Error opening %s: %s' % (new, inst[1]))
+
+    convert_db(old, new)
+
 
 if __name__ == "__main__":
-    if len(sys.argv) != 2:
-        error('Usage: %s pfbcache.db-gdbm | db_load pfbcache.db-db4'
-              % sys.argv[0])
+    if len(sys.argv) != 3:
+        error('\n'.join(__doc__.splitlines()[1:]) % __file__)
     else:
-        main(sys.argv[1])
+        main(sys.argv[1], sys.argv[2])
 





More information about the commits mailing list