Edit on GitHub

src.scheduler.config_freezer

События связанные с заморозкой

  1"""События связанные с заморозкой"""
  2
  3import logging
  4
  5from core.err import log_cash_error
  6from core.exceptions import DatabaseError, WireguardError
  7from db.models import FreezeSteps
  8from db.utils import freeze_config, get_all_wg_configs
  9from wg.utils import WgServerTools
 10
 11logger = logging.getLogger("apscheduler")
 12logging.getLogger("apscheduler.executors.default").setLevel(logging.WARNING)
 13
 14
 15async def check_freeze_configs():
 16    """Проверяет и обновляет состояние заморозки конфигураций.
 17
 18    Эта функция получает все конфигурации и проверяет их состояние заморозки.
 19    Если конфигурация находится в состоянии ожидания разморозки, она будет разморожена.
 20    Если конфигурация находится в состоянии ожидания заморозки, она будет заморожена.
 21    Логи записываются для отслеживания изменений состояний конфигураций.
 22
 23    Raises:
 24        DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
 25        WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
 26    """
 27    try:
 28        configs = await get_all_wg_configs()
 29
 30        wait_no_cfg = [cfg for cfg in configs if cfg.freeze == FreezeSteps.wait_no]
 31        for config in wait_no_cfg:
 32            await WgServerTools().move_user(
 33                move="unban", server_pubkey=config.server_public_key
 34            )
 35        if wait_no_cfg:
 36            await freeze_config(wait_no_cfg, freeze=FreezeSteps.no)
 37
 38        wait_yes_cfg = [cfg for cfg in configs if cfg.freeze == FreezeSteps.wait_yes]
 39        for config in wait_yes_cfg:
 40            await WgServerTools().move_user(
 41                move="ban", server_pubkey=config.server_public_key
 42            )
 43        if wait_yes_cfg:
 44            await freeze_config(wait_yes_cfg, freeze=FreezeSteps.yes)
 45
 46    except DatabaseError as e:
 47        if log_cash_error(e):
 48            logger.exception("Ошибка связи с БД при заморозке конфигураций")
 49        return
 50    except WireguardError as e:
 51        if log_cash_error(e):
 52            logger.exception(
 53                "Ошибка связи с wireguard сервером при заморозке конфигураций"
 54            )
 55        return
 56    except Exception as e:
 57        if log_cash_error(e):
 58            logger.exception("Ошибка обновления состояния заморозки")
 59        return
 60    else:
 61        if wait_no_cfg:
 62            logger.info(
 63                "Разморожены конфигурации",
 64                extra={"configs.ids": [config.id for config in wait_no_cfg]},
 65            )
 66        if wait_yes_cfg:
 67            logger.info(
 68                "Заморожены конфигурации",
 69                extra={"configs.ids": [config.id for config in wait_yes_cfg]},
 70            )
 71
 72
 73async def validate_configs():
 74    """Проверяет соответствие локальных конфигураций и конфигураций на сервере.
 75
 76    Эта функция получает список пиров с сервера и локальные конфигурации.
 77    Она проверяет, соответствуют ли адреса пиров конфигурациям в базе данных.
 78    Если пир заблокирован, конфигурация будет заморожена. Если пир разблокирован, конфигурация будет разморожена.
 79
 80    Raises:
 81        DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
 82        WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
 83        AssertionError: Если адрес полученного пира не соответствует имеющемуся в базе данных.
 84    """
 85    try:
 86        server_peers = await WgServerTools().get_peer_list()
 87        server_peers = {peer["publickey"]: peer for peer in server_peers}
 88
 89        local_configs = await get_all_wg_configs()
 90
 91        to_freeze = []
 92        to_unfreeze = []
 93
 94        for config in local_configs:
 95            peer = server_peers.get(config.server_public_key, None)
 96
 97            if peer:
 98                assert str(config.address) == peer["allowedips"]
 99
100                if peer["ban"] and config.freeze in (
101                    FreezeSteps.no,
102                    FreezeSteps.wait_yes,
103                ):
104                    to_freeze.append(config)
105
106                elif not peer["ban"] and config.freeze in (
107                    FreezeSteps.yes,
108                    FreezeSteps.wait_no,
109                ):
110                    to_unfreeze.append(config)
111            else:
112                logger.warning(
113                    f"Найдена незарегистрированная конфигурация: {config.address}"
114                )
115
116        if to_freeze:
117            await freeze_config(to_freeze, freeze=FreezeSteps.yes)
118        if to_unfreeze:
119            await freeze_config(to_unfreeze, freeze=FreezeSteps.no)
120
121    except DatabaseError as e:
122        if log_cash_error(e):
123            logger.exception("Ошибка связи с БД при заморозке конфигураций")
124    except WireguardError as e:
125        if log_cash_error(e):
126            logger.exception(
127                "Ошибка связи с wireguard сервером при заморозке конфигураций"
128            )
129    except AssertionError as e:
130        if log_cash_error(e):
131            logger.error("Адрес полученного пира не соответствует имеющемуся в БД")
132    except Exception as e:
133        if log_cash_error(e):
134            logger.exception("Ошибка валидации состояния заморозки")
logger = <Logger apscheduler (INFO)>
async def check_freeze_configs():
16async def check_freeze_configs():
17    """Проверяет и обновляет состояние заморозки конфигураций.
18
19    Эта функция получает все конфигурации и проверяет их состояние заморозки.
20    Если конфигурация находится в состоянии ожидания разморозки, она будет разморожена.
21    Если конфигурация находится в состоянии ожидания заморозки, она будет заморожена.
22    Логи записываются для отслеживания изменений состояний конфигураций.
23
24    Raises:
25        DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
26        WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
27    """
28    try:
29        configs = await get_all_wg_configs()
30
31        wait_no_cfg = [cfg for cfg in configs if cfg.freeze == FreezeSteps.wait_no]
32        for config in wait_no_cfg:
33            await WgServerTools().move_user(
34                move="unban", server_pubkey=config.server_public_key
35            )
36        if wait_no_cfg:
37            await freeze_config(wait_no_cfg, freeze=FreezeSteps.no)
38
39        wait_yes_cfg = [cfg for cfg in configs if cfg.freeze == FreezeSteps.wait_yes]
40        for config in wait_yes_cfg:
41            await WgServerTools().move_user(
42                move="ban", server_pubkey=config.server_public_key
43            )
44        if wait_yes_cfg:
45            await freeze_config(wait_yes_cfg, freeze=FreezeSteps.yes)
46
47    except DatabaseError as e:
48        if log_cash_error(e):
49            logger.exception("Ошибка связи с БД при заморозке конфигураций")
50        return
51    except WireguardError as e:
52        if log_cash_error(e):
53            logger.exception(
54                "Ошибка связи с wireguard сервером при заморозке конфигураций"
55            )
56        return
57    except Exception as e:
58        if log_cash_error(e):
59            logger.exception("Ошибка обновления состояния заморозки")
60        return
61    else:
62        if wait_no_cfg:
63            logger.info(
64                "Разморожены конфигурации",
65                extra={"configs.ids": [config.id for config in wait_no_cfg]},
66            )
67        if wait_yes_cfg:
68            logger.info(
69                "Заморожены конфигурации",
70                extra={"configs.ids": [config.id for config in wait_yes_cfg]},
71            )

Проверяет и обновляет состояние заморозки конфигураций.

Эта функция получает все конфигурации и проверяет их состояние заморозки. Если конфигурация находится в состоянии ожидания разморозки, она будет разморожена. Если конфигурация находится в состоянии ожидания заморозки, она будет заморожена. Логи записываются для отслеживания изменений состояний конфигураций.

Raises:
  • DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
  • WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
async def validate_configs():
 74async def validate_configs():
 75    """Проверяет соответствие локальных конфигураций и конфигураций на сервере.
 76
 77    Эта функция получает список пиров с сервера и локальные конфигурации.
 78    Она проверяет, соответствуют ли адреса пиров конфигурациям в базе данных.
 79    Если пир заблокирован, конфигурация будет заморожена. Если пир разблокирован, конфигурация будет разморожена.
 80
 81    Raises:
 82        DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
 83        WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
 84        AssertionError: Если адрес полученного пира не соответствует имеющемуся в базе данных.
 85    """
 86    try:
 87        server_peers = await WgServerTools().get_peer_list()
 88        server_peers = {peer["publickey"]: peer for peer in server_peers}
 89
 90        local_configs = await get_all_wg_configs()
 91
 92        to_freeze = []
 93        to_unfreeze = []
 94
 95        for config in local_configs:
 96            peer = server_peers.get(config.server_public_key, None)
 97
 98            if peer:
 99                assert str(config.address) == peer["allowedips"]
100
101                if peer["ban"] and config.freeze in (
102                    FreezeSteps.no,
103                    FreezeSteps.wait_yes,
104                ):
105                    to_freeze.append(config)
106
107                elif not peer["ban"] and config.freeze in (
108                    FreezeSteps.yes,
109                    FreezeSteps.wait_no,
110                ):
111                    to_unfreeze.append(config)
112            else:
113                logger.warning(
114                    f"Найдена незарегистрированная конфигурация: {config.address}"
115                )
116
117        if to_freeze:
118            await freeze_config(to_freeze, freeze=FreezeSteps.yes)
119        if to_unfreeze:
120            await freeze_config(to_unfreeze, freeze=FreezeSteps.no)
121
122    except DatabaseError as e:
123        if log_cash_error(e):
124            logger.exception("Ошибка связи с БД при заморозке конфигураций")
125    except WireguardError as e:
126        if log_cash_error(e):
127            logger.exception(
128                "Ошибка связи с wireguard сервером при заморозке конфигураций"
129            )
130    except AssertionError as e:
131        if log_cash_error(e):
132            logger.error("Адрес полученного пира не соответствует имеющемуся в БД")
133    except Exception as e:
134        if log_cash_error(e):
135            logger.exception("Ошибка валидации состояния заморозки")

Проверяет соответствие локальных конфигураций и конфигураций на сервере.

Эта функция получает список пиров с сервера и локальные конфигурации. Она проверяет, соответствуют ли адреса пиров конфигурациям в базе данных. Если пир заблокирован, конфигурация будет заморожена. Если пир разблокирован, конфигурация будет разморожена.

Raises:
  • DatabaseError: Если произошла ошибка при взаимодействии с базой данных.
  • WireguardError: Если произошла ошибка при взаимодействии с сервером Wireguard.
  • AssertionError: Если адрес полученного пира не соответствует имеющемуся в базе данных.