124 lines
2.7 KiB
Go
124 lines
2.7 KiB
Go
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
|
|
}
|