Exemple #1
0
    def _delete(self, schema, data):
        if True:  # try:
            uuid = data['uuid']

            if schema in objectmodels.keys():
                self.log("Looking for object to be deleted.", lvl=debug)
                storageobject = objectmodels[schema].find_one({'uuid': uuid})
                self.log("Found object.", lvl=debug)

                self.log("Fields:", storageobject._fields, "\n\n\n",
                         storageobject.__dict__)
                storageobject.delete()

                self.log("Preparing notification.", lvl=debug)
                notification = objectdeletion(uuid, schema)

                if uuid in self.subscriptions:
                    deletion = {'component': 'objectmanager',
                                'action': 'deletion',
                                'data': uuid
                                }
                    for recipient in self.subscriptions[uuid]:
                        self.fireEvent(send(recipient, deletion))

                    del (self.subscriptions[uuid])

                result = {'component': 'objectmanager',
                          'action': 'delete',
                          'data': (True, schema, storageobject.uuid),
                          }
                return result, notification
            else:
                self.log("Unknown schema encountered: ", schema, lvl=warn)
Exemple #2
0
    def objectmanagerrequest(self, event):
        """OM event handler for incoming events
        :param event: OMRequest with incoming OM pagename and pagedata
        """

        self.log("Event: '%s'" % event.__dict__)
        action = event.action
        data = event.data
        if action not in ['subscribe', 'unsubscribe']:
            if 'schema' in data:
                schema = data['schema']
            else:
                self.log("No Schema given, cannot act!", lvl=critical)
                return

        if 'filter' in data:
            objectfilter = data['filter']
        else:
            objectfilter = {}

        result = None
        notification = None

        if action == "list":
            if schema in objectmodels.keys():
                if 'fields' in data:
                    fields = data['fields']
                else:
                    fields = []

                objlist = []

                if objectmodels[schema].count(objectfilter) > WARNSIZE:
                    self.log("Getting a very long list of items for ", schema,
                             lvl=warn)

                for item in objectmodels[schema].find(objectfilter):
                    try:
                        if fields in ('*', ['*']):
                            objlist.append(item.serializablefields())
                        else:
                            listitem = {'uuid': item.uuid}

                            if 'name' in item._fields:
                                listitem['name'] = item._fields['name']

                            for field in fields:
                                if field in item._fields:
                                    listitem[field] = item._fields[field]
                                else:
                                    listitem[field] = None

                            objlist.append(listitem)
                    except Exception as e:
                        self.log("Faulty object or field: ", e, type(e),
                                 item._fields, fields, lvl=error,
                                 exc=True)
                self.log("Generated object list: ", objlist)

                result = {'component': 'objectmanager',
                          'action': 'list',
                          'data': {'schema': schema,
                                   'list': objlist
                                   }
                          }
            else:
                self.log("Schemata: ", objectmodels.keys())
                self.log("List for unavailable schema requested: ", schema,
                         lvl=warn)

        elif action == "search":
            if schema in objectmodels.keys():
                # objectfilter['$text'] = {'$search': str(data['search'])}
                objectfilter = {
                    'name': {'$regex': str(data['search']), '$options': '$i'}}

                # if 'fields' in data:
                #    fields = data['fields']
                # else:
                fields = []

                reqid = data['req']

                objlist = []

                if collections[schema].count() > WARNSIZE:
                    self.log("Getting a very long list of items for ", schema,
                             lvl=warn)

                self.log("Objectfilter: ", objectfilter, ' Schema: ', schema,
                         lvl=warn)
                # for item in collections[schema].find(objectfilter):
                for item in collections[schema].find(objectfilter):
                    self.log("Search found item: ", item, lvl=warn)
                    try:
                        # TODO: Fix bug in warmongo that needs this workaround:
                        item = objectmodels[schema](item)
                        listitem = {'uuid': item.uuid}
                        if 'name' in item._fields:
                            listitem['name'] = item.name

                        for field in fields:
                            if field in item._fields:
                                listitem[field] = item._fields[field]
                            else:
                                listitem[field] = None

                        objlist.append(listitem)
                    except Exception as e:
                        self.log("Faulty object or field: ", e, type(e),
                                 item._fields, fields, lvl=error)
                self.log("Generated object search list: ", objlist)

                result = {'component': 'objectmanager',
                          'action': 'search',
                          'data': {'schema': schema,
                                   'list': objlist,
                                   'req': reqid
                                   }
                          }
            else:
                self.log("List for unavailable schema requested: ", schema,
                         lvl=warn)

        elif action == "get":
            if 'subscribe' in data:
                subscribe = data['subscribe'] is True
            else:
                subscribe = False

            try:
                uuid = str(data['uuid'])
            except (KeyError, TypeError):
                uuid = ""

            if objectfilter == {}:
                if uuid == "":
                    self.log('Object with no filter/uuid requested:', schema, data,
                             lvl=error)
                    return
                objectfilter = {'uuid': uuid}

            storageobject = None

            if schema in objectmodels.keys():
                storageobject = objectmodels[schema].find_one(objectfilter)

                if not storageobject:
                    if uuid.upper == "CREATE":
                        # TODO: Fix this, a request for an existing object is a
                        # request for an existing object, a creation request is
                        # not.

                        self.log("Object not found, creating: ", data)

                        storageobject = objectmodels[schema]({'uuid': str(uuid4())})

                        if "useruuid" in schemastore[schema]['schema']['properties']:
                            storageobject.useruuid = event.user.uuid
                            self.log("Attached initial owner's id: ", event.user.uuid)
                    else:
                        self.log("Object not found and not willing to create.", lvl=warn)
                        result = {
                            'component': 'objectmanager',
                            'action': 'nonexistant',
                            'data': {
                                'schema': schema,
                            }
                        }
            else:
                self.log('Object for invalid schema requested!', schema, lvl=error)

            if storageobject:
                self.log("Object found, delivering: ", data)
                if subscribe and uuid != "":
                    self.log('Updating subscriptions', lvl=debug)
                    if uuid in self.subscriptions:
                        if not event.client.uuid in self.subscriptions[uuid]:
                            self.subscriptions[uuid].append(event.client.uuid)
                    else:
                        self.subscriptions[uuid] = [event.client.uuid]

                result = {'component': 'objectmanager',
                          'action': 'get',
                          'data': storageobject.serializablefields()
                          }

        elif action == "subscribe":
            uuid = data

            if uuid in self.subscriptions:
                if not event.client.uuid in self.subscriptions[uuid]:
                    self.subscriptions[uuid].append(event.client.uuid)
            else:
                self.subscriptions[uuid] = [event.client.uuid]

            result = {'component': 'objectmanager',
                      'action': 'subscribe',
                      'data': {'uuid': uuid, 'success': True}
                      }

        elif action == "unsubscribe":
            # TODO: Automatic Unsubscription
            uuid = data

            if uuid in self.subscriptions:
                self.subscriptions[uuid].remove(event.client.uuid)

                if len(self.subscriptions[uuid]) == 0:
                    del (self.subscriptions[uuid])

            result = {'component': 'objectmanager',
                      'action': 'unsubscribe',
                      'data': {'uuid': uuid, 'success': True}
                      }

        elif action == "put":
            result, notification = self._put(schema, data)

        elif action == 'delete':
            result, notification = self._delete(schema, data)

        elif action == 'change':
            result, notification = self._change(schema, data)

        else:
            self.log("Unsupported action: ", action, event, event.__dict__,
                     lvl=warn)
            return

        if notification:
            try:
                self.fireEvent(notification)
            except Exception as e:
                self.log("Transmission error during notification: %s" % e,
                         lvl=error)

        if result:
            try:
                self.fireEvent(send(event.client.uuid, result))
            except Exception as e:
                self.log("Transmission error during response: %s" % e,
                         lvl=error)
Exemple #3
0
    def objectmanagerrequest(self, event):
        """OM event handler for incoming events
        :param event: OMRequest with incoming OM pagename and pagedata
        """

        hfoslog("[OM] Event: '%s'" % event.__dict__)
        try:
            action = event.action
            data = event.data
            schema = data['schema']

            result = None

            if action == "list":
                if schema in objectmodels.keys():
                    if 'filter' in data:
                        filter = data['filter']
                    else:
                        filter = {}

                    if 'fields' in data:
                        fields = data['fields']
                    else:
                        fields = []

                    objlist = []

                    if objectmodels[schema].count(filter) > WARNSIZE:
                        hfoslog("[OM] Getting a very long list of items for ", schema, lvl=warn)

                    for item in objectmodels[schema].find(filter):
                        try:
                            listitem = {'uuid': item.uuid, 'name': item.name}
                            for field in fields:
                                if field in item._fields:
                                    listitem[field] = item._fields[field]
                                else:
                                    listitem[field] = None

                            objlist.append(listitem)
                        except Exception as e:
                            hfoslog("[OM] Faulty object or field: ", item._fields, fields, lvl=error)
                    hfoslog("[OM] Generated object list: ", objlist)

                    result = {'component': 'objectmanager',
                              'action': 'list',
                              'data': {'schema': schema,
                                       'list': objlist
                                       }
                              }
                else:
                    hfoslog("[OM] List for unavailable schema requested: ", schema, lvl=warn)

            elif action == "get":
                uuid = data['uuid']

                obj = None

                if schema in objectmodels.keys() and uuid.upper != "CREATE":
                    obj = objectmodels[schema].find_one({'uuid': uuid})

                if not obj:
                    hfoslog("[OM] Object not found, creating: ", data)
                    obj = objectmodels[schema]({'uuid': str(uuid4())})
                else:
                    hfoslog("[OM] Object found, delivering: ", data)

                result = {'component': 'objectmanager',
                          'action': 'get',
                          'data': obj.serializablefields()
                          }

            elif action == "put":
                try:
                    putobj = data['obj']
                    uuid = putobj['uuid']
                except KeyError:
                    hfoslog("[OM] Put request with missing arguments!", event, lvl=critical)
                    return

                try:
                    if uuid != 'create':
                        obj = objectmodels[schema].find_one({'uuid': uuid})
                    else:
                        putobj['uuid'] = uuid4()
                    if obj:
                        hfoslog("[OM] Updating object:", obj._fields, lvl=debug)
                        obj.update(putobj)

                    else:
                        obj = objectmodels[schema](putobj)
                        hfoslog("[OM] Storing object:", obj._fields, lvl=debug)
                        try:
                            obj.validate()
                        except ValidationError:
                            hfoslog("[OM] Validation of new object failed!", data, lvl=warn)

                    obj.save()

                    hfoslog("[OM] Object stored.")

                    result = {'component': 'objectmanager',
                              'action': 'put',
                              'data': (True, obj.uuid),
                              }
                except Exception as e:
                    hfoslog("[OM] Error during object storage:", e, type(e), lvl=error)

            else:
                hfoslog("[OM] Unsupported action: ", action, event, event.__dict__, lvl=warn)
                return

            if result:
                try:
                    self.fireEvent(send(event.client.uuid, result))
                except Exception as e:
                    hfoslog("[OM] Transmission error before broadcast: %s" % e, lvl=error)

        except Exception as e:
            hfoslog("[OM] Error: '%s' %s" % (e, type(e)), lvl=error)
Exemple #4
0
    def objectmanagerrequest(self, event):
        """OM event handler for incoming events
        :param event: OMRequest with incoming OM pagename and pagedata
        """

        hfoslog("[OM] Event: '%s'" % event.__dict__)
        try:
            action = event.action
            data = event.data
            schema = data['schema']

            result = None

            if action == "list":
                if schema in objectmodels.keys():
                    if 'filter' in data:
                        filter = data['filter']
                    else:
                        filter = {}

                    if 'fields' in data:
                        fields = data['fields']
                    else:
                        fields = []

                    objlist = []

                    if objectmodels[schema].count(filter) > WARNSIZE:
                        hfoslog("[OM] Getting a very long list of items for ",
                                schema,
                                lvl=warn)

                    for item in objectmodels[schema].find(filter):
                        try:
                            listitem = {'uuid': item.uuid, 'name': item.name}
                            for field in fields:
                                if field in item._fields:
                                    listitem[field] = item._fields[field]
                                else:
                                    listitem[field] = None

                            objlist.append(listitem)
                        except Exception as e:
                            hfoslog("[OM] Faulty object or field: ",
                                    item._fields,
                                    fields,
                                    lvl=error)
                    hfoslog("[OM] Generated object list: ", objlist)

                    result = {
                        'component': 'objectmanager',
                        'action': 'list',
                        'data': {
                            'schema': schema,
                            'list': objlist
                        }
                    }
                else:
                    hfoslog("[OM] List for unavailable schema requested: ",
                            schema,
                            lvl=warn)

            elif action == "get":
                uuid = data['uuid']

                obj = None

                if schema in objectmodels.keys() and uuid.upper != "CREATE":
                    obj = objectmodels[schema].find_one({'uuid': uuid})

                if not obj:
                    hfoslog("[OM] Object not found, creating: ", data)
                    obj = objectmodels[schema]({'uuid': str(uuid4())})
                else:
                    hfoslog("[OM] Object found, delivering: ", data)

                result = {
                    'component': 'objectmanager',
                    'action': 'get',
                    'data': obj.serializablefields()
                }

            elif action == "put":
                try:
                    putobj = data['obj']
                    uuid = putobj['uuid']
                except KeyError:
                    hfoslog("[OM] Put request with missing arguments!",
                            event,
                            lvl=critical)
                    return

                try:
                    if uuid != 'create':
                        obj = objectmodels[schema].find_one({'uuid': uuid})
                    else:
                        putobj['uuid'] = uuid4()
                    if obj:
                        hfoslog("[OM] Updating object:",
                                obj._fields,
                                lvl=debug)
                        obj.update(putobj)

                    else:
                        obj = objectmodels[schema](putobj)
                        hfoslog("[OM] Storing object:", obj._fields, lvl=debug)
                        try:
                            obj.validate()
                        except ValidationError:
                            hfoslog("[OM] Validation of new object failed!",
                                    data,
                                    lvl=warn)

                    obj.save()

                    hfoslog("[OM] Object stored.")

                    result = {
                        'component': 'objectmanager',
                        'action': 'put',
                        'data': (True, obj.uuid),
                    }
                except Exception as e:
                    hfoslog("[OM] Error during object storage:",
                            e,
                            type(e),
                            lvl=error)

            else:
                hfoslog("[OM] Unsupported action: ",
                        action,
                        event,
                        event.__dict__,
                        lvl=warn)
                return

            if result:
                try:
                    self.fireEvent(send(event.client.uuid, result))
                except Exception as e:
                    hfoslog("[OM] Transmission error before broadcast: %s" % e,
                            lvl=error)

        except Exception as e:
            hfoslog("[OM] Error: '%s' %s" % (e, type(e)), lvl=error)