12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Package telnet provides very simple interface for interacting with telnet devices from go routines.
- package telnet
- import (
- "bufio"
- "bytes"
- "net"
- "strings"
- "time"
- )
- // Telnet presents struct with net.Conn interface for telnet protocol plus buffered reader and timeout setup
- type Telnet struct {
- conn net.Conn
- reader *bufio.Reader
- timeout time.Duration
- }
- // Dial constructs connection to a telnet device. Address string must be in format: "ip:port" (e.g. "127.0.0.1:23").
- // Default timeout is set to 5 seconds.
- func Dial(addr string) (t Telnet, err error) {
- t.conn, err = net.Dial("tcp", addr)
- if err == nil {
- t.reader = bufio.NewReader(t.conn)
- t.timeout = time.Second * 5 // default
- }
- return
- }
- // DialTimeout acts like Dial but takes a specific timeout (in nanoseconds).
- func DialTimeout(addr string, timeout time.Duration) (t Telnet, err error) {
- t.conn, err = net.DialTimeout("tcp", addr, timeout)
- if err == nil {
- t.reader = bufio.NewReader(t.conn)
- t.timeout = timeout
- }
- return
- }
- // Read reads all data into string from telnet device until it meets the expected or stops on timeout.
- func (t Telnet) Read(expect string) (str string, err error) {
- var buf bytes.Buffer
- t.conn.SetReadDeadline(time.Now().Add(t.timeout))
- for {
- b, e := t.reader.ReadByte()
- if e != nil {
- err = e
- break
- }
- if b == 255 {
- t.reader.Discard(2)
- } else {
- buf.WriteByte(b)
- }
- if strings.Contains(buf.String(), expect) {
- str = buf.String()
- break
- }
- }
- return
- }
- // Write writes string (command or data) to telnet device. Do not forget add LF to end of string!
- func (t Telnet) Write(s string) (i int, err error) {
- t.conn.SetWriteDeadline(time.Now().Add(t.timeout))
- i, err = t.conn.Write([]byte(s))
- return
- }
- // SetTimeout changes default or start timeout for all interactions
- func (t Telnet) SetTimeout(timeout time.Duration) {
- t.timeout = timeout
- }
|