add a bunch of methods to the client end

This commit is contained in:
Barak Michener 2018-03-30 21:34:51 -07:00
parent a5d237df2a
commit 5ab2cbd265
8 changed files with 236 additions and 17 deletions

View file

@ -4,6 +4,7 @@ import (
"io"
"os"
"path/filepath"
"syscall"
"github.com/barakmich/kubelwagen"
"github.com/hanwen/go-fuse/fuse"
@ -28,6 +29,38 @@ func (fs *LocalFs) Handle(r *kubelwagen.Request) *kubelwagen.Response {
return fs.openDir(r)
case kubelwagen.MethodGetAttr:
return fs.getAttr(r)
case kubelwagen.MethodStatFs:
return fs.statFs(r)
case kubelwagen.MethodChmod:
return fs.serveFromErr(r, os.Chmod(fs.getPath(r), os.FileMode(r.Mode)))
case kubelwagen.MethodChown:
return fs.serveFromErr(r, os.Chown(fs.getPath(r), int(r.UID), int(r.GID)))
case kubelwagen.MethodTruncate:
return fs.serveFromErr(r, os.Truncate(fs.getPath(r), r.Offset))
case kubelwagen.MethodMknod:
return fs.serveFromErr(r, syscall.Mknod(fs.getPath(r), r.Mode, int(r.Dev)))
case kubelwagen.MethodMkdir:
return fs.serveFromErr(r, os.Mkdir(fs.getPath(r), os.FileMode(r.Mode)))
case kubelwagen.MethodUnlink:
return fs.serveFromErr(r, syscall.Unlink(fs.getPath(r)))
case kubelwagen.MethodRmdir:
return fs.serveFromErr(r, syscall.Rmdir(fs.getPath(r)))
case kubelwagen.MethodSymlink:
return fs.serveFromErr(r, os.Symlink(r.NewPath, fs.getPath(r)))
case kubelwagen.MethodRename:
return fs.serveFromErr(r, os.Rename(fs.getPath(r), filepath.Join(fs.base, r.NewPath)))
case kubelwagen.MethodLink:
return fs.serveFromErr(r, os.Link(fs.getPath(r), filepath.Join(fs.base, r.NewPath)))
case kubelwagen.MethodReadLink:
f, err := os.Readlink(fs.getPath(r))
if err != nil {
return kubelwagen.ErrorResp(r, nil)
}
out := fs.serveFromErr(r, err)
out.LinkStr = f
return out
case kubelwagen.MethodAccess:
return fs.serveFromErr(r, syscall.Access(fs.getPath(r), r.Mode))
}
return &kubelwagen.Response{
ID: r.ID,
@ -99,3 +132,31 @@ func (fs *LocalFs) getAttr(r *kubelwagen.Request) *kubelwagen.Response {
out.Stat = fuse.ToAttr(fi)
return out
}
func (fs *LocalFs) statFs(r *kubelwagen.Request) *kubelwagen.Response {
out := &kubelwagen.Response{
ID: r.ID,
Code: fuse.OK,
}
s := syscall.Statfs_t{}
err := syscall.Statfs(fs.getPath(r), &s)
if err != nil {
return kubelwagen.ErrorResp(r, err)
}
g := &fuse.StatfsOut{}
g.FromStatfsT(&s)
out.Statfs = g
return out
}
func (fs *LocalFs) serveFromErr(r *kubelwagen.Request, err error) *kubelwagen.Response {
out := &kubelwagen.Response{
ID: r.ID,
Code: fuse.OK,
}
if err != nil {
return kubelwagen.ErrorResp(r, err)
}
return out
}