console.go 1.4 KB

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