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