From 8c176dc5c5959e1a30c52de089724f45938aad3b Mon Sep 17 00:00:00 2001 From: stevefoxru <53931856+stevefoxru@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:29:19 +0300 Subject: [PATCH] Create wg.py --- awg/wg.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 awg/wg.py diff --git a/awg/wg.py b/awg/wg.py new file mode 100644 index 0000000..ab112c9 --- /dev/null +++ b/awg/wg.py @@ -0,0 +1,49 @@ +import subprocess +import asyncio +import os + +def generate_key(): + """Генерирует пару ключей WireGuard (приватный и публичный).""" + private_key = subprocess.check_output(["wg", "genkey"]).decode().strip() + public_key = subprocess.check_output(["wg", "pubkey"], input=private_key.encode()).decode().strip() + return private_key, public_key + +def allocate_ip(): + """Выделяет уникальный IP-адрес из подсети 10.0.0.0/24.""" + conf_path = "/root/amnezia-bot/awg/files/wg0.conf" + used_ips = [] + + try: + with open(conf_path, "r") as f: + for line in f: + if "AllowedIPs" in line: + ip = line.split("=")[1].strip().split("/")[0] + used_ips.append(ip) + except FileNotFoundError: + pass + + for i in range(2, 255): # Начинаем с 10.0.0.2 + ip = f"10.0.0.{i}" + if ip not in used_ips: + return ip + raise Exception("Нет доступных IP-адресов.") + +async def generate_vpn_key(conf_path: str) -> str: + """Преобразует .conf в формат vpn:// с помощью awg-decode.py.""" + process = await asyncio.create_subprocess_exec( + 'python3.11', '/root/amnezia-bot/awg/awg-decode.py', '--encode', conf_path, + stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await process.communicate() + if process.returncode == 0 and stdout.decode().startswith('vpn://'): + return stdout.decode().strip() + else: + print(f"Ошибка генерации vpn://: {stderr.decode()}") + return "" + +def add_peer(public_key, ip_address): + """Добавляет новый пир в wg0.conf и синхронизирует с Docker.""" + conf_path = "/root/amnezia-bot/awg/files/wg0.conf" + with open(conf_path, "a") as f: + f.write(f"\n[Peer]\nPublicKey = {public_key}\nAllowedIPs = {ip_address}/32\n") + subprocess.run(["docker", "exec", "amnezia-awg", "wg", "syncconf", "wg0", "/config/wg0.conf"])