From 6654db26b7ebc7625c9ebce67e02822aa394366a Mon Sep 17 00:00:00 2001 From: "Markus F.J. Busche" Date: Sat, 20 Sep 2025 16:12:09 +0200 Subject: [PATCH] chore(release): bump to 0.1.3; robust sudo/paths for tailscale --- .../tailscale_interface.py | 36 ++++++++++++++++--- octoprint_tailscale_funnel/setup.py | 2 +- octoprint_tailscale_funnel/update.json | 2 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/tailscale_interface.py b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/tailscale_interface.py index a53415a..15ca9fc 100644 --- a/octoprint_tailscale_funnel/octoprint_tailscale_funnel/tailscale_interface.py +++ b/octoprint_tailscale_funnel/octoprint_tailscale_funnel/tailscale_interface.py @@ -74,14 +74,30 @@ class TailscaleInterface: """ Check if tailscale is installed """ - result = self._run_command("which tailscale") - return result["success"] and result["output"] != "" + # Try PATH lookup, absolute path, or a sudo check that doesn't prompt + candidates = [ + "command -v tailscale", + "test -x /usr/bin/tailscale && echo /usr/bin/tailscale", + "test -x /usr/local/bin/tailscale && echo /usr/local/bin/tailscale", + ] + result = self._run_first_success(candidates) + if result and result["success"] and result.get("output"): + return True + # Fallback: ask tailscale for version via sudo -n (non-interactive) + version_check = self._run_command("sudo -n tailscale version") + return version_check["success"] def is_tailscale_running(self): """ Check if tailscale is running """ - result = self._run_command("tailscale status --json") + # Prefer non-interactive sudo to avoid PATH/permission issues + result = self._run_first_success([ + "sudo -n tailscale status --json", + "tailscale status --json", + "/usr/bin/tailscale status --json", + "/usr/local/bin/tailscale status --json", + ]) return result["success"] def get_tailscale_status(self): @@ -109,7 +125,12 @@ class TailscaleInterface: if not self.is_tailscale_installed(): raise TailscaleNotInstalledError("Tailscale is not installed") - result = self._run_command("tailscale funnel status --json") + result = self._run_first_success([ + "sudo -n tailscale funnel status --json", + "tailscale funnel status --json", + "/usr/bin/tailscale funnel status --json", + "/usr/local/bin/tailscale funnel status --json", + ]) if result["success"]: try: status = json.loads(result["output"]) if result["output"] else {} @@ -204,7 +225,12 @@ class TailscaleInterface: if not self.is_tailscale_installed(): raise TailscaleNotInstalledError("Tailscale is not installed") - result = self._run_command("tailscale funnel status --json") + result = self._run_first_success([ + "sudo -n tailscale funnel status --json", + "tailscale funnel status --json", + "/usr/bin/tailscale funnel status --json", + "/usr/local/bin/tailscale funnel status --json", + ]) if result["success"]: try: status = json.loads(result["output"]) if result["output"] else {} diff --git a/octoprint_tailscale_funnel/setup.py b/octoprint_tailscale_funnel/setup.py index c8da760..98d1c22 100644 --- a/octoprint_tailscale_funnel/setup.py +++ b/octoprint_tailscale_funnel/setup.py @@ -14,7 +14,7 @@ plugin_package = "octoprint_tailscale_funnel" plugin_name = "OctoPrint-Tailscale-Funnel" # The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module -plugin_version = "0.1.2" +plugin_version = "0.1.3" # The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin # module diff --git a/octoprint_tailscale_funnel/update.json b/octoprint_tailscale_funnel/update.json index 34eb914..b8830b6 100644 --- a/octoprint_tailscale_funnel/update.json +++ b/octoprint_tailscale_funnel/update.json @@ -1,4 +1,4 @@ { - "version": "0.1.2" + "version": "0.1.3" }