Новый модуль для взаимодействия с 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