summaryrefslogtreecommitdiff
path: root/src/local/server-tools
diff options
context:
space:
mode:
authorAlon Levy <alon@pobox.com>2015-04-10 18:00:26 +0200
committerAlon Levy <alon@pobox.com>2015-04-10 18:14:47 +0200
commit30bf7c4e6ab0e8521d3acdfceb3f4f37cee44abf (patch)
tree0c8a9f7944cded35bdc8769c3d072c961187a7b0 /src/local/server-tools
parent5ecd636b8104cbc7c20c68afedaaba68d0298d68 (diff)
server tools: move to separate dir, rename, add helper rz.py to hide ugly import details
Diffstat (limited to 'src/local/server-tools')
-rwxr-xr-xsrc/local/server-tools/rz-doc151
-rwxr-xr-xsrc/local/server-tools/rz-user105
-rw-r--r--src/local/server-tools/rz.py4
3 files changed, 260 insertions, 0 deletions
diff --git a/src/local/server-tools/rz-doc b/src/local/server-tools/rz-doc
new file mode 100755
index 00000000..e0b30bf8
--- /dev/null
+++ b/src/local/server-tools/rz-doc
@@ -0,0 +1,151 @@
+#!/usr/bin/python
+
+import sys
+import os
+import argparse # TODO - use the newer / shorter argument parser. y?
+from collections import namedtuple
+import json
+import uuid
+
+# must be before any rhizi import
+import rz
+
+from neo4j_util import generate_random_id__uuid
+from rz_server import init_config
+from rz_kernel import RZ_Kernel
+from model.graph import Topo_Diff
+import db_controller as dbc
+
+def clone(rzdoc_name):
+ return kernel.rzdoc__clone(kernel.rzdoc__lookup_by_name(rzdoc_name))
+
+def names():
+ return [v['name'] for v in kernel.rzdoc__list()]
+
+def create_id():
+ return uuid.uuid4().get_hex()[:8]
+
+def merge_topos(topos):
+ """
+ Merge a number of Topo_Diff's
+
+ result node set is union of nodes
+ conflicting nodes:
+ same name nodes take the first (id wise)
+ attributes: take the first
+ result link set is merged (well defined: replace dropped id by chosen id in all links)
+ """
+ result = Topo_Diff()
+ node_names = dict()
+ node_ids = set()
+ dropped_nodes = set()
+ links_src_dst = set()
+
+ def rename(links, from_id, to_id):
+ for link in links:
+ if link['__src_id'] == from_id:
+ link['__src_id'] = to_id
+ if link['__dst_id'] == from_id:
+ link['__dst_id'] = to_id
+
+ def merge(topo):
+ links = topo.link_set_add
+ nodes = topo.node_set_add
+ new_nodes = []
+ for node in nodes:
+ name = node['name']
+ if name in node_names:
+ dropped_nodes.add(node['name'])
+ rename(links, node['id'], node_names[name]['id'])
+ else:
+ node_names[name] = node
+ new_nodes.append(node)
+ node_ids.add(node['id'])
+ new_links = []
+ for link in links:
+ k = (link['__src_id'], link['__dst_id'])
+ if k not in links_src_dst:
+ links_src_dst.add(k)
+ new_links.append(link)
+ if len(dropped_nodes) > 0:
+ print("dropped duplicate nodes count: %s" % len(dropped_nodes))
+ if len(new_links) != len(links):
+ print("dropped duplicate links count: %s" % (len(links) - len(new_links)))
+ print("adding %s nodes, %s links" % (len(new_nodes), len(new_links)))
+ result.node_set_add.extend(new_nodes)
+ result.link_set_add.extend(new_links)
+
+ for topo in topos:
+ merge(topo)
+ # now realloc all ids since otherwise they are duplicates of originals
+ renames = [(node['id'], create_id()) for node in result.node_set_add]
+ def show(word):
+ print("=" * 80)
+ print(word)
+ print(result.node_set_add)
+ print(result.link_set_add)
+ for src, dst in renames:
+ rename(result.link_set_add, src, dst)
+ for node, (_, new_id) in zip(result.node_set_add, renames):
+ node['id'] = new_id
+ return result
+
+def merge(destination_name, sources=None):
+ if sources == None:
+ sources = names()
+ docs = [kernel.rzdoc__lookup_by_name(name) for name in sources]
+ topos = [kernel.rzdoc__clone(doc) for doc in docs]
+ destination = kernel.rzdoc__create(destination_name)
+
+ ctx = namedtuple('Context', ['user_name', 'rzdoc'])(None, destination)
+ kernel.diff_commit__topo(merge_topos(topos), ctx)
+
+def remove(rzdoc_name):
+ kernel.rzdoc__delete(kernel.rzdoc__lookup_by_name(rzdoc_name))
+
+def noeol(line):
+ if len(line) == 0:
+ return line
+ return line[:-1] if line[-1] == '\n' else line
+
+if __name__ == '__main__':
+ p = argparse.ArgumentParser(description="rhizi command line interface")
+ p.add_argument('--config-dir', help='path to Rhizi config dir', default=None)
+ p.add_argument('--list-names', default=False, action='store_true')
+ p.add_argument('--list-table', default=False, action='store_true')
+ p.add_argument('--delete', help='doc name to delete')
+ p.add_argument('--merge-target', help='name of resulting rzdoc')
+ p.add_argument('--merge', help='comma separated names of docs to merge')
+ p.add_argument('--merge-file', help='filename with line per doc name')
+ p.add_argument('--clone', help='show contents of doc')
+ args = p.parse_args()
+
+ if args.config_dir is None:
+ for d in ['res/etc', '/etc/rhizi']:
+ if os.path.exists(d):
+ args.config_dir = d
+ break
+ cfg = init_config(args.config_dir)
+ kernel = RZ_Kernel()
+ db_ctl = dbc.DB_Controller(cfg)
+ kernel.db_ctl = db_ctl
+ if args.list_table:
+ print('\n'.join('%30s %30s' % (d['name'].encode('utf-8').ljust(30),
+ d['id'].encode('utf-8').ljust(30)) for d in kernel.rzdoc__list()))
+ raise SystemExit
+ if args.list_names:
+ print('\n'.join(d['name'].encode('utf-8') for d in kernel.rzdoc__list()))
+ raise SystemExit
+ if args.delete:
+ remove(args.delete)
+ if args.clone:
+ print(json.dumps(clone(args.clone).to_json_dict()))
+ if args.merge_target:
+ merge_sources = None
+ if args.merge:
+ merge_sources = args.merge.split(',')
+ if args.merge_file:
+ with open(args.merge_file) as fd:
+ merge_sources = [noeol(line) for line in fd.readlines()]
+ if merge_sources:
+ merge(args.merge_target, merge_sources)
diff --git a/src/local/server-tools/rz-user b/src/local/server-tools/rz-user
new file mode 100755
index 00000000..ebdcd9f8
--- /dev/null
+++ b/src/local/server-tools/rz-user
@@ -0,0 +1,105 @@
+#!/bin/env python
+
+import argparse
+import os
+import pickle
+import re
+import sys
+
+# must be before any rhizi import
+import rz
+
+from crypt_util import hash_pw
+from rz_server import init_config
+from rz_user_db import User_Account, User_DB
+
+def init_pw_db(cfg, user_pw_list_file, user_db_path):
+
+ def add_user_login(first_name, last_name,
+ rz_username, email_address, pw_plaintext):
+ pw_hash = hash_pw(str(pw_plaintext), salt)
+ u_account = User_Account(first_name=first_name,
+ last_name=last_name,
+ rz_username=rz_username,
+ email_address=email_address,
+ pw_hash=pw_hash,
+ role_set=['user'])
+
+ print('user_db: added entry: user: %s, pw: %s...' % (u, pw_db[u][:5]))
+
+ if os.path.exists(user_db_path):
+ print('user_db_path already exists, aborting: ' + user_db_path)
+ return
+
+ user_db = User_DB(db_path=db_path)
+ user_db.init(mode='c')
+
+ salt = cfg.secret_key
+ assert len(salt) > 8, 'server-key not found or too short'
+ print('using config secret_key for salt generation: ' + salt[:3] + '...')
+
+ u_count = 0
+ with open(user_pw_list_file, 'r') as f:
+ for line in f:
+ if re.match('(^#)|(\s+$)', line):
+ continue
+
+ kv_arr = line.split(',')
+ if 5 != len(kv_arr):
+ raise Exception('failed to parse first-name,last-name,email,user,pw line: ' + line)
+
+ first_name, last_name, rz_username, email_address, pw_plaintext = map(
+ str.strip, kv_arr)
+ add_user_login(first_name=first_name,
+ last_name=last_name,
+ rz_username=rz_username,
+ email_address=email_address,
+ pw_plaintext=pw_plaintext)
+ print('added user: u: ' + rz_username)
+ u_count = u_count + 1
+ print('user_db generated: path: %s, user-count: %d' % (user_db_path, u_count))
+
+def open_existing_user_db(user_db_path):
+ user_db = User_DB(db_path=user_db_path)
+ user_db.init(mode='w')
+ return user_db
+
+def role_add(user_db_path, user_email, role):
+ user_db = open_existing_user_db(user_db_path)
+ uid, u = user_db.lookup_user__by_email_address(user_email)
+ user_db.user_add_role(uid, role)
+
+def role_rm(user_db_path, user_email, role):
+ user_db = open_existing_user_db(user_db_path)
+ uid, u = user_db.lookup_user__by_email_address(user_email)
+ user_db.user_rm_role(uid, role)
+
+def main():
+ p = argparse.ArgumentParser(description='rz-cli tool')
+ p.add_argument('--config-dir', help='path to Rhizi config dir', default='res/etc')
+ p.add_argument('--user-db-path', help='path to user_db (ignore config)')
+ p.add_argument('--init-user-db', help='init user db', action='store_const', const=True)
+ p.add_argument('--user-db-init-file', help='user_db db initialization file in \'user,pw\' format')
+ p.add_argument('--email', help='email of user to operate on')
+ p.add_argument('--role-add', help='role to add to user, i.e. admin or user')
+ p.add_argument('--role-rm', help='role to remove from user')
+
+ args = p.parse_args()
+ if None == args.user_db_path:
+ cfg = init_config(args.config_dir)
+ user_db_path = cfg.user_db_path
+ else:
+ user_db_path = args.user_db_path
+
+ if args.init_user_db:
+ init_pw_db(cfg, args.user_db_init_file, user_db_path)
+ exit(0)
+
+ if args.email:
+ if args.role_add:
+ role_add(user_db_path, args.email, args.role_add)
+ if args.role_rm:
+ role_rm(user_db_path, args.email, args.role_rm)
+
+if __name__ == '__main__':
+ main()
diff --git a/src/local/server-tools/rz.py b/src/local/server-tools/rz.py
new file mode 100644
index 00000000..4bcf6c05
--- /dev/null
+++ b/src/local/server-tools/rz.py
@@ -0,0 +1,4 @@
+# hack to setup rhizi path - needs a proper install
+import sys
+import os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'server'))