|
- //go:build linux || (darwin && amd64)
-
- package mount
-
- import (
- fusefs "github.com/hanwen/go-fuse/v2/fs"
- "github.com/hanwen/go-fuse/v2/fuse"
- cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
- "gitlink.org.cn/cloudream/common/utils/sync2"
- "gitlink.org.cn/cloudream/storage/client2/internal/mount/config"
- fuse2 "gitlink.org.cn/cloudream/storage/client2/internal/mount/fuse"
- "gitlink.org.cn/cloudream/storage/client2/internal/mount/vfs"
- "gitlink.org.cn/cloudream/storage/common/pkgs/db2"
- "gitlink.org.cn/cloudream/storage/common/pkgs/downloader"
- )
-
- type MountEvent interface {
- IsMountEvent() bool
- }
-
- type MountExitEvent struct {
- MountEvent
- }
-
- type MountingFailedEvent struct {
- MountEvent
- Err error
- }
-
- type Mount struct {
- cfg *config.Config
- vfs *vfs.Vfs
- fuse *fuse2.Fuse
- }
-
- func NewMount(cfg *config.Config, db *db2.DB, downloader *downloader.Downloader) *Mount {
- vfs := vfs.NewVfs(cfg, db, downloader)
- fuse := fuse2.NewFuse(cfg, vfs)
-
- return &Mount{
- cfg: cfg,
- vfs: vfs,
- fuse: fuse,
- }
- }
-
- func (m *Mount) Start() *sync2.UnboundChannel[MountEvent] {
- ch := sync2.NewUnboundChannel[MountEvent]()
- go func() {
-
- nodeFsOpt := &fusefs.Options{
- MountOptions: fuse.MountOptions{
- FsName: "CDS",
- },
- }
- rawFs := fusefs.NewNodeFS(m.fuse.Root(), nodeFsOpt)
-
- svr, err := fuse.NewServer(rawFs, m.cfg.MountPoint, &nodeFsOpt.MountOptions)
- if err != nil {
- ch.Send(MountingFailedEvent{Err: err})
- return
- }
-
- svr.Serve()
- ch.Send(MountExitEvent{})
- }()
- return ch
- }
-
- func (m *Mount) NotifyObjectInvalid(obj cdssdk.Object) {
-
- }
-
- func (m *Mount) NotifyPackageInvalid(pkg cdssdk.Package) {
-
- }
-
- func (m *Mount) NotifyBucketInvalid(bkt cdssdk.Bucket) {
-
- }
|