aboutsummaryrefslogtreecommitdiffstats
path: root/vm/vmimpl/util.go
blob: 08034450ff3aba693294d4665b2749d5124d9cb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// 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
}