parent
							
								
									69f4b4a6b7
								
							
						
					
					
						commit
						b0f32717b7
					
				
				 2 changed files with 64 additions and 0 deletions
			
			
		@ -0,0 +1,57 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					import sys | 
				
			||||||
 | 
					import argparse | 
				
			||||||
 | 
					import re | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from openpilot.common.basedir import BASEDIR | 
				
			||||||
 | 
					from openpilot.tools.lib.auth_config import get_token | 
				
			||||||
 | 
					from openpilot.tools.lib.api import CommaApi | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  parser = argparse.ArgumentParser(description="A helper for connecting to devices over the comma prime SSH proxy.\ | 
				
			||||||
 | 
					      Adding your SSH key to your SSH config is recommended for more convenient use; see https://docs.comma.ai/how-to/connect-to-comma/.") | 
				
			||||||
 | 
					  parser.add_argument("device", help="device name or dongle id") | 
				
			||||||
 | 
					  parser.add_argument("--host", help="ssh jump server host", default="ssh.comma.ai") | 
				
			||||||
 | 
					  parser.add_argument("--port", help="ssh jump server port", default=22, type=int) | 
				
			||||||
 | 
					  parser.add_argument("--key", help="ssh key", default=os.path.join(BASEDIR, "system/hardware/tici/id_rsa")) | 
				
			||||||
 | 
					  parser.add_argument("--debug", help="enable debug output", action="store_true") | 
				
			||||||
 | 
					  args = parser.parse_args() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  r = CommaApi(get_token()).get("v1/me/devices") | 
				
			||||||
 | 
					  devices = {x['dongle_id']: x['alias'] for x in r} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if not re.match("[0-9a-zA-Z]{16}", args.device): | 
				
			||||||
 | 
					    user_input = args.device.replace(" ", "").lower() | 
				
			||||||
 | 
					    matches = { k: v for k, v in devices.items() if isinstance(v, str) and user_input in v.replace(" ", "").lower() } | 
				
			||||||
 | 
					    if len(matches) == 1: | 
				
			||||||
 | 
					      dongle_id = list(matches.keys())[0] | 
				
			||||||
 | 
					    else: | 
				
			||||||
 | 
					      print(f"failed to look up dongle id for \"{args.device}\"", file=sys.stderr) | 
				
			||||||
 | 
					      if len(matches) > 1: | 
				
			||||||
 | 
					        print("found multiple matches:", file=sys.stderr) | 
				
			||||||
 | 
					        for k, v in matches.items(): | 
				
			||||||
 | 
					          print(f"  \"{v}\" ({k})", file=sys.stderr) | 
				
			||||||
 | 
					      exit(1) | 
				
			||||||
 | 
					  else: | 
				
			||||||
 | 
					    dongle_id = args.device | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  name = dongle_id | 
				
			||||||
 | 
					  if dongle_id in devices: | 
				
			||||||
 | 
					    name = f"{devices[dongle_id]} ({dongle_id})" | 
				
			||||||
 | 
					  print(f"connecting to {name} through {args.host}:{args.port} ...") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  command = [ | 
				
			||||||
 | 
					    "ssh", | 
				
			||||||
 | 
					    "-i", args.key, | 
				
			||||||
 | 
					    "-o", f"ProxyCommand=ssh -i {args.key} -W %h:%p -p %p %h@{args.host}", | 
				
			||||||
 | 
					    "-p", str(args.port), | 
				
			||||||
 | 
					  ] | 
				
			||||||
 | 
					  if args.debug: | 
				
			||||||
 | 
					    command += ["-v"] | 
				
			||||||
 | 
					  command += [ | 
				
			||||||
 | 
					    f"comma@{dongle_id}", | 
				
			||||||
 | 
					  ] | 
				
			||||||
 | 
					  if args.debug: | 
				
			||||||
 | 
					    print(" ".join([f"'{c}'" if " " in c else c for c in command])) | 
				
			||||||
 | 
					  os.execvp(command[0], command) | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue