diff --git a/README.md b/README.md index 167fa4b..dac84d6 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,5 @@ ## TODO - Support building images within docker compose -- GUI \ No newline at end of file +- GUI +- Allow stack to be named whatever is needed \ No newline at end of file diff --git a/composer/agent.py b/composer/agent.py index 25e1de7..38910a9 100644 --- a/composer/agent.py +++ b/composer/agent.py @@ -1,8 +1,8 @@ """Provides setup and the core Composer class functionality to interact with a compose stack""" -from git import Repo +from git import exc, Repo import logging -from os import getenv +from os import environ, getenv from pathlib import Path from python_on_whales import DockerClient from python_on_whales.exceptions import DockerException @@ -16,10 +16,27 @@ logger = logging.getLogger("composer-agent-logger") logger.addHandler(handler) logger.setLevel(logging.DEBUG) #TODO: add something to change log levles +environ['GIT_TERMINAL_PROMPT'] = '0' + class Setup: """Setup class ensuring appropriate files and symlinks are created for a Composer instance""" + @staticmethod + def create_credential_remote(): + + """Creates a remote url with credentials embedded""" + + username, password = getenv("GIT_USERNAME"), getenv("GIT_PASSWORD") + remote = getenv("REMOTE_REPO") + if not remote: + logger.critical("Remote URL not defined, aborting!") + raise Exception("Remote URL not defined!") + if username is not None and password is not None: + return f"https://{username}:{password}@{remote.removeprefix('https://')}" + else: + return remote + @staticmethod def create_symlink(): @@ -74,10 +91,14 @@ class Composer: if not Path("store/stack/.git").exists(): self.repo = Repo.init("store/stack") - self.repo.create_remote('origin', url) + self.repo.create_remote('origin', remote_url) else: self.repo = Repo("store/stack") - self.repo.remotes.origin.pull('master') + try: + self.repo.remotes.origin.pull('master') + except exc.GitCommandError: + logger.critical("Failed to autheticate remote, aborting!") + raise Exception("Failed to authenticate remote!") if self.docker.compose.config(return_json=True)["name"] != "stack": logger.warn(f"Composer stack name is wrong, either make sure it is set manually or keep it store/stack") self.start_update_job() @@ -137,14 +158,17 @@ class Composer: else: logger.warn(f"Undefined status {status} - use up, down, or restart") except DockerException as error: - logger.critical(f"Setting status of composer failed: {error}") + logger.error(f"Setting status of composer failed: {error}") def update(self): """Updates the Composer stack based on the remote repo""" current = self.repo.head.commit - self.repo.remotes.origin.pull('master') + try: + self.repo.remotes.origin.pull('master') + except exc.GitCommandError: + logger.critical("Failed to autheticate remote, aborting!") if current != self.repo.head.commit: self._create_services() self.set_status("up") @@ -240,8 +264,7 @@ class Service: else: logger.warn(f"Undefined status {status} - use up, down, or restart") except DockerException as error: - logger.critical(f"Setting status for service {self.name} failed: {error}") - logger.critical(error) + logger.error(f"Setting status for service {self.name} failed: {error}") def update(self, restart=True): diff --git a/composer/entrypoint.py b/composer/entrypoint.py index 2c0d93d..270a168 100644 --- a/composer/entrypoint.py +++ b/composer/entrypoint.py @@ -5,7 +5,8 @@ import time Setup.populate_store() Setup.create_symlink() -composer = Composer(getenv("REMOTE_REPO")) +remote = Setup.create_credential_remote() +composer = Composer(remote) while True: schedule.run_pending() time.sleep(1) \ No newline at end of file