init project
This commit is contained in:
commit
9160b0ff43
105
client.go
Normal file
105
client.go
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/reiver/go-telnet"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
t *telnet.Conn
|
||||||
|
mutex sync.Mutex
|
||||||
|
login string
|
||||||
|
password string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) readUntil(read bool, delims ...string) ([]byte, int, error) {
|
||||||
|
if len(delims) == 0 {
|
||||||
|
return nil, 0, nil
|
||||||
|
}
|
||||||
|
p := make([]string, len(delims))
|
||||||
|
for i, s := range delims {
|
||||||
|
if len(s) == 0 {
|
||||||
|
return nil, 0, nil
|
||||||
|
}
|
||||||
|
p[i] = s
|
||||||
|
}
|
||||||
|
var line []byte
|
||||||
|
b := make([]byte, 1)
|
||||||
|
for {
|
||||||
|
_, err := c.t.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
if read {
|
||||||
|
line = append(line, b...)
|
||||||
|
}
|
||||||
|
for i, s := range p {
|
||||||
|
if s[0] == b[0] {
|
||||||
|
if len(s) == 1 {
|
||||||
|
return line, i, nil
|
||||||
|
}
|
||||||
|
p[i] = s[1:]
|
||||||
|
} else {
|
||||||
|
p[i] = delims[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) ExecuteCommand(cmd string) []byte {
|
||||||
|
c.mutex.Lock()
|
||||||
|
c.t.Write([]byte(cmd + "\n"))
|
||||||
|
result, _ := c.ReadUntil(">")
|
||||||
|
c.mutex.Unlock()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) ReadUntil(delims ...string) ([]byte, error) {
|
||||||
|
d, _, err := c.readUntil(true, delims...)
|
||||||
|
return d, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) SkipUntil(delims ...string) error {
|
||||||
|
_, _, err := c.readUntil(false, delims...)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func expect(c *Client, d ...string) {
|
||||||
|
c.SkipUntil(d...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) Authorize() {
|
||||||
|
c.mutex.Lock()
|
||||||
|
|
||||||
|
expect(c, "Login:")
|
||||||
|
fmt.Println("l")
|
||||||
|
c.t.Write([]byte(c.login + "\n"))
|
||||||
|
expect(c, "Password:")
|
||||||
|
fmt.Println("p")
|
||||||
|
c.t.Write([]byte(c.password + "\n"))
|
||||||
|
expect(c, ">")
|
||||||
|
|
||||||
|
c.mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(dst string, login string, password string) (*Client, error) {
|
||||||
|
t, err := telnet.DialTo(dst)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Client{
|
||||||
|
t: t,
|
||||||
|
mutex: sync.Mutex{},
|
||||||
|
login: login,
|
||||||
|
password: password,
|
||||||
|
}, nil
|
||||||
|
}
|
7
go.mod
Normal file
7
go.mod
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module git.slipenko.com/Maks1mS/go-keenetic
|
||||||
|
|
||||||
|
go 1.18
|
||||||
|
|
||||||
|
require github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e
|
||||||
|
|
||||||
|
require github.com/reiver/go-oi v1.0.0 // indirect
|
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
github.com/reiver/go-oi v1.0.0 h1:nvECWD7LF+vOs8leNGV/ww+F2iZKf3EYjYZ527turzM=
|
||||||
|
github.com/reiver/go-oi v1.0.0/go.mod h1:RrDBct90BAhoDTxB1fenZwfykqeGvhI6LsNfStJoEkI=
|
||||||
|
github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e h1:quuzZLi72kkJjl+f5AQ93FMcadG19WkS7MO6TXFOSas=
|
||||||
|
github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e/go.mod h1:+5vNVvEWwEIx86DB9Ke/+a5wBI464eDRo3eF0LcfpWg=
|
83
iproute.go
Normal file
83
iproute.go
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IProute struct {
|
||||||
|
Destination string
|
||||||
|
Gateway string
|
||||||
|
Interface string
|
||||||
|
Metric string
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetIpRoutesCmd() string {
|
||||||
|
return "show ip route"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) GetIpRoutes() []IProute {
|
||||||
|
raw := c.ExecuteCommand(GetIpRoutesCmd())
|
||||||
|
|
||||||
|
prefix := 305
|
||||||
|
postfix := 12
|
||||||
|
|
||||||
|
string_result := string(raw[prefix : len(raw)-postfix])
|
||||||
|
lines := strings.Split(string_result, "\r\n")
|
||||||
|
|
||||||
|
result := make([]IProute, len(lines))
|
||||||
|
|
||||||
|
for i, x := range lines {
|
||||||
|
l := strings.Fields(x)
|
||||||
|
result[i] = IProute{Destination: l[0], Gateway: l[1], Interface: l[2], Metric: l[3]}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddIpRouteCmd(route IProute, auto bool) string {
|
||||||
|
autoString := "auto"
|
||||||
|
|
||||||
|
if !auto {
|
||||||
|
autoString = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("ip route %s %s %s %s %s", route.Destination, route.Gateway, route.Interface, route.Metric, autoString)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) AddIpRoute(route IProute, auto bool) error {
|
||||||
|
cmd := AddIpRouteCmd(route, auto)
|
||||||
|
raw := c.ExecuteCommand(cmd)
|
||||||
|
|
||||||
|
prefix := len(cmd)*4 + 7
|
||||||
|
postfix := 11
|
||||||
|
|
||||||
|
result := string(raw[prefix : len(raw)-postfix])
|
||||||
|
|
||||||
|
if strings.HasPrefix(result, "Network::RoutingTable: added static route") || strings.HasPrefix(result, "Network::RoutingTable: renewed static route") {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return errors.New(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func RemoveIpRouteCmd(route IProute) string {
|
||||||
|
return fmt.Sprintf("no ip route %s %s %s", route.Destination, route.Interface, route.Metric)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) RemoveIpRoute(route IProute) error {
|
||||||
|
cmd := RemoveIpRouteCmd(route)
|
||||||
|
raw := c.ExecuteCommand(cmd)
|
||||||
|
|
||||||
|
prefix := len(cmd)*4 + 7
|
||||||
|
postfix := 11
|
||||||
|
|
||||||
|
result := string(raw[prefix : len(raw)-postfix])
|
||||||
|
|
||||||
|
if strings.HasPrefix(result, "Network::RoutingTable: deleted static route:") {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return errors.New(result)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user