evcc-io/cmd/detect/tasks/tcp.go
2023-12-06 18:29:32 +01:00

54 lines
955 B
Go

package tasks
import (
"errors"
"net"
"strconv"
"time"
"github.com/evcc-io/evcc/util"
)
const Tcp TaskType = "tcp"
func init() {
registry.Add(Tcp, TcpHandlerFactory)
}
func TcpHandlerFactory(conf map[string]interface{}) (TaskHandler, error) {
handler := TcpHandler{
Timeout: timeout,
}
err := util.DecodeOther(conf, &handler)
if err == nil && len(handler.Ports) == 0 {
err = errors.New("missing port")
}
handler.dialer = net.Dialer{Timeout: handler.Timeout}
return &handler, err
}
type TcpHandler struct {
Ports []int
Timeout time.Duration
dialer net.Dialer
}
func (h *TcpHandler) Test(_ *util.Logger, in ResultDetails) (res []ResultDetails) {
for _, port := range h.Ports {
addr := net.JoinHostPort(in.IP, strconv.Itoa(port))
conn, err := h.dialer.Dial("tcp", addr)
if err == nil {
defer conn.Close()
}
if err == nil {
out := in.Clone()
out.Port = port
res = append(res, out)
}
}
return res
}