servermonitor.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net"
  6. "os"
  7. "os/exec"
  8. "strings"
  9. "time"
  10. "bet24.com/log"
  11. "bet24.com/utils"
  12. "github.com/gorilla/websocket"
  13. )
  14. type serverconfig struct {
  15. ServerPort int
  16. }
  17. type multipleServerconfig struct {
  18. PortStart int
  19. }
  20. type roomconfig struct {
  21. ServerPort int
  22. }
  23. type room struct {
  24. Config roomconfig
  25. }
  26. type rooms struct {
  27. Rooms []room
  28. }
  29. func waitInput() {
  30. for {
  31. var endInput string
  32. fmt.Scanln(&endInput)
  33. switch endInput {
  34. case "list":
  35. fmt.Println(modules)
  36. default:
  37. fmt.Println("unknown command")
  38. }
  39. }
  40. }
  41. func tryRestart(name string) {
  42. cmd := exec.Command("cmd.exe", "/c", fmt.Sprintf("start cmd.exe /k %v", name))
  43. cmd.Start()
  44. }
  45. func doMonitorConfigServer(name string) {
  46. var sc serverconfig
  47. configFile := fmt.Sprintf("%s/server.json", name)
  48. data, err := os.ReadFile(configFile)
  49. if err != nil {
  50. log.Debug("doMonitorConfigServer read config[%s] failed", configFile)
  51. }
  52. err = json.Unmarshal(data, &sc)
  53. if err != nil {
  54. log.Debug("Unmarshal config failed err:%v", err)
  55. return
  56. }
  57. // 百人游戏,端口在rooms
  58. if sc.ServerPort == 0 {
  59. doMonitorBacServer(name)
  60. return
  61. }
  62. doMonitorTcpServer(fmt.Sprintf("localhost:%d", sc.ServerPort+100), name)
  63. }
  64. func doMonitorBacServer(name string) {
  65. var sc rooms
  66. configFile := fmt.Sprintf("%s/rooms.json", name)
  67. data, err := os.ReadFile(configFile)
  68. if err != nil {
  69. log.Debug("doMonitorBacServer read config[%s] failed", configFile)
  70. }
  71. err = json.Unmarshal(data, &sc)
  72. if err != nil {
  73. log.Debug("doMonitorBacServer Unmarshal config failed err:%v", err)
  74. return
  75. }
  76. for _, v := range sc.Rooms {
  77. doMonitorTcpServer(fmt.Sprintf("localhost:%d", v.Config.ServerPort+100), name)
  78. }
  79. }
  80. func doMonitorMultiServer(name string, count int) {
  81. var sc multipleServerconfig
  82. configFile := fmt.Sprintf("%s/server.json", name)
  83. data, err := os.ReadFile(configFile)
  84. if err != nil {
  85. log.Debug("doMonitorMultiServer read config[%s] failed", configFile)
  86. }
  87. err = json.Unmarshal(data, &sc)
  88. if err != nil {
  89. log.Debug("doMonitorMultiServer Unmarshal config failed err:%v", err)
  90. return
  91. }
  92. for i := 0; i < count; i++ {
  93. doMonitorTcpServer(fmt.Sprintf("localhost:%d", sc.PortStart+100+i), fmt.Sprintf("%s %d", name, i+1))
  94. }
  95. }
  96. func doMonitorWsServer(url string, name string) {
  97. wsServer := url
  98. //wsServer := "ws://192.168.0.18:3563"
  99. c, _, err := websocket.DefaultDialer.Dial(wsServer, nil)
  100. if err != nil {
  101. log.Debug("连接[%s,%s]服务器失败 %v time = %v", name, url, err, time.Now().Format("2006-01-02 15:04:05"))
  102. tryRestart(name)
  103. return
  104. }
  105. log.Debug("连接[%s]成功 time = %v", name, time.Now().Format("2006-01-02 15:04:05"))
  106. c.Close()
  107. }
  108. func doMonitorTcpServer(url string, name string) {
  109. tcpAddr, err := net.ResolveTCPAddr("tcp4", url)
  110. if err != nil {
  111. log.Debug("doTcpServer[%v] Fatal error: %v", name, err.Error())
  112. return
  113. }
  114. conn, err := net.DialTCP("tcp", nil, tcpAddr)
  115. if err != nil {
  116. log.Debug("连接[%v]服务器失败 %v time = %v", name, err, time.Now().Format("2006-01-02 15:04:05"))
  117. tryRestart(name)
  118. return
  119. }
  120. log.Debug("连接[%v]成功 time = %v", name, time.Now().Format("2006-01-02 15:04:05"))
  121. conn.Close()
  122. }
  123. type module struct {
  124. Name string
  125. Addr string
  126. Count int
  127. }
  128. var modules []module
  129. func run() {
  130. // 读取配置文件
  131. data, err := os.ReadFile("conf/servermonitor.json")
  132. if err != nil {
  133. log.Debug("read config failed")
  134. time.AfterFunc(time.Second*10, run)
  135. return
  136. }
  137. err = json.Unmarshal(data, &modules)
  138. if err != nil {
  139. log.Debug("Unmarshal config failed err:%v", err)
  140. time.AfterFunc(time.Second*10, run)
  141. return
  142. }
  143. utils.SetConsoleTitle(fmt.Sprintf("ServerMonitor %d apps", len(modules)))
  144. fmt.Println(string(data))
  145. doMonitor()
  146. }
  147. func doMonitor() {
  148. for _, v := range modules {
  149. if v.Count > 0 {
  150. doMonitorMultiServer(v.Name, v.Count)
  151. } else if v.Addr == "" {
  152. doMonitorConfigServer(v.Name)
  153. } else if strings.Index(v.Addr, "ws://") >= 0 {
  154. doMonitorWsServer(v.Addr, v.Name)
  155. } else {
  156. doMonitorTcpServer(v.Addr, v.Name)
  157. }
  158. }
  159. time.AfterFunc(time.Second*10, doMonitor)
  160. }
  161. func main() {
  162. defer waitInput()
  163. go run()
  164. }