From 30bf7c4e6ab0e8521d3acdfceb3f4f37cee44abf Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 10 Apr 2015 18:00:26 +0200 Subject: server tools: move to separate dir, rename, add helper rz.py to hide ugly import details --- src/local/rz_cli_tool.py | 106 ----------------------------- src/local/server-tools/rz-doc | 151 +++++++++++++++++++++++++++++++++++++++++ src/local/server-tools/rz-user | 105 ++++++++++++++++++++++++++++ src/local/server-tools/rz.py | 4 ++ src/server/rz_cli.py | 141 -------------------------------------- 5 files changed, 260 insertions(+), 247 deletions(-) delete mode 100755 src/local/rz_cli_tool.py create mode 100755 src/local/server-tools/rz-doc create mode 100755 src/local/server-tools/rz-user create mode 100644 src/local/server-tools/rz.py delete mode 100755 src/server/rz_cli.py diff --git a/src/local/rz_cli_tool.py b/src/local/rz_cli_tool.py deleted file mode 100755 index 3c98d45a..00000000 --- a/src/local/rz_cli_tool.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/env python - -import argparse -import os -import pickle -import re -import sys - -# access to crypt_util & rz_server -sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'server')) -#import pdb; pdb.set_trace() - -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-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')) diff --git a/src/server/rz_cli.py b/src/server/rz_cli.py deleted file mode 100755 index 59d782cc..00000000 --- a/src/server/rz_cli.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/python - -import os -import argparse # TODO - use the newer / shorter argument parser. y? -from collections import namedtuple -import json -import uuid - -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)) - -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'].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 = [line.strip() for line in fd.readlines()] - if merge_sources: - merge(args.merge_target, merge_sources) -- cgit v1.3.1