// Copyright 2017 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. package vmimpl import ( "fmt" "time" "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/osutil" ) // Sleep for d. // If shutdown is in progress, return false prematurely. func SleepInterruptible(d time.Duration) bool { select { case <-time.After(d): return true case <-Shutdown: return false } } func WaitForSSH(debug bool, timeout time.Duration, addr, sshKey, sshUser, OS string, port int) error { pwd := "pwd" if OS == "windows" { pwd = "dir" } startTime := time.Now() SleepInterruptible(5 * time.Second) for { if !SleepInterruptible(5 * time.Second) { return fmt.Errorf("shutdown in progress") } args := append(SSHArgs(debug, sshKey, port), sshUser+"@"+addr, pwd) if debug { log.Logf(0, "running ssh: %#v", args) } _, err := osutil.RunCmd(time.Minute, "", "ssh", args...) if err == nil { return nil } if time.Since(startTime) > timeout { return fmt.Errorf("can't ssh into the instance: %v", err) } } } func SSHArgs(debug bool, sshKey string, port int) []string { return sshArgs(debug, sshKey, "-p", port) } func SCPArgs(debug bool, sshKey string, port int) []string { return sshArgs(debug, sshKey, "-P", port) } func sshArgs(debug bool, sshKey, portArg string, port int) []string { args := []string{ portArg, fmt.Sprint(port), "-i", sshKey, "-F", "/dev/null", "-o", "UserKnownHostsFile=/dev/null", "-o", "BatchMode=yes", "-o", "IdentitiesOnly=yes", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", } if sshKey != "" { args = append(args, "-i", sshKey) } if debug { args = append(args, "-v") } return args }