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