Esempio n. 1
0
 def get(self, id):
     '''
     GET(read) operation
     '''
     version = self.get_argument('version', None)
     internal = self.get_argument('internal', None)
     txid = self.get_argument('txid', None)
     tega_id = self.get_argument('tega_id')
     regex_flag = str2bool(self.get_argument('regex_flag', False))
     if version:
         version = int(version)
     internal = str2bool(internal)
     path = url2path(id)
     value = None
     try:
         value = tega.idb.get(url2path(id), version=version,
                 regex_flag=regex_flag)
         if isinstance(value, Cont) or is_builtin_type(value):
             self.write(value.dumps_(internal=internal))
         elif isinstance(value, list):
             dict_ = {v[0]: {'groups':v[2],
                 'instance':v[1].serialize_(internal=internal)} for v in
                 value}
             self.write(json.dumps(dict_))
         else:
             self.write(json.dumps(value))
         self.set_header('Content-Type', 'application/json')
     except KeyError:
         logging.info('path "{}" not found in global idb'.format(path))
         raise tornado.web.HTTPError(404)  # Not Found(404)
Esempio n. 2
0
    def on_message(self, msg):
        '''
        Handles SESSION/SUBSCRIBE/UNSUBSCRIBE request from a subscriber.
        '''
        cmd, param, body = self.parser(msg)

        if cmd == 'SESSION':
            self.tega_id = param[0]  # tega ID from a tega client
            scope = SCOPE(param[1])
            self.subscriber = WebSocketSubscriber(scope, self)
            self.subscriber.tega_id = self.tega_id
            if scope == SCOPE.GLOBAL:
                def _on_subscribe(path, scope):
                    self.write_message(
                            'SUBSCRIBE {} {}'.format(path, scope.value))
                self.subscriber.on_subscribe = _on_subscribe
                tega.idb.add_subscribe_forwarder(self.subscriber)
            subscriber_clients[self.tega_id] = self.subscriber
            tega.idb.add_tega_id(self.tega_id)
            self.write_message('SESSIONACK {}'.format(server_tega_id))
        elif cmd == 'SUBSCRIBE':
            if param:
                channel = param[0]
                scope = SCOPE(param[1])
                regex_flag = str2bool(param[2])
                tega.idb.subscribe(self.subscriber, channel, scope, regex_flag)
            else:
                logging.warn('WebSocket(server): no channel indicated in SUBSCRIBE request')
        elif cmd == 'UNSUBSCRIBE':
            if param:
                channel = param[0]
                regex_flag = str2bool(param[1])
                tega.idb.unsubscribe(self.subscriber, channel, regex_flag)
                self.write_message('UNSUBSCRIBE {}'.format(param))
            else:
                tega.idb.unsubscribe_all(self.subscriber)
                self.write_message('UNSUBSCRIBE')
        elif cmd == 'PUBLISH':
            tega.idb.publish(param, self.tega_id, body['message'],
                    self.subscriber)
        elif cmd == 'NOTIFY':
            tega.idb.crud_batch(body, self.subscriber)
        elif cmd == 'MESSAGE':
            channel = param[0]
            tega_id = param[1]
            tega.idb.publish(channel, tega_id, body['message'], self.subscriber)
        elif cmd == 'REQUEST':
            type_ = REQUEST_TYPE(param[1])
            if type_ == REQUEST_TYPE.RPC:
                self._route_rpc_request(param, body)
            elif type_ == REQUEST_TYPE.SYNC:
                self._sync_request(param, body)
            elif type_ == REQUEST_TYPE.REFER:
                self._refer_request(param, body)
        elif cmd == 'RESPONSE':
            type_ = REQUEST_TYPE(param[1])
            if type_ == REQUEST_TYPE.RPC:
                self._route_rpc_response(param, body)
            elif type_ == REQUEST_TYPE.SYNC:
                on_response(param, body)
            elif type_ == REQUEST_TYPE.REFER:
                on_response(param, body)