2023-11-16 12:31:12 +01:00
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
|
|
|
|
def run_command(command):
|
|
|
|
try:
|
|
|
|
subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
print(e.output.decode())
|
|
|
|
sys.exit(e.returncode)
|
|
|
|
|
|
|
|
def git_pull(directory):
|
|
|
|
os.chdir(directory)
|
|
|
|
print(f"Checking if the git repository in {directory} is up to date.")
|
|
|
|
local = subprocess.check_output("git rev-parse @", shell=True).decode().strip()
|
|
|
|
remote = subprocess.check_output("git rev-parse @{u}", shell=True).decode().strip()
|
|
|
|
|
|
|
|
if local != remote:
|
|
|
|
print("Repository is not up to date. Performing git pull.")
|
|
|
|
run_command("git pull")
|
|
|
|
else:
|
|
|
|
print("Repository is already up to date.")
|
2023-11-16 12:49:53 +01:00
|
|
|
|
|
|
|
def get_image_digests():
|
|
|
|
images_output = subprocess.check_output('docker-compose images --digests', shell=True).decode().strip()
|
|
|
|
image_lines = images_output.splitlines()
|
|
|
|
return {line.split()[0]: line.split()[2] for line in image_lines if line}
|
2023-11-16 12:31:12 +01:00
|
|
|
|
|
|
|
def update_docker(directory):
|
2023-11-16 12:49:53 +01:00
|
|
|
print(f"Checking for updates to Docker images in {directory}.")
|
|
|
|
os.chdir(directory)
|
|
|
|
before_digests = get_image_digests()
|
|
|
|
print("Pulling docker images.")
|
|
|
|
run_command("docker-compose pull")
|
|
|
|
after_digests = get_image_digests()
|
|
|
|
|
|
|
|
if before_digests != after_digests:
|
|
|
|
print("Changes detected in image digests. Rebuilding containers.")
|
|
|
|
run_command("docker-compose up -d --build --force-recreate")
|
|
|
|
else:
|
|
|
|
print("Docker images are up to date. No rebuild necessary.")
|
2023-11-16 12:31:12 +01:00
|
|
|
|
|
|
|
def update_nextcloud(directory):
|
|
|
|
print("Updating Nextcloud apps.")
|
|
|
|
run_command("docker-compose exec -T -u www-data application /var/www/html/occ app:update --all")
|
|
|
|
|
|
|
|
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]
|
|
|
|
for dir_entry in os.scandir(parent_directory):
|
|
|
|
if dir_entry.is_dir():
|
|
|
|
dir_path = dir_entry.path
|
|
|
|
print(f"Checking for updates in: {dir_path}")
|
|
|
|
|
|
|
|
if os.path.isdir(os.path.join(dir_path, ".git")):
|
|
|
|
git_pull(dir_path)
|
|
|
|
|
|
|
|
update_docker(dir_path)
|
|
|
|
|
|
|
|
if os.path.basename(dir_path) == "nextcloud":
|
|
|
|
update_nextcloud(dir_path)
|