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  }