diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 44 |
1 files changed, 37 insertions, 7 deletions
@@ -63,21 +63,51 @@ func DoAddress(host, network, address string) Point { } return NewPoint("public", tags, map[string]interface{}{"error": err.Error()}) } - conn, err := net.DialTCP(network, nil, addr) + + var _wg sync.WaitGroup + _wg.Add(2) + var result_name string + var result_version string + var result_error error + go func() { + defer _wg.Done() + result_name, result_version, result_error = Hello(addr) + }() + var result_ping float64 + go func() { + defer _wg.Done() + result_ping = Ping(addr.IP) + }() + _wg.Wait() + + result := map[string]interface{}{} + if result_error == nil { + result["name"] = result_name + result["version"] = result_version + } else { + result["error"] = result_error + } + if result_ping >= 0 { + result["ping"] = result_ping + } + + return NewPoint("public", tags, result) +} + +func Hello(addr *net.TCPAddr) (name, version string, err error) { + conn, err := net.DialTCP(addr.Network(), nil, addr) if err != nil { - return NewPoint("public", tags, map[string]interface{}{"error": err.Error()}) + return "", "", err } + defer conn.Close() conn.CloseWrite() all, _ := ioutil.ReadAll(conn) line := strings.TrimRight(string(all), "\n") parts := strings.Split(line, " ") if len(parts) != 3 { - return NewPoint("public", tags, map[string]interface{}{"error": fmt.Sprintf("malformed ID line: %q", line)}) + return "", "", fmt.Errorf("malformed ID line: %q", line) } - return NewPoint("public", tags, map[string]interface{}{ - "name": parts[1], - "version": parts[2], - }) + return parts[1], parts[2], nil } func main() { |