diff options
Diffstat (limited to 'pcmpl-tailscale.el')
-rw-r--r-- | pcmpl-tailscale.el | 71 |
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) |