Skip to content

Commit

Permalink
build: close sftp connection when done (#24593)
Browse files Browse the repository at this point in the history
  • Loading branch information
holiman authored Mar 27, 2022
1 parent eb3ebce commit 0fffd3a
Showing 1 changed file with 28 additions and 14 deletions.
42 changes: 28 additions & 14 deletions internal/build/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package build

import (
"bufio"
"bytes"
"flag"
"fmt"
Expand Down Expand Up @@ -116,7 +117,6 @@ func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x
// the form sftp://[user@]host[:port].
func UploadSFTP(identityFile, host, dir string, files []string) error {
sftp := exec.Command("sftp")
sftp.Stdout = os.Stdout
sftp.Stderr = os.Stderr
if identityFile != "" {
sftp.Args = append(sftp.Args, "-i", identityFile)
Expand All @@ -131,6 +131,10 @@ func UploadSFTP(identityFile, host, dir string, files []string) error {
if err != nil {
return fmt.Errorf("can't create stdin pipe for sftp: %v", err)
}
stdout, err := sftp.StdoutPipe()
if err != nil {
return fmt.Errorf("can't create stdout pipe for sftp: %v", err)
}
if err := sftp.Start(); err != nil {
return err
}
Expand All @@ -139,24 +143,34 @@ func UploadSFTP(identityFile, host, dir string, files []string) error {
fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f)))
}
fmt.Fprintln(in, "exit")
// Avoid travis timout after 10m of inactivity by printing something
// every 8 minutes.
done := make(chan bool)
// Some issue with the PPA sftp server makes it so the server does not
// respond properly to a 'bye', 'exit' or 'quit' from the client.
// To work around that, we check the output, and when we see the client
// exit command, we do a hard exit.
// See
// https://github.com/kolban-google/sftp-gcs/issues/23
// https://github.com/mscdex/ssh2/pull/1111
aborted := false
go func() {
for {
select {
case <-time.After(8 * time.Minute):
fmt.Println("keepalive log")
continue
case <-done:
return
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
txt := scanner.Text()
fmt.Println(txt)
if txt == "sftp> exit" {
// Give it .5 seconds to exit (server might be fixed), then
// hard kill it from the outside
time.Sleep(500 * time.Millisecond)
aborted = true
sftp.Process.Kill()
}

}
}()
stdin.Close()
defer close(done)
return sftp.Wait()
err = sftp.Wait()
if aborted {
return nil
}
return err
}

// FindMainPackages finds all 'main' packages in the given directory and returns their
Expand Down

0 comments on commit 0fffd3a

Please sign in to comment.