xugu_start.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package auto
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "xg_auto_deploy/internal/config"
  7. "xg_auto_deploy/internal/global"
  8. "xg_auto_deploy/internal/models"
  9. "xg_auto_deploy/internal/remote"
  10. )
  11. func StartAll() {
  12. for NodeId, nodeTemp := range global.ServerNodeConfigs {
  13. global.Logs.Infoln("----------------开始启动服务器----------------------------")
  14. wg.Add(1)
  15. go func(serverNodeConfig models.ServerNodeConfig, serverNodeId string) {
  16. if serverNodeConfig.XuguAddr != "" {
  17. //删除stdout.txt文件
  18. _, err := remote.SingleCmd(&serverNodeConfig, fmt.Sprintf("rm -f %s/BIN/stdout.txt", serverNodeConfig.XuguAddr))
  19. if err != nil {
  20. global.Logs.Errorf("删除%s节点stdout.txt文件失败\n", serverNodeId)
  21. }
  22. xgBin := findXuguBin(&serverNodeConfig)
  23. //fmt.Println("启动服务器:", serverNodeId)
  24. cmd := fmt.Sprintf("stdbuf -o0 %s/BIN/%s -service ", serverNodeConfig.XuguAddr, xgBin)
  25. //cmd := fmt.Sprintf("%s/BIN/xugu_cluster_linux_aarch64_20240416 -service > /dev/null ", serverNodeConfig.XuguAddr)
  26. global.Logs.Infof("%s节点执行命令%s\n", serverNodeId, cmd)
  27. ret, err := remote.SingleCmdTime(&serverNodeConfig, cmd)
  28. if err != nil {
  29. global.Logs.Errorf("启动%s节点数据库失败\n", serverNodeId)
  30. } else {
  31. global.Logs.Infof("%s节点执行命令返回: %s", serverNodeId, ret)
  32. }
  33. if checkXuguPort(&serverNodeConfig) {
  34. global.Logs.Infof("启动%s节点数据库成功\n", serverNodeId)
  35. } else {
  36. //等待5秒进行第二次查询
  37. time.Sleep(5 * time.Second)
  38. if checkXuguPort(&serverNodeConfig) {
  39. global.Logs.Infof("启动%s节点数据库成功\n", serverNodeId)
  40. } else {
  41. global.Logs.Errorf("启动%s节点数据库失败\n", serverNodeId)
  42. //对stdout.txt查询
  43. ret, err := remote.SingleCmd(&serverNodeConfig, fmt.Sprintf("cat %s/BIN/stdout.txt", serverNodeConfig.XuguAddr))
  44. if err != nil {
  45. global.Logs.Errorf("查询%s节点数据库stdout.txt文件失败\n", serverNodeId)
  46. }
  47. global.Logs.Printf("查询%s节点数据库stdout.txt : %s\n", serverNodeId, ret)
  48. }
  49. }
  50. }
  51. defer wg.Done()
  52. }(nodeTemp, NodeId)
  53. }
  54. wg.Wait()
  55. }
  56. func findXuguBin(serverNodeConfig *models.ServerNodeConfig) string {
  57. cmd := fmt.Sprintf("cd %s/BIN/ && ls", serverNodeConfig.XuguAddr)
  58. global.Logs.Infoln("执行命令:", cmd)
  59. input, err := remote.SingleCmd(serverNodeConfig, cmd)
  60. if err != nil {
  61. global.Logs.Errorf("查找虚谷BIN文件出错 Error:\n", err)
  62. }
  63. items := strings.Split(input, "\n")
  64. var result []string
  65. // 过滤掉包含 "init"、"console" 和 ".sh" 的字符串
  66. for _, str := range items {
  67. if !strings.Contains(str, "init") && !strings.Contains(str, "console") && !strings.HasSuffix(str, ".sh") {
  68. result = append(result, str)
  69. }
  70. }
  71. // 将结果数组重新组合为字符串
  72. //output := `"` + strings.Join(result, `", "`) + `"`
  73. return result[0]
  74. }
  75. func checkXuguPort(serverNodeConfig *models.ServerNodeConfig) bool {
  76. xuguIniDownloadTempbuf := remote.DownloadFileBuffer(serverNodeConfig, fmt.Sprintf(serverNodeConfig.XuguAddr+"/SETUP/xugu.ini"))
  77. keyToFind := "listen_port"
  78. port, err := config.GetXginiValue(xuguIniDownloadTempbuf, keyToFind)
  79. if err != nil {
  80. global.Logs.Errorf("查找虚谷ini配置文件出错 Error:\n", err)
  81. }
  82. remote.SingleCmd(serverNodeConfig, "chmod -R +x "+serverNodeConfig.XuguAddr)
  83. ret, err := remote.SingleCmdTime(serverNodeConfig, "lsof -i:"+port)
  84. if err != nil {
  85. //fmt.Println("执行命令失败:", err)
  86. return false
  87. } else {
  88. global.Logs.Infoln("执行命令返回 ret:", ret)
  89. return true
  90. }
  91. }