JCS-pub/client/internal/mount/mount_linux.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) {
}