//go:build linux || (darwin && amd64) package mount import ( fusefs "github.com/hanwen/go-fuse/v2/fs" "github.com/hanwen/go-fuse/v2/fuse" "gitlink.org.cn/cloudream/common/pkgs/async" db2 "gitlink.org.cn/cloudream/jcs-pub/client/internal/db" "gitlink.org.cn/cloudream/jcs-pub/client/internal/downloader" "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/config" fuse2 "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/fuse" "gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/vfs" "gitlink.org.cn/cloudream/jcs-pub/client/internal/uploader" clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types" ) type Mount struct { cfg *config.Config vfs *vfs.Vfs fuse *fuse2.Fuse fuseServer *fuse.Server eventChan *MountEventChan } func NewMount(cfg *config.Config, db *db2.DB, uploader *uploader.Uploader, downloader *downloader.Downloader) *Mount { mnt := &Mount{ cfg: cfg, eventChan: async.NewUnboundChannel[MountEvent](), } if cfg != nil { mnt.vfs = vfs.NewVfs(cfg, db, uploader, downloader) mnt.fuse = fuse2.NewFuse(cfg, mnt.vfs) } return mnt } func (m *Mount) Start() *MountEventChan { if m.cfg == nil { return m.eventChan } go func() { m.vfs.Start() defer m.vfs.Stop() nodeFsOpt := &fusefs.Options{ MountOptions: fuse.MountOptions{ AllowOther: true, FsName: "CDS", // Debug: true, }, GID: m.cfg.GID, UID: m.cfg.UID, } rawFs := fusefs.NewNodeFS(m.fuse.Root(), nodeFsOpt) svr, err := fuse.NewServer(rawFs, m.cfg.MountPoint, &nodeFsOpt.MountOptions) if err != nil { m.eventChan.Send(ExitEvent{Err: err}) return } m.fuseServer = svr svr.Serve() m.eventChan.Send(ExitEvent{}) }() return m.eventChan } func (m *Mount) Stop() { if m.fuseServer == nil { m.eventChan.Send(ExitEvent{}) return } m.fuseServer.Unmount() } func (m *Mount) MountPoint() string { if m.cfg == nil { return "" } return m.cfg.MountPoint } func (m *Mount) Dump() MountStatus { if m.vfs == nil { return MountStatus{} } cacheStatus := m.vfs.Dump() return MountStatus{ Cache: cacheStatus, } } func (m *Mount) ReclaimSpace() { if m.vfs == nil { return } m.vfs.ReclaimSpace() } func (m *Mount) NotifyObjectInvalid(obj clitypes.Object) { } func (m *Mount) NotifyPackageInvalid(pkg clitypes.Package) { } func (m *Mount) NotifyBucketInvalid(bkt clitypes.Bucket) { }