mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-08-26 21:45:20 +02:00
- Added detect_env_file() to both sys-ctl-rpr-docker-soft and sys-ctl-rpr-docker-hard * prefer .env, fallback to .env/env * append --env-file parameter automatically - Refactored soft script to use compose_cmd() for consistent command building - Adjusted error recovery path in soft script to also respect env-file - Extended unit tests for soft script to cover env-file priority and restart commands - Added new unit tests for hard script verifying env-file priority, cwd handling, and --only filter logic Ref: https://chatgpt.com/share/68ad7b30-7510-800f-8172-56f03a2f40f5
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
import os
|
|
import sys
|
|
import subprocess
|
|
import argparse
|
|
|
|
|
|
def detect_env_file(dir_path: str) -> str | None:
|
|
"""
|
|
Return the path to a Compose env file if present (.env preferred, fallback to env).
|
|
"""
|
|
candidates = [os.path.join(dir_path, ".env"), os.path.join(dir_path, ".env", "env")]
|
|
for candidate in candidates:
|
|
if os.path.isfile(candidate):
|
|
return candidate
|
|
return None
|
|
|
|
|
|
def hard_restart_docker_services(dir_path):
|
|
"""
|
|
Perform a hard restart of docker-compose services in the given directory
|
|
using docker-compose down and docker-compose up -d, adding --env-file if present.
|
|
"""
|
|
try:
|
|
print(f"Performing hard restart for docker-compose services in: {dir_path}")
|
|
|
|
env_file = detect_env_file(dir_path)
|
|
base = ["docker-compose"]
|
|
down_cmd = base.copy()
|
|
up_cmd = base.copy()
|
|
|
|
if env_file:
|
|
down_cmd += ["--env-file", env_file]
|
|
up_cmd += ["--env-file", env_file]
|
|
|
|
down_cmd += ["down"]
|
|
up_cmd += ["up", "-d"]
|
|
|
|
subprocess.run(down_cmd, cwd=dir_path, check=True)
|
|
subprocess.run(up_cmd, cwd=dir_path, check=True)
|
|
|
|
print(f"Hard restart completed successfully in: {dir_path}")
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error during hard restart in {dir_path}: {e}")
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Restart docker-compose services in subdirectories."
|
|
)
|
|
parser.add_argument(
|
|
"parent_directory",
|
|
help="Path to the parent directory containing docker-compose projects"
|
|
)
|
|
parser.add_argument(
|
|
"--only",
|
|
nargs="+",
|
|
help="Restart only the specified subdirectories (by name)"
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
parent_directory = args.parent_directory
|
|
|
|
if not os.path.isdir(parent_directory):
|
|
print(f"Error: {parent_directory} is not a valid directory.")
|
|
sys.exit(1)
|
|
|
|
for dir_entry in os.scandir(parent_directory):
|
|
if dir_entry.is_dir():
|
|
dir_path = dir_entry.path
|
|
dir_name = os.path.basename(dir_path)
|
|
print(f"Checking directory: {dir_path}")
|
|
|
|
docker_compose_file = os.path.join(dir_path, "docker-compose.yml")
|
|
|
|
if os.path.isfile(docker_compose_file):
|
|
if args.only and dir_name not in args.only:
|
|
print(f"Skipping {dir_name} (not in --only list).")
|
|
continue
|
|
print(f"Performing normal restart in {dir_name}...")
|
|
hard_restart_docker_services(dir_path)
|
|
else:
|
|
print(f"No docker-compose.yml found in {dir_path}. Skipping.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|