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.
This commit is contained in:
Michael Albinus 2024-05-12 19:40:08 +02:00
parent 2c759b9ce6
commit e53e8b4cf4
5 changed files with 124 additions and 52 deletions

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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")))