sys-ctl-rpr-docker-hard: Refactor restart script with argparse & update systemd ExecStart

- Removed unused soft restart function and switched to argparse-based CLI.
- Added --only argument to selectively restart subdirectories.
- Updated systemctl service template to pass PATH_DOCKER_COMPOSE_INSTANCES as argument.
- Ensures service unit correctly invokes the Python script with target path.

See conversation: https://chatgpt.com/share/68a771d9-5fd8-800f-a410-08132699cc3a
This commit is contained in:
Kevin Veen-Birkenbach 2025-08-21 21:22:29 +02:00
parent e33944cda2
commit dc3f4e05a8
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
2 changed files with 33 additions and 26 deletions

View File

@ -1,17 +1,7 @@
import os import os
import sys import sys
import subprocess import subprocess
import argparse
def restart_docker_services(dir_path):
"""
Restart docker-compose services in the given directory.
"""
try:
print(f"Restarting docker-compose services in: {dir_path}")
subprocess.run(["docker-compose", "restart"], cwd=dir_path, check=True)
print(f"Services restarted successfully in: {dir_path}")
except subprocess.CalledProcessError as e:
print(f"Error restarting services in {dir_path}: {e}")
def hard_restart_docker_services(dir_path): def hard_restart_docker_services(dir_path):
""" """
@ -26,28 +16,45 @@ def hard_restart_docker_services(dir_path):
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f"Error during hard restart in {dir_path}: {e}") print(f"Error during hard restart in {dir_path}: {e}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Please provide the path to the parent directory as a parameter.")
sys.exit(1)
parent_directory = sys.argv[1] 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): for dir_entry in os.scandir(parent_directory):
if dir_entry.is_dir(): if dir_entry.is_dir():
dir_path = dir_entry.path dir_path = dir_entry.path
dir_name = os.path.basename(dir_path) dir_name = os.path.basename(dir_path)
print(f"Checking directory: {dir_path}") print(f"Checking directory: {dir_path}")
docker_compose_file = os.path.join(dir_path, "docker-compose.yml") docker_compose_file = os.path.join(dir_path, "docker-compose.yml")
if os.path.isfile(docker_compose_file): if os.path.isfile(docker_compose_file):
print(f"Found docker-compose.yml in {dir_path}.") if args.only and dir_name not in args.only:
if dir_name == "web-app-mailu": print(f"Skipping {dir_name} (not in --only list).")
print(f"Directory {dir_name} detected. Performing hard restart...") continue
hard_restart_docker_services(dir_path) print(f"Performing normal restart in {dir_name}...")
else: hard_restart_docker_services(dir_path)
print(f"Restarting services in {dir_path}...")
restart_docker_services(dir_path)
else: else:
print(f"No docker-compose.yml found in {dir_path}. Skipping.") print(f"No docker-compose.yml found in {dir_path}. Skipping.")
if __name__ == "__main__":
main()

View File

@ -5,4 +5,4 @@ OnFailure={{ SYS_SERVICE_ON_FAILURE_COMPOSE }}
[Service] [Service]
Type=oneshot Type=oneshot
ExecStartPre=/usr/bin/python {{ PATH_SYSTEM_LOCK_SCRIPT }} {{ SYS_SERVICE_GROUP_MANIPULATION | join(' ') }} --ignore {{ SYS_SERVICE_REPAIR_DOCKER_HARD }} --timeout "{{ SYS_TIMEOUT_RESTART_DOCKER }}" ExecStartPre=/usr/bin/python {{ PATH_SYSTEM_LOCK_SCRIPT }} {{ SYS_SERVICE_GROUP_MANIPULATION | join(' ') }} --ignore {{ SYS_SERVICE_REPAIR_DOCKER_HARD }} --timeout "{{ SYS_TIMEOUT_RESTART_DOCKER }}"
ExecStart={{ system_service_script_exec }} ExecStart={{ system_service_script_exec }} {{ PATH_DOCKER_COMPOSE_INSTANCES }}