mnt_fs.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package amntfs
  2. import (
  3. "git.swzry.com/ProjectNagae/FsUtils/mountree"
  4. "github.com/GUAIK-ORG/go-snowflake/snowflake"
  5. "github.com/spf13/afero"
  6. )
  7. var _ afero.Fs = (*AMNTFS)(nil)
  8. type AMNTFS struct {
  9. mountTree *mountree.SimpleUnixLikePathTree[*MountNode]
  10. snowflaker *snowflake.Snowflake
  11. }
  12. func NewAMNTFS() *AMNTFS {
  13. sn, err := snowflake.NewSnowflake(0, 0)
  14. if err != nil {
  15. panic(err)
  16. }
  17. fs := &AMNTFS{
  18. mountTree: mountree.NewSimpleUnixLikePathTree[*MountNode](),
  19. snowflaker: sn,
  20. }
  21. return fs
  22. }
  23. func (fs *AMNTFS) Mount(path string, childFs afero.Fs, forceRemountExists bool) error {
  24. node := &MountNode{
  25. mountId: fs.snowflaker.NextVal(),
  26. mountPoint: path,
  27. filesystemType: childFs.Name(),
  28. filesystem: childFs,
  29. }
  30. err := fs.mountTree.Mount(path, node, forceRemountExists)
  31. if err != nil {
  32. if mountree.CheckErrorType(err, mountree.ErrMountPointAlreadyExists) {
  33. return NewAMNTFSError(ErrMountPointAlreadyMounted, nil)
  34. } else {
  35. return NewAMNTFSError(ErrUnknownInternalError, err)
  36. }
  37. }
  38. return nil
  39. }
  40. func (fs *AMNTFS) Umount(path string) error {
  41. err := fs.mountTree.Umount(path)
  42. if err != nil {
  43. if mountree.CheckErrorType(err, mountree.ErrMountPointNotExists) {
  44. return NewAMNTFSError(ErrMountPointAlreadyMounted, nil)
  45. } else {
  46. return NewAMNTFSError(ErrUnknownInternalError, err)
  47. }
  48. }
  49. return nil
  50. }
  51. func (fs *AMNTFS) ListAllMount() []MountInfoEntity {
  52. mil := make([]MountInfoEntity, 0)
  53. fs.mountTree.ListAllMount(func(path string, payload *MountNode) {
  54. mil = append(mil, MountInfoEntity{
  55. MountId: payload.MountId(),
  56. MountPoint: payload.MountPoint(),
  57. FsType: payload.FsType(),
  58. })
  59. })
  60. return mil
  61. }
  62. func (fs *AMNTFS) getMountEntity(path string) (*MountNode, string) {
  63. p, remain, err := fs.mountTree.GetPayload(path)
  64. if err != nil {
  65. return nil, ""
  66. }
  67. return *p, remain
  68. }