From 4a3609ef279389dc8c8d1e9f9db64be62c746102 Mon Sep 17 00:00:00 2001 From: jaydee Date: Sat, 21 Mar 2026 10:36:53 +0100 Subject: [PATCH] build --- main.py | 7 +++++-- portainer/api.py | 49 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 4640617..9d88b31 100755 --- a/main.py +++ b/main.py @@ -302,6 +302,7 @@ def prompt_missing_args(args_in, defaults_in, fields, action=None,stacks=None): commands.sort() commands_tuples = [(cmd, cmd) for cmd in commands] commands_tuples.insert(0, ("__ALL__", "[Select ALL]")) + commands_tuples.insert(0, ("mandatory", "[Mandatory]")) value_in = checkboxlist_dialog( title="Select Services", text="Choose one or more services:", @@ -314,12 +315,14 @@ def prompt_missing_args(args_in, defaults_in, fields, action=None,stacks=None): elif "__ALL__" in value_in: # User selected "Select ALL" value_in = commands # all real commands - + elif "mandatory" in value_in: + # User selected "Select ALL" + value_in = ['pihole', 'nginx', 'authentik', 'hashicorp', 'mosquitto','homepage', 'mailu3', 'home-assistant', 'mediacenter' ] # all real commands value_in.sort() if "pihole" in value_in: - if action == "delete_stack": + if args.action == "delete_stack": value_in.remove("pihole") value_in.append("pihole") else: diff --git a/portainer/api.py b/portainer/api.py index 0c2a0b5..5b9c788 100644 --- a/portainer/api.py +++ b/portainer/api.py @@ -657,6 +657,11 @@ class PortainerApi: stack_mode="swarm", ): for stack in stacks: + if self.endpoint_name == "nas": + server = "_nas" + else: + server = "" + if stack_mode == "swarm": swarm_id = self.get_swarm_id(endpoint) p = "swarm" @@ -748,8 +753,8 @@ class PortainerApi: }, "repositoryURL": "https://gitlab.sectorq.eu/home/docker-compose.git", "ReferenceName": "refs/heads/main", - "composeFile": f"{stack}/docker-compose.yml", - "ConfigFilePath": f"{stack}/docker-compose.yml", + "composeFile": f"{stack}/docker-compose{server}.yml", + "ConfigFilePath": f"{stack}/docker-compose{server}.yml", "repositoryAuthentication": True, "repositoryUsername": "jaydee", "repositoryPassword": "glpat-uj-n-eEfTY398PE4vKSS", @@ -1208,25 +1213,36 @@ class PortainerApi: def start_stack(self, stack=None, endpoint_id=None): """Start one stack or all stacks on an endpoint.""" + ok = "\033[92m✔\033[0m" + ok2 = "\033[93m✔\033[0m" + err = "\033[91m✖\033[0m" if endpoint_id is not None: print("Getting endpoint") self.get_endpoint(endpoint_id) + size = 0 if stack is not None: for s in stack: + if len(s) > size: + size = len(s) self.stack_ids.append(self._resolve_stack_id(s, endpoint_id)) + size = size + 5 for stck in self.stack_ids: + print( + f"Starting stack {self.stacks_all[self.endpoint_id]['by_id'][stck][:size].ljust(size)}", + end="", flush=True + ) path = f"/stacks/{stck}/start" if self.endpoint_id is not None: path += f"?endpointId={self.endpoint_id}" try: - resp = self._api_post_no_body(path, timeout=20) + resp = self._api_post_no_body(path, timeout=120) except ValueError as e: - print(f"Error stoping stack: {e}") + print(f"Error starting stack: {e}") return [] if "Id" in json.loads(resp): - print( - f"Stack {self.stacks_all[self.endpoint_id]['by_id'][stck]} : started" - ) + print(ok) + elif "already running" in json.loads(resp)['message']: + print(ok2) else: print( f"Stack {self.stacks_all[self.endpoint_id]['by_id'][stck]} : {json.loads(resp)['message']}" @@ -1238,14 +1254,25 @@ class PortainerApi: """Stop one stack or all stacks on an endpoint.""" # print(f"Stopping stack {stack}") - + ok = "\033[92m✔\033[0m" + ok2 = "\033[93m✔\033[0m" + err = "\033[91m✖\033[0m" if endpoint_id is not None: self.get_endpoint(endpoint_id) + size = 0 if stack is not None: for s in stack: + if size < len(s): + size = len(s) self.stack_ids.append(self._resolve_stack_id(s, endpoint_id)) + size = size + 5 self.stack_ids = list(dict.fromkeys(self.stack_ids)) for stck in self.stack_ids: + print( + f"Stopping stack {self.stacks_all[self.endpoint_id]['by_id'][stck][:size].ljust(size)}", + end="", + flush=True + ) path = f"/stacks/{stck}/stop" # print(path) if self.endpoint_id is not None: @@ -1256,9 +1283,9 @@ class PortainerApi: print(f"Error stopping stack: {e}") return [] if "Id" in json.loads(resp): - print( - f"Stack {self.stacks_all[self.endpoint_id]['by_id'][stck]} : stopped" - ) + print(ok) + elif "already inactive" in json.loads(resp)['message']: + print(ok2) else: print( f"Stack {self.stacks_all[self.endpoint_id]['by_id'][stck]} : {json.loads(resp)['message']}"