go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/connection/vagrant/cli.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package vagrant 5 6 import ( 7 "bufio" 8 "io" 9 "regexp" 10 "strconv" 11 "strings" 12 13 "github.com/rs/zerolog/log" 14 ) 15 16 var ParseVagrantStatusRegex = regexp.MustCompile(`^(.*?)\s+(not created|running)\s(?:.*)$`) 17 18 func ParseVagrantStatus(r io.Reader) (map[string]bool, error) { 19 res := make(map[string]bool) 20 scanner := bufio.NewScanner(r) 21 for scanner.Scan() { 22 line := scanner.Text() 23 24 m := ParseVagrantStatusRegex.FindStringSubmatch(line) 25 if len(m) == 3 { 26 running := false 27 28 if m[2] == "running" { 29 running = true 30 } 31 32 res[m[1]] = running 33 } 34 35 } 36 return res, nil 37 } 38 39 type VagrantVmSSHConfig struct { 40 Host string 41 HostName string 42 User string 43 Port int 44 // eg /dev/null 45 UserKnownHostsFile string 46 // enabled StrictHostKeyChecking - "yes" || "no" 47 StrictHostKeyChecking string 48 // enabled password authentication - "yes" || "no" 49 PasswordAuthentication string 50 // eg. .vagrant/machines/default/virtualbox/private_key 51 IdentityFile string 52 // "yes" || "no" 53 IdentitiesOnly string 54 LogLevel string 55 } 56 57 func ParseVagrantSshConfig(r io.Reader) (map[string]*VagrantVmSSHConfig, error) { 58 res := make(map[string]*VagrantVmSSHConfig) 59 scanner := bufio.NewScanner(r) 60 61 var config *VagrantVmSSHConfig 62 for scanner.Scan() { 63 line := scanner.Text() 64 log.Debug().Msg(line) 65 66 fields := strings.Fields(strings.TrimSpace(line)) 67 68 if len(fields) == 2 { 69 switch fields[0] { 70 case "Host": 71 if config != nil { 72 res[config.Host] = config 73 } 74 config = &VagrantVmSSHConfig{} 75 config.Host = fields[1] 76 case "HostName": 77 config.HostName = fields[1] 78 case "IdentitiesOnly": 79 config.IdentitiesOnly = fields[1] 80 case "IdentityFile": 81 config.IdentityFile = fields[1] 82 case "LogLevel": 83 config.LogLevel = fields[1] 84 case "PasswordAuthentication": 85 config.PasswordAuthentication = fields[1] 86 case "Port": 87 config.Port, _ = strconv.Atoi(fields[1]) 88 case "StrictHostKeyChecking": 89 config.StrictHostKeyChecking = fields[1] 90 case "User": 91 config.User = fields[1] 92 case "UserKnownHostsFile": 93 config.UserKnownHostsFile = fields[1] 94 } 95 } 96 } 97 98 // add the last element 99 if config != nil { 100 res[config.Host] = config 101 } 102 103 return res, nil 104 }