Новый модуль для взаимодействия с GoBGP
Позволяет объявить вычисленные CIDR в статических анонсах GoBGP
This commit is contained in:
57
gobgp_loader_cli.py
Normal file
57
gobgp_loader_cli.py
Normal 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()
|
||||||
Reference in New Issue
Block a user