⚠⚠⚠ Deprecated: ⚠⚠⚠
This repository is deprecated in favor of libcontainerssh for ContainerSSH 0.5.
This library implements a backend that connects to a Docker socket and launches a new container for each connection, then runs executes a separate command per channel using docker exec
. It replaces the legacy dockerrun
backend.
This library implements a NetworkConnectionHandler
from the sshserver library. This can be embedded into a connection handler.
The network connection handler can be created with the New()
method:
var client net.TCPAddr
connectionID := "0123456789ABCDEF"
config := docker.Config{
//...
}
collector := metrics.New()
dr, err := docker.New(
client,
connectionID,
config,
logger,
collector.MustCreateCounter("backend_requests", "", ""),
collector.MustCreateCounter("backend_failures", "", ""),
)
if err != nil {
// Handle error
}
The logger
parameter is a logger from the ContainerSSH logger library.
The dr
variable can then be used to create a container on finished handshake:
ssh, err := dr.OnHandshakeSuccess("provided-connection-username")
Conversely, on disconnect you must call dr.OnDisconnect()
. The ssh
variable can then be used to create session channels:
var channelID uint64 = 0
extraData := []byte{}
session, err := ssh.OnSessionChannel(channelID, extraData)
Finally, the session can be used to launch programs:
var requestID uint64 = 0
err = session.OnEnvRequest(requestID, "foo", "bar")
// ...
requestID = 1
var stdin io.Reader
var stdout, stderr io.Writer
err = session.OnShell(
requestID,
stdin,
stdout,
stderr,
func(exitStatus ExitStatus) {
// ...
},
)
This library supports several operating modes:
connection
creates a container per connection and uses thedocker exec
mechanism to launch SSH programs inside the container. This mode ignores theCMD
of the container image and uses theidleProgram
setting to launch inside the container.session
creates a container per session and potentially results in multiple containers for a single SSH connection. This mode uses theCMD
of the container image or from the configuration.