Новый модуль для взаимодействия с GoBGP

Позволяет объявить вычисленные CIDR в статических анонсах GoBGP
This commit is contained in:
2026-03-29 08:50:15 +03:00
parent 53e69aef83
commit a6af2b17b2

57
gobgp_loader_cli.py Normal file
View File

@@ -0,0 +1,57 @@
#!/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 <prefix>
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()