Skip to main content

tailscale/tsapi.py

1#!/usr/bin/env python3
2"""
3tsapi is a lightweight wrapper for calling the Tailscale API with
4a local instance of the Tailscale control plane. It's to save me
5remembering the exact set of curl commands I need.
6"""
8import argparse
9import json
10import shlex
11import subprocess
12from typing import TypedDict
14from chives.text import coloured
16Args = TypedDict(
17 "args",
18 {
19 "method": str,
20 "path": str,
21 "api_key": str,
22 "data": str,
23 },
27def parse_args():
28 parser = argparse.ArgumentParser(
29 prog="tsapi",
30 description="Make API calls to a local instance of devcontrol",
31 )
33 parser.add_argument("--endpoint", help="API endpoint", required=True)
34 parser.add_argument("--api-key", help="API key", required=True)
35 parser.add_argument("--data", help="Body to POST with the request")
37 args = parser.parse_args()
39 method, path = args.endpoint.split()
41 return {
42 "method": method,
43 "path": path,
44 "api_key": args.api_key,
45 "data": args.data,
46 }
49if __name__ == "__main__":
50 args = parse_args()
51 cmd = [
52 "curl",
53 f"http://localhost:31544/api/v2{args['path']}",
54 "--silent",
55 "--request",
56 args["method"],
57 "--header",
58 f"Authorization: Bearer {args['api_key']}",
59 ]
60 if args["data"]:
61 cmd.extend(["--data", args["data"]])
63 print(coloured("-> " + " ".join(shlex.quote(c) for c in cmd), "blue"))
64 output = subprocess.check_output(cmd)
65 print(json.dumps(json.loads(output), indent=2))