gitscope
https://dev.kronoz.win/r/marzneshin.git
app/marznode/operations.py · v0.6.5
Source
1 49457ba Dawsh 2y ago import asyncio
2 12b255b Dawsh 2y ago from collections import defaultdict
3 12b255b Dawsh 2y ago from typing import TYPE_CHECKING
4 12b255b Dawsh 2y ago
5 12b255b Dawsh 2y ago from app import marznode
6 8372786 Dawsh 2y ago from .grpcio import MarzNodeGRPCIO
7 8372786 Dawsh 2y ago from .grpclib import MarzNodeGRPCLIB
8 f6a32ea Dawsh 2y ago from ..models.node import NodeConnectionBackend
9 19289de Dawsh 2y ago from ..models.user import User
10 12b255b Dawsh 2y ago
11 12b255b Dawsh 2y ago if TYPE_CHECKING:
12 12b255b Dawsh 2y ago from app.db import User as DBUser
13 12b255b Dawsh 2y ago
14 12b255b Dawsh 2y ago
15 d377c4c Dawsh 2y ago def update_user(
16 d377c4c Dawsh 2y ago user: "DBUser", old_inbounds: set | None = None, remove: bool = False
17 d377c4c Dawsh 2y ago ):
18 d377c4c Dawsh 2y ago """updates a user on all related nodes"""
19 f6a32ea Dawsh 2y ago if old_inbounds is None:
20 f6a32ea Dawsh 2y ago old_inbounds = set()
21 34a7612 Dawsh 2y ago
22 f6a32ea Dawsh 2y ago node_inbounds = defaultdict(list)
23 d377c4c Dawsh 2y ago if remove:
24 f6a32ea Dawsh 2y ago for inb in user.inbounds:
25 d377c4c Dawsh 2y ago node_inbounds[inb.node_id]
26 f6a32ea Dawsh 2y ago else:
27 f6a32ea Dawsh 2y ago for inb in user.inbounds:
28 d377c4c Dawsh 2y ago node_inbounds[inb.node_id].append(inb.tag)
29 12b255b Dawsh 2y ago
30 f6a32ea Dawsh 2y ago for inb in old_inbounds:
31 f6a32ea Dawsh 2y ago node_inbounds[inb[0]]
32 12b255b Dawsh 2y ago
33 f6a32ea Dawsh 2y ago for node_id, tags in node_inbounds.items():
34 d6e2aad Dawsh 2y ago if marznode.nodes.get(node_id):
35 d377c4c Dawsh 2y ago asyncio.ensure_future(
36 19289de Dawsh 2y ago marznode.nodes[node_id].update_user(
37 19289de Dawsh 2y ago user=User.model_validate(user), inbounds=tags
38 19289de Dawsh 2y ago )
39 49457ba Dawsh 2y ago )
40 d6e2aad Dawsh 2y ago
41 d6e2aad Dawsh 2y ago
42 d6e2aad Dawsh 2y ago async def remove_user(user: "DBUser"):
43 c7e6427 Dawsh 2y ago node_ids = set(inb.node_id for inb in user.inbounds)
44 d6e2aad Dawsh 2y ago
45 d6e2aad Dawsh 2y ago for node_id in node_ids:
46 d6e2aad Dawsh 2y ago if marznode.nodes.get(node_id):
47 d377c4c Dawsh 2y ago asyncio.ensure_future(
48 d377c4c Dawsh 2y ago marznode.nodes[node_id].update_user(user=user, inbounds=[])
49 d377c4c Dawsh 2y ago )
50 12b255b Dawsh 2y ago
51 12b255b Dawsh 2y ago
52 12b255b Dawsh 2y ago async def remove_node(node_id: int):
53 12b255b Dawsh 2y ago if node_id in marznode.nodes:
54 961d06d Dawsh 2y ago await marznode.nodes[node_id].stop()
55 12b255b Dawsh 2y ago del marznode.nodes[node_id]
56 12b255b Dawsh 2y ago
57 12b255b Dawsh 2y ago
58 f6a32ea Dawsh 2y ago async def add_node(db_node, certificate):
59 f6a32ea Dawsh 2y ago await remove_node(db_node.id)
60 f6a32ea Dawsh 2y ago if db_node.connection_backend == NodeConnectionBackend.grpcio:
61 49457ba Dawsh 2y ago node = MarzNodeGRPCIO(
62 49457ba Dawsh 2y ago db_node.id,
63 49457ba Dawsh 2y ago db_node.address,
64 49457ba Dawsh 2y ago db_node.port,
65 49457ba Dawsh 2y ago usage_coefficient=db_node.usage_coefficient,
66 49457ba Dawsh 2y ago )
67 f6a32ea Dawsh 2y ago else:
68 01cdf2e Dawsh 2y ago node = MarzNodeGRPCLIB(
69 01cdf2e Dawsh 2y ago db_node.id,
70 01cdf2e Dawsh 2y ago db_node.address,
71 01cdf2e Dawsh 2y ago db_node.port,
72 01cdf2e Dawsh 2y ago certificate.key,
73 01cdf2e Dawsh 2y ago certificate.certificate,
74 49457ba Dawsh 2y ago usage_coefficient=db_node.usage_coefficient,
75 01cdf2e Dawsh 2y ago )
76 f6a32ea Dawsh 2y ago marznode.nodes[db_node.id] = node
77 12b255b Dawsh 2y ago
78 12b255b Dawsh 2y ago
79 01cdf2e Dawsh 2y ago __all__ = ["update_user", "add_node", "remove_node"]