auto_update.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "github.com/mark3labs/mcp-go/server"
  7. "fwh-toolbox-server/cmd/mcp/tools/helper"
  8. "fwh-toolbox-server/domain"
  9. "fwh-toolbox-server/services"
  10. )
  11. func registerAutoUpdateTools(s *server.MCPServer) {
  12. s.AddTool(
  13. mcp.NewTool("service_auto_update_get_options",
  14. mcp.WithDescription("查询自动升级配置选项(升级包列表和 aGate 版本列表)"),
  15. ),
  16. handleAutoUpdateGetOptions,
  17. )
  18. s.AddTool(
  19. mcp.NewTool("service_auto_update_get_package",
  20. mcp.WithDescription("查询指定升级包的详细信息"),
  21. mcp.WithString("file_name", mcp.Required(), mcp.Description("升级包文件名")),
  22. ),
  23. handleAutoUpdateGetPackage,
  24. )
  25. s.AddTool(
  26. mcp.NewTool("service_auto_update_create_package",
  27. mcp.WithDescription("创建升级包信息 [写操作]"),
  28. mcp.WithString("package_type", mcp.Required(), mcp.Description("包类型:system, aGate, subDevice, others")),
  29. mcp.WithString("info", mcp.Required(), mcp.Description("升级包信息 JSON,包含 id(文件名)、title、invVersion[]")),
  30. ),
  31. handleAutoUpdateCreatePackage,
  32. )
  33. s.AddTool(
  34. mcp.NewTool("service_auto_update_update_package",
  35. mcp.WithDescription("更新升级包信息 [写操作]"),
  36. mcp.WithString("file_name", mcp.Required(), mcp.Description("升级包文件名")),
  37. mcp.WithString("info", mcp.Required(), mcp.Description("升级包信息 JSON,包含 id、title、invVersion[]")),
  38. ),
  39. handleAutoUpdateUpdatePackage,
  40. )
  41. s.AddTool(
  42. mcp.NewTool("service_auto_update_delete_package",
  43. mcp.WithDescription("删除升级包信息 [写操作]"),
  44. mcp.WithString("package_type", mcp.Required(), mcp.Description("包类型:system, aGate, subDevice, others")),
  45. mcp.WithString("file_name", mcp.Required(), mcp.Description("升级包文件名")),
  46. ),
  47. handleAutoUpdateDeletePackage,
  48. )
  49. s.AddTool(
  50. mcp.NewTool("service_auto_update_get_apower_version",
  51. mcp.WithDescription("查询 aPower 硬件版本列表"),
  52. ),
  53. handleAutoUpdateGetAPowerVersion,
  54. )
  55. s.AddTool(
  56. mcp.NewTool("service_auto_update_get_config",
  57. mcp.WithDescription("查询指定 aGate 版本的自动升级配置"),
  58. mcp.WithString("agate_version", mcp.Required(), mcp.Description("aGate 硬件版本号")),
  59. ),
  60. handleAutoUpdateGetConfig,
  61. )
  62. s.AddTool(
  63. mcp.NewTool("service_auto_update_update_config",
  64. mcp.WithDescription("更新指定 aGate 版本的自动升级配置 [写操作]"),
  65. mcp.WithString("agate_version", mcp.Required(), mcp.Description("aGate 硬件版本号")),
  66. mcp.WithString("config", mcp.Required(), mcp.Description("配置 JSON,包含 config.defaultType 和 config.specialType")),
  67. ),
  68. handleAutoUpdateUpdateConfig,
  69. )
  70. s.AddTool(
  71. mcp.NewTool("service_auto_update_delete_config",
  72. mcp.WithDescription("删除指定 aGate 版本的自动升级配置 [写操作]"),
  73. mcp.WithString("agate_version", mcp.Required(), mcp.Description("aGate 硬件版本号")),
  74. ),
  75. handleAutoUpdateDeleteConfig,
  76. )
  77. s.AddTool(
  78. mcp.NewTool("service_auto_update_file_list",
  79. mcp.WithDescription("查询自动升级配置文件列表(已生成的 Excel 文件)"),
  80. mcp.WithNumber("page", mcp.Description("页码,从1开始,默认1")),
  81. mcp.WithNumber("size", mcp.Description("每页数量,默认10")),
  82. ),
  83. handleAutoUpdateFileList,
  84. )
  85. s.AddTool(
  86. mcp.NewTool("service_auto_update_create_file",
  87. mcp.WithDescription("生成新的自动升级配置 Excel 文件 [写操作]"),
  88. ),
  89. handleAutoUpdateCreateFile,
  90. )
  91. }
  92. func handleAutoUpdateGetOptions(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  93. data, err := services.GetAutoUpdateConfigOption()
  94. if err != nil {
  95. return helper.ServiceError("查询升级配置选项", err), nil
  96. }
  97. return helper.JSONResultOrFileAuto(data), nil
  98. }
  99. func handleAutoUpdateGetPackage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  100. fileName, err := req.RequireString("file_name")
  101. if err != nil {
  102. return helper.ParamError("file_name"), nil
  103. }
  104. data, err := services.GetAutoUpdatePackageInfo(fileName)
  105. if err != nil {
  106. return helper.ServiceError("查询升级包信息", err), nil
  107. }
  108. return helper.JSONResultOrFileAuto(data), nil
  109. }
  110. func handleAutoUpdateCreatePackage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  111. packageType, err := req.RequireString("package_type")
  112. if err != nil {
  113. return helper.ParamError("package_type"), nil
  114. }
  115. infoStr, err := req.RequireString("info")
  116. if err != nil {
  117. return helper.ParamError("info"), nil
  118. }
  119. var info domain.AutoUpdatePackages
  120. if err := json.Unmarshal([]byte(infoStr), &info); err != nil {
  121. return helper.ParamInvalidError("info", "需要有效的JSON格式"), nil
  122. }
  123. if err := services.CreateAutoUpdatePackageInfo(packageType, info); err != nil {
  124. return helper.ServiceError("创建升级包", err), nil
  125. }
  126. return helper.TextResult("升级包创建成功"), nil
  127. }
  128. func handleAutoUpdateUpdatePackage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  129. fileName, err := req.RequireString("file_name")
  130. if err != nil {
  131. return helper.ParamError("file_name"), nil
  132. }
  133. infoStr, err := req.RequireString("info")
  134. if err != nil {
  135. return helper.ParamError("info"), nil
  136. }
  137. var info domain.AutoUpdatePackages
  138. if err := json.Unmarshal([]byte(infoStr), &info); err != nil {
  139. return helper.ParamInvalidError("info", "需要有效的JSON格式"), nil
  140. }
  141. if err := services.UpdateAutoUpdatePackageInfo(fileName, info); err != nil {
  142. return helper.ServiceError("更新升级包", err), nil
  143. }
  144. return helper.TextResult("升级包更新成功"), nil
  145. }
  146. func handleAutoUpdateDeletePackage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  147. packageType, err := req.RequireString("package_type")
  148. if err != nil {
  149. return helper.ParamError("package_type"), nil
  150. }
  151. fileName, err := req.RequireString("file_name")
  152. if err != nil {
  153. return helper.ParamError("file_name"), nil
  154. }
  155. if err := services.DeleteAutoUpdatePackageInfo(packageType, fileName); err != nil {
  156. return helper.ServiceError("删除升级包", err), nil
  157. }
  158. return helper.TextResult("升级包删除成功"), nil
  159. }
  160. func handleAutoUpdateGetAPowerVersion(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  161. data, err := services.GetAutoUpdateAPowerVersion()
  162. if err != nil {
  163. return helper.ServiceError("查询aPower版本列表", err), nil
  164. }
  165. return helper.JSONResultOrFileAuto(data), nil
  166. }
  167. func handleAutoUpdateGetConfig(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  168. agateVersion, err := req.RequireString("agate_version")
  169. if err != nil {
  170. return helper.ParamError("agate_version"), nil
  171. }
  172. data, err := services.GetAutoUpdateConfig(agateVersion)
  173. if err != nil {
  174. return helper.ServiceError("查询升级配置", err), nil
  175. }
  176. return helper.JSONResultOrFileAuto(data), nil
  177. }
  178. func handleAutoUpdateUpdateConfig(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  179. agateVersion, err := req.RequireString("agate_version")
  180. if err != nil {
  181. return helper.ParamError("agate_version"), nil
  182. }
  183. configStr, err := req.RequireString("config")
  184. if err != nil {
  185. return helper.ParamError("config"), nil
  186. }
  187. var config domain.AutoUpdateConfig
  188. if err := json.Unmarshal([]byte(configStr), &config); err != nil {
  189. return helper.ParamInvalidError("config", "需要有效的JSON格式"), nil
  190. }
  191. if err := services.UpdateAutoUpdateConfig(agateVersion, config); err != nil {
  192. return helper.ServiceError("更新升级配置", err), nil
  193. }
  194. return helper.TextResult("升级配置更新成功"), nil
  195. }
  196. func handleAutoUpdateDeleteConfig(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  197. agateVersion, err := req.RequireString("agate_version")
  198. if err != nil {
  199. return helper.ParamError("agate_version"), nil
  200. }
  201. if err := services.DeleteAutoUpdateConfig(agateVersion); err != nil {
  202. return helper.ServiceError("删除升级配置", err), nil
  203. }
  204. return helper.TextResult("升级配置删除成功"), nil
  205. }
  206. func handleAutoUpdateFileList(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  207. page := uint(req.GetFloat("page", 1))
  208. size := uint(req.GetFloat("size", 10))
  209. data, err := services.GetAutoUpdateConfigFileInfo(page, size)
  210. if err != nil {
  211. return helper.ServiceError("查询配置文件列表", err), nil
  212. }
  213. return helper.PageResult(data.Total, data.PageSize, data.PageNum, data.Data, "auto_update_file_list"), nil
  214. }
  215. func handleAutoUpdateCreateFile(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  216. if err := services.CreateAutoUpdateConfigFile(); err != nil {
  217. return helper.ServiceError("生成配置文件", err), nil
  218. }
  219. return helper.TextResult("配置文件生成成功"), nil
  220. }