diff options
| author | Tomás Touceda <chiiph@leap.se> | 2014-03-26 12:00:49 -0300 | 
|---|---|---|
| committer | Tomás Touceda <chiiph@leap.se> | 2014-03-26 12:00:49 -0300 | 
| commit | bd5110af83bce10392b971db71f8e3719df0d75c (patch) | |
| tree | 69fe39d18d853d2fe8374e24179612c0e4e6a870 | |
| parent | 6548d7ed36180d6aec4d205a3b3e5e7b4df54987 (diff) | |
| parent | 4dd32df24959b3f6062f525a3bba5cd592729107 (diff) | |
Merge remote-tracking branch 'refs/remotes/drebs/feature/add-reset-script' into develop
| -rw-r--r-- | scripts/db_access/reset_db.py | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/scripts/db_access/reset_db.py b/scripts/db_access/reset_db.py new file mode 100644 index 00000000..80871856 --- /dev/null +++ b/scripts/db_access/reset_db.py @@ -0,0 +1,79 @@ +#!/usr/bin/python + +# This script can be run on server side to completelly reset a user database. +# +# WARNING: running this script over a database will delete all documents but +# the one with id u1db_config (which contains db metadata) and design docs +# needed for couch backend. + + +import sys +from ConfigParser import ConfigParser +import threading +import logging +from couchdb import Database as CouchDatabase + + +if len(sys.argv) != 2: +    print 'Usage: %s <uuid>' % sys.argv[0] +    exit(1) + +uuid = sys.argv[1] + + +# create a logger +logger = logging.getLogger(__name__) +LOG_FORMAT = '%(asctime)s %(message)s' +logging.basicConfig(format=LOG_FORMAT, level=logging.INFO) + + +# get couch url +cp = ConfigParser() +cp.read('/etc/leap/soledad-server.conf') +url = cp.get('soledad-server', 'couch_url') + + +# confirm +yes = raw_input("Are you sure you want to reset the database for user %s " +                "(type YES)? " % uuid) +if yes != 'YES': +    print 'Bailing out...' +    exit(2) + + +db = CouchDatabase('%s/user-%s' % (url, uuid)) + + +class _DeleterThread(threading.Thread): + +    def __init__(self, db, doc_id, release_fun): +        threading.Thread.__init__(self) +        self._db = db +        self._doc_id = doc_id +        self._release_fun = release_fun + +    def run(self): +        logger.info('[%s] deleting doc...' % self._doc_id) +        del self._db[self._doc_id] +        logger.info('[%s] done.' % self._doc_id) +        self._release_fun() + + +semaphore_pool = threading.BoundedSemaphore(value=20) + + +threads = [] +for doc_id in db: +    if doc_id != 'u1db_config' and not doc_id.startswith('_design'): +        semaphore_pool.acquire() +        logger.info('[main] launching thread for doc: %s' % doc_id) +        t = _DeleterThread(db, doc_id, semaphore_pool.release) +        t.start() +        threads.append(t) + + +logger.info('[main] waiting for threads.') +map(lambda thread: thread.join(), threads) + + +logger.info('[main] done.') | 
