github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/helper/freeport/ephemeral_darwin.go (about)

     1  //+build darwin
     2  
     3  package freeport
     4  
     5  import (
     6  	"fmt"
     7  	"os/exec"
     8  	"regexp"
     9  	"strconv"
    10  )
    11  
    12  /*
    13  $ sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
    14  net.inet.ip.portrange.first: 49152
    15  net.inet.ip.portrange.last: 65535
    16  */
    17  
    18  const (
    19  	ephPortFirst = "net.inet.ip.portrange.first"
    20  	ephPortLast  = "net.inet.ip.portrange.last"
    21  	command      = "sysctl"
    22  )
    23  
    24  var ephPortRe = regexp.MustCompile(`^\s*(\d+)\s+(\d+)\s*$`)
    25  
    26  func getEphemeralPortRange() (int, int, error) {
    27  	cmd := exec.Command(command, "-n", ephPortFirst, ephPortLast)
    28  	out, err := cmd.Output()
    29  	if err != nil {
    30  		return 0, 0, err
    31  	}
    32  
    33  	val := string(out)
    34  
    35  	m := ephPortRe.FindStringSubmatch(val)
    36  	if m != nil {
    37  		min, err1 := strconv.Atoi(m[1])
    38  		max, err2 := strconv.Atoi(m[2])
    39  
    40  		if err1 == nil && err2 == nil {
    41  			return min, max, nil
    42  		}
    43  	}
    44  
    45  	return 0, 0, fmt.Errorf("unexpected sysctl value %q for keys %q %q", val, ephPortFirst, ephPortLast)
    46  }