Files
rakshasa/server/cli.go
T
2023-04-08 21:29:05 +08:00

129 lines
2.5 KiB
Go

package server
import (
"rakshasa/common"
"strings"
"time"
"github.com/luyu6056/ishell"
)
var rootCli = cliInit()
func CliRun() {
rootCli.Run()
}
func init() {
rootCli.SetPrompt("rakshasa>")
}
func cliInit() *ishell.Shell {
shell := ishell.New()
shell.AddCmd(&ishell.Cmd{
Name: "ping",
Help: "ping 节点",
Func: func(c *ishell.Context) {
if len(c.Args) != 1 {
c.Println("参数错误,使用方法 ping 服务器地址")
return
}
var err error
n, err := getNode(c.Args[0])
if err != nil {
c.Println("无法连接节点", c.Args[0])
return
}
be := time.Now()
resChan := make(chan interface{}, 1)
id := n.storeQuery(resChan)
go n.ping(id)
select {
case <-resChan:
n.deleteQuery(id)
c.Println("ping", n.uuid, time.Since(be))
case <-time.After(common.CMD_TIMEOUT):
n.deleteQuery(id)
c.Println("ping time out")
}
},
})
shell.AddCmd(&ishell.Cmd{
Name: "new",
Help: "与一个或者多个节点连接,使用方法 new ip:端口 多个地址以,间隔 如1080 127.0.0.1:1081,127.0.0.1:1082",
Func: func(c *ishell.Context) {
if len(c.Args) != 1 {
c.Println("参数错误,使用方法 connect ip:端口")
return
}
for _, addr := range strings.Split(c.Args[0], ",") {
_, err := getNode(addr)
if err != nil {
c.Println("连接", addr, "失败", err)
return
}
}
},
})
shell.AddCmd(&ishell.Cmd{
Name: "print",
Help: "列出所有节点",
Func: func(c *ishell.Context) {
printNodes(c)
},
})
if common.Debug {
shell.AddCmd(&ishell.Cmd{
Name: "printConn",
Help: "列出所有链接",
Func: func(c *ishell.Context) {
printConn()
},
})
shell.AddCmd(&ishell.Cmd{
Name: "printLock",
Help: "列出所有锁",
Func: func(c *ishell.Context) {
printLock()
},
})
shell.AddCmd(&ishell.Cmd{
Name: "delete",
Help: "sync.Map删除一个node ID",
Func: func(c *ishell.Context) {
l := clientLock.Lock()
defer l.Unlock()
if len(c.Args) != 1 {
c.Println("参数不对")
return
}
n, ok := nodeMap[c.Args[0]]
if ok {
n.Delete("")
}
},
})
shell.AddCmd(&ishell.Cmd{
Name: "closenode",
Help: "关闭一个node ID",
Func: func(c *ishell.Context) {
l := clientLock.Lock()
defer l.Unlock()
if len(c.Args) != 1 {
c.Println("参数不对")
return
}
n, ok := nodeMap[c.Args[0]]
if ok {
n.Close("debug关闭")
}
},
})
}
return shell
}