summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Shyba <victor.shyba@gmail.com>2015-10-27 13:30:07 -0300
committerVictor Shyba <victor.shyba@gmail.com>2015-10-29 16:50:01 -0300
commitbc8e8bea61b01e0b93593e24a816574f5a19ac61 (patch)
tree4c6bc6273977faa3537b2cd88bd2f5ea810d9485
parent7c50a100a46c69f759dc22165cec9b8098cac3a4 (diff)
[feat] adds --migrate-all to create-user-db script
This parameter applies the ensure_database to all existing databases, making all of them use the latest design documents. This can be used to migrate security documents, update handlers or any other kind of design document.
-rw-r--r--common/src/leap/soledad/common/couch.py17
-rw-r--r--server/changes/feat_configurable_ensure5
-rwxr-xr-xserver/pkg/create-user-db35
3 files changed, 51 insertions, 6 deletions
diff --git a/common/src/leap/soledad/common/couch.py b/common/src/leap/soledad/common/couch.py
index c2809a47..ccedef15 100644
--- a/common/src/leap/soledad/common/couch.py
+++ b/common/src/leap/soledad/common/couch.py
@@ -70,6 +70,23 @@ logger = logging.getLogger(__name__)
COUCH_TIMEOUT = 120 # timeout for transfers between Soledad server and Couch
+def list_users_dbs(couch_url):
+ """
+ Retrieves a list with all databases that starts with 'user-' on CouchDB.
+ Those databases belongs to users. So, the list will contain all the
+ database names in the form of 'user-{uuid4}'.
+
+ :param couch_url: The couch url with needed credentials
+ :type couch_url: str
+
+ :return: The list of all database names from users.
+ :rtype: [str]
+ """
+ with couch_server(couch_url) as server:
+ users = [dbname for dbname in server if dbname.startswith('user-')]
+ return users
+
+
class InvalidURLError(Exception):
"""
diff --git a/server/changes/feat_configurable_ensure b/server/changes/feat_configurable_ensure
new file mode 100644
index 00000000..34a20c86
--- /dev/null
+++ b/server/changes/feat_configurable_ensure
@@ -0,0 +1,5 @@
+o 'create-user-db' script now can be configured from soledad-server.conf
+ when generating the user's security document.
+o Migrating a user's database to newest design documents is now possible by
+ using a parameter '--migrate-all' on 'create-user-db' script.
+
diff --git a/server/pkg/create-user-db b/server/pkg/create-user-db
index 28d1cbd0..ae5d15dc 100755
--- a/server/pkg/create-user-db
+++ b/server/pkg/create-user-db
@@ -21,6 +21,7 @@ import netrc
import argparse
from leap.soledad.common.couch import CouchDatabase
from leap.soledad.common.couch import is_db_name_valid
+from leap.soledad.common.couch import list_users_dbs
from leap.soledad.server import load_configuration
@@ -30,7 +31,10 @@ This is meant to be used by Soledad Server.
"""
parser = argparse.ArgumentParser(description=description)
parser.add_argument('dbname', metavar='user-d34db33f', type=str,
+ default='', nargs='?',
help='database name on the format user-{uuid4}')
+parser.add_argument('--migrate-all', action='store_true',
+ help="recreate all design docs for all existing account")
CONF = load_configuration('/etc/soledad/soledad-server.conf')
NETRC_PATH = CONF['soledad-server']['admin_netrc']
@@ -49,15 +53,34 @@ def url_for_db(dbname):
return url
-if __name__ == '__main__':
- args = parser.parse_args()
- if not is_db_name_valid(args.dbname):
- print ("Invalid name! %s" % args.dbname)
+def ensure_database(dbname):
+ """
+ This method will ensure that a database named `dbname` will exist
+ or created if it doesn't. Calling it twice will ensure that design
+ documents are present and updated.
+ The database name has to match this criteria to be considered valid:
+ user-[a-f0-9]+
+
+ :param dbname: name of the user database
+ :type dbname: str
+ """
+ if not is_db_name_valid(dbname):
+ print ("Invalid name! %s" % dbname)
sys.exit(1)
- url = url_for_db(args.dbname)
+ url = url_for_db(dbname)
db_security = CONF['database-security']
db = CouchDatabase.open_database(url=url, create=True,
replica_uid=None, ensure_ddocs=True,
database_security=db_security)
- print ('success! Created %s, replica_uid: %s' %
+ print ('success! Ensured that database %s exists, with replica_uid: %s' %
(db._dbname, db.replica_uid))
+
+
+if __name__ == '__main__':
+ args = parser.parse_args()
+ if args.migrate_all:
+ couch_url = url_for_db('')
+ for dbname in list_users_dbs(couch_url):
+ ensure_database(dbname)
+ else:
+ ensure_database(args.dbname)