github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/drivers/java/utils.go (about)

     1  package java
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os/exec"
     7  	"regexp"
     8  	rt "runtime"
     9  	"strings"
    10  )
    11  
    12  var javaVersionCommand = []string{"java", "-version"}
    13  var macOSJavaTestCommand = "/usr/libexec/java_home"
    14  
    15  func checkForMacJVM() (ok bool, err error) {
    16  	// test for java differently because of the shim application
    17  	var out bytes.Buffer
    18  	cmd := exec.Command(macOSJavaTestCommand)
    19  	cmd.Stdout = &out
    20  	cmd.Stderr = &out
    21  	err = cmd.Run()
    22  	if err != nil {
    23  		err = fmt.Errorf("failed check for macOS jvm: %v, out: %v", err, strings.ReplaceAll(strings.ReplaceAll(out.String(), "\n", " "), `"`, `\"`))
    24  		return false, err
    25  	}
    26  	return true, nil
    27  }
    28  
    29  func javaVersionInfo() (version, runtime, vm string, err error) {
    30  	var out bytes.Buffer
    31  
    32  	if rt.GOOS == "darwin" {
    33  		_, err = checkForMacJVM()
    34  		if err != nil {
    35  			err = fmt.Errorf("failed to check java version: %v", err)
    36  			return
    37  		}
    38  	}
    39  
    40  	cmd := exec.Command(javaVersionCommand[0], javaVersionCommand[1:]...)
    41  	cmd.Stdout = &out
    42  	cmd.Stderr = &out
    43  	err = cmd.Run()
    44  	if err != nil {
    45  		err = fmt.Errorf("failed to check java version: %v", err)
    46  		return
    47  	}
    48  
    49  	version, runtime, vm = parseJavaVersionOutput(out.String())
    50  	return
    51  }
    52  
    53  var (
    54  	javaVersionRe = regexp.MustCompile(`([.\d_]+)`)
    55  )
    56  
    57  func parseJavaVersionOutput(infoString string) (version, runtime, vm string) {
    58  	infoString = strings.TrimSpace(infoString)
    59  
    60  	lines := strings.Split(infoString, "\n")
    61  	if strings.Contains(lines[0], "Picked up _JAVA_OPTIONS") {
    62  		lines = lines[1:]
    63  	}
    64  
    65  	if len(lines) < 3 {
    66  		// unexpected output format, don't attempt to parse output for version
    67  		return "", "", ""
    68  	}
    69  
    70  	versionString := strings.TrimSpace(lines[0])
    71  
    72  	if match := javaVersionRe.FindStringSubmatch(versionString); len(match) == 2 {
    73  		versionString = match[1]
    74  	}
    75  
    76  	return versionString, strings.TrimSpace(lines[1]), strings.TrimSpace(lines[2])
    77  }