github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/machine/keys.go (about)

     1  //go:build amd64 || arm64
     2  // +build amd64 arm64
     3  
     4  package machine
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"io/ioutil"
    10  	"os"
    11  	"os/exec"
    12  	"path/filepath"
    13  	"strings"
    14  
    15  	"github.com/sirupsen/logrus"
    16  )
    17  
    18  var sshCommand = []string{"ssh-keygen", "-N", "", "-t", "ed25519", "-f"}
    19  
    20  // CreateSSHKeys makes a priv and pub ssh key for interacting
    21  // the a VM.
    22  func CreateSSHKeys(writeLocation string) (string, error) {
    23  	if err := generatekeys(writeLocation); err != nil {
    24  		return "", err
    25  	}
    26  	b, err := ioutil.ReadFile(writeLocation + ".pub")
    27  	if err != nil {
    28  		return "", err
    29  	}
    30  	return strings.TrimSuffix(string(b), "\n"), nil
    31  }
    32  
    33  func CreateSSHKeysPrefix(dir string, file string, passThru bool, skipExisting bool, prefix ...string) (string, error) {
    34  	location := filepath.Join(dir, file)
    35  
    36  	_, e := os.Stat(location)
    37  	if !skipExisting || errors.Is(e, os.ErrNotExist) {
    38  		if err := generatekeysPrefix(dir, file, passThru, prefix...); err != nil {
    39  			return "", err
    40  		}
    41  	} else {
    42  		fmt.Println("Keys already exist, reusing")
    43  	}
    44  	b, err := ioutil.ReadFile(filepath.Join(dir, file) + ".pub")
    45  	if err != nil {
    46  		return "", err
    47  	}
    48  	return strings.TrimSuffix(string(b), "\n"), nil
    49  }
    50  
    51  // generatekeys creates an ed25519 set of keys
    52  func generatekeys(writeLocation string) error {
    53  	args := append(append([]string{}, sshCommand[1:]...), writeLocation)
    54  	return exec.Command(sshCommand[0], args...).Run()
    55  }
    56  
    57  // generatekeys creates an ed25519 set of keys
    58  func generatekeysPrefix(dir string, file string, passThru bool, prefix ...string) error {
    59  	args := append([]string{}, prefix[1:]...)
    60  	args = append(args, sshCommand...)
    61  	args = append(args, file)
    62  	cmd := exec.Command(prefix[0], args...)
    63  	cmd.Dir = dir
    64  	if passThru {
    65  		cmd.Stdin = os.Stdin
    66  		cmd.Stdout = os.Stdout
    67  		cmd.Stderr = os.Stderr
    68  	}
    69  	logrus.Debugf("Running wsl cmd %v in dir: %s", args, dir)
    70  	return cmd.Run()
    71  }