66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
|
// Copyright (c) 2016 Arista Networks, Inc.
|
||
|
// Use of this source code is governed by the Apache License 2.0
|
||
|
// that can be found in the COPYING file.
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"net"
|
||
|
|
||
|
"github.com/aristanetworks/glog"
|
||
|
)
|
||
|
|
||
|
type telnetClient struct {
|
||
|
addr string
|
||
|
conn net.Conn
|
||
|
}
|
||
|
|
||
|
func newTelnetClient(addr string) OpenTSDBConn {
|
||
|
return &telnetClient{
|
||
|
addr: addr,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func readErrors(conn net.Conn) {
|
||
|
var buf [4096]byte
|
||
|
for {
|
||
|
// TODO: We should add a buffer to read line-by-line properly instead
|
||
|
// of using a fixed-size buffer and splitting on newlines manually.
|
||
|
n, err := conn.Read(buf[:])
|
||
|
if n == 0 {
|
||
|
return
|
||
|
} else if n > 0 {
|
||
|
for _, line := range bytes.Split(buf[:n], []byte{'\n'}) {
|
||
|
if s := string(line); s != "" {
|
||
|
glog.Info("tsd replied: ", s)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *telnetClient) Put(d *DataPoint) error {
|
||
|
return c.PutBytes([]byte(d.String()))
|
||
|
}
|
||
|
|
||
|
func (c *telnetClient) PutBytes(d []byte) error {
|
||
|
var err error
|
||
|
if c.conn == nil {
|
||
|
c.conn, err = net.Dial("tcp", c.addr)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
go readErrors(c.conn)
|
||
|
}
|
||
|
_, err = c.conn.Write(d)
|
||
|
if err != nil {
|
||
|
c.conn.Close()
|
||
|
c.conn = nil
|
||
|
}
|
||
|
return err
|
||
|
}
|