__init__.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # Copyright (C) 2018-2019 Garmin Ltd.
  2. #
  3. # SPDX-License-Identifier: GPL-2.0-only
  4. #
  5. import asyncio
  6. from contextlib import closing
  7. import itertools
  8. import json
  9. from collections import namedtuple
  10. from urllib.parse import urlparse
  11. from bb.asyncrpc.client import parse_address, ADDR_TYPE_UNIX, ADDR_TYPE_WS
  12. User = namedtuple("User", ("username", "permissions"))
  13. def create_server(
  14. addr,
  15. dbname,
  16. *,
  17. sync=True,
  18. upstream=None,
  19. read_only=False,
  20. db_username=None,
  21. db_password=None,
  22. anon_perms=None,
  23. admin_username=None,
  24. admin_password=None,
  25. reuseport=False,
  26. ):
  27. def sqlite_engine():
  28. from .sqlite import DatabaseEngine
  29. return DatabaseEngine(dbname, sync)
  30. def sqlalchemy_engine():
  31. from .sqlalchemy import DatabaseEngine
  32. return DatabaseEngine(dbname, db_username, db_password)
  33. from . import server
  34. if "://" in dbname:
  35. db_engine = sqlalchemy_engine()
  36. else:
  37. db_engine = sqlite_engine()
  38. if anon_perms is None:
  39. anon_perms = server.DEFAULT_ANON_PERMS
  40. s = server.Server(
  41. db_engine,
  42. upstream=upstream,
  43. read_only=read_only,
  44. anon_perms=anon_perms,
  45. admin_username=admin_username,
  46. admin_password=admin_password,
  47. )
  48. (typ, a) = parse_address(addr)
  49. if typ == ADDR_TYPE_UNIX:
  50. s.start_unix_server(*a)
  51. elif typ == ADDR_TYPE_WS:
  52. url = urlparse(a[0])
  53. s.start_websocket_server(url.hostname, url.port, reuseport=reuseport)
  54. else:
  55. s.start_tcp_server(*a, reuseport=reuseport)
  56. return s
  57. def create_client(addr, username=None, password=None):
  58. from . import client
  59. c = client.Client(username, password)
  60. try:
  61. (typ, a) = parse_address(addr)
  62. if typ == ADDR_TYPE_UNIX:
  63. c.connect_unix(*a)
  64. elif typ == ADDR_TYPE_WS:
  65. c.connect_websocket(*a)
  66. else:
  67. c.connect_tcp(*a)
  68. return c
  69. except Exception as e:
  70. c.close()
  71. raise e
  72. async def create_async_client(addr, username=None, password=None):
  73. from . import client
  74. c = client.AsyncClient(username, password)
  75. try:
  76. (typ, a) = parse_address(addr)
  77. if typ == ADDR_TYPE_UNIX:
  78. await c.connect_unix(*a)
  79. elif typ == ADDR_TYPE_WS:
  80. await c.connect_websocket(*a)
  81. else:
  82. await c.connect_tcp(*a)
  83. return c
  84. except Exception as e:
  85. await c.close()
  86. raise e