#!/usr/bin/env python3 import json import subprocess import logging import ipaddress logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def load_prefixes_from_file(filepath: str) -> dict: with open(filepath, 'r', encoding='utf-8') as f: return json.load(f) def add_prefix_cli(prefix: str, asn: str) -> bool: """Добавляет префикс через CLI gobgp""" try: # Команда: gobgp global rib add cmd = ['gobgp', 'global', 'rib', 'add', prefix] result = subprocess.run(cmd, capture_output=True, text=True, timeout=5) if result.returncode == 0: logger.info(f"[ASN {asn}] Добавлен префикс: {prefix}") return True else: logger.error(f"[ASN {asn}] Ошибка: {result.stderr}") return False except Exception as e: logger.error(f"[ASN {asn}] Исключение: {str(e)}") return False def main(): import argparse parser = argparse.ArgumentParser(description='Загрузка префиксов в GoBGP (CLI)') parser.add_argument('file', help='Путь к JSON файлу') parser.add_argument('--ipv6', action='store_true', help='Добавлять IPv6') args = parser.parse_args() data = load_prefixes_from_file(args.file) total_added = 0 for asn, info in data.items(): for prefix in info.get('prefixes', []): # Проверка версии IP try: net = ipaddress.ip_network(prefix, strict=False) if net.version == 6 and not args.ipv6: continue except ValueError: continue if add_prefix_cli(prefix, asn): total_added += 1 logger.info(f"Готово. Добавлено префиксов: {total_added}") if __name__ == '__main__': main()