summaryrefslogtreecommitdiffstats
path: root/lib/folder
diff options
context:
space:
mode:
authorSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-26 11:29:56 +0200
committerSebastien Douheret <sebastien.douheret@iot.bzh>2017-08-26 11:29:56 +0200
commit5e120c466686880c5bf6b94043dd01edc261fef9 (patch)
tree9d3071f226bd0b234540bd20bdab0c77d3bca164 /lib/folder
parente113bbc75f88457d29f11823af0ff902e7c2ac8b (diff)
parent0367a6f9f2f868d785f197a052840ec621a681a6 (diff)
Merge remote-tracking branch 'origin/wip'
Diffstat (limited to 'lib/folder')
-rw-r--r--lib/folder/folder-interface.go68
-rw-r--r--lib/folder/folder-pathmap.go115
2 files changed, 183 insertions, 0 deletions
diff --git a/lib/folder/folder-interface.go b/lib/folder/folder-interface.go
new file mode 100644
index 0000000..c04cbd7
--- /dev/null
+++ b/lib/folder/folder-interface.go
@@ -0,0 +1,68 @@
+package folder
+
+// FolderType definition
+type FolderType int
+
+const (
+ TypePathMap = 1
+ TypeCloudSync = 2
+ TypeCifsSmb = 3
+)
+
+// Folder Status definition
+const (
+ StatusErrorConfig = "ErrorConfig"
+ StatusDisable = "Disable"
+ StatusEnable = "Enable"
+ StatusPause = "Pause"
+ StatusSyncing = "Syncing"
+)
+
+type EventCBData map[string]interface{}
+type EventCB func(cfg *FolderConfig, data *EventCBData)
+
+// IFOLDER Folder interface
+type IFOLDER interface {
+ NewUID(suffix string) string // Get a new folder UUID
+ 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
+ RegisterEventChange(cb *EventCB, data *EventCBData) error // Request events registration (sent through WS)
+ UnRegisterEventChange() error // Un-register events
+ 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"`
+ IsInSync bool `json:"isInSync"`
+ 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..f73f271
--- /dev/null
+++ b/lib/folder/folder-pathmap.go
@@ -0,0 +1,115 @@
+package folder
+
+import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ common "github.com/iotbzh/xds-common/golib"
+ "github.com/iotbzh/xds-server/lib/xdsconfig"
+ uuid "github.com/satori/go.uuid"
+)
+
+// IFOLDER interface implementation for native/path mapping folders
+
+// PathMap .
+type PathMap struct {
+ globalConfig *xdsconfig.Config
+ config FolderConfig
+}
+
+// NewFolderPathMap Create a new instance of PathMap
+func NewFolderPathMap(gc *xdsconfig.Config) *PathMap {
+ f := PathMap{
+ globalConfig: gc,
+ }
+ return &f
+}
+
+// NewUID Get a UUID
+func (f *PathMap) NewUID(suffix string) string {
+ return uuid.NewV1().String() + "_" + suffix
+}
+
+// Add a new folder
+func (f *PathMap) Add(cfg FolderConfig) (*FolderConfig, error) {
+ if cfg.DataPathMap.ServerPath == "" {
+ return nil, fmt.Errorf("ServerPath must be set")
+ }
+
+ // Use shareRootDir if ServerPath is a relative path
+ dir := cfg.DataPathMap.ServerPath
+ if !filepath.IsAbs(dir) {
+ dir = filepath.Join(f.globalConfig.FileConf.ShareRootDir, dir)
+ }
+
+ // Sanity check
+ 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 = dir
+ f.config.DataPathMap.ServerPath = dir
+ f.config.IsInSync = true
+ 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
+}
+
+// RegisterEventChange requests registration for folder change event
+func (f *PathMap) RegisterEventChange(cb *EventCB, data *EventCBData) error {
+ return nil
+}
+
+// UnRegisterEventChange remove registered callback
+func (f *PathMap) UnRegisterEventChange() error {
+ 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
+}