summaryrefslogtreecommitdiff
path: root/pcmpl-tailscale.el
diff options
context:
space:
mode:
Diffstat (limited to 'pcmpl-tailscale.el')
-rw-r--r--pcmpl-tailscale.el71
1 files changed, 71 insertions, 0 deletions
diff --git a/pcmpl-tailscale.el b/pcmpl-tailscale.el
new file mode 100644
index 0000000..68c424a
--- /dev/null
+++ b/pcmpl-tailscale.el
@@ -0,0 +1,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)