forked from TrueCloudLab/rclone
sftp: support listening on passed FDs
This commit is contained in:
parent
b29a22095f
commit
156feff9f2
2 changed files with 31 additions and 2 deletions
|
@ -21,6 +21,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
sdActivation "github.com/coreos/go-systemd/v22/activation"
|
||||||
"github.com/rclone/rclone/cmd/serve/proxy"
|
"github.com/rclone/rclone/cmd/serve/proxy"
|
||||||
"github.com/rclone/rclone/cmd/serve/proxy/proxyflags"
|
"github.com/rclone/rclone/cmd/serve/proxy/proxyflags"
|
||||||
"github.com/rclone/rclone/fs"
|
"github.com/rclone/rclone/fs"
|
||||||
|
@ -266,10 +267,27 @@ func (s *server) serve() (err error) {
|
||||||
|
|
||||||
// Once a ServerConfig has been configured, connections can be
|
// Once a ServerConfig has been configured, connections can be
|
||||||
// accepted.
|
// accepted.
|
||||||
s.listener, err = net.Listen("tcp", s.opt.ListenAddr)
|
var listener net.Listener
|
||||||
|
|
||||||
|
// In case we run in a socket-activated environment, listen on (the first)
|
||||||
|
// passed FD.
|
||||||
|
sdListeners, err := sdActivation.Listeners()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to listen for connection: %w", err)
|
return fmt.Errorf("unable to acquire listeners: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(sdListeners) > 0 {
|
||||||
|
if len(sdListeners) > 1 {
|
||||||
|
fs.LogPrintf(fs.LogLevelWarning, nil, "more than one listener passed, ignoring all but the first.\n")
|
||||||
|
}
|
||||||
|
listener = sdListeners[0]
|
||||||
|
} else {
|
||||||
|
listener, err = net.Listen("tcp", s.opt.ListenAddr)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to listen for connection: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.listener = listener
|
||||||
fs.Logf(nil, "SFTP server listening on %v\n", s.listener.Addr())
|
fs.Logf(nil, "SFTP server listening on %v\n", s.listener.Addr())
|
||||||
|
|
||||||
go s.acceptConnections()
|
go s.acceptConnections()
|
||||||
|
|
|
@ -115,6 +115,17 @@ directory.
|
||||||
By default the server binds to localhost:2022 - if you want it to be
|
By default the server binds to localhost:2022 - if you want it to be
|
||||||
reachable externally then supply ` + "`--addr :2022`" + ` for example.
|
reachable externally then supply ` + "`--addr :2022`" + ` for example.
|
||||||
|
|
||||||
|
This also supports being run with socket activation, in which case it will
|
||||||
|
listen on the first passed FD.
|
||||||
|
It can be configured with .socket and .service unit files as described in
|
||||||
|
https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html
|
||||||
|
|
||||||
|
Socket activation can be tested ad-hoc with the ` + "`systemd-socket-activate`" + `command:
|
||||||
|
|
||||||
|
systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
|
||||||
|
|
||||||
|
This will socket-activate rclone on the first connection to port 2222 over TCP.
|
||||||
|
|
||||||
Note that the default of ` + "`--vfs-cache-mode off`" + ` is fine for the rclone
|
Note that the default of ` + "`--vfs-cache-mode off`" + ` is fine for the rclone
|
||||||
sftp backend, but it may not be with other SFTP clients.
|
sftp backend, but it may not be with other SFTP clients.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue