def dispatch(request, *args, **kw): """ Perform somes checks, call the importer, and returns. Arguments of the method MUST be passed as pickle in POST data. This method is not meant to be called directly with a web browser. The Importer() instance is stored in session. """ base = kw.pop('base') modules = kw.pop('modules') # Create Importer() if not already present in session. if '__importer__' not in request.session: request.session['__importer__'] = Importer() full_path = base.replace('/', '.') + '.' + modules.replace('/', '.') mod, met = full_path.rsplit('.', 1) module = __import__(mod, {}, {}, ['']) callee = getattr(module, met) if not hasattr(callee, '__exportable__'): logger.debug("Exporter: method not exportable: " + full_path) return (200, Exception("Method not exportable")) # GET request ? # Only method call without args or attributes. (from a webbrowser) if request.method == 'GET': try: return (200, request.session['__importer__'].get(mod, met)) except ImporterError, e: logger.debug("Exporter: Catched: " + e.traceback) return (500, {'msg': e.msg, 'traceback': e.traceback})
def __delete_item(pg_manager, ctx_list, table, table_key, item_list): """ Delete a set of items from @table. """ ids = dict(zip(range(0, len(item_list)), item_list)) query_item = [] query_dict = {} for key, value in ids.iteritems(): query_item.append('%%(__table_key_%d__)s' % key) query_dict.update({'__table_key_%d__' % key: value}) query_dict.update({'table': table, 'table_key': table_key}) query = 'DELETE FROM %s WHERE %s IN (%s)' % (table, table_key, ','.join(query_item)) try: pg_manager.execute(ctx_list[0], query, query_dict) pg_manager.commit(ctx_list[0]) except sjutils.PgConnManager.DatabaseError, _error: logger.debug('Rollback delete in table %s' % table) raise
def create_groups(pg_manager, ctx_list, _request, groups): """ Create new groups. @groups: list of group names [String, String, ...] @returns: dictionary containing new groups and if an error occurs during object creation, it is appended to the @errors key with an added @message key containing the error message. All changes related to the failed group creation will be rolled back. { 'errors': [{ @object-keys: @object-values, 'message': String }, ... ], @group_id: { 'grp_id': Integer, 'name': String }, ... } """ ret = {} errors = [] db_grp = None savepoint = 0 for grp in groups: try: # Insert check savepoint += 1 pg_manager.execute(ctx_list[0], "SAVEPOINT save%s" % savepoint) query = """INSERT INTO groups (name) VALUES (%(name)s) RETURNING grp_id, name""" pg_manager.execute(ctx_list[0], query, {'name': grp}) db_grp = pg_manager.fetchall(ctx_list[0])[0] ret[db_grp[0]] = {'grp_id': db_grp[0], 'name': db_grp[1]} pg_manager.commit(ctx_list[0]) except sjutils.PgConnManager.DatabaseError, error: logger.debug('Rollback group creation for %s.' % grp['name']) pg_manager.execute(ctx_list[0], "ROLLBACK TO save%s" % savepoint) if db_grp: del ret[db_grp[0]] grp['message'] = str(error) errors.append(grp)
def create_checks(pg_manager, ctx_list, _request, checks): """ Create new checks with provided data. @checks: must be a list of check dictionaries of the form: [{ 'plugin': String, 'plugin_check': String, 'name': String, 'repeat': Integer, 'repeat_on_error': Integer, 'group_id': Integer (optional), 'infos': (optional) { @key: @value, ... } }, ... ] For each check, it is possible to automatically add it to an existing group according to its @group_id. @returns: dictionary containing new checks and if an error occurs during object creation, it is appended to the @errors key with an added @message key containing the error message. All changes related to the failed check creation will be rolled back. { 'errors': [{ @object-keys: @object-values, 'message': String }, ... ], @chk_id: { 'chk_id': Integer, 'plugin': String, 'plugin_check': String, }, ... } """ ret = {} errors = [] db_chk = None savepoint = 0 for chk in checks: try: # Insert check savepoint += 1 db_chk = None pg_manager.execute(ctx_list[0], "SAVEPOINT save%s" % savepoint) query = """INSERT INTO checks (plugin, plugin_check, name, repeat, repeat_on_error) VALUES (%(plugin)s, %(plugin_check)s, %(name)s, %(repeat)s, %(repeat_on_error)s) RETURNING chk_id, plugin, plugin_check""" pg_manager.execute(ctx_list[0], query, { 'plugin': chk['plugin'], 'plugin_check': chk['plugin_check'], 'name': chk['name'], 'repeat': chk['repeat'], 'repeat_on_error': chk['repeat_on_error'] }) db_chk = pg_manager.fetchall(ctx_list[0])[0] ret[db_chk[0]] = {'chk_id': db_chk[0], 'plugin': db_chk[1], 'plugin_check': db_chk[2]} # Insert check_infos if 'infos' in chk: for key, value in chk['infos'].iteritems(): query = """INSERT INTO check_infos (chk_id, key, value) VALUES (%(chk_id)s, %(chk_key)s, %(chk_value)s)""" pg_manager.execute(ctx_list[0], query, {'chk_id': db_chk[0], 'chk_key': key, 'chk_value': value}) # Assign to existing group if 'group_id' in chk: query = "INSERT INTO checks_group (chk_id, grp_id) VALUES (%(chk_id)s, %(group_id)s)" pg_manager.execute(ctx_list[0], query, {'chk_id': db_chk[0], 'group_id': chk['group_id']}) except sjutils.PgConnManager.DatabaseError, error: logger.debug('Rollback check creation for %s.%s.' % (chk['plugin'], chk['plugin_check'])) pg_manager.execute(ctx_list[0], "ROLLBACK TO save%s" % savepoint) if db_chk: del ret[db_chk[0]] chk['message'] = str(error) errors.append(chk)
def create_objects(pg_manager, ctx_list, _request, objects): """ Create new objects with provided data. @checks: must be a list of object dictionaries of the form: [{ 'address': String, 'group_id': Integer (optional), 'infos': (optional) { @key: @value, ... } }, ... ] For each check, it is possible to automatically add it to an existing group according to its @group_id. @returns: dictionary containing new objects and if an error occurs during object creation, it is appended to the @errors key with an added @message key containing the error message. All changes related to the failed object creation will be rolled back. { 'errors': [{ @object-keys: @object-values, 'message': String }, ... ], @obj_id: { 'obj_id': Integer, 'address': String, 'creation_date': datetime.date }, ... } """ ret = {} errors = [] db_obj = None savepoint = 0 for obj in objects: try: savepoint += 1 db_obj = None # Insert object pg_manager.execute(ctx_list[0], "SAVEPOINT save%s" % savepoint) query = "INSERT INTO objects (address) VALUES (%(obj_address)s) RETURNING obj_id, address, creation_date" pg_manager.execute(ctx_list[0], query, {'obj_address': obj['address']}) db_obj = pg_manager.fetchall(ctx_list[0])[0] ret[db_obj[0]] = {'obj_id': db_obj[0], 'address': db_obj[1], 'creation_date': str(db_obj[2])} # Insert object_infos if 'infos' in obj: for key, value in obj['infos'].iteritems(): query = """INSERT INTO object_infos (obj_id, key, value) VALUES (%(obj_id)s, %(obj_key)s, %(obj_value)s)""" pg_manager.execute(ctx_list[0], query, {'obj_id': db_obj[0], 'obj_key': key, 'obj_value': value}) # Assign to existing group if 'group_id' in obj: query = "INSERT INTO objects_group (obj_id, grp_id) VALUES (%(obj_id)s, %(group_id)s)" pg_manager.execute(ctx_list[0], query, {'obj_id': db_obj[0], 'group_id': obj['group_id']}) except sjutils.PgConnManager.DatabaseError, error: logger.debug('Rollback object creation for address %s.' % obj['address']) pg_manager.execute(ctx_list[0], "ROLLBACK TO save%s" % savepoint) if db_obj: del ret[db_obj[0]] obj['message'] = str(error) errors.append(obj)
def update(pg_manager, ctx_list, _request, params): """ Update checks, groups and objects according to @params. If an error occurs during the update, the method will raise an error and rollback all changes. @params: dictionary of the form: { 'objects': { @obj_id : { 'obj_id' : Integer, 'address' : String, 'infos' : { 'insert': { @key : String, ... }, 'delete': { @key : String, ... } } }, ... }, 'checks': { @chk_id: { 'chk_id' : Integer, 'name' : String, 'plugin' : String, 'plugin_check' : String, 'repeat' : Integer, 'repeat_on_error' : Integer, 'infos' : { 'insert': { @key : String, ... }, 'delete': { @key : String, ... } } }, ... }, 'groups' : { @grp_id : { 'grp_id' : Integer, 'name' : String }, ... } } Please note that chk_id, obj_id or grp_id are mandatory items that will not be changed. """ try: # Update objects if 'objects' in params: for obj_id, obj_update in params['objects'].iteritems(): query = "UPDATE objects SET address=%(address)s WHERE obj_id=%(obj_id)s" pg_manager.execute(ctx_list[0], query, obj_update) if 'infos' in obj_update: __update_infos(pg_manager, ctx_list, {'table_name': 'object_infos', 'table_id': 'obj_id', 'table_id_value': obj_id}, obj_update['infos']) # Update checks if 'checks' in params: for chk_id, chk_update in params['checks'].iteritems(): for chk_param in ('name', 'plugin', 'plugin_check', 'repeat', 'repeat_on_error'): query = "UPDATE checks SET " + chk_param + "=%(" + chk_param + ")s WHERE chk_id=%(chk_id)s" pg_manager.execute(ctx_list[0], query, chk_update) if 'infos' in chk_update: __update_infos(pg_manager, ctx_list, {'table_name': 'check_infos', 'table_id': 'chk_id', 'table_id_value': chk_id}, chk_update['infos']) # Update groups if 'groups' in params: for _grp_id, grp_update in params['groups'].iteritems(): query = "UPDATE groups SET name=%(name)s WHERE grp_id=%(grp_id)s" pg_manager.execute(ctx_list[0], query, grp_update) pg_manager.commit(ctx_list[0]) except sjutils.PgConnManager.DatabaseError, _error: logger.debug('Rollback update') raise
def create_checks(pg_manager, ctx_list, _request, checks): """ Create new checks with provided data. @checks: must be a list of check dictionaries of the form: [{ 'plugin': String, 'plugin_check': String, 'name': String, 'repeat': Integer, 'repeat_on_error': Integer, 'group_id': Integer (optional), 'infos': (optional) { @key: @value, ... } }, ... ] For each check, it is possible to automatically add it to an existing group according to its @group_id. @returns: dictionary containing new checks and if an error occurs during object creation, it is appended to the @errors key with an added @message key containing the error message. All changes related to the failed check creation will be rolled back. { 'errors': [{ @object-keys: @object-values, 'message': String }, ... ], @chk_id: { 'chk_id': Integer, 'plugin': String, 'plugin_check': String, }, ... } """ ret = {} errors = [] db_chk = None savepoint = 0 for chk in checks: try: # Insert check savepoint += 1 db_chk = None pg_manager.execute(ctx_list[0], "SAVEPOINT save%s" % savepoint) query = """INSERT INTO checks (plugin, plugin_check, name, repeat, repeat_on_error) VALUES (%(plugin)s, %(plugin_check)s, %(name)s, %(repeat)s, %(repeat_on_error)s) RETURNING chk_id, plugin, plugin_check""" pg_manager.execute( ctx_list[0], query, { 'plugin': chk['plugin'], 'plugin_check': chk['plugin_check'], 'name': chk['name'], 'repeat': chk['repeat'], 'repeat_on_error': chk['repeat_on_error'] }) db_chk = pg_manager.fetchall(ctx_list[0])[0] ret[db_chk[0]] = { 'chk_id': db_chk[0], 'plugin': db_chk[1], 'plugin_check': db_chk[2] } # Insert check_infos if 'infos' in chk: for key, value in chk['infos'].iteritems(): query = """INSERT INTO check_infos (chk_id, key, value) VALUES (%(chk_id)s, %(chk_key)s, %(chk_value)s)""" pg_manager.execute(ctx_list[0], query, { 'chk_id': db_chk[0], 'chk_key': key, 'chk_value': value }) # Assign to existing group if 'group_id' in chk: query = "INSERT INTO checks_group (chk_id, grp_id) VALUES (%(chk_id)s, %(group_id)s)" pg_manager.execute(ctx_list[0], query, { 'chk_id': db_chk[0], 'group_id': chk['group_id'] }) except sjutils.PgConnManager.DatabaseError, error: logger.debug('Rollback check creation for %s.%s.' % (chk['plugin'], chk['plugin_check'])) pg_manager.execute(ctx_list[0], "ROLLBACK TO save%s" % savepoint) if db_chk: del ret[db_chk[0]] chk['message'] = str(error) errors.append(chk)
def create_objects(pg_manager, ctx_list, _request, objects): """ Create new objects with provided data. @checks: must be a list of object dictionaries of the form: [{ 'address': String, 'group_id': Integer (optional), 'infos': (optional) { @key: @value, ... } }, ... ] For each check, it is possible to automatically add it to an existing group according to its @group_id. @returns: dictionary containing new objects and if an error occurs during object creation, it is appended to the @errors key with an added @message key containing the error message. All changes related to the failed object creation will be rolled back. { 'errors': [{ @object-keys: @object-values, 'message': String }, ... ], @obj_id: { 'obj_id': Integer, 'address': String, 'creation_date': datetime.date }, ... } """ ret = {} errors = [] db_obj = None savepoint = 0 for obj in objects: try: savepoint += 1 db_obj = None # Insert object pg_manager.execute(ctx_list[0], "SAVEPOINT save%s" % savepoint) query = "INSERT INTO objects (address) VALUES (%(obj_address)s) RETURNING obj_id, address, creation_date" pg_manager.execute(ctx_list[0], query, {'obj_address': obj['address']}) db_obj = pg_manager.fetchall(ctx_list[0])[0] ret[db_obj[0]] = { 'obj_id': db_obj[0], 'address': db_obj[1], 'creation_date': db_obj[2] } # Insert object_infos if 'infos' in obj: for key, value in obj['infos'].iteritems(): query = """INSERT INTO object_infos (obj_id, key, value) VALUES (%(obj_id)s, %(obj_key)s, %(obj_value)s)""" pg_manager.execute(ctx_list[0], query, { 'obj_id': db_obj[0], 'obj_key': key, 'obj_value': value }) # Assign to existing group if 'group_id' in obj: query = "INSERT INTO objects_group (obj_id, grp_id) VALUES (%(obj_id)s, %(group_id)s)" pg_manager.execute(ctx_list[0], query, { 'obj_id': db_obj[0], 'group_id': obj['group_id'] }) except sjutils.PgConnManager.DatabaseError, error: logger.debug('Rollback object creation for address %s.' % obj['address']) pg_manager.execute(ctx_list[0], "ROLLBACK TO save%s" % savepoint) if db_obj: del ret[db_obj[0]] obj['message'] = str(error) errors.append(obj)
def update(pg_manager, ctx_list, _request, params): """ Update checks, groups and objects according to @params. If an error occurs during the update, the method will raise an error and rollback all changes. @params: dictionary of the form: { 'objects': { @obj_id : { 'obj_id' : Integer, 'address' : String, 'infos' : { 'insert': { @key : String, ... }, 'delete': { @key : String, ... } } }, ... }, 'checks': { @chk_id: { 'chk_id' : Integer, 'name' : String, 'plugin' : String, 'plugin_check' : String, 'repeat' : Integer, 'repeat_on_error' : Integer, 'infos' : { 'insert': { @key : String, ... }, 'delete': { @key : String, ... } } }, ... }, 'groups' : { @grp_id : { 'grp_id' : Integer, 'name' : String }, ... } } Please note that chk_id, obj_id or grp_id are mandatory items that will not be changed. """ try: # Update objects if 'objects' in params: for obj_id, obj_update in params['objects'].iteritems(): query = "UPDATE objects SET address=%(address)s WHERE obj_id=%(obj_id)s" pg_manager.execute(ctx_list[0], query, obj_update) if 'infos' in obj_update: __update_infos( pg_manager, ctx_list, { 'table_name': 'object_infos', 'table_id': 'obj_id', 'table_id_value': obj_id }, obj_update['infos']) # Update checks if 'checks' in params: for chk_id, chk_update in params['checks'].iteritems(): for chk_param in ('name', 'plugin', 'plugin_check', 'repeat', 'repeat_on_error'): query = "UPDATE checks SET " + chk_param + "=%(" + chk_param + ")s WHERE chk_id=%(chk_id)s" pg_manager.execute(ctx_list[0], query, chk_update) if 'infos' in chk_update: __update_infos( pg_manager, ctx_list, { 'table_name': 'check_infos', 'table_id': 'chk_id', 'table_id_value': chk_id }, chk_update['infos']) # Update groups if 'groups' in params: for _grp_id, grp_update in params['groups'].iteritems(): query = "UPDATE groups SET name=%(name)s WHERE grp_id=%(grp_id)s" pg_manager.execute(ctx_list[0], query, grp_update) pg_manager.commit(ctx_list[0]) except sjutils.PgConnManager.DatabaseError, _error: logger.debug('Rollback update') raise
def dispatch(request, *args, **kw): """ Perform somes checks, call the importer, and returns. Arguments of the method MUST be passed as pickle in POST data. This method is not meant to be called directly with a web browser. """ base = kw.pop("base") modules = kw.pop("modules") # Create Importer() if not already present in session. imp = Importer() full_path = base.replace("/", ".") + "." + modules.replace("/", ".") mod, met = full_path.rsplit(".", 1) module = __import__(mod, {}, {}, [""]) callee = getattr(module, met) if not hasattr(callee, "__exportable__"): logger.debug("Exporter: method not exportable: " + full_path) return (200, Exception("Method not exportable")) # GET request ? # Only method call without args or attributes. (from a webbrowser) if request.method == "GET": try: return (200, imp.get(mod, met)) except ImporterError as e: logger.debug("Exporter: Catched: " + e.traceback) return (500, {"msg": e.msg, "traceback": e.traceback}) # POST ? # Method call with args, instantiations elif request.method == "POST": try: # Cause args is a tuple, create a list before. args = list(args) data = request.DECODED if data.get("args"): args += data["args"] kw.update(data["kw"]) kw.update({"__request__": request}) ret = None t = data["type"] if t == "call": ret = imp.call(mod, met, *args, **kw) elif t == "get": ret = imp.get(mod, met) elif t == "set": ret = imp.set(mod, met, kw.pop("value")) elif t == "instantiate": ret = imp.instantiate(kw.pop("variable"), mod, met, *args, **kw) return (200, ret) except ImporterError as e: logger.debug("Exporter: ImporterError catched: " + str(e)) return (500, {"msg": e.msg, "traceback": e.traceback}) except Exception as e: import traceback logger.debug("Exporter: Catched: " + str(e)) return (500, {"msg": str(e), "traceback": traceback.format_exc()})
except ImporterError, e: logger.debug("Exporter: Catched: " + e.traceback) return (500, {'msg': e.msg, 'traceback': e.traceback}) # POST ? # Method call with args, instantiations elif request.method == 'POST': try: # Cause args is a tuple, create a list before. args = list(args) data = request.DECODED if data.get('args'): args += data['args'] kw.update(data['kw']) kw.update({'__request__': request}) ret = None t = data['type'] if t == 'call': ret = request.session['__importer__'].call(mod, met, *args, **kw) elif t == 'get': ret = request.session['__importer__'].get(mod, met) elif t == 'set': ret = request.session['__importer__'].set(mod, met, kw.pop('value')) elif t == 'instantiate': ret = request.session['__importer__'].instantiate(kw.pop('variable'), mod, met, *args, **kw) # Force session to be saved (should be pickable now). request.session.modified = True return (200, ret) except ImporterError, e: logger.debug("Exporter: ImporterError catched: " + str(e)) return (500, {'msg': e.msg, 'traceback': e.traceback}) except Exception, e: import traceback logger.debug("Exporter: Catched: " + str(e)) return (500, {'msg': str(e), 'traceback': traceback.format_exc()})
# Cause args is a tuple, create a list before. args = list(args) data = request.DECODED if data.get('args'): args += data['args'] kw.update(data['kw']) kw.update({'__request__': request}) ret = None t = data['type'] if t == 'call': ret = request.session['__importer__'].call( mod, met, *args, **kw) elif t == 'get': ret = request.session['__importer__'].get(mod, met) elif t == 'set': ret = request.session['__importer__'].set( mod, met, kw.pop('value')) elif t == 'instantiate': ret = request.session['__importer__'].instantiate( kw.pop('variable'), mod, met, *args, **kw) # Force session to be saved (should be pickable now). request.session.modified = True return (200, ret) except ImporterError, e: logger.debug("Exporter: ImporterError catched: " + str(e)) return (500, {'msg': e.msg, 'traceback': e.traceback}) except Exception, e: import traceback logger.debug("Exporter: Catched: " + str(e)) return (500, {'msg': str(e), 'traceback': traceback.format_exc()})