package services import ( "bufio" "fmt" "net" "strconv" "strings" "time" ) func NewGenericEchoHandler(log LoggerFunc) Handler { return func(c net.Conn) { defer c.Close() remote := c.RemoteAddr().String() c.SetDeadline(time.Now().Add(10 * time.Second)) _, _ = c.Write([]byte("220 Welcome to service\r\n")) r := bufio.NewReader(c) var b strings.Builder for i := 0; i < 10; i++ { line, err := r.ReadString('\n') if err != nil { break } b.WriteString(line) _, _ = c.Write([]byte("ACK\r\n")) } log(Record{Timestamp: Now(), RemoteAddr: remoteIP(remote), RemotePort: remotePort(remote), Service: "generic", Details: map[string]string{"lines": strconv.Itoa(strings.Count(b.String(), "\n"))}, RawPayload: b.String()}) } } func NewGenericBannerHandler(banner string, log LoggerFunc) Handler { return func(c net.Conn) { defer c.Close() remote := c.RemoteAddr().String() _, _ = c.Write([]byte(fmt.Sprintf("%s\r\n", banner))) c.SetDeadline(time.Now().Add(10 * time.Second)) buf := make([]byte, 4096) n, _ := c.Read(buf) payload := strings.TrimSpace(string(buf[:n])) log(Record{Timestamp: Now(), RemoteAddr: remoteIP(remote), RemotePort: remotePort(remote), Service: banner, Details: map[string]string{"read_bytes": strconv.Itoa(n)}, RawPayload: payload}) } }