1package ssh
2
3import (
4	"os/signal"
5
6	boshlog "github.com/cloudfoundry/bosh-utils/logger"
7	boshsys "github.com/cloudfoundry/bosh-utils/system"
8
9	boshdir "github.com/cloudfoundry/bosh-cli/director"
10	boshui "github.com/cloudfoundry/bosh-cli/ui"
11)
12
13type Provider struct {
14	streamingSSH ComboRunner
15	resultsSSH   ComboRunner
16	scp          ComboRunner
17}
18
19func NewProvider(cmdRunner boshsys.CmdRunner, fs boshsys.FileSystem, ui boshui.UI, logger boshlog.Logger) Provider {
20	sshSessionFactory := func(connOpts ConnectionOpts, result boshdir.SSHResult) Session {
21		return NewSessionImpl(connOpts, SessionImplOpts{ForceTTY: true}, result, fs)
22	}
23
24	streamingWriter := NewStreamingWriter(boshui.NewComboWriter(ui))
25
26	streamingSSH := NewComboRunner(
27		cmdRunner, sshSessionFactory, signal.Notify, streamingWriter, fs, ui, logger)
28
29	resultsSSH := NewComboRunner(
30		cmdRunner, sshSessionFactory, signal.Notify, NewResultsWriter(ui), fs, ui, logger)
31
32	scpSessionFactory := func(connOpts ConnectionOpts, result boshdir.SSHResult) Session {
33		return NewSessionImpl(connOpts, SessionImplOpts{}, result, fs)
34	}
35
36	scp := NewComboRunner(cmdRunner, scpSessionFactory, signal.Notify, streamingWriter, fs, ui, logger)
37
38	return Provider{streamingSSH: streamingSSH, resultsSSH: resultsSSH, scp: scp}
39}
40
41func (p Provider) NewResultsSSHRunner(interactive bool) Runner {
42	return NewNonInteractiveRunner(p.resultsSSH)
43}
44
45func (p Provider) NewSSHRunner(interactive bool) Runner {
46	if interactive {
47		return NewInteractiveRunner(p.streamingSSH)
48	}
49	return NewNonInteractiveRunner(p.streamingSSH)
50}
51
52func (p Provider) NewSCPRunner() SCPRunner { return NewSCPRunner(p.scp) }
53