Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions lib/reversetunnel/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ func (a *Agent) proxyTransport(ch ssh.Channel, reqC <-chan *ssh.Request) {
// to the given SSH connection.
//
func (a *Agent) runHeartbeat(conn *ssh.Client) {
ticker := time.NewTicker(defaults.ReverseTunnelAgentHeartbeatPeriod)
defer ticker.Stop()

heartbeatLoop := func() error {
if conn == nil {
return trace.Errorf("heartbeat cannot ping: need to reconnect")
Expand All @@ -258,8 +261,6 @@ func (a *Agent) runHeartbeat(conn *ssh.Client) {

// send first ping right away, then start a ping timer:
hb.SendRequest("ping", false, nil)
ticker := time.NewTicker(defaults.ReverseTunnelAgentHeartbeatPeriod)
defer ticker.Stop()

for {
select {
Expand Down Expand Up @@ -307,10 +308,18 @@ func (a *Agent) runHeartbeat(conn *ssh.Client) {
}
}

// run heartbeat loop, and when it fails (probably means that a tunnel got disconnected)
// keep repeating to reconnect until we're asked to stop
err := heartbeatLoop()
if err != nil || conn == nil {
time.Sleep(defaults.ReverseTunnelAgentHeartbeatPeriod)
a.Start()
select {
// abort if asked to stop:
case <-a.broadcastClose.C:
return
// reconnect
case <-ticker.C:
a.Start()
}
}
}

Expand Down