blob: a5cf059cd3b595a55d8d1a1c560c1392d4c87f6f (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
;;; pcmpl-tailscale.el --- Completions For Tailscale -*- lexical-binding: t; -*-
;; Copyright (C) 2024 Thanos Apollo
;; Author: Thanos Apollo <[email protected]>
;; Keywords: comm extensions
;; URL: https://git.thanosapollo.com/pcmpl-tailscale
;; Version: 0.0.1
;; Package-Requires: ((emacs "27.2"))
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;; Under development
;;; Code:
(require 'pcomplete)
(require 'cl-lib)
(defvar pcmpl-tailscale-subcommands '("up" "down" "set" "login" "logout" "switch"
"configure" "netcheck" "ip" "status" "ping"
"nc" "ssh" "funnel" "serve" "version"
"web" "file" "bugreport" "cert" "lock"
"licenses" "exit-node" "update" "whois"))
(defvar pcmpl-tailscale-subcommand-set-flags '("--exit-node" "--accept-dns" "--ssh"
"--auto-update" "--exit-node-allow-lan-access"
"--nickname" "--hostname" "--operator" "--shields-up"
"--advertise-routes" "--advertise-exit-node"
"--advertise-connector" "--advertise-risk"))
(defun pcmpl-tailscale-get-exit-nodes ()
"Return a list of ip addresses of pcmpl-tailscale exit nodes."
(let* ((output (shell-command-to-string "tailscale exit-node list"))
(exit-nodes (split-string output "\n"))) ;; Split output into lines.
(cl-loop for ip in exit-nodes
when (string-match "\\([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\)" ip)
collect (match-string 0 ip))))
;;;###autoload
(defun pcomplete/tailscale ()
"Completion for `tailscale'."
(pcomplete-here pcmpl-tailscale-subcommands)
(cond ((string= (pcomplete-arg 1) "set")
(pcomplete-here pcmpl-tailscale-subcommand-set-flags)
(cond ((pcomplete-match "--exit-node" 1)
(pcomplete-here (pcmpl-tailscale-get-exit-nodes)))))
((string= (pcomplete-arg 1) "exit-node")
(pcomplete-here '("list")))))
(provide 'pcmpl-tailscale)
;;; pcmpl-tailscale.el ends here
|