github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/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.Replace(strings.Replace(out.String(), "\n", " ", -1), `"`, `\"`, -1))
    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  func parseJavaVersionOutput(infoString string) (version, runtime, vm string) {
    54  	infoString = strings.TrimSpace(infoString)
    55  
    56  	lines := strings.Split(infoString, "\n")
    57  	if strings.Contains(lines[0], "Picked up _JAVA_OPTIONS") {
    58  		lines = lines[1:]
    59  	}
    60  
    61  	if len(lines) < 3 {
    62  		// unexpected output format, don't attempt to parse output for version
    63  		return "", "", ""
    64  	}
    65  
    66  	versionString := strings.TrimSpace(lines[0])
    67  
    68  	re := regexp.MustCompile(`version "([^"]*)"`)
    69  	if match := re.FindStringSubmatch(lines[0]); len(match) == 2 {
    70  		versionString = match[1]
    71  	}
    72  
    73  	return versionString, strings.TrimSpace(lines[1]), strings.TrimSpace(lines[2])
    74  }