Переглянути джерело

Added WIP sharefs abstraction

Toby Chui 3 роки тому
батько
коміт
2b157aa234
3 змінених файлів з 132 додано та 21 видалено
  1. 112 0
      mod/filesystem/abstractions/sharefs/sharefs.go
  2. 19 20
      mod/filesystem/filesystem.go
  3. 1 1
      storage.go

+ 112 - 0
mod/filesystem/abstractions/sharefs/sharefs.go

@@ -0,0 +1,112 @@
+package sharefs
+
+import (
+	"errors"
+	"io"
+	"os"
+	"path/filepath"
+	"time"
+)
+
+/*
+	filesystemAbstraction.go
+
+	This file contains all the abstraction funtion of a local file system.
+
+*/
+
+type ShareFileSystemAbstraction struct {
+}
+
+func NewShareFileSystemAbstraction() ShareFileSystemAbstraction {
+	return ShareFileSystemAbstraction{}
+}
+
+func (l ShareFileSystemAbstraction) Chmod(filename string, mode os.FileMode) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Chown(filename string, uid int, gid int) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Chtimes(filename string, atime time.Time, mtime time.Time) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Create(filename string) (*os.File, error) {
+	return nil, nil
+}
+func (l ShareFileSystemAbstraction) Mkdir(filename string, mode os.FileMode) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) MkdirAll(filename string, mode os.FileMode) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Name() string {
+	return ""
+}
+func (l ShareFileSystemAbstraction) Open(filename string) (*os.File, error) {
+	return nil, nil
+}
+func (l ShareFileSystemAbstraction) OpenFile(filename string, flag int, perm os.FileMode) (*os.File, error) {
+	return nil, nil
+}
+func (l ShareFileSystemAbstraction) Remove(filename string) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) RemoveAll(path string) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Rename(oldname, newname string) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) Stat(filename string) (os.FileInfo, error) {
+	return nil, nil
+}
+
+/*
+	Abstraction Utilities
+*/
+
+func (l ShareFileSystemAbstraction) VirtualPathToRealPath(subpath string, username string) (string, error) {
+	return "", errors.New("SHAREFS WORK IN PROGRESS")
+}
+
+func (l ShareFileSystemAbstraction) RealPathToVirtualPath(fullpath string, username string) (string, error) {
+	return "", errors.New("SHAREFS WORK IN PROGRESS")
+}
+
+func (l ShareFileSystemAbstraction) FileExists(realpath string) bool {
+	return false
+}
+
+func (l ShareFileSystemAbstraction) IsDir(realpath string) bool {
+	return false
+}
+
+func (l ShareFileSystemAbstraction) Glob(realpathWildcard string) ([]string, error) {
+	return []string{}, nil
+}
+
+func (l ShareFileSystemAbstraction) GetFileSize(realpath string) int64 {
+	return 0
+}
+
+func (l ShareFileSystemAbstraction) GetModTime(realpath string) (int64, error) {
+	return 0, errors.New("empty filesystem abstraction")
+}
+
+func (l ShareFileSystemAbstraction) WriteFile(filename string, content []byte, mode os.FileMode) error {
+	return nil
+}
+func (l ShareFileSystemAbstraction) ReadFile(filename string) ([]byte, error) {
+	return []byte(""), errors.New("empty filesystem abstraction")
+}
+func (l ShareFileSystemAbstraction) WriteStream(filename string, stream io.Reader, mode os.FileMode) error {
+	return errors.New("operation not supported on dummy file system")
+}
+func (l ShareFileSystemAbstraction) ReadStream(filename string) (io.ReadCloser, error) {
+	return nil, errors.New("operation not supported on dummy file system")
+}
+
+func (l ShareFileSystemAbstraction) Walk(root string, walkFn filepath.WalkFunc) error {
+	return errors.New("empty filesystem abstraction")
+}

+ 19 - 20
mod/filesystem/filesystem.go

@@ -21,8 +21,8 @@ import (
 
 	db "imuslab.com/arozos/mod/database"
 	"imuslab.com/arozos/mod/disk/hybridBackup"
-	"imuslab.com/arozos/mod/filesystem/abstractions/emptyfs"
 	"imuslab.com/arozos/mod/filesystem/abstractions/localfs"
+	"imuslab.com/arozos/mod/filesystem/abstractions/sharefs"
 	"imuslab.com/arozos/mod/filesystem/abstractions/webdavfs"
 )
 
@@ -223,26 +223,25 @@ func NewFileSystemHandler(option FileSystemOption) (*FileSystemHandler, error) {
 			Filesystem:            fstype,
 			Closed:                false,
 		}, nil
+	} else if option.Filesystem == "share" {
+		return &FileSystemHandler{
+			Name:                  option.Name,
+			UUID:                  option.Uuid,
+			Path:                  "",
+			ReadOnly:              option.Access == "readonly",
+			RequireBuffer:         false,
+			Parentuid:             option.Parentuid,
+			Hierarchy:             option.Hierarchy,
+			HierarchyConfig:       nil,
+			InitiationTime:        time.Now().Unix(),
+			FilesystemDatabase:    nil,
+			FileSystemAbstraction: sharefs.NewShareFileSystemAbstraction(),
+			Filesystem:            fstype,
+			Closed:                false,
+		}, nil
 	} else if option.Filesystem == "virtual" {
-		//Virtual filesystem, use custom mapping logic to handle file access
-		if option.Hierarchy == "share" {
-			//Emulated share virtual file system. Use Share Manager structure
-			return &FileSystemHandler{
-				Name:                  option.Name,
-				UUID:                  option.Uuid,
-				Path:                  "",
-				ReadOnly:              option.Access == "readonly",
-				RequireBuffer:         false,
-				Parentuid:             option.Parentuid,
-				Hierarchy:             option.Hierarchy,
-				HierarchyConfig:       nil,
-				InitiationTime:        time.Now().Unix(),
-				FilesystemDatabase:    nil,
-				FileSystemAbstraction: emptyfs.NewEmptyFileSystemAbstraction(),
-				Filesystem:            fstype,
-				Closed:                false,
-			}, nil
-		}
+		//Virtual filesystem, deprecated
+		log.Println("Deprecated file system type: Virtual")
 	}
 
 	return nil, errors.New("Not supported file system: " + fstype)

+ 1 - 1
storage.go

@@ -71,7 +71,7 @@ func LoadBaseStoragePool() error {
 		Access:     "readonly",
 		Hierarchy:  "share",
 		Automount:  false,
-		Filesystem: "virtual",
+		Filesystem: "share",
 	})
 
 	if err != nil {