autoupdate.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package tools
  2. // 自动升级配置(只读,与 ToolBox“自动升级”页面同源):按 aGate 硬件类型配置可自动升级的 EMS 版本、aPower 硬件与升级步骤(升级包)。
  3. import (
  4. "context"
  5. "errors"
  6. "strings"
  7. "github.com/mark3labs/mcp-go/mcp"
  8. "go.mongodb.org/mongo-driver/mongo"
  9. "fwh-toolbox-server/agentmcp/kit"
  10. "fwh-toolbox-server/domain"
  11. "fwh-toolbox-server/services"
  12. )
  13. // ---- auto_update_catalog ----
  14. var AutoUpdateCatalog = kit.Def[kit.NoArgs]{
  15. Name: "auto_update_catalog",
  16. Title: "查询自动升级目录",
  17. Description: "列出自动升级配置的目录:aGateHardware(已配置的 aGate 硬件类型,作为 auto_update_config_get 的参数)、" +
  18. "packages(升级包文件名,按 system 系统包、aGate、subDevice 子设备包、others 分类)、aPowerVersions(aPower 硬件版本号与名称)。",
  19. ReadOnly: true,
  20. Handler: func(ctx context.Context, _ kit.NoArgs) (*mcp.CallToolResult, error) {
  21. opt, err := services.GetAutoUpdateConfigOption()
  22. if err != nil {
  23. return kit.Upstream("ToolBox 自动升级配置", err), nil
  24. }
  25. ap, err := services.GetAutoUpdateAPowerVersion()
  26. if err != nil {
  27. return kit.Upstream("ToolBox 自动升级配置", err), nil
  28. }
  29. return kit.Object(map[string]any{"aGateHardware": opt.AGateVersions, "packages": opt.Packages, "aPowerVersions": ap}), nil
  30. },
  31. }
  32. // ---- auto_update_config_get ----
  33. type autoUpdateConfigArgs struct {
  34. AGate string `json:"aGate" jsonschema:"aGate 硬件类型(auto_update_catalog 的 aGateHardware 中的值)"`
  35. }
  36. var AutoUpdateConfigGet = kit.Def[autoUpdateConfigArgs]{
  37. Name: "auto_update_config_get",
  38. Title: "查询 aGate 自动升级配置",
  39. Description: "查询某个 aGate 硬件类型的自动升级配置:default(标准升级)与 special(备件换件、休眠等特殊场景)。" +
  40. "每项含 emsVersions(满足条件的当前 EMS 版本)、aPowerVersions(满足条件的 aPower 硬件版本)、steps(按顺序执行的升级包:file、title、invVersion)。" +
  41. "special 中 useDefaultUpdate=true 表示先执行特殊步骤再追加标准步骤,否则只执行特殊步骤。用于回答“某类站点会升级到什么版本”。",
  42. ReadOnly: true,
  43. Handler: func(ctx context.Context, a autoUpdateConfigArgs) (*mcp.CallToolResult, error) {
  44. hw, err := kit.Required("aGate", a.AGate)
  45. if err != nil {
  46. return kit.Fail(err), nil
  47. }
  48. cfg, err := services.GetAutoUpdateConfig(hw)
  49. if errors.Is(err, mongo.ErrNoDocuments) {
  50. return kit.Failf("没有 aGate 硬件类型 %s 的自动升级配置,可用 auto_update_catalog 查看已配置的类型", hw), nil
  51. }
  52. if err != nil {
  53. return kit.Upstream("ToolBox 自动升级配置", err), nil
  54. }
  55. packages := map[string]map[string]any{}
  56. steps := func(files []string) []map[string]any {
  57. out := make([]map[string]any, 0, len(files))
  58. for _, f := range files {
  59. p, ok := packages[f]
  60. if !ok {
  61. p = map[string]any{"file": f}
  62. if info, err := services.GetAutoUpdatePackageInfo(f); err == nil && info != nil {
  63. p["title"], p["invVersion"] = info.Title, info.InvVersion
  64. } else {
  65. p["note"] = "升级包信息缺失"
  66. }
  67. packages[f] = p
  68. }
  69. out = append(out, p)
  70. }
  71. return out
  72. }
  73. def := cfg.Config.DefaultType
  74. special := make([]map[string]any, 0, len(cfg.Config.SpecialType))
  75. for _, s := range cfg.Config.SpecialType {
  76. special = append(special, map[string]any{
  77. "title": s.Title, "emsVersions": versionList(s.EmsVersions), "aPowerVersions": s.APowerVersions,
  78. "steps": steps(s.SpecialUpdateOrder), "useDefaultUpdate": s.UseDefaultUpdate,
  79. })
  80. }
  81. return kit.Object(map[string]any{
  82. "aGate": cfg.Id,
  83. "default": map[string]any{
  84. "emsVersions": versionList(def.EmsVersions), "aPowerVersions": def.APowerVersions, "steps": steps(def.UpdateOrder),
  85. },
  86. "special": special,
  87. }), nil
  88. },
  89. }
  90. // versionList EMS 版本条件:版本号(带备注时附在后面)
  91. func versionList(vs []domain.AutoUpdateSoftwareVersionInfo[string]) []string {
  92. out := make([]string, 0, len(vs))
  93. for _, v := range vs {
  94. s := v.Version
  95. if r := strings.TrimSpace(v.Remark); r != "" {
  96. s += "(" + r + ")"
  97. }
  98. out = append(out, s)
  99. }
  100. return out
  101. }