summaryrefslogtreecommitdiff
path: root/pcmpl-tailscale.el
blob: 68c424a2586b04524fd1d5afeb2f46578dbd0671 (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
68
69
70
71

;;; pcmpl-tailscale.el --- Completions For Tailscale  -*- lexical-binding: t; -*-

;; Copyright (C) 2024  Thanos Apollo

;; Author: Thanos Apollo <[email protected]>
;; Keywords: pcomplete completions emerge gentoo
;; 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"))

(defvar pcmpl-tailscale-true-or-false '("true" "false"))

(defvar pcmpl-tailscale-serve-subcommands '("status" "reset"))


(defun pcmpl-tailscale-get-exit-nodes ()
  "Return a list of ip addresses of 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)