forked from name5566/leaf
/
console.go
83 lines (71 loc) · 1.34 KB
/
console.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package console
import (
"bufio"
"github.com/uc1024/leaf/conf"
"github.com/uc1024/leaf/network"
"math"
"strconv"
"strings"
)
var server *network.TCPServer
func Init() {
if conf.ConsolePort == 0 {
return
}
server = new(network.TCPServer)
server.Addr = "localhost:" + strconv.Itoa(conf.ConsolePort)
server.MaxConnNum = int(math.MaxInt32)
server.PendingWriteNum = 100
server.NewAgent = newAgent
server.Start()
}
func Destroy() {
if server != nil {
server.Close()
}
}
type Agent struct {
conn *network.TCPConn
reader *bufio.Reader
}
func newAgent(conn *network.TCPConn) network.Agent {
a := new(Agent)
a.conn = conn
a.reader = bufio.NewReader(conn)
return a
}
func (a *Agent) Run() {
for {
if conf.ConsolePrompt != "" {
a.conn.Write([]byte(conf.ConsolePrompt))
}
line, err := a.reader.ReadString('\n')
if err != nil {
break
}
line = strings.TrimSuffix(line[:len(line)-1], "\r")
args := strings.Fields(line)
if len(args) == 0 {
continue
}
if args[0] == "quit" {
break
}
var c Command
for _, _c := range commands {
if _c.name() == args[0] {
c = _c
break
}
}
if c == nil {
a.conn.Write([]byte("command not found, try `help` for help\r\n"))
continue
}
output := c.run(args[1:])
if output != "" {
a.conn.Write([]byte(output + "\r\n"))
}
}
}
func (a *Agent) OnClose() {}