53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"net"
|
||
|
|
||
|
"github.com/go-git/go-billy/v5"
|
||
|
"github.com/go-git/go-billy/v5/memfs"
|
||
|
|
||
|
nfs "git.kmsign.ru/royalcat/tstor/pkg/go-nfs"
|
||
|
"git.kmsign.ru/royalcat/tstor/pkg/go-nfs/helpers"
|
||
|
nfshelper "git.kmsign.ru/royalcat/tstor/pkg/go-nfs/helpers"
|
||
|
)
|
||
|
|
||
|
// ROFS is an intercepter for the filesystem indicating it should
|
||
|
// be read only. The undelrying billy.Memfs indicates it supports
|
||
|
// writing, but does not in implement billy.Change to support
|
||
|
// modification of permissions / modTimes, and as such cannot be
|
||
|
// used as RW system.
|
||
|
type ROFS struct {
|
||
|
nfs.Filesystem
|
||
|
}
|
||
|
|
||
|
// Capabilities exports the filesystem as readonly
|
||
|
func (ROFS) Capabilities() billy.Capability {
|
||
|
return billy.ReadCapability | billy.SeekCapability
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
ctx := context.Background()
|
||
|
|
||
|
listener, err := net.Listen("tcp", ":0")
|
||
|
if err != nil {
|
||
|
fmt.Printf("Failed to listen: %v\n", err)
|
||
|
return
|
||
|
}
|
||
|
fmt.Printf("Server running at %s\n", listener.Addr())
|
||
|
|
||
|
mem := helpers.WrapBillyFS(memfs.New())
|
||
|
f, err := mem.Create(ctx, "hello.txt")
|
||
|
if err != nil {
|
||
|
fmt.Printf("Failed to create file: %v\n", err)
|
||
|
return
|
||
|
}
|
||
|
_, _ = f.Write(ctx, []byte("hello world"))
|
||
|
_ = f.Close(ctx)
|
||
|
|
||
|
handler := nfshelper.NewNullAuthHandler(ROFS{mem})
|
||
|
cacheHelper := nfshelper.NewCachingHandler(handler, 1024)
|
||
|
fmt.Printf("%v", nfs.Serve(listener, cacheHelper))
|
||
|
}
|