126 lines
6.2 KiB
Python
126 lines
6.2 KiB
Python
# cert_renew_restart.py
|
||
import subprocess
|
||
import shutil
|
||
from pathlib import Path
|
||
from common import *
|
||
|
||
def generate_mkcert_command():
|
||
"""Генерирует команду для mkcert с указанием всех доменов"""
|
||
project_path = get_project_root()
|
||
services = read_services_config(project_path)
|
||
domains = [f"{service['name']}.local" for service in services['services']]
|
||
domains.append("*.local")
|
||
|
||
# Создаем PowerShell команду
|
||
domains_str = " ".join([f'"{domain}"' for domain in domains])
|
||
powershell_cmd = f'mkcert {domains_str}'
|
||
return powershell_cmd
|
||
|
||
def copy_and_rename_certificates(project_path):
|
||
"""Копирует и переименовывает сертификаты из Windows в WSL в директорию проекта."""
|
||
# Определяем пути
|
||
windows_certs_path = Path("C:/store/certs")
|
||
# Путь к директории certs внутри проекта local-dns
|
||
wsl_certs_path = project_path / "certs"
|
||
|
||
# Создаем директорию для сертификатов в WSL в корне проекта
|
||
wsl_certs_path.mkdir(parents=True, exist_ok=True)
|
||
|
||
# Находим сгенерированные mkcert файлы (обычно именуются как _wildcard.local+*.pem)
|
||
# Предполагаем, что первый найденный файл - это сертификат
|
||
cert_files = list(windows_certs_path.glob("_wildcard.local*.pem"))
|
||
if not cert_files:
|
||
print(f"Сертификаты не найдены в {windows_certs_path} по шаблону _wildcard.local*.pem")
|
||
return False
|
||
|
||
# Сортируем, чтобы упростить выбор (хотя mkcert обычно создает пару)
|
||
cert_files.sort()
|
||
cert_file = cert_files[0]
|
||
|
||
# Пытаемся найти соответствующий ключ (обычно имя файла сертификата с -key.pem)
|
||
# Например, если сертификат _wildcard.local+2.pem, ключ будет _wildcard.local+2-key.pem
|
||
expected_key_name = cert_file.with_name(cert_file.name.replace('.pem', '-key.pem'))
|
||
if expected_key_name.exists():
|
||
key_file = expected_key_name
|
||
else:
|
||
print(f"Файл ключа не найден по ожидаемому пути: {expected_key_name}")
|
||
# Альтернатива: ищем файл с -key.pem в имени среди найденных
|
||
key_candidates = [f for f in cert_files if '-key.pem' in f.name]
|
||
if key_candidates:
|
||
key_file = key_candidates[0] # Берем первый найденный ключ
|
||
print(f"Найден ключ по альтернативному поиску: {key_file}")
|
||
else:
|
||
print(f"Файл ключа не найден в {windows_certs_path}")
|
||
return False
|
||
|
||
|
||
# Копируем и переименовываем в директорию проекта
|
||
target_cert = wsl_certs_path / "wildcard.local.pem"
|
||
target_key = wsl_certs_path / "wildcard.local.key"
|
||
|
||
try:
|
||
shutil.copy2(cert_file, target_cert)
|
||
shutil.copy2(key_file, target_key)
|
||
print(f"Сертификат скопирован в: {target_cert}")
|
||
print(f"Ключ скопирован в: {target_key}")
|
||
except Exception as e:
|
||
print(f"Ошибка копирования сертификатов: {e}")
|
||
return False
|
||
|
||
# Создаем копии для default (если требуются контейнером)
|
||
default_cert = wsl_certs_path / "default.crt"
|
||
default_key = wsl_certs_path / "default.key"
|
||
|
||
try:
|
||
shutil.copy2(target_cert, default_cert)
|
||
shutil.copy2(target_key, default_key)
|
||
print(f"Копии сертификатов созданы как default.crt и default.key")
|
||
except Exception as e:
|
||
print(f"Ошибка создания копий сертификатов по умолчанию: {e}")
|
||
# Это может быть не критичной ошибкой, в зависимости от настройки контейнера
|
||
|
||
print(f"Сертификаты скопированы в {wsl_certs_path}")
|
||
return True
|
||
|
||
def main():
|
||
print("Обновление сертификатов и перезапуск сервисов...")
|
||
|
||
# Получаем путь к проекту
|
||
project_path = get_project_root()
|
||
|
||
# Генерируем конфигурацию dnsmasq перед обновлением
|
||
generate_dnsmasq_config(project_path)
|
||
|
||
# Выводим команду для генерации сертификатов
|
||
mkcert_cmd = generate_mkcert_command()
|
||
print("\nДля генерации сертификатов выполните в PowerShell (от администратора):")
|
||
print(f"cd C:\\store\\certs")
|
||
print(mkcert_cmd)
|
||
print()
|
||
|
||
# Ждем подтверждения пользователя
|
||
input("Нажмите Enter после генерации сертификатов в PowerShell...")
|
||
|
||
# Копируем сертификаты
|
||
if not copy_and_rename_certificates(project_path):
|
||
print("Не удалось скопировать сертификаты")
|
||
sys.exit(1)
|
||
|
||
# Перезапускаем контейнеры Docker Compose
|
||
print("Перезапуск контейнеров Docker Compose...")
|
||
if not run_docker_command("docker-compose restart"):
|
||
print("Команда 'docker-compose restart' не удалась.")
|
||
print("Попытка поднять контейнеры с помощью 'docker-compose up -d'...")
|
||
if not run_docker_command("docker-compose up -d --force-recreate"):
|
||
print("Не удалось поднять контейнеры с помощью 'docker-compose up -d'.")
|
||
sys.exit(1)
|
||
else:
|
||
print("Контейнеры подняты с помощью 'docker-compose up -d'.")
|
||
else:
|
||
print("Контейнеры успешно перезапущены!")
|
||
|
||
print("Сертификаты обновлены и сервисы перезапущены!")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|