From 6f3d5effe36dd2e45e71fa94517e8531954feb26 Mon Sep 17 00:00:00 2001 From: Benjamin Braatz Date: Wed, 2 Jun 2021 06:18:11 +0200 Subject: [PATCH] Establish connection. --- controlpi_plugins/graph.py | 60 ++++++++++++++++++++++++++++++++++---- setup.py | 1 + 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/controlpi_plugins/graph.py b/controlpi_plugins/graph.py index b90fdc9..8e59cb2 100644 --- a/controlpi_plugins/graph.py +++ b/controlpi_plugins/graph.py @@ -4,6 +4,12 @@ TODO: documentation, doctests """ +import asyncio +import os.path +import ssl +import struct +import urllib.parse +import msgpack from controlpi import BasePlugin, Message, MessageTemplate @@ -22,13 +28,55 @@ class GraphConnection(BasePlugin): async def _receive(self, message: Message) -> None: await self.bus.send(Message(self.name, {'spam': self.conf['spam']})) + async def _call(self, method, params): + await self._lock.acquire() + self._call_id += 1 + request = { 'jsonrpc': '2.0', 'method': method, + 'params': params, 'id': self._call_id } + message = msgpack.packb(request) + size = struct.pack(' None: """Register plugin as bus client.""" - message = Message(self.name, {'spam': self.conf['spam']}) - sends = [MessageTemplate.from_message(message)] - receives = [MessageTemplate({'target': {'const': self.name}})] - self.bus.register(self.name, 'Plugin', sends, receives, self._receive) + res = urllib.parse.urlparse(self.conf['url']) + if res.scheme != 'tls': + raise NotImplementedError("Only implemented scheme is 'tls'.") + self._host = res.hostname + self._port = res.port + if not os.path.isfile(self.conf['crt']): + raise FileNotFoundError("Cannot find certificate file" + f"'{self.conf['crt']}'.") + self._ssl_ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) + self._ssl_ctx.load_cert_chain(self.conf['crt']) + self._call_id = 0 + #message = Message(self.name, {'spam': self.conf['spam']}) + #sends = [MessageTemplate.from_message(message)] + #receives = [MessageTemplate({'target': {'const': self.name}})] + #self.bus.register(self.name, 'Plugin', sends, receives, self._receive) async def run(self) -> None: - """Send initial message.""" - await self.bus.send(Message(self.name, {'spam': self.conf['spam']})) + """Open connection and test it.""" + self._lock = asyncio.Lock() + (self._reader, self._writer) = await asyncio.open_connection( + self._host, self._port, ssl=self._ssl_ctx) + size = await self._reader.readexactly(4) + size = struct.unpack('