add an acceptable error management.

This commit is contained in:
Manuel 2018-03-13 16:20:09 +01:00
parent c3d49fde95
commit e9eef9a49e
2 changed files with 33 additions and 10 deletions

View file

@ -29,6 +29,7 @@ type Config struct {
} }
func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx ssh.Context, configs []Config) error { func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx ssh.Context, configs []Config) error {
var lastClient *gossh.Client
switch newChan.ChannelType() { switch newChan.ChannelType() {
case "session" : case "session" :
lch, lreqs, err := newChan.Accept() lch, lreqs, err := newChan.Accept()
@ -38,7 +39,6 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
return nil return nil
} }
var lastClient *gossh.Client
// go through all the hops // go through all the hops
for _, config := range configs { for _, config := range configs {
@ -62,6 +62,7 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
defer func() { _ = client.Close() }() defer func() { _ = client.Close() }()
lastClient = client lastClient = client
} }
rch, rreqs, err := lastClient.OpenChannel("session", []byte{}) rch, rreqs, err := lastClient.OpenChannel("session", []byte{})
if err != nil { if err != nil {
return err return err
@ -76,24 +77,41 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
// TODO: trigger event callback // TODO: trigger event callback
return nil return nil
} }
// open client channel // go through all the hops
rconn, err := gossh.Dial("tcp", config.Addr, config.ClientConfig) for _, config := range configs {
if err != nil { var client *gossh.Client
return err if lastClient == nil {
client, err = gossh.Dial("tcp", config.Addr, config.ClientConfig)
} else {
rconn, err := lastClient.Dial("tcp", config.Addr)
if err != nil {
return err
}
ncc, chans, reqs, err := gossh.NewClientConn(rconn, config.Addr, config.ClientConfig)
if err != nil {
return err
}
client = gossh.NewClient(ncc, chans, reqs)
}
if err != nil {
return err
}
defer func() { _ = client.Close() }()
lastClient = client
} }
defer func() { _ = rconn.Close() }()
d := logtunnel.ForwardData{} d := logtunnel.ForwardData{}
if err := gossh.Unmarshal(newChan.ExtraData(), &d); err != nil { if err := gossh.Unmarshal(newChan.ExtraData(), &d); err != nil {
return err return err
} }
rch, rreqs, err := rconn.OpenChannel("direct-tcpip", newChan.ExtraData()) rch, rreqs, err := lastClient.OpenChannel("direct-tcpip", newChan.ExtraData())
if err != nil { if err != nil {
return err return err
} }
user := conn.User() user := conn.User()
// pipe everything // pipe everything
return pipe(lreqs, rreqs, lch, rch, config.Logs, user, newChan) return pipe(lreqs, rreqs, lch, rch, configs[len(configs)-1].Logs, user, newChan)
default: default:
newChan.Reject(gossh.UnknownChannelType, "unsupported channel type") newChan.Reject(gossh.UnknownChannelType, "unsupported channel type")
return nil return nil

7
ssh.go
View file

@ -158,7 +158,12 @@ func channelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewCh
return return
} }
err = bastionsession.MultiChannelHandler(srv, conn, newChan, ctx, sessionConfigs) go func() {
err = bastionsession.MultiChannelHandler(srv, conn, newChan, ctx, sessionConfigs)
if err != nil {
log.Printf("Error: %v", err)
}
}()
now := time.Now() now := time.Now()
sessUpdate := Session{ sessUpdate := Session{