summaryrefslogtreecommitdiffstats
path: root/lib/folder
diff options
context:
space:
mode:
authorSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-10 12:19:34 +0200
committerSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-16 14:27:28 +0200
commitdd6f08b10b1597f44e3dc25509ac9a45336b0914 (patch)
tree3dcb835306bc3adbae7c27d94fc8a51de8d6f09a /lib/folder
parent0262f5bef6ff67e77b844a04733c57740fba9f00 (diff)
Add folder interface and support native pathmap folder type.
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
Diffstat (limited to 'lib/folder')
-rw-r--r--lib/folder/folder-interface.go59
-rw-r--r--lib/folder/folder-pathmap.go88
2 files changed, 147 insertions, 0 deletions
diff --git a/lib/folder/folder-interface.go b/lib/folder/folder-interface.go
new file mode 100644
index 0000000..b76b3f3
--- /dev/null
+++ b/lib/folder/folder-interface.go
@@ -0,0 +1,59 @@
+package folder
+
+// FolderType definition
+type FolderType int
+
+const (
+ TypePathMap = 1
+ TypeCloudSync = 2
+ TypeCifsSmb = 3
+)
+
+// Folder Status definition
+const (
+ StatusErrorConfig = "ErrorConfig"
+ StatusDisable = "Disable"
+ StatusEnable = "Enable"
+)
+
+// IFOLDER Folder interface
+type IFOLDER interface {
+ Add(cfg FolderConfig) (*FolderConfig, error) // Add a new folder
+ GetConfig() FolderConfig // Get folder public configuration
+ GetFullPath(dir string) string // Get folder full path
+ Remove() error // Remove a folder
+ Sync() error // Force folder files synchronization
+ IsInSync() (bool, error) // Check if folder files are in-sync
+}
+
+// FolderConfig is the config for one folder
+type FolderConfig struct {
+ ID string `json:"id"`
+ Label string `json:"label"`
+ ClientPath string `json:"path"`
+ Type FolderType `json:"type"`
+ Status string `json:"status"`
+ DefaultSdk string `json:"defaultSdk"`
+
+ // Not exported fields from REST API point of view
+ RootPath string `json:"-"`
+
+ // FIXME: better to define an equivalent to union data and then implement
+ // UnmarshalJSON/MarshalJSON to decode/encode according to Type value
+ // Data interface{} `json:"data"`
+
+ // Specific data depending on which Type is used
+ DataPathMap PathMapConfig `json:"dataPathMap,omitempty"`
+ DataCloudSync CloudSyncConfig `json:"dataCloudSync,omitempty"`
+}
+
+// PathMapConfig Path mapping specific data
+type PathMapConfig struct {
+ ServerPath string `json:"serverPath"`
+}
+
+// CloudSyncConfig CloudSync (AKA Syncthing) specific data
+type CloudSyncConfig struct {
+ SyncThingID string `json:"syncThingID"`
+ BuilderSThgID string `json:"builderSThgID"`
+}
diff --git a/lib/folder/folder-pathmap.go b/lib/folder/folder-pathmap.go
new file mode 100644
index 0000000..8711df2
--- /dev/null
+++ b/lib/folder/folder-pathmap.go
@@ -0,0 +1,88 @@
+package folder
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ common "github.com/iotbzh/xds-common/golib"
+)
+
+// IFOLDER interface implementation for native/path mapping folders
+
+// PathMap .
+type PathMap struct {
+ config FolderConfig
+}
+
+// NewFolderPathMap Create a new instance of PathMap
+func NewFolderPathMap() *PathMap {
+ f := PathMap{}
+ return &f
+}
+
+// Add a new folder
+func (f *PathMap) Add(cfg FolderConfig) (*FolderConfig, error) {
+ if cfg.DataPathMap.ServerPath == "" {
+ return nil, fmt.Errorf("ServerPath must be set")
+ }
+
+ // Sanity check
+ dir := cfg.DataPathMap.ServerPath
+ if !common.Exists(dir) {
+ // try to create if not existing
+ if err := os.MkdirAll(dir, 0755); err != nil {
+ return nil, fmt.Errorf("Cannot create ServerPath directory: %s", dir)
+ }
+ }
+ if !common.Exists(dir) {
+ return nil, fmt.Errorf("ServerPath directory is not accessible: %s", dir)
+ }
+ file, err := ioutil.TempFile(dir, "xds_pathmap_check")
+ if err != nil {
+ return nil, fmt.Errorf("ServerPath sanity check error: %s", err.Error())
+ }
+ defer os.Remove(file.Name())
+
+ msg := "sanity check PathMap Add folder"
+ n, err := file.Write([]byte(msg))
+ if err != nil || n != len(msg) {
+ return nil, fmt.Errorf("ServerPath sanity check error: %s", err.Error())
+ }
+
+ f.config = cfg
+ f.config.RootPath = cfg.DataPathMap.ServerPath
+ f.config.Status = StatusEnable
+
+ return &f.config, nil
+}
+
+// GetConfig Get public part of folder config
+func (f *PathMap) GetConfig() FolderConfig {
+ return f.config
+}
+
+// GetFullPath returns the full path
+func (f *PathMap) GetFullPath(dir string) string {
+ if &dir == nil {
+ return f.config.DataPathMap.ServerPath
+ }
+ return filepath.Join(f.config.DataPathMap.ServerPath, dir)
+}
+
+// Remove a folder
+func (f *PathMap) Remove() error {
+ // nothing to do
+ return nil
+}
+
+// Sync Force folder files synchronization
+func (f *PathMap) Sync() error {
+ return nil
+}
+
+// IsInSync Check if folder files are in-sync
+func (f *PathMap) IsInSync() (bool, error) {
+ return true, nil
+}