import os import requests import json from typing import Dict, Optional class VaultClient: """Клиент для работы с HashiCorp Vault через AppRole аутентификацию""" def __init__(self): self.vault_addr = os.environ.get('VAULT_ADDR', 'http://localhost:8200') self.role_id = os.environ.get('VAULT_ROLE_ID') self.secret_id = os.environ.get('VAULT_SECRET_ID') self.secret_path = os.environ.get('VAULT_SECRET_PATH', 'kv/data/mikrotik-bot') self.token = None def authenticate(self) -> bool: """Аутентификация через AppRole""" if not self.role_id or not self.secret_id: print("❌ VAULT_ROLE_ID или VAULT_SECRET_ID не установлены") return False try: auth_url = f"{self.vault_addr}/v1/auth/approle/login" auth_data = { "role_id": self.role_id, "secret_id": self.secret_id } response = requests.post(auth_url, json=auth_data) response.raise_for_status() auth_result = response.json() self.token = auth_result['auth']['client_token'] print("✅ Vault аутентификация успешна") return True except Exception as e: print(f"❌ Ошибка аутентификации Vault: {e}") return False def get_secrets(self) -> Optional[Dict[str, str]]: """Получение секретов из Vault""" if not self.token and not self.authenticate(): return None try: headers = {"X-Vault-Token": self.token} secret_url = f"{self.vault_addr}/v1/{self.secret_path}" response = requests.get(secret_url, headers=headers) response.raise_for_status() secret_data = response.json() secrets = secret_data['data']['data'] print("✅ Секреты успешно получены из Vault") return secrets except Exception as e: print(f"❌ Ошибка получения секретов: {e}") return None def get_config(self) -> Dict[str, str]: """Получение конфигурации с fallback на environment variables""" # Сначала пытаемся получить из Vault secrets = self.get_secrets() if secrets: return { 'BOT_TOKEN': secrets.get('bot_token'), 'ROUTER_HOST': secrets.get('router_host'), 'ROUTER_USER': secrets.get('router_user'), 'ROUTER_PASSWORD': secrets.get('router_password'), } # Fallback на environment variables print("⚠️ Используются environment variables вместо Vault") return { 'BOT_TOKEN': os.environ.get('BOT_TOKEN'), 'ROUTER_HOST': os.environ.get('ROUTER_HOST'), 'ROUTER_USER': os.environ.get('ROUTER_USER'), 'ROUTER_PASSWORD': os.environ.get('ROUTER_PASSWORD'), }