From b44a09003e57ffd530c886f7c7b7eba342abb569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Skaza?= Date: Wed, 29 Nov 2023 13:19:56 +0100 Subject: [PATCH] make challenge resolving function static, fix issues with plugins --- ctfcli/__main__.py | 2 +- ctfcli/cli/challenges.py | 38 ++++++++++++++++++++------------------ ctfcli/core/plugins.py | 3 +++ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/ctfcli/__main__.py b/ctfcli/__main__.py index 0a9a72b..7557ed8 100644 --- a/ctfcli/__main__.py +++ b/ctfcli/__main__.py @@ -133,7 +133,7 @@ def main(): # if the command returns an int, then we serialize it as none to prevent fire from printing it # (this does not change the actual return value, so it's still good to use as an exit code) # everything else is returned as is, so fire can print help messages - ret = fire.Fire(CTFCLI, serialize=lambda r: None if isinstance(r, int) else r) + ret = fire.Fire(COMMANDS["cli"], serialize=lambda r: None if isinstance(r, int) else r) if isinstance(ret, int): sys.exit(ret) diff --git a/ctfcli/cli/challenges.py b/ctfcli/cli/challenges.py index 4de1d46..c84bc0b 100644 --- a/ctfcli/cli/challenges.py +++ b/ctfcli/cli/challenges.py @@ -62,7 +62,7 @@ def new(self, type: str = "blank") -> int: def edit(self, challenge: str, dockerfile: bool = False) -> int: log.debug(f"edit: {challenge} (dockerfile={dockerfile})") - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 @@ -94,7 +94,7 @@ def show(self, challenge: str, color=True) -> int: def view(self, challenge: str, color=True) -> int: log.debug(f"view: {challenge} (color={color})") - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 @@ -450,13 +450,13 @@ def install( log.debug(f"install: (challenge={challenge}, force={force}, hidden={hidden}, ignore={ignore})") if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 local_challenges = [challenge_instance] else: - local_challenges = self._resolve_all_challenges() + local_challenges = self.resolve_all_challenges() if isinstance(ignore, str): ignore = (ignore,) @@ -527,13 +527,13 @@ def sync(self, challenge: str = None, ignore: Union[str, Tuple[str]] = ()) -> in log.debug(f"sync: (challenge={challenge}, ignore={ignore})") if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 local_challenges = [challenge_instance] else: - local_challenges = self._resolve_all_challenges() + local_challenges = self.resolve_all_challenges() if isinstance(ignore, str): ignore = (ignore,) @@ -588,13 +588,13 @@ def deploy( log.debug(f"deploy: (challenge={challenge}, host={host}, skip_login={skip_login})") if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 challenges = [challenge_instance] else: - challenges = self._resolve_all_challenges() + challenges = self.resolve_all_challenges() deployable_challenges, failed_deployments, failed_syncs = [], [], [] @@ -727,7 +727,7 @@ def lint( ) -> int: log.debug(f"lint: (challenge={challenge}, skip_hadolint={skip_hadolint}, flag_format='{flag_format}')") - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 @@ -745,7 +745,7 @@ def lint( def healthcheck(self, challenge: Optional[str] = None) -> int: log.debug(f"healthcheck: (challenge={challenge})") - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 @@ -817,13 +817,13 @@ def mirror( ) if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 local_challenges = [challenge_instance] else: - local_challenges = self._resolve_all_challenges() + local_challenges = self.resolve_all_challenges() if isinstance(ignore, str): ignore = (ignore,) @@ -873,13 +873,13 @@ def verify(self, challenge: str = None, ignore: Tuple[str] = ()) -> int: log.debug(f"verify: (challenge={challenge}, ignore={ignore})") if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 local_challenges = [challenge_instance] else: - local_challenges = self._resolve_all_challenges() + local_challenges = self.resolve_all_challenges() if isinstance(ignore, str): ignore = (ignore,) @@ -938,13 +938,13 @@ def format(self, challenge: Optional[str] = None) -> int: log.debug(f"format: (challenge={challenge})") if challenge: - challenge_instance = self._resolve_single_challenge(challenge) + challenge_instance = self.resolve_single_challenge(challenge) if not challenge_instance: return 1 challenges = [challenge_instance] else: - challenges = self._resolve_all_challenges() + challenges = self.resolve_all_challenges() failed_formats = [] for challenge_instance in challenges: @@ -967,7 +967,8 @@ def format(self, challenge: Optional[str] = None) -> int: return 1 - def _resolve_single_challenge(self, challenge: Optional[str] = None) -> Optional[Challenge]: + @staticmethod + def resolve_single_challenge(challenge: Optional[str] = None) -> Optional[Challenge]: # if a challenge is specified if challenge: # check if it's a path to challenge.yml, or the current directory @@ -992,7 +993,8 @@ def _resolve_single_challenge(self, challenge: Optional[str] = None) -> Optional click.secho(str(e), fg="red") return - def _resolve_all_challenges(self) -> List[Challenge]: + @staticmethod + def resolve_all_challenges() -> List[Challenge]: config = Config() challenge_keys = config.challenges.keys() diff --git a/ctfcli/core/plugins.py b/ctfcli/core/plugins.py index 4829493..bed2551 100644 --- a/ctfcli/core/plugins.py +++ b/ctfcli/core/plugins.py @@ -13,6 +13,9 @@ def load_plugins(commands: Dict): sys.path.insert(0, str(plugins_path.absolute())) for plugin in sorted(plugins_path.iterdir()): + if plugin.name.startswith("_"): + continue + plugin_path = plugins_path / plugin / "__init__.py" log.debug(f"Loading plugin '{plugin}' from '{plugin_path}'")