summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/hashserv/__init__.py
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-11-03 08:26:20 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-09 17:33:02 +0000
commit2484bd893189bc24ac210edf2de3b7e1115eebd3 (patch)
treebe9433e53a5bb645816f5b78730830a73bc6ee10 /bitbake/lib/hashserv/__init__.py
parent8f8501ed403dec27acbe780b936bc087fc5006d0 (diff)
downloadpoky-2484bd893189bc24ac210edf2de3b7e1115eebd3.tar.gz
bitbake: hashserv: Add websocket connection implementation
Adds support to the hash equivalence client and server to communicate over websockets. Since websockets are message orientated instead of stream orientated, and new connection class is needed to handle them. Note that websocket support does require the 3rd party websockets python module be installed on the host, but it should not be required unless websockets are actually being used. (Bitbake rev: 56dd2fdbfb6350a9eef43a12aa529c8637887a7e) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/hashserv/__init__.py')
-rw-r--r--bitbake/lib/hashserv/__init__.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init__.py
index 3a4018353f..56b9c6bc82 100644
--- a/bitbake/lib/hashserv/__init__.py
+++ b/bitbake/lib/hashserv/__init__.py
@@ -9,11 +9,15 @@ import re
9import sqlite3 9import sqlite3
10import itertools 10import itertools
11import json 11import json
12from urllib.parse import urlparse
12 13
13UNIX_PREFIX = "unix://" 14UNIX_PREFIX = "unix://"
15WS_PREFIX = "ws://"
16WSS_PREFIX = "wss://"
14 17
15ADDR_TYPE_UNIX = 0 18ADDR_TYPE_UNIX = 0
16ADDR_TYPE_TCP = 1 19ADDR_TYPE_TCP = 1
20ADDR_TYPE_WS = 2
17 21
18UNIHASH_TABLE_DEFINITION = ( 22UNIHASH_TABLE_DEFINITION = (
19 ("method", "TEXT NOT NULL", "UNIQUE"), 23 ("method", "TEXT NOT NULL", "UNIQUE"),
@@ -84,6 +88,8 @@ def setup_database(database, sync=True):
84def parse_address(addr): 88def parse_address(addr):
85 if addr.startswith(UNIX_PREFIX): 89 if addr.startswith(UNIX_PREFIX):
86 return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX):],)) 90 return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX):],))
91 elif addr.startswith(WS_PREFIX) or addr.startswith(WSS_PREFIX):
92 return (ADDR_TYPE_WS, (addr,))
87 else: 93 else:
88 m = re.match(r'\[(?P<host>[^\]]*)\]:(?P<port>\d+)$', addr) 94 m = re.match(r'\[(?P<host>[^\]]*)\]:(?P<port>\d+)$', addr)
89 if m is not None: 95 if m is not None:
@@ -103,6 +109,9 @@ def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False):
103 (typ, a) = parse_address(addr) 109 (typ, a) = parse_address(addr)
104 if typ == ADDR_TYPE_UNIX: 110 if typ == ADDR_TYPE_UNIX:
105 s.start_unix_server(*a) 111 s.start_unix_server(*a)
112 elif typ == ADDR_TYPE_WS:
113 url = urlparse(a[0])
114 s.start_websocket_server(url.hostname, url.port)
106 else: 115 else:
107 s.start_tcp_server(*a) 116 s.start_tcp_server(*a)
108 117
@@ -116,6 +125,8 @@ def create_client(addr):
116 (typ, a) = parse_address(addr) 125 (typ, a) = parse_address(addr)
117 if typ == ADDR_TYPE_UNIX: 126 if typ == ADDR_TYPE_UNIX:
118 c.connect_unix(*a) 127 c.connect_unix(*a)
128 elif typ == ADDR_TYPE_WS:
129 c.connect_websocket(*a)
119 else: 130 else:
120 c.connect_tcp(*a) 131 c.connect_tcp(*a)
121 132
@@ -128,6 +139,8 @@ async def create_async_client(addr):
128 (typ, a) = parse_address(addr) 139 (typ, a) = parse_address(addr)
129 if typ == ADDR_TYPE_UNIX: 140 if typ == ADDR_TYPE_UNIX:
130 await c.connect_unix(*a) 141 await c.connect_unix(*a)
142 elif typ == ADDR_TYPE_WS:
143 await c.connect_websocket(*a)
131 else: 144 else:
132 await c.connect_tcp(*a) 145 await c.connect_tcp(*a)
133 146