emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e53e8b4cf44 1/4: Add Tramp method "nspawn"


From: Michael Albinus
Subject: master e53e8b4cf44 1/4: Add Tramp method "nspawn"
Date: Mon, 13 May 2024 03:24:20 -0400 (EDT)

branch: master
commit e53e8b4cf44be0fac0eb92c816b2c7915533e283
Author: Michael Albinus <michael.albinus@gmx.de>
Commit: Michael Albinus <michael.albinus@gmx.de>

    Add Tramp method "nspawn"
    
    * doc/misc/tramp.texi: Adapt some markups.
    (Inline methods) <nspawn>: Add.
    (Default Host): Mention default host for "nspawn".
    (Customizing Methods): Remove tramp-nspawn.
    (Password handling): Add "nspawn".
    
    * etc/NEWS: New Tramp method "nspawn".
    
    * lisp/net/tramp-compat.el (tramp-nspawn): Warn, if that package is used.
    
    * lisp/net/tramp-container.el (tramp-nspawn-program): New defcustom.
    (tramp-nspawn-method): New defconst.
    (tramp-nspawn--completion-function, tramp-enable-nspawn-method):
    New defuns.
    
    * lisp/net/tramp.el (tramp-local-host-regexp): Add OpenSUSE host names.
---
 doc/misc/tramp.texi         | 95 ++++++++++++++++++++++++---------------------
 etc/NEWS                    |  8 ++--
 lisp/net/tramp-compat.el    |  3 ++
 lisp/net/tramp-container.el | 64 ++++++++++++++++++++++++++++--
 lisp/net/tramp.el           |  6 ++-
 5 files changed, 124 insertions(+), 52 deletions(-)

diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 6c36429fb79..e5e2f3b243f 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -973,7 +973,12 @@ supports changing the remote login shell @command{/bin/sh}.
 
 Check the @samp{Share SSH connections if possible} control for that
 session.
+@end table
+
+@noindent
+The following methods allow to access containers in different ways:
 
+@table @asis
 @item @option{docker}
 @cindex method @option{docker}
 @cindex @option{docker} method
@@ -1032,6 +1037,14 @@ name, as returned by @samp{apptainer instance list}.
 This is an optional method, @ref{Optional methods}.  It does not
 support user names.
 
+@item @option{nspawn}
+@cindex method @option{nspawn}
+@cindex @option{nspawn} method
+
+Integration of @code{systemd-nspawn} instances.  The host name is the
+instance name, as returned by @samp{machinectl list --all}.
+
+This is an optional method, @ref{Optional methods}.
 @end table
 
 
@@ -1256,9 +1269,9 @@ domain name).  An example:
 @trampfn{smb,daniel%BIZARRE@@melancholia,/daniel$$/.emacs}
 @end example
 
-where user @code{daniel} connects as a domain user to the SMB host
-@code{melancholia} in the MS Windows domain @code{BIZARRE} to edit
-@file{.emacs} located in the home directory (share @code{daniel$}).
+where user @samp{daniel} connects as a domain user to the SMB host
+@samp{melancholia} in the MS Windows domain @samp{BIZARRE} to edit
+@file{.emacs} located in the home directory (share @samp{daniel$}).
 
 Alternatively, for local WINS users (as opposed to domain users),
 substitute the domain name with the name of the local host in
@@ -1268,9 +1281,9 @@ UPPERCASE as shown here:
 @trampfn{smb,daniel%MELANCHOLIA@@melancholia,/daniel$$/.emacs}
 @end example
 
-where user @code{daniel} connects as local user to the SMB host
-@code{melancholia} in the local domain @code{MELANCHOLIA} to edit
-@file{.emacs} located in the home directory (share @code{daniel$}).
+where user @samp{daniel} connects as local user to the SMB host
+@samp{melancholia} in the local domain @samp{MELANCHOLIA} to edit
+@file{.emacs} located in the home directory (share @samp{daniel$}).
 
 The domain name and user name are optional for @command{smbclient}
 authentication.  When user name is not specified, @command{smbclient}
@@ -1702,8 +1715,8 @@ follows:
 @end group
 @end lisp
 
-With all defaults set, @samp{@trampfn{-,,}} will connect @value{tramp}
-to John's home directory on @code{target} via @code{ssh}.
+With all defaults set, @file{@trampfn{-,,}} will connect @value{tramp}
+to John's home directory on @samp{target} via method @option{ssh}.
 @end defopt
 
 @defopt tramp-default-host-alist
@@ -1712,6 +1725,10 @@ allows multiple default host values based on access 
method or user
 name combinations.  The alist can hold multiple values.  While
 @code{tramp-default-host} is sufficient in most cases, some methods,
 like @option{adb}, require defaults overwritten.
+
+The default host name for @option{nspawn} is @samp{.host}.  Therefore,
+@file{@trampfn{nspawn,,}} and @file{@trampfn{sudo,,}} have the same
+effect.
 @end defopt
 
 
@@ -1938,17 +1955,6 @@ Access of a hadoop/hdfs file system.  A file is accessed 
via
 the user that you want to use, and @samp{node} is the name of the
 hadoop server.
 
-@item tramp-nspawn
-@cindex method @option{nspawn}
-@cindex @option{nspawn} method
-Access to environments provided by systemd-nspawn.  A file is accessed
-via @file{@trampfn{nspawn,user@@container,/path/to/file}}, where
-@samp{user} is the (optional) user that you want to use, and
-@samp{container} is the container to connect to.  systemd-nspawn and
-its container utilities often require super user access to run, use
-multi-hop file names with @option{doas} or @option{sudo} to raise your
-privileges.
-
 @item vagrant-tramp
 @cindex method @option{vagrant}
 @cindex @option{vagrant} method
@@ -2118,11 +2124,12 @@ file name syntax, must be appended to the machine and 
login items:
 machine melancholia#4711 port davs login daniel%BIZARRE password geheim
 @end example
 
-For the methods @option{doas}, @option{sudo} and @option{sudoedit} the
-password of the user requesting the connection is needed, and not the
-password of the target user@footnote{On the local host, @code{run0}
-uses a graphical password agent.}.  If these connections happen on the
-local host, an entry with the local user and local host is used:
+For the methods @option{doas}, @option{sudo}, @option{sudoedit} and
+@option{nspawn} the password of the user requesting the connection is
+needed, and not the password of the target user@footnote{On the local
+host, @code{run0} uses a graphical password agent.}.  If these
+connections happen on the local host, an entry with the local user and
+local host is used:
 
 @example
 machine @var{host} port sudo login @var{user} password secret
@@ -2701,8 +2708,8 @@ its execution of @command{/bin/sh} on the remote host 
because Bourne
 shell does not recognize the export command as entered in
 @file{.profile}.
 
-Likewise, (@code{~}) character in paths will cause errors because
-Bourne shell does not do (@code{~}) character expansions.
+Likewise, (@samp{~}) character in paths will cause errors because
+Bourne shell does not do (@samp{~}) character expansions.
 
 One approach to avoiding these incompatibilities is to make all
 commands in @file{~/.shrc} and @file{~/.profile} Bourne shell
@@ -3417,7 +3424,7 @@ configuration option will be selected, it can be 
@t{"--standard"}
 or @t{"--paranoia"}.  See the @samp{encfs(1)} man page for details.
 
 However, @value{tramp} must adapt these configuration sets.  The
-@code{chainedNameIV} configuration option must be disabled; otherwise
+@option{chainedNameIV} configuration option must be disabled; otherwise
 @value{tramp} couldn't handle file name encryption transparently.
 @end defopt
 
@@ -3536,7 +3543,7 @@ on the remote host @var{host}, using the method 
@var{method}.
 @table @file
 @item @value{prefix}ssh@value{postfixhop}melancholia@value{postfix}.emacs
 For the file @file{.emacs} located in the home directory, on the host
-@code{melancholia}, using method @code{ssh}.
+@samp{melancholia}, using method @option{ssh}.
 
 @item 
@value{prefix}ssh@value{postfixhop}melancholia.danann.net@value{postfix}.emacs
 For the file @file{.emacs} specified using the fully qualified domain name of
@@ -3546,12 +3553,12 @@ the host.
 For the file @file{.emacs} specified using the @file{~}, which is expanded.
 
 @item 
@value{prefix}ssh@value{postfixhop}melancholia@value{postfix}~daniel/.emacs
-For the file @file{.emacs} located in @code{daniel}'s home directory
-on the host, @code{melancholia}.  The @file{~<user>} construct is
+For the file @file{.emacs} located in @samp{daniel}'s home directory
+on the host, @samp{melancholia}.  The @file{~<user>} construct is
 expanded to the home directory of that user on the remote host.
 
 @item 
@value{prefix}ssh@value{postfixhop}melancholia@value{postfix}/etc/squid.conf
-For the file @file{/etc/squid.conf} on the host @code{melancholia}.
+For the file @file{/etc/squid.conf} on the host @samp{melancholia}.
 
 @end table
 
@@ -3569,8 +3576,8 @@ different name using the proper syntax will override this 
default
 behavior: @file{@trampfn{method,user@@host,path/to/file}}.
 
 @file{@trampfn{ssh,daniel@@melancholia,.emacs}} is for file
-@file{.emacs} in @code{daniel}'s home directory on the host,
-@code{melancholia}, accessing via method @code{ssh}.
+@file{.emacs} in @samp{daniel}'s home directory on the host,
+@samp{melancholia}, accessing via method @option{ssh}.
 
 For specifying port numbers, affix @file{#<port>} to the host
 name.  For example: @file{@trampfn{ssh,daniel@@melancholia#42,.emacs}}.
@@ -3603,8 +3610,8 @@ names.  Beside the @code{default} value, @var{syntax} can 
be
 
 This remote file name syntax is similar to the syntax used by Ange FTP@.
 A remote file name has the form
-@code{@value{prefix}user@@host@value{postfix}path/to/file}.  The
-@code{user@@} part is optional, and the method is determined by
+@file{@value{prefix}user@@host@value{postfix}path/to/file}.  The
+@samp{user@@} part is optional, and the method is determined by
 @ref{Default Method}.
 
 @item @code{separate}
@@ -3615,8 +3622,8 @@ A remote file name has the form
 @include trampver.texi
 This remote file name syntax originated in the XEmacs text editor.
 A remote file name has the form
-@code{@trampfn{method,user@@host,path/to/file}}.  The @code{method}
-and @code{user@@} parts are optional.
+@file{@trampfn{method,user@@host,path/to/file}}.  The @samp{method}
+and @samp{user@@} parts are optional.
 @clear separate
 @set unified
 @include trampver.texi
@@ -3799,12 +3806,12 @@ Ad-hoc proxies can take patterns @code{%h} or @code{%u} 
like in
 @code{tramp-default-proxies-alist}.  The following file name expands
 to user @samp{root} on host @samp{remotehost}, starting with an
 @option{ssh} session on host @samp{remotehost}:
-@samp{@trampfn{ssh@value{postfixhop}%h|su,remotehost,}}.
+@file{@trampfn{ssh@value{postfixhop}%h|su,remotehost,}}.
 
 On the other hand, if a trailing hop does not specify a host name, the
 host name of the previous hop is reused.  Therefore, the following
 file name is equivalent to the previous example:
-@samp{@trampfn{ssh@value{postfixhop}remotehost|su,,}}.
+@file{@trampfn{ssh@value{postfixhop}remotehost|su,,}}.
 
 @defopt tramp-completion-multi-hop-methods
 When this list includes the last method in a multi-hop connection, the
@@ -3831,8 +3838,8 @@ The buffer must either visit a file, or a directory
 
 @defopt tramp-file-name-with-method
 The method @code{tramp-revert-buffer-with-sudo} shows an alternate
-buffer.  It defaults to @code{sudo}, other valid methods are
-@code{su}, @code{doas}, @code{run0}, and @code{ksu}.
+buffer.  It defaults to @option{sudo}, other valid methods are
+@option{su}, @option{doas}, @option{run0}, and @option{ksu}.
 
 @lisp
 (customize-set-variable 'tramp-file-name-with-method "doas")
@@ -4066,7 +4073,7 @@ follows in the local @file{.emacs} file:
 local host that the remote host can redirect X11 window
 interactions.  If querying for a recognizable name is not possible for
 whatever reason, then replace @code{(getenv "DISPLAY")} with a
-hard-coded, fixed name.  Note that using @code{:0} for X11 display name
+hard-coded, fixed name.  Note that using @samp{:0} for X11 display name
 here will not work as expected.
 
 @vindex ForwardX11@r{, ssh option}
@@ -4638,7 +4645,7 @@ specifies the target to be applied for renaming buffer 
file names from
 source via @code{tramp-rename-files}.  @code{source} is a regular
 expressions, which matches a remote file name.  @code{target} must be
 a directory name, which could be remote (including remote directories
-@value{tramp} infers by default, such as @samp{@trampfn{method,user@@host,}}).
+@value{tramp} infers by default, such as @file{@trampfn{method,user@@host,}}).
 
 @code{target} can contain the patterns @code{%m}, @code{%u} or
 @code{%h}, which are replaced by the method name, user name or host
@@ -4667,7 +4674,7 @@ ssh@value{postfixhop}%h@value{postfix}")
 @end lisp
 
 routes all connections to a host in @samp{company.org} via
-@samp{@trampfn{ssh,multi.hop,}}, which might be useful when using
+@file{@trampfn{ssh,multi.hop,}}, which might be useful when using
 Emacs outside the company network.
 
 @lisp
diff --git a/etc/NEWS b/etc/NEWS
index 846bf759995..cb7c62a7876 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1079,9 +1079,11 @@ This connection method is similar to "sudo", but it uses 
the
 These are the external methods counterparts of "docker" and "podman".
 
 +++
-*** New optional connection methods "toolbox", "flatpak" and "apptainer".
-They allow accessing system containers provided by Toolbox, sandboxes
-provided by Flatpak, or instances managed by Apptainer.
+*** New optional connection methods for containers.
+Tere are new optional connection methods "toolbox", "flatpak",
+"apptainer" and "nspawn".  They allow accessing system containers
+provided by Toolbox, sandboxes provided by Flatpak, instances managed by
+Apptainer, or accessing systemd-based light-weight containers..
 
 +++
 *** Connection method "kubernetes" supports now optional container name.
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index d7492be63f2..26c2049fbae 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -55,6 +55,9 @@
 (with-eval-after-load 'kubernetes-tramp
   (warn (concat "Package `kubernetes-tramp' has been obsoleted, "
                "please use integrated package `tramp-container'")))
+(with-eval-after-load 'tramp-nspawn
+  (warn (concat "Package `tramp-nspawn' has been obsoleted, "
+               "please use integrated package `tramp-container'")))
 
 ;; For not existing functions, obsolete functions, or functions with a
 ;; changed argument list, there are compiler warnings.  We want to
diff --git a/lisp/net/tramp-container.el b/lisp/net/tramp-container.el
index 902fc6a451b..3d15d71d709 100644
--- a/lisp/net/tramp-container.el
+++ b/lisp/net/tramp-container.el
@@ -81,8 +81,8 @@
 ;;     C-x C-f /flatpak:SANDBOX:/path/to/file
 ;;
 ;; Where:
-;;     SANDBOX is the running sandbox to connect to.
-;;             It could be an application ID, an instance ID, or a PID.
+;;     SANDBOX      is the running sandbox to connect to.
+;;                  It could be an application ID, an instance ID, or a PID.
 ;;
 ;;
 ;;
@@ -91,7 +91,17 @@
 ;;     C-x C-f /apptainer:INSTANCE:/path/to/file
 ;;
 ;; Where:
-;;     INSTANCE        is the running instance to connect to.
+;;     INSTANCE             is the running instance to connect to.
+;;
+;;
+;;
+;; 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
 
 ;;; Code:
 
@@ -159,6 +169,13 @@ If it is nil, the default context will be used."
   :type '(choice (const "apptainer")
                  (string)))
 
+(defcustom tramp-nspawn-program "machinectl"
+  "Name of the machinectl program."
+  :group 'tramp
+  :version "30.1"
+  :type '(choice (const "machinectl")
+                 (string)))
+
 ;;;###tramp-autoload
 (defconst tramp-docker-method "docker"
   "Tramp method name to use to connect to Docker containers.")
@@ -193,6 +210,10 @@ This is for out-of-band connections.")
 (defconst tramp-apptainer-method "apptainer"
   "Tramp method name to use to connect to Apptainer instances.")
 
+;;;###tramp-autoload
+(defconst tramp-nspawn-method "nspawn"
+  "Tramp method name to use to connect to systemd-nspawn containers.")
+
 ;;;###tramp-autoload
 (defmacro tramp-skeleton-completion-function (method &rest body)
   "Skeleton for `tramp-*-completion-function' with multi-hop support.
@@ -416,6 +437,21 @@ see its function help for a description of the format."
                        lines)))
       (mapcar (lambda (name) (list nil name)) names))))
 
+(defun tramp-nspawn--completion-function (method)
+  "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."
+  (tramp-skeleton-completion-function method
+    (when-let ((raw-list
+               (shell-command-to-string (concat program " list --all -q")))
+              ;; Ignore header line.
+               (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))))
+
 ;;;###tramp-autoload
 (defvar tramp-default-remote-shell) ;; Silence byte compiler.
 
@@ -580,6 +616,28 @@ see its function help for a description of the format."
    tramp-apptainer-method
    `((tramp-apptainer--completion-function ,tramp-apptainer-method))))
 
+;; todo: check tramp-async-args and tramp-direct-async
+;;;###tramp-autoload
+(defun tramp-enable-nspawn-method ()
+  "Enable connection to nspawn containers."
+  (add-to-list 'tramp-methods
+              `(,tramp-nspawn-method
+                (tramp-login-program ,tramp-nspawn-program)
+                (tramp-login-args (("shell")
+                                   ("-q")
+                                   ("--uid" "%u")
+                                   ("%h")))
+                (tramp-remote-shell ,tramp-default-remote-shell)
+                (tramp-remote-shell-login ("-l"))
+                (tramp-remote-shell-args ("-i" "-c"))))
+
+  (add-to-list 'tramp-default-host-alist `(,tramp-nspawn-method nil ".host"))
+  (add-to-list 'tramp-completion-multi-hop-methods tramp-nspawn-method)
+
+  (tramp-set-completion-function
+   tramp-nspawn-method
+   `((tramp-nspawn--completion-function ,tramp-nspawn-method))))
+
 ;; Default connection-local variables for Tramp.
 
 (defconst tramp-kubernetes-connection-local-default-variables
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 02a493f0a78..5bb1ab66175 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -562,11 +562,13 @@ host runs a restricted shell, it shall be added to this 
list, too."
            ;; Fedora.
            "localhost4" "localhost6"
            ;; Ubuntu.
-           "ip6-localhost" "ip6-loopback"))
+           "ip6-localhost" "ip6-loopback"
+           ;; OpenSUSE.
+           "ipv6-localhost" "ipv6-loopback"))
       eos)
   "Host names which are regarded as local host.
 If the local host runs a chrooted environment, set this to nil."
-  :version "29.3"
+  :version "30.1"
   :type '(choice (const :tag "Chrooted environment" nil)
                 (regexp :tag "Host regexp")))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]