Brad Bishop | 08902b0 | 2019-08-20 09:16:51 -0400 | [diff] [blame] | 1 | # Copyright (C) 2018-2019 Garmin Ltd. |
Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 2 | # |
Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 3 | # SPDX-License-Identifier: GPL-2.0-only |
Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 4 | # |
Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 5 | |
Andrew Geissler | 6ce62a2 | 2020-11-30 19:58:47 -0600 | [diff] [blame] | 6 | import asyncio |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 7 | from contextlib import closing |
Andrew Geissler | 475cb72 | 2020-07-10 16:00:51 -0500 | [diff] [blame] | 8 | import itertools |
| 9 | import json |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 10 | from collections import namedtuple |
| 11 | from urllib.parse import urlparse |
Patrick Williams | 44b3caf | 2024-04-12 16:51:14 -0500 | [diff] [blame] | 12 | from bb.asyncrpc.client import parse_address, ADDR_TYPE_UNIX, ADDR_TYPE_WS |
Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 13 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 14 | User = namedtuple("User", ("username", "permissions")) |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 15 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 16 | def 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 Geissler | 475cb72 | 2020-07-10 16:00:51 -0500 | [diff] [blame] | 31 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 32 | return DatabaseEngine(dbname, sync) |
Andrew Geissler | 475cb72 | 2020-07-10 16:00:51 -0500 | [diff] [blame] | 33 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 34 | def sqlalchemy_engine(): |
| 35 | from .sqlalchemy import DatabaseEngine |
Andrew Geissler | 475cb72 | 2020-07-10 16:00:51 -0500 | [diff] [blame] | 36 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 37 | return DatabaseEngine(dbname, db_username, db_password) |
| 38 | |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 39 | from . import server |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 40 | |
| 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 Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 57 | |
| 58 | (typ, a) = parse_address(addr) |
| 59 | if typ == ADDR_TYPE_UNIX: |
| 60 | s.start_unix_server(*a) |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 61 | elif typ == ADDR_TYPE_WS: |
| 62 | url = urlparse(a[0]) |
| 63 | s.start_websocket_server(url.hostname, url.port) |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 64 | else: |
| 65 | s.start_tcp_server(*a) |
| 66 | |
| 67 | return s |
| 68 | |
| 69 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 70 | def create_client(addr, username=None, password=None): |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 71 | from . import client |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 72 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 73 | c = client.Client(username, password) |
Brad Bishop | a34c030 | 2019-09-23 22:34:48 -0400 | [diff] [blame] | 74 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 75 | 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 Geissler | 6ce62a2 | 2020-11-30 19:58:47 -0600 | [diff] [blame] | 87 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 88 | |
| 89 | async def create_async_client(addr, username=None, password=None): |
Andrew Geissler | 6ce62a2 | 2020-11-30 19:58:47 -0600 | [diff] [blame] | 90 | from . import client |
Andrew Geissler | 6ce62a2 | 2020-11-30 19:58:47 -0600 | [diff] [blame] | 91 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 92 | c = client.AsyncClient(username, password) |
Andrew Geissler | 6ce62a2 | 2020-11-30 19:58:47 -0600 | [diff] [blame] | 93 | |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 94 | 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 |