예제 #1
0
 def connection_made(self, transport):
     self.peername = transport.get_extra_info('peername')
     self.logger.info('New connection from %s', self.peername)
     self.transport = transport
     self.processor = UaProcessor(self.iserver, self.transport)
     self.processor.set_policies(self.policies)
     self.data = b""
        class OPCUAProtocol(asyncio.Protocol):

            """
            instanciated for every connection
            defined as internal class since it needs access
            to the internal server object
            FIXME: find another solution
            """

            iserver = self.iserver
            loop = self.loop
            logger = self.logger
            policies = self._policies

            def connection_made(self, transport):
                self.peername = transport.get_extra_info('peername')
                self.logger.info('New connection from %s', self.peername)
                self.transport = transport
                self.processor = UaProcessor(self.iserver, self.transport)
                self.processor.set_policies(self.policies)
                self.data = b""

            def connection_lost(self, ex):
                self.logger.info('Lost connection from %s, %s', self.peername, ex)
                self.transport.close()
                self.processor.close()

            def data_received(self, data):
                logger.debug("received %s bytes from socket", len(data))
                if self.data:
                    data = self.data + data
                    self.data = b""
                self._process_data(data)

            def _process_data(self, data):
                buf = ua.utils.Buffer(data)
                while True:
                    try:
                        backup_buf = buf.copy()
                        try:
                            hdr = ua.Header.from_string(buf)
                        except ua.utils.NotEnoughData:
                            logger.info("We did not receive enough data from client, waiting for more")
                            self.data = backup_buf.read(len(backup_buf))
                            return
                        if len(buf) < hdr.body_size:
                            logger.info("We did not receive enough data from client, waiting for more")
                            self.data = backup_buf.read(len(backup_buf))
                            return
                        ret = self.processor.process(hdr, buf)
                        if not ret:
                            logger.info("processor returned False, we close connection from %s", self.peername)
                            self.transport.close()
                            return
                        if len(buf) == 0:
                            return
                    except Exception:
                        logger.exception("Exception raised while parsing message from client, closing")
                        self.transport.close()
                        break
 def connection_made(self, transport):
     self.peername = transport.get_extra_info('peername')
     self.logger.info('New connection from %s', self.peername)
     self.transport = transport
     self.processor = UaProcessor(self.iserver, self.transport)
     self.processor.set_policies(self.policies)
     self.data = b""
예제 #4
0
        class OPCUAProtocol(asyncio.Protocol):
            """
            instanciated for every connection
            defined as internal class since it needs access
            to the internal server object
            FIXME: find another solution
            """
            iserver = self.iserver
            loop = self.loop
            logger = self.logger
            policies = self._policies

            def connection_made(self, transport):
                self.peername = transport.get_extra_info('peername')
                self.logger.info('New connection from %s', self.peername)
                self.transport = transport
                self.processor = UaProcessor(self.iserver, self.transport)
                self.processor.set_policies(self.policies)
                self.data = b""

            def connection_lost(self, ex):
                self.logger.info('Lost connection from %s, %s', self.peername,
                                 ex)
                self.transport.close()
                self.processor.close()

            def data_received(self, data):
                logger.debug("received %s bytes from socket", len(data))
                if self.data:
                    data = self.data + data
                    self.data = b""
                self._process_data(data)

            def _process_data(self, data):
                buf = ua.utils.Buffer(data)
                while True:
                    try:
                        backup_buf = buf.copy()
                        try:
                            hdr = ua.Header.from_string(buf)
                        except ua.utils.NotEnoughData:
                            logger.info(
                                "We did not receive enough data from client, waiting for more"
                            )
                            self.data = backup_buf.read(len(backup_buf))
                            return
                        if len(buf) < hdr.body_size:
                            logger.info(
                                "We did not receive enough data from client, waiting for more"
                            )
                            self.data = backup_buf.read(len(backup_buf))
                            return
                        ret = self.processor.process(hdr, buf)
                        if not ret:
                            logger.info(
                                "processor returned False, we close connection from %s",
                                self.peername)
                            self.transport.close()
                            return
                        if len(buf) == 0:
                            return
                    except Exception:
                        logger.exception(
                            "Exception raised while parsing message from client, closing"
                        )
                        self.transport.close()
                        break
예제 #5
0
class OPCUAProtocol(asyncio.Protocol):

    """Interface for OPCUA protocol.
    """

    iserver = None
    loop = None
    logger = None
    policies = None
    clients = None

    def __str__(self):
        return "OPCUAProtocol({}, {})".format(self.peername, self.processor.session)
    __repr__ = __str__

    def connection_made(self, transport):
        self.peername = transport.get_extra_info('peername')
        self.logger.info('New connection from %s', self.peername)
        self.transport = transport
        self.processor = UaProcessor(self.iserver, self.transport)
        self.processor.set_policies(self.policies)
        self.data = b""
        self.iserver.asyncio_transports.append(transport)
        self.clients.append(self)

    def connection_lost(self, ex):
        self.logger.info('Lost connection from %s, %s', self.peername, ex)
        self.transport.close()
        self.iserver.asyncio_transports.remove(self.transport)
        self.processor.close()
        if self in self.clients:
            self.clients.remove(self)

    def data_received(self, data):
        logger.debug("received %s bytes from socket", len(data))
        if self.data:
            data = self.data + data
            self.data = b""
        self._process_data(data)

    def _process_data(self, data):
        buf = ua.utils.Buffer(data)
        while True:
            try:
                backup_buf = buf.copy()
                try:
                    hdr = uabin.header_from_binary(buf)
                except ua.utils.NotEnoughData:
                    logger.info("We did not receive enough data from client, waiting for more")
                    self.data = backup_buf.read(len(backup_buf))
                    return
                if len(buf) < hdr.body_size:
                    logger.info("We did not receive enough data from client, waiting for more")
                    self.data = backup_buf.read(len(backup_buf))
                    return
                ret = self.processor.process(hdr, buf)
                if not ret:
                    logger.info("processor returned False, we close connection from %s", self.peername)
                    self.transport.close()
                    return
                if len(buf) == 0:
                    return
            except Exception:
                logger.exception("Exception raised while parsing message from client, closing")
                return
예제 #6
0
class OPCUAProtocol(asyncio.Protocol):

    """Interface for OPCUA protocol.
    """

    iserver = None
    loop = None
    logger = None
    policies = None
    clients = None

    def __str__(self):
        return "OPCUAProtocol({}, {})".format(self.peername, self.processor.session)
    __repr__ = __str__

    def connection_made(self, transport):
        self.peername = transport.get_extra_info('peername')
        self.logger.info('New connection from %s', self.peername)
        self.transport = transport
        self.processor = UaProcessor(self.iserver, self.transport)
        self.processor.set_policies(self.policies)
        self.data = b""
        self.iserver.asyncio_transports.append(transport)
        self.clients.append(self)

    def connection_lost(self, ex):
        self.logger.info('Lost connection from %s, %s', self.peername, ex)
        self.transport.close()
        self.iserver.asyncio_transports.remove(self.transport)
        self.processor.close()
        if self in self.clients:
            self.clients.remove(self)

    def data_received(self, data):
        logger.debug("received %s bytes from socket", len(data))
        if self.data:
            data = self.data + data
            self.data = b""
        self._process_data(data)

    def _process_data(self, data):
        buf = ua.utils.Buffer(data)
        while True:
            try:
                backup_buf = buf.copy()
                try:
                    hdr = uabin.header_from_binary(buf)
                except ua.utils.NotEnoughData:
                    logger.info("We did not receive enough data from client, waiting for more")
                    self.data = backup_buf.read(len(backup_buf))
                    return
                if len(buf) < hdr.body_size:
                    logger.info("We did not receive enough data from client, waiting for more")
                    self.data = backup_buf.read(len(backup_buf))
                    return
                ret = self.processor.process(hdr, buf)
                if not ret:
                    logger.info("processor returned False, we close connection from %s", self.peername)
                    self.transport.close()
                    return
                if len(buf) == 0:
                    return
            except Exception:
                logger.exception("Exception raised while parsing message from client, closing")
                return