brushservicelogic.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // udeServer: 一键刷库(手动补刷) —— 按服务配置的 IP/端口/密钥/保护目录,
  2. // 调外挂程序的 /api/migrate 接口,把保护目录存量明文加密进 <目录>-cipher 并清空明文。
  3. // 与创建流程的自动刷库(createservicelogic.notifyFuseBrush)共用 dispatchFuseBrush。
  4. package logic
  5. import (
  6. "context"
  7. "fmt"
  8. "udeServer/internal/svc"
  9. "udeServer/internal/types"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. )
  12. type BrushServiceLogic struct {
  13. logx.Logger
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. }
  17. func NewBrushServiceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *BrushServiceLogic {
  18. return &BrushServiceLogic{
  19. Logger: logx.WithContext(ctx),
  20. ctx: ctx,
  21. svcCtx: svcCtx,
  22. }
  23. }
  24. func (l *BrushServiceLogic) BrushService(req *types.ServiceIdReq) (*types.DeleteResp, error) {
  25. if err := checkId(req.Id); err != nil {
  26. return nil, err
  27. }
  28. svc, err := findService(l.ctx, l.svcCtx.ServiceModel, req.Id)
  29. if err != nil {
  30. return nil, err
  31. }
  32. // 挂载中拒绝刷库(第2道防线):挂载后保护目录是FUSE明文视图,历史文件已被隐藏,
  33. // 此时刷库的"清空明文"动作会穿透挂载删除底层密文,数据全失。
  34. // 前端按钮点击时已有同款拦截(第1道防线),后端这道防的是绕过前端直接调接口;
  35. // 外挂侧 rejectIfMounted 查挂载注册表兜底(第3道防线,防库状态过时)。
  36. if svc.MountStatus.String == "mounted" {
  37. return nil, fmt.Errorf("历史文件已被挂载隐藏,请先卸掉挂载再执行刷库操作")
  38. }
  39. // 查该服务的全部保护目录(目录表按 service_id 过滤)
  40. dirs, err := l.svcCtx.DirectoryModel.FindDirsByServiceId(l.ctx, req.Id)
  41. if err != nil {
  42. return nil, fmt.Errorf("查询保护目录失败: %w", err)
  43. }
  44. if len(dirs) == 0 {
  45. return nil, fmt.Errorf("该服务未配置保护目录,无库可刷")
  46. }
  47. // 下发刷库:手动补刷是显式操作,失败直接返回错误,前端红色提示(与创建流程的软处理不同)
  48. if err := dispatchFuseBrush(l.ctx, l.svcCtx, svc, dirs); err != nil {
  49. l.Errorf("brush dispatch failed, service id: %d, err: %v", req.Id, err)
  50. return nil, err
  51. }
  52. l.Infof("brush dispatch ok, service id: %d, dirs: %v", req.Id, dirs)
  53. return &types.DeleteResp{Ok: true}, nil
  54. }