From fdef168fabec494da5937b6b34cdaad920533075 Mon Sep 17 00:00:00 2001 From: David Chen Date: Tue, 12 Aug 2025 11:41:21 -0700 Subject: [PATCH] ngrok api --- bin/ncon | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 bin/ncon diff --git a/bin/ncon b/bin/ncon new file mode 100755 index 0000000..c94da34 --- /dev/null +++ b/bin/ncon @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +import json +import subprocess +import sys +import os +import getpass + +def get_tunnels(): + try: + result = subprocess.run(['ngrok', 'api', 'tunnels', 'list'], + capture_output=True, text=True, check=True) + tunnels = json.loads(result.stdout) + return tunnels['tunnels'] + except Exception as e: + print(f"Error getting tunnels: {e}") + return [] + +def get_ssh_tunnel(): + tunnels = get_tunnels() + for tunnel in tunnels: + if tunnel['proto'] == 'tcp' and tunnel['forwards_to'] == 'localhost:22': + url = tunnel['public_url'] + host_port = url.replace('tcp://', '') + host, port = host_port.rsplit(':', 1) + return host, port + + print("No SSH tunnel found") + return None, None + +def list_tunnels(): + tunnels = get_tunnels() + if not tunnels: + print("No tunnels found") + return + + for tunnel in tunnels: + url = tunnel['public_url'] + forwards_to = tunnel['forwards_to'] + + if tunnel['proto'] == 'tcp': + host_port = url.replace('tcp://', '') + host, port = host_port.rsplit(':', 1) + local_port = forwards_to.split(':')[-1] + print(f"{host}:{port} -> localhost:{local_port}") + else: + domain = url.replace('https://', '').replace('http://', '') + local_port = forwards_to.split(':')[-1] + ngrok_port = "443" if url.startswith('https://') else "80" + print(f"{domain}:{ngrok_port} -> localhost:{local_port}") + +def main(): + if len(sys.argv) < 2: + print("Usage: ncon [ssh|list]") + sys.exit(1) + + if sys.argv[1] == 'ssh': + host, port = get_ssh_tunnel() + if host and port: + cmd = ['ssh', '-p', port, f'david@{host}'] + print(f"Connecting to: {' '.join(cmd)}") + os.execvp('ssh', cmd) + else: + print("Failed to find SSH tunnel") + sys.exit(1) + elif sys.argv[1] == 'list': + list_tunnels() + else: + print("Unknown command. Use: ncon [ssh|list]") + sys.exit(1) + +if __name__ == '__main__': + main() \ No newline at end of file