func hasPort(proc *process.Process, connections []net.ConnectionStat) bool { for _, connection := range connections { if connection.Status == "LISTEN" && connection.Pid == int32(proc.Pid) { return true } } children, err := proc.Children() if err == nil { for _, child := range children { if hasPort(child, connections) { return true } } } return false }
func (sc *ServiceConfig) doGetPorts(proc *process.Process) ([]string, error) { var err error if len(connectionsCache) == 0 { connectionsCache, err = net.Connections("all") if err != nil { return nil, errors.WithStack(err) } } var ports []string var knownPorts = make(map[int]struct{}) if sc.LaunchChecks != nil { for _, port := range sc.LaunchChecks.Ports { knownPorts[port] = struct{}{} } } for _, connection := range connectionsCache { if connection.Status == "LISTEN" { if _, ok := knownPorts[int(connection.Laddr.Port)]; connection.Pid == proc.Pid && !ok { ports = append(ports, strconv.Itoa(int(connection.Laddr.Port))) } } } children, err := proc.Children() // This will error out if the process has finished or has no children if err != nil { return ports, nil } for _, child := range children { childPorts, err := sc.doGetPorts(child) if err == nil { ports = append(ports, childPorts...) } } return ports, nil }