| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package discovery
- import (
- "fmt"
- "net/http"
- "sort"
- "time"
- )
- type Scanner struct {
- Host string
- ScanRange *[2]int
- }
- func NewScanner(host string, scanRange *[2]int) *Scanner {
- return &Scanner{
- Host: host,
- ScanRange: scanRange,
- }
- }
- func (s *Scanner) Discover() []int {
- ports := findByCmdline()
- if len(ports) == 0 {
- ports = findByPID()
- }
- if len(ports) == 0 && s.ScanRange != nil {
- ports = scanPorts(s.Host, s.ScanRange[0], s.ScanRange[1])
- }
- return unique(ports)
- }
- func scanPorts(host string, startPort, endPort int) []int {
- var found []int
- client := http.Client{Timeout: 1 * time.Second}
- for port := startPort; port <= endPort; port++ {
- resp, err := client.Get(fmt.Sprintf("http://%s:%d/global/health", host, port))
- if err == nil && resp.StatusCode == 200 {
- found = append(found, port)
- resp.Body.Close()
- }
- }
- return found
- }
- func contains(slice []int, val int) bool {
- for _, v := range slice {
- if v == val {
- return true
- }
- }
- return false
- }
- func unique(slice []int) []int {
- keys := make(map[int]bool)
- var result []int
- for _, v := range slice {
- if !keys[v] {
- keys[v] = true
- result = append(result, v)
- }
- }
- sort.Ints(result)
- return result
- }
|