| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package main
- import (
- "encoding/json"
- "fmt"
- "net"
- "os"
- "os/exec"
- "strings"
- "time"
- "bet24.com/log"
- "bet24.com/utils"
- "github.com/gorilla/websocket"
- )
- type serverconfig struct {
- ServerPort int
- }
- type multipleServerconfig struct {
- PortStart int
- }
- type roomconfig struct {
- ServerPort int
- }
- type room struct {
- Config roomconfig
- }
- type rooms struct {
- Rooms []room
- }
- func waitInput() {
- for {
- var endInput string
- fmt.Scanln(&endInput)
- switch endInput {
- case "list":
- fmt.Println(modules)
- default:
- fmt.Println("unknown command")
- }
- }
- }
- func tryRestart(name string) {
- cmd := exec.Command("cmd.exe", "/c", fmt.Sprintf("start cmd.exe /k %v", name))
- cmd.Start()
- }
- func doMonitorConfigServer(name string) {
- var sc serverconfig
- configFile := fmt.Sprintf("%s/server.json", name)
- data, err := os.ReadFile(configFile)
- if err != nil {
- log.Debug("doMonitorConfigServer read config[%s] failed", configFile)
- }
- err = json.Unmarshal(data, &sc)
- if err != nil {
- log.Debug("Unmarshal config failed err:%v", err)
- return
- }
- // 百人游戏,端口在rooms
- if sc.ServerPort == 0 {
- doMonitorBacServer(name)
- return
- }
- doMonitorTcpServer(fmt.Sprintf("localhost:%d", sc.ServerPort+100), name)
- }
- func doMonitorBacServer(name string) {
- var sc rooms
- configFile := fmt.Sprintf("%s/rooms.json", name)
- data, err := os.ReadFile(configFile)
- if err != nil {
- log.Debug("doMonitorBacServer read config[%s] failed", configFile)
- }
- err = json.Unmarshal(data, &sc)
- if err != nil {
- log.Debug("doMonitorBacServer Unmarshal config failed err:%v", err)
- return
- }
- for _, v := range sc.Rooms {
- doMonitorTcpServer(fmt.Sprintf("localhost:%d", v.Config.ServerPort+100), name)
- }
- }
- func doMonitorMultiServer(name string, count int) {
- var sc multipleServerconfig
- configFile := fmt.Sprintf("%s/server.json", name)
- data, err := os.ReadFile(configFile)
- if err != nil {
- log.Debug("doMonitorMultiServer read config[%s] failed", configFile)
- }
- err = json.Unmarshal(data, &sc)
- if err != nil {
- log.Debug("doMonitorMultiServer Unmarshal config failed err:%v", err)
- return
- }
- for i := 0; i < count; i++ {
- doMonitorTcpServer(fmt.Sprintf("localhost:%d", sc.PortStart+100+i), fmt.Sprintf("%s %d", name, i+1))
- }
- }
- func doMonitorWsServer(url string, name string) {
- wsServer := url
- //wsServer := "ws://192.168.0.18:3563"
- c, _, err := websocket.DefaultDialer.Dial(wsServer, nil)
- if err != nil {
- log.Debug("连接[%s,%s]服务器失败 %v time = %v", name, url, err, time.Now().Format("2006-01-02 15:04:05"))
- tryRestart(name)
- return
- }
- log.Debug("连接[%s]成功 time = %v", name, time.Now().Format("2006-01-02 15:04:05"))
- c.Close()
- }
- func doMonitorTcpServer(url string, name string) {
- tcpAddr, err := net.ResolveTCPAddr("tcp4", url)
- if err != nil {
- log.Debug("doTcpServer[%v] Fatal error: %v", name, err.Error())
- return
- }
- conn, err := net.DialTCP("tcp", nil, tcpAddr)
- if err != nil {
- log.Debug("连接[%v]服务器失败 %v time = %v", name, err, time.Now().Format("2006-01-02 15:04:05"))
- tryRestart(name)
- return
- }
- log.Debug("连接[%v]成功 time = %v", name, time.Now().Format("2006-01-02 15:04:05"))
- conn.Close()
- }
- type module struct {
- Name string
- Addr string
- Count int
- }
- var modules []module
- func run() {
- // 读取配置文件
- data, err := os.ReadFile("conf/servermonitor.json")
- if err != nil {
- log.Debug("read config failed")
- time.AfterFunc(time.Second*10, run)
- return
- }
- err = json.Unmarshal(data, &modules)
- if err != nil {
- log.Debug("Unmarshal config failed err:%v", err)
- time.AfterFunc(time.Second*10, run)
- return
- }
- utils.SetConsoleTitle(fmt.Sprintf("ServerMonitor %d apps", len(modules)))
- fmt.Println(string(data))
- doMonitor()
- }
- func doMonitor() {
- for _, v := range modules {
- if v.Count > 0 {
- doMonitorMultiServer(v.Name, v.Count)
- } else if v.Addr == "" {
- doMonitorConfigServer(v.Name)
- } else if strings.Index(v.Addr, "ws://") >= 0 {
- doMonitorWsServer(v.Addr, v.Name)
- } else {
- doMonitorTcpServer(v.Addr, v.Name)
- }
- }
- time.AfterFunc(time.Second*10, doMonitor)
- }
- func main() {
- defer waitInput()
- go run()
- }
|