forked from Elara6331/itd
yannickulrich
9ecd45dadd
This exposes the watches' file system over FUSE. This way, we can access files on the watch without having to go through `itctl` or developing 3rd party tools. **Features** - [x] read/write access to the file system - [x] read access to momentary sensor data - [x] live access to sensor data (i.e. WatchMotion rather than Motion) - [x] configuration of mount point Co-authored-by: Yannick Ulrich <yannick.ulrich@durham.ac.uk> Reviewed-on: https://gitea.arsenm.dev/Arsen6331/itd/pulls/55 Co-authored-by: yannickulrich <yannick.ulrich@protonmail.com> Co-committed-by: yannickulrich <yannick.ulrich@protonmail.com>
61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package main
|
|
import (
|
|
"go.arsenm.dev/itd/internal/fusefs"
|
|
"os"
|
|
"github.com/hanwen/go-fuse/v2/fs"
|
|
"github.com/hanwen/go-fuse/v2/fuse"
|
|
"go.arsenm.dev/logger/log"
|
|
"context"
|
|
"go.arsenm.dev/infinitime"
|
|
)
|
|
|
|
func startFUSE(ctx context.Context, dev *infinitime.Device) error {
|
|
// This is where we'll mount the FS
|
|
err := os.MkdirAll(k.String("fuse.mountpoint"), 0755)
|
|
if err != nil && !os.IsExist(err) {
|
|
return err
|
|
}
|
|
|
|
// Ignore the error because nothing might be mounted on the mountpoint
|
|
_ = fusefs.Unmount(k.String("fuse.mountpoint"))
|
|
|
|
|
|
root, err := fusefs.BuildRootNode(dev)
|
|
if err != nil {
|
|
log.Error("Building root node failed").
|
|
Err(err).
|
|
Send()
|
|
return err
|
|
}
|
|
|
|
server, err := fs.Mount(k.String("fuse.mountpoint"), root, &fs.Options{
|
|
MountOptions: fuse.MountOptions{
|
|
// Set to true to see how the file system works.
|
|
Debug: false,
|
|
SingleThreaded: true,
|
|
},
|
|
})
|
|
if err != nil {
|
|
log.Error("Mounting failed").
|
|
Str("target", k.String("fuse.mountpoint")).
|
|
Err(err).
|
|
Send()
|
|
return err
|
|
}
|
|
|
|
log.Info("Mounted on target").
|
|
Str("target", k.String("fuse.mountpoint")).
|
|
Send()
|
|
|
|
fusefs.BuildProperties(dev)
|
|
|
|
if err != nil {
|
|
log.Warn("Error getting BLE filesystem").Err(err).Send()
|
|
return err
|
|
}
|
|
|
|
// Wait until unmount before exiting
|
|
go server.Serve()
|
|
return nil
|
|
}
|