110 lines
2.2 KiB
Go
110 lines
2.2 KiB
Go
//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{
|
|
FsName: "CDS",
|
|
// Debug: true,
|
|
},
|
|
}
|
|
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) NotifyObjectInvalid(obj clitypes.Object) {
|
|
|
|
}
|
|
|
|
func (m *Mount) NotifyPackageInvalid(pkg clitypes.Package) {
|
|
|
|
}
|
|
|
|
func (m *Mount) NotifyBucketInvalid(bkt clitypes.Bucket) {
|
|
|
|
}
|