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: Если адрес полученного пира не соответствует имеющемуся в базе данных.