Files
local-dns/scripts/cert_renew_restart.py
2025-11-22 15:56:02 +03:00

126 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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()