FlexDXCluster/TCPClient.go

124 lines
2.7 KiB
Go
Raw Normal View History

2024-09-23 16:24:50 +07:00
package main
import (
"bufio"
"net"
"os"
"regexp"
"strings"
"time"
log "github.com/sirupsen/logrus"
)
var spotRe *regexp.Regexp = regexp.MustCompile(`DX\sde\s([\w\d]+).*:\s+(\d+.\d)\s+([\w\d]+)\s+(CW|SSB|FT8|FT4|RTTY|USB|LSB)?\s+(.*)\s\s\s+([\d]+\w{1})`)
type TelnetClient struct {
Login string
Password string
Address string
Port string
Timeout time.Duration
LogWriter *bufio.Writer
Reader *bufio.Reader
Writer *bufio.Writer
Conn *net.TCPConn
TCPServer TCPServer
FlexClient FlexClient
MsgChan chan string
CmdChan chan string
SpotChan chan TelnetSpot
Log *log.Logger
}
func (tc *TelnetClient) setDefaultParams() {
if tc.Timeout == 0 {
tc.Timeout = 600 * time.Second
}
if tc.LogWriter == nil {
tc.LogWriter = bufio.NewWriter(os.Stdout)
}
}
func (tc *TelnetClient) StartClient() {
var err error
addr, err := net.ResolveTCPAddr("tcp", tc.Address+":"+tc.Port)
if err != nil {
tc.Log.Error("cannot resolve Telnet Client address:", err)
}
tc.setDefaultParams()
tc.Conn, err = net.DialTCP("tcp", nil, addr)
if err != nil {
tc.Log.Error("cannot connect to Telnet Client:", err)
}
tc.Log.Infof("connected to %s:%s", tc.Address, tc.Port)
err = tc.Conn.SetKeepAlive(true)
if err != nil {
tc.Log.Error("error while setting keep alive:", err)
}
tc.Reader = bufio.NewReader(tc.Conn)
tc.Writer = bufio.NewWriter(tc.Conn)
go tc.ReadLine()
}
func (tc *TelnetClient) Close() {
tc.Writer.WriteString("bye")
}
func (tc *TelnetClient) SetFilters() {
if Cfg.Cluster.FT8 {
tc.Write([]byte("set/ft8\r\n"))
tc.Log.Info("FT8 is on as defined in the config file")
}
if Cfg.Cluster.Skimmer {
tc.Write([]byte("set/skimmer\r\n"))
tc.Log.Info("Skimmer is on as defined in the config file")
}
if !Cfg.Cluster.FT8 {
tc.Write([]byte("set/noft8\r\n"))
tc.Log.Info("FT8 is off as defined in the config file")
}
if !Cfg.Cluster.Skimmer {
tc.Write([]byte("set/noskimmer\r\n"))
tc.Log.Info("Skimmer is off as defined in the config file")
}
}
func (tc *TelnetClient) ReadLine() {
for {
message, err := tc.Reader.ReadString('\n')
if err != nil {
tc.Log.Errorf("Error reading message: %s", err)
continue
}
if strings.Contains(message, "Login: \r\n") || strings.Contains(message, "Please enter your call: \r\n") {
tc.Log.Info("Found login prompt...sending callsign")
tc.Write([]byte(tc.Login + "\r\n"))
time.Sleep(time.Second * 2)
tc.SetFilters()
}
ProcessTelnetSpot(spotRe, message, tc.SpotChan, tc.Log)
tc.MsgChan <- message
}
}
// Write sends raw data to remove telnet server
func (tc *TelnetClient) Write(data []byte) (n int, err error) {
n, err = tc.Writer.Write(data)
if err == nil {
err = tc.Writer.Flush()
}
return
}