update
This commit is contained in:
110
TCPClient.go
110
TCPClient.go
@@ -12,6 +12,8 @@ import (
|
||||
)
|
||||
|
||||
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})`)
|
||||
var defaultLoginRe *regexp.Regexp = regexp.MustCompile("[\\w\\d-_]+ login:")
|
||||
var defaultPasswordRe *regexp.Regexp = regexp.MustCompile("Password:")
|
||||
|
||||
type TCPClient struct {
|
||||
Login string
|
||||
@@ -24,7 +26,7 @@ type TCPClient struct {
|
||||
Reader *bufio.Reader
|
||||
Writer *bufio.Writer
|
||||
Scanner *bufio.Scanner
|
||||
Conn *net.TCPConn
|
||||
Conn net.Conn
|
||||
TCPServer TCPServer
|
||||
MsgChan chan string
|
||||
CmdChan chan string
|
||||
@@ -33,6 +35,8 @@ type TCPClient struct {
|
||||
Log *log.Logger
|
||||
Config *Config
|
||||
Countries Countries
|
||||
LoginRe *regexp.Regexp
|
||||
PasswordRe *regexp.Regexp
|
||||
}
|
||||
|
||||
func NewTCPClient(TCPServer *TCPServer, Countries Countries) *TCPClient {
|
||||
@@ -58,35 +62,32 @@ func (c *TCPClient) setDefaultParams() {
|
||||
c.LogWriter = bufio.NewWriter(os.Stdout)
|
||||
}
|
||||
c.LoggedIn = false
|
||||
|
||||
if c.LoginRe == nil {
|
||||
c.LoginRe = defaultLoginRe
|
||||
}
|
||||
|
||||
if c.PasswordRe == nil {
|
||||
c.PasswordRe = defaultPasswordRe
|
||||
}
|
||||
}
|
||||
|
||||
func (c *TCPClient) StartClient() {
|
||||
var err error
|
||||
|
||||
addr, err := net.ResolveTCPAddr("tcp", c.Address+":"+c.Port)
|
||||
if err != nil {
|
||||
Log.Error("Cannot resolve Telnet Client address:", err)
|
||||
}
|
||||
|
||||
c.setDefaultParams()
|
||||
c.Conn, err = net.DialTCP("tcp", nil, addr)
|
||||
|
||||
c.Conn, err = net.Dial("tcp", c.Address+":"+c.Port)
|
||||
if err != nil {
|
||||
Log.Error("Cannot connect to Telnet Client:", err)
|
||||
}
|
||||
|
||||
// err = c.Conn.SetKeepAlive(true)
|
||||
// if err != nil {
|
||||
// Log.Error("Error while setting keep alive:", err)
|
||||
// }
|
||||
|
||||
c.Reader = bufio.NewReader(c.Conn)
|
||||
c.Writer = bufio.NewWriter(c.Conn)
|
||||
|
||||
go func() {
|
||||
for message := range c.TCPServer.CmdChan {
|
||||
Log.Infof("Received Command: %s", message)
|
||||
message := message + "\n"
|
||||
c.WriteString(message)
|
||||
c.Write([]byte(message + "\r\n"))
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -133,64 +134,67 @@ func (c *TCPClient) SetFilters() {
|
||||
func (c *TCPClient) ReadLine() {
|
||||
|
||||
for {
|
||||
|
||||
// Need to check data with space first to find login and then use \n
|
||||
if !c.LoggedIn {
|
||||
message, err := c.Reader.ReadString(' ')
|
||||
message, _ = strings.CutSuffix(message, "\n")
|
||||
message, _ = strings.CutSuffix(message, "\r")
|
||||
|
||||
message, err := c.Reader.ReadBytes(':')
|
||||
if err != nil {
|
||||
Log.Errorf("Error reading message: %s", err)
|
||||
c.Conn.Close()
|
||||
c.StartClient()
|
||||
}
|
||||
|
||||
if strings.Contains(message, Cfg.Cluster.LoginPrompt) {
|
||||
// message, _ = strings.CutSuffix(message, "\n")
|
||||
// message, _ = strings.CutSuffix(message, "\r")
|
||||
|
||||
if strings.Contains(string(message), Cfg.Cluster.LoginPrompt) || strings.Contains(string(message), "login:") {
|
||||
time.Sleep(time.Second * 1)
|
||||
Log.Debug("Found login prompt...sending callsign")
|
||||
c.Write([]byte(c.Login + "\r\n"))
|
||||
c.Write([]byte(c.Login + "\n\r"))
|
||||
c.LoggedIn = true
|
||||
c.SetFilters()
|
||||
if Cfg.Cluster.Command != "" {
|
||||
c.WriteString(Cfg.Cluster.Command + "\n\r")
|
||||
}
|
||||
Log.Infof("Connected to DX cluster %s:%s", Cfg.Cluster.Server, Cfg.Cluster.Port)
|
||||
Log.Info("Start receiving spots")
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if c.LoggedIn {
|
||||
message, err := c.Reader.ReadString('\n')
|
||||
message, _ = strings.CutSuffix(message, "\n")
|
||||
message, _ = strings.CutSuffix(message, "\r")
|
||||
message, err := c.Reader.ReadBytes('\n')
|
||||
messageString := string(message)
|
||||
// Log.Println(messageString)
|
||||
|
||||
if strings.Contains(message, "password") {
|
||||
Log.Debug("Found password prompt...sending password")
|
||||
c.Write([]byte(c.Password + "\r\n"))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
Log.Errorf("Error reading message: %s", err)
|
||||
c.Conn.Close()
|
||||
c.StartClient()
|
||||
}
|
||||
|
||||
if strings.Contains(message, "Error reading from server: read tcp") {
|
||||
Log.Error("Disconnected from Telnet Server, reconnecting")
|
||||
c.Close()
|
||||
c.StartClient()
|
||||
} else {
|
||||
if c.LoggedIn && strings.Contains(message, "DX") {
|
||||
ProcessTelnetSpot(spotRe, message, c.SpotChanToFlex, c.SpotChanToHTTPServer, c.Countries)
|
||||
if messageString != "" {
|
||||
if err != nil {
|
||||
Log.Errorf("Error reading message: %s", err)
|
||||
c.Conn.Close()
|
||||
c.StartClient()
|
||||
}
|
||||
|
||||
if strings.Contains(messageString, "password") {
|
||||
Log.Debug("Found password prompt...sending password...")
|
||||
c.Write([]byte(c.Password + "\r\n"))
|
||||
}
|
||||
|
||||
if strings.Contains(messageString, "Hello") || strings.Contains(messageString, "Welcome") {
|
||||
go c.SetFilters()
|
||||
if Cfg.Cluster.Command != "" {
|
||||
c.WriteString(Cfg.Cluster.Command + "\n\r")
|
||||
Log.Debugf("Sending Command: %s", Cfg.Cluster.Command)
|
||||
}
|
||||
}
|
||||
|
||||
if strings.Contains(messageString, "Error reading from server: read tcp") {
|
||||
Log.Error("Disconnected from Telnet Server, reconnecting")
|
||||
c.Close()
|
||||
c.StartClient()
|
||||
}
|
||||
|
||||
if strings.Contains(messageString, "DX") {
|
||||
ProcessTelnetSpot(spotRe, messageString, c.SpotChanToFlex, c.SpotChanToHTTPServer, c.Countries)
|
||||
}
|
||||
|
||||
// Send the spot message to TCP server
|
||||
c.MsgChan <- messageString
|
||||
}
|
||||
|
||||
// Send the spot message to TCP server
|
||||
c.MsgChan <- message
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user