blob: 74367eb6b48cf6ab1bb5d0af24f4d238f226dac7 [file] [log] [blame]
Brad Bishop08902b02019-08-20 09:16:51 -04001# Copyright (C) 2018-2019 Garmin Ltd.
Brad Bishop19323692019-04-05 15:28:33 -04002#
Brad Bishopc342db32019-05-15 21:57:59 -04003# SPDX-License-Identifier: GPL-2.0-only
Brad Bishop19323692019-04-05 15:28:33 -04004#
Brad Bishop19323692019-04-05 15:28:33 -04005
Andrew Geissler6ce62a22020-11-30 19:58:47 -06006import asyncio
Brad Bishopa34c0302019-09-23 22:34:48 -04007from contextlib import closing
Andrew Geissler475cb722020-07-10 16:00:51 -05008import itertools
9import json
Patrick Williamsac13d5f2023-11-24 18:59:46 -060010from collections import namedtuple
11from urllib.parse import urlparse
Patrick Williams44b3caf2024-04-12 16:51:14 -050012from bb.asyncrpc.client import parse_address, ADDR_TYPE_UNIX, ADDR_TYPE_WS
Brad Bishop19323692019-04-05 15:28:33 -040013
Patrick Williamsac13d5f2023-11-24 18:59:46 -060014User = namedtuple("User", ("username", "permissions"))
Brad Bishopa34c0302019-09-23 22:34:48 -040015
Patrick Williamsac13d5f2023-11-24 18:59:46 -060016def create_server(
17 addr,
18 dbname,
19 *,
20 sync=True,
21 upstream=None,
22 read_only=False,
23 db_username=None,
24 db_password=None,
25 anon_perms=None,
26 admin_username=None,
27 admin_password=None,
28):
29 def sqlite_engine():
30 from .sqlite import DatabaseEngine
Andrew Geissler475cb722020-07-10 16:00:51 -050031
Patrick Williamsac13d5f2023-11-24 18:59:46 -060032 return DatabaseEngine(dbname, sync)
Andrew Geissler475cb722020-07-10 16:00:51 -050033
Patrick Williamsac13d5f2023-11-24 18:59:46 -060034 def sqlalchemy_engine():
35 from .sqlalchemy import DatabaseEngine
Andrew Geissler475cb722020-07-10 16:00:51 -050036
Patrick Williamsac13d5f2023-11-24 18:59:46 -060037 return DatabaseEngine(dbname, db_username, db_password)
38
Brad Bishopa34c0302019-09-23 22:34:48 -040039 from . import server
Patrick Williamsac13d5f2023-11-24 18:59:46 -060040
41 if "://" in dbname:
42 db_engine = sqlalchemy_engine()
43 else:
44 db_engine = sqlite_engine()
45
46 if anon_perms is None:
47 anon_perms = server.DEFAULT_ANON_PERMS
48
49 s = server.Server(
50 db_engine,
51 upstream=upstream,
52 read_only=read_only,
53 anon_perms=anon_perms,
54 admin_username=admin_username,
55 admin_password=admin_password,
56 )
Brad Bishopa34c0302019-09-23 22:34:48 -040057
58 (typ, a) = parse_address(addr)
59 if typ == ADDR_TYPE_UNIX:
60 s.start_unix_server(*a)
Patrick Williamsac13d5f2023-11-24 18:59:46 -060061 elif typ == ADDR_TYPE_WS:
62 url = urlparse(a[0])
63 s.start_websocket_server(url.hostname, url.port)
Brad Bishopa34c0302019-09-23 22:34:48 -040064 else:
65 s.start_tcp_server(*a)
66
67 return s
68
69
Patrick Williamsac13d5f2023-11-24 18:59:46 -060070def create_client(addr, username=None, password=None):
Brad Bishopa34c0302019-09-23 22:34:48 -040071 from . import client
Brad Bishopa34c0302019-09-23 22:34:48 -040072
Patrick Williamsac13d5f2023-11-24 18:59:46 -060073 c = client.Client(username, password)
Brad Bishopa34c0302019-09-23 22:34:48 -040074
Patrick Williamsac13d5f2023-11-24 18:59:46 -060075 try:
76 (typ, a) = parse_address(addr)
77 if typ == ADDR_TYPE_UNIX:
78 c.connect_unix(*a)
79 elif typ == ADDR_TYPE_WS:
80 c.connect_websocket(*a)
81 else:
82 c.connect_tcp(*a)
83 return c
84 except Exception as e:
85 c.close()
86 raise e
Andrew Geissler6ce62a22020-11-30 19:58:47 -060087
Patrick Williamsac13d5f2023-11-24 18:59:46 -060088
89async def create_async_client(addr, username=None, password=None):
Andrew Geissler6ce62a22020-11-30 19:58:47 -060090 from . import client
Andrew Geissler6ce62a22020-11-30 19:58:47 -060091
Patrick Williamsac13d5f2023-11-24 18:59:46 -060092 c = client.AsyncClient(username, password)
Andrew Geissler6ce62a22020-11-30 19:58:47 -060093
Patrick Williamsac13d5f2023-11-24 18:59:46 -060094 try:
95 (typ, a) = parse_address(addr)
96 if typ == ADDR_TYPE_UNIX:
97 await c.connect_unix(*a)
98 elif typ == ADDR_TYPE_WS:
99 await c.connect_websocket(*a)
100 else:
101 await c.connect_tcp(*a)
102
103 return c
104 except Exception as e:
105 await c.close()
106 raise e