From 3b31544b21ee313ca03a34ef398b2d89896a9846 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 19 Feb 2022 16:08:34 -0500 Subject: =?UTF-8?q?Rename=20package=20to=20=E2=80=98tramp-nspawn=E2=80=99.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tramp-nspawn.el | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 tramp-nspawn.el (limited to 'tramp-nspawn.el') diff --git a/tramp-nspawn.el b/tramp-nspawn.el new file mode 100644 index 0000000..7f3b5ca --- /dev/null +++ b/tramp-nspawn.el @@ -0,0 +1,125 @@ +;;; tramp-nspawn.el -- Tramp integration for systemd-nspawn containers -*- lexical-binding: t; -*- + +;; Copyright © 2021-2022 Free Software Foundation, Inc. + +;; Author: Brian Cully +;; Maintainer: Brian Cully +;; URL: https://github.com/bjc/tramp-nspawn +;; Keywords: tramp, nspawn, machinectl, systemd, systemd-nspawn +;; Version: 1.0 +;; Package-Requires: ((emacs "23")) + +;;; License: + +;; 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 . + +;;; Commentary: + +;; +;; ‘tramp-nspawn’ allows Tramp to work with containers provided by +;; systemd-nspawn. +;; +;; ## Usage +;; +;; Call ‘tramp-nspawn-setup’ in your Emacs initialization. +;; +;; (add-hook 'after-init-hook 'tramp-nspawn-setup) +;; +;; Open a file on a running systemd-nspawn container: +;; +;; C-x C-f /nspawn:USER@CONTAINER:/path/to/file +;; +;; Where: +;; USER is the user on the container to connect as (optional) +;; CONTAINER is the container to connect to +;; +;; ## Privileges +;; +;; systemd-nspawn and its container utilities often require super user +;; access to run, and this package does not escalate privileges in +;; order to accomplish that. +;; +;; One way of working around this using Tramp’s built-in multi-hop +;; facilities with doas or sudo to raise your privileges. +;; +;; Another possibility is using polkit(8) to allow specific users +;; access to the requisite services (machinectl). +;; + +;;; Code: + +(require 'tramp) + +(defgroup tramp-nspawn nil + "Tramp integration for systemd-nspawn containers." + :prefix "tramp-nspawn-" + :group 'applications + :link '(url-link :tag "Github" "https://github.com/bjc/tramp-nspawn") + :link '(emacs-commentary-link :tag "Commentary" "tramp-nspawn")) + +(defcustom tramp-nspawn-machinectl-file-name "machinectl" + "File name of machinectl executable." + :type 'string + :group 'tramp-nspawn) + +(defconst tramp-nspawn-method "nspawn" + "Tramp method name to use to connect to systemd-nspawn containers.") + +(defun tramp-nspawn--completion-function (&rest _args) + "List systemd-nspawn containers available for connection. + +This function is used by ‘tramp-set-completion-function’, please +see its function help for a description of the format." + (let* ((raw-list (shell-command-to-string + (concat tramp-nspawn-machinectl-file-name + " list -q"))) + (lines (cdr (split-string raw-list "\n"))) + (first-words (mapcar (lambda (line) (car (split-string line))) + lines)) + (machines (seq-take-while (lambda (name) name) first-words))) + (mapcar (lambda (m) (list nil m)) machines))) + + +(defun tramp-nspawn--add-method () + "Add Tramp method handler for nspawn containers." + (push `(,tramp-nspawn-method + (tramp-login-program ,tramp-nspawn-machinectl-file-name) + (tramp-login-args (("shell") + ("-q") + ("--uid" "%u") + ("%h"))) + (tramp-remote-shell "/bin/sh") + (tramp-remote-shell-login ("-l")) + (tramp-remote-shell-args ("-i" "-c"))) + tramp-methods)) + +(defun tramp-nspawn--remove-method () + "Remove Tramp method handler for nspawn containers." + (setf (alist-get tramp-nspawn-method tramp-methods nil t 'string=) nil)) + +(defun tramp-nspawn-unload-function () + "Remove Tramp method handler and completion functions." + (tramp-set-completion-function tramp-nspawn-method nil) + (tramp-nspawn--remove-method) + nil) + +;;;###autoload +(defun tramp-nspawn-setup () + "Initialize systemd-nspawn support for Tramp." + (tramp-nspawn--add-method) + (tramp-set-completion-function tramp-nspawn-method + '((tramp-nspawn--completion-function "")))) + +(provide 'tramp-nspawn) +;;; tramp-nspawn.el ends here -- cgit v1.2.3 From ae6d0d218b9d911257f2ecde325436f9e1a22473 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 19 Feb 2022 16:13:04 -0500 Subject: Clarify wording on package commentary. Previous wording may have implied that this package would allow Tramp to isolate itself within nspawn containers, rather than allow acces into nspawn containers. --- tramp-nspawn.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tramp-nspawn.el') diff --git a/tramp-nspawn.el b/tramp-nspawn.el index 7f3b5ca..0219643 100644 --- a/tramp-nspawn.el +++ b/tramp-nspawn.el @@ -27,7 +27,7 @@ ;;; Commentary: ;; -;; ‘tramp-nspawn’ allows Tramp to work with containers provided by +;; ‘tramp-nspawn’ allows Tramp access to environments provided by ;; systemd-nspawn. ;; ;; ## Usage -- cgit v1.2.3 From 6403f4f883fadb147a8c42d9123763913a90a850 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Sat, 19 Feb 2022 16:20:00 -0500 Subject: Rename tramp-nspawn-machinectl-file-name to -program. Seems to be more in line with what other packages are doing. --- tramp-nspawn.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'tramp-nspawn.el') diff --git a/tramp-nspawn.el b/tramp-nspawn.el index 0219643..286074a 100644 --- a/tramp-nspawn.el +++ b/tramp-nspawn.el @@ -68,8 +68,8 @@ :link '(url-link :tag "Github" "https://github.com/bjc/tramp-nspawn") :link '(emacs-commentary-link :tag "Commentary" "tramp-nspawn")) -(defcustom tramp-nspawn-machinectl-file-name "machinectl" - "File name of machinectl executable." +(defcustom tramp-nspawn-machinectl-program "machinectl" + "Name of the machinectl program." :type 'string :group 'tramp-nspawn) @@ -82,7 +82,7 @@ This function is used by ‘tramp-set-completion-function’, please see its function help for a description of the format." (let* ((raw-list (shell-command-to-string - (concat tramp-nspawn-machinectl-file-name + (concat tramp-nspawn-machinectl-program " list -q"))) (lines (cdr (split-string raw-list "\n"))) (first-words (mapcar (lambda (line) (car (split-string line))) @@ -94,7 +94,7 @@ see its function help for a description of the format." (defun tramp-nspawn--add-method () "Add Tramp method handler for nspawn containers." (push `(,tramp-nspawn-method - (tramp-login-program ,tramp-nspawn-machinectl-file-name) + (tramp-login-program ,tramp-nspawn-machinectl-program) (tramp-login-args (("shell") ("-q") ("--uid" "%u") -- cgit v1.2.3