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 }