From 7c7d90a781082c6bd22d12a5e2451ca61a5198af Mon Sep 17 00:00:00 2001 From: Sebastien Douheret Date: Wed, 29 Nov 2017 11:19:00 +0100 Subject: Renamed apiv1 lib to xaapiv1. xa prefix (for Xds Agent) is safest to avoid confusion with xs prefix (for Xds Server) Signed-off-by: Sebastien Douheret --- Makefile | 3 +- glide.yaml | 4 ++ lib/agent/apiv1-config.go | 12 ++-- lib/agent/apiv1-events.go | 6 +- lib/agent/apiv1-projects.go | 6 +- lib/agent/apiv1-version.go | 10 +-- lib/agent/events.go | 16 ++--- lib/agent/project-interface.go | 10 +-- lib/agent/project-pathmap.go | 17 ++--- lib/agent/project-st.go | 31 +++++----- lib/agent/projects.go | 41 ++++++------ lib/agent/webserver.go | 4 +- lib/agent/xdsserver.go | 137 ++++++++++------------------------------- lib/apiv1/config.go | 22 ------- lib/apiv1/events.go | 77 ----------------------- lib/apiv1/exec.go | 64 ------------------- lib/apiv1/projects.go | 38 ------------ lib/apiv1/sdks.go | 11 ---- lib/apiv1/version.go | 15 ----- lib/syncthing/stfolder.go | 8 +-- lib/xaapiv1/config.go | 22 +++++++ lib/xaapiv1/events.go | 77 +++++++++++++++++++++++ lib/xaapiv1/exec.go | 64 +++++++++++++++++++ lib/xaapiv1/projects.go | 38 ++++++++++++ lib/xaapiv1/sdks.go | 11 ++++ lib/xaapiv1/version.go | 15 +++++ 26 files changed, 347 insertions(+), 412 deletions(-) delete mode 100644 lib/apiv1/config.go delete mode 100644 lib/apiv1/events.go delete mode 100644 lib/apiv1/exec.go delete mode 100644 lib/apiv1/projects.go delete mode 100644 lib/apiv1/sdks.go delete mode 100644 lib/apiv1/version.go create mode 100644 lib/xaapiv1/config.go create mode 100644 lib/xaapiv1/events.go create mode 100644 lib/xaapiv1/exec.go create mode 100644 lib/xaapiv1/projects.go create mode 100644 lib/xaapiv1/sdks.go create mode 100644 lib/xaapiv1/version.go diff --git a/Makefile b/Makefile index 3f4457c..802aede 100644 --- a/Makefile +++ b/Makefile @@ -140,7 +140,8 @@ vendor: tools/glide glide.yaml vendor/debug: vendor (cd vendor/github.com/iotbzh && \ - rm -rf xds-common && ln -s ../../../../xds-common ) + rm -rf xds-common && ln -s ../../../../xds-common && \ + rm -rf xds-server && ln -s ../../../../xds-server ) .PHONY: tools/glide tools/glide: diff --git a/glide.yaml b/glide.yaml index 1630276..0569d76 100644 --- a/glide.yaml +++ b/glide.yaml @@ -25,5 +25,9 @@ import: version: ^0.1.0 subpackages: - golib/common +- package: github.com/iotbzh/xds-server + version: 5c1d023f41472660952ee559e2484cd6bbe688d3 + subpackages: + - lib/xsapiv1 - package: github.com/franciscocpg/reflectme version: ^0.1.9 diff --git a/lib/agent/apiv1-config.go b/lib/agent/apiv1-config.go index 2197720..40f65df 100644 --- a/lib/agent/apiv1-config.go +++ b/lib/agent/apiv1-config.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/gin-gonic/gin" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" "github.com/iotbzh/xds-agent/lib/xdsconfig" common "github.com/iotbzh/xds-common/golib" ) @@ -24,7 +24,7 @@ func (s *APIService) getConfig(c *gin.Context) { // SetConfig sets configuration func (s *APIService) setConfig(c *gin.Context) { - var cfgArg apiv1.APIConfig + var cfgArg xaapiv1.APIConfig if c.BindJSON(&cfgArg) != nil { common.APIError(c, "Invalid arguments") return @@ -65,16 +65,16 @@ func (s *APIService) setConfig(c *gin.Context) { c.JSON(http.StatusOK, s._getConfig()) } -func (s *APIService) _getConfig() apiv1.APIConfig { - cfg := apiv1.APIConfig{ +func (s *APIService) _getConfig() xaapiv1.APIConfig { + cfg := xaapiv1.APIConfig{ Version: s.Config.Version, APIVersion: s.Config.APIVersion, VersionGitTag: s.Config.VersionGitTag, - Servers: []apiv1.ServerCfg{}, + Servers: []xaapiv1.ServerCfg{}, } for _, svr := range s.xdsServers { - cfg.Servers = append(cfg.Servers, apiv1.ServerCfg{ + cfg.Servers = append(cfg.Servers, xaapiv1.ServerCfg{ ID: svr.ID, URL: svr.BaseURL, APIURL: svr.APIURL, diff --git a/lib/agent/apiv1-events.go b/lib/agent/apiv1-events.go index cb7cde1..c40b83f 100644 --- a/lib/agent/apiv1-events.go +++ b/lib/agent/apiv1-events.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" common "github.com/iotbzh/xds-common/golib" ) @@ -15,7 +15,7 @@ func (s *APIService) eventsList(c *gin.Context) { // eventsRegister Registering for events that will be send over a WS func (s *APIService) eventsRegister(c *gin.Context) { - var args apiv1.EventRegisterArgs + var args xaapiv1.EventRegisterArgs if c.BindJSON(&args) != nil || args.Name == "" { common.APIError(c, "Invalid arguments") @@ -39,7 +39,7 @@ func (s *APIService) eventsRegister(c *gin.Context) { // eventsRegister Registering for events that will be send over a WS func (s *APIService) eventsUnRegister(c *gin.Context) { - var args apiv1.EventUnRegisterArgs + var args xaapiv1.EventUnRegisterArgs if c.BindJSON(&args) != nil || args.Name == "" { common.APIError(c, "Invalid arguments") diff --git a/lib/agent/apiv1-projects.go b/lib/agent/apiv1-projects.go index 5784896..281886f 100644 --- a/lib/agent/apiv1-projects.go +++ b/lib/agent/apiv1-projects.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" common "github.com/iotbzh/xds-common/golib" ) @@ -31,7 +31,7 @@ func (s *APIService) getProject(c *gin.Context) { // addProject adds a new project to server config func (s *APIService) addProject(c *gin.Context) { - var cfgArg apiv1.ProjectConfig + var cfgArg xaapiv1.ProjectConfig if c.BindJSON(&cfgArg) != nil { common.APIError(c, "Invalid arguments") return @@ -93,7 +93,7 @@ func (s *APIService) updateProject(c *gin.Context) { return } - var cfgArg apiv1.ProjectConfig + var cfgArg xaapiv1.ProjectConfig if c.BindJSON(&cfgArg) != nil { common.APIError(c, "Invalid arguments") return diff --git a/lib/agent/apiv1-version.go b/lib/agent/apiv1-version.go index c73010e..be72672 100644 --- a/lib/agent/apiv1-version.go +++ b/lib/agent/apiv1-version.go @@ -5,13 +5,13 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" ) // getInfo : return various information about server func (s *APIService) getVersion(c *gin.Context) { - response := apiv1.XDSVersion{ - Client: apiv1.VersionData{ + response := xaapiv1.XDSVersion{ + Client: xaapiv1.VersionData{ ID: "", Version: s.Config.Version, APIVersion: s.Config.APIVersion, @@ -19,9 +19,9 @@ func (s *APIService) getVersion(c *gin.Context) { }, } - svrVer := []apiv1.VersionData{} + svrVer := []xaapiv1.VersionData{} for _, svr := range s.xdsServers { - res := apiv1.VersionData{} + res := xaapiv1.VersionData{} if err := svr.GetVersion(&res); err != nil { errMsg := fmt.Sprintf("Cannot retrieve version of XDS server ID %s : %v", svr.ID, err.Error()) s.Log.Warning(errMsg) diff --git a/lib/agent/events.go b/lib/agent/events.go index ccf8ddc..a45d404 100644 --- a/lib/agent/events.go +++ b/lib/agent/events.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" ) // EventDef Definition on one event @@ -21,7 +21,7 @@ type Events struct { // NewEvents creates an instance of Events func NewEvents(ctx *Context) *Events { evMap := make(map[string]*EventDef) - for _, ev := range apiv1.EVTAllList { + for _, ev := range xaapiv1.EVTAllList { evMap[ev] = &EventDef{ sids: make(map[string]int), } @@ -34,13 +34,13 @@ func NewEvents(ctx *Context) *Events { // GetList returns the list of all supported events func (e *Events) GetList() []string { - return apiv1.EVTAllList + return xaapiv1.EVTAllList } // Register Used by a client/session to register to a specific (or all) event(s) func (e *Events) Register(evName, sessionID string) error { - evs := apiv1.EVTAllList - if evName != apiv1.EVTAll { + evs := xaapiv1.EVTAllList + if evName != xaapiv1.EVTAll { if _, ok := e.eventsMap[evName]; !ok { return fmt.Errorf("Unsupported event type name") } @@ -54,8 +54,8 @@ func (e *Events) Register(evName, sessionID string) error { // UnRegister Used by a client/session to unregister event(s) func (e *Events) UnRegister(evName, sessionID string) error { - evs := apiv1.EVTAllList - if evName != apiv1.EVTAll { + evs := xaapiv1.EVTAllList + if evName != xaapiv1.EVTAll { if _, ok := e.eventsMap[evName]; !ok { return fmt.Errorf("Unsupported event type name") } @@ -92,7 +92,7 @@ func (e *Events) Emit(evName string, data interface{},fromSid string) error { } continue } - msg := apiv1.EventMsg{ + msg := xaapiv1.EventMsg{ Time: time.Now().String(), FromSessionID: fromSid, Type: evName, diff --git a/lib/agent/project-interface.go b/lib/agent/project-interface.go index 0d6bb1a..7191210 100644 --- a/lib/agent/project-interface.go +++ b/lib/agent/project-interface.go @@ -1,14 +1,14 @@ package agent -import "github.com/iotbzh/xds-agent/lib/apiv1" +import "github.com/iotbzh/xds-agent/lib/xaapiv1" // IPROJECT Project interface type IPROJECT interface { - Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) // Add a new project - Setup(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) // Local setup of the project + Add(cfg xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) // Add a new project + Setup(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) // Local setup of the project Delete() error // Delete a project - GetProject() *apiv1.ProjectConfig // Get project public configuration - Update(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) // Update project configuration + GetProject() *xaapiv1.ProjectConfig // Get project public configuration + Update(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) // Update project configuration GetServer() *XdsServer // Get XdsServer that holds this project Sync() error // Force project files synchronization IsInSync() (bool, error) // Check if project files are in-sync diff --git a/lib/agent/project-pathmap.go b/lib/agent/project-pathmap.go index 3c87770..1880fa3 100644 --- a/lib/agent/project-pathmap.go +++ b/lib/agent/project-pathmap.go @@ -6,8 +6,9 @@ import ( "os" "strings" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" common "github.com/iotbzh/xds-common/golib" + "github.com/iotbzh/xds-server/lib/xsapiv1" ) // IPROJECT interface implementation for native/path mapping projects @@ -16,7 +17,7 @@ import ( type PathMap struct { *Context server *XdsServer - folder *XdsFolderConfig + folder *xsapiv1.FolderConfig } // NewProjectPathMap Create a new instance of PathMap @@ -24,13 +25,13 @@ func NewProjectPathMap(ctx *Context, svr *XdsServer) *PathMap { p := PathMap{ Context: ctx, server: svr, - folder: &XdsFolderConfig{}, + folder: &xsapiv1.FolderConfig{}, } return &p } // Add a new project -func (p *PathMap) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *PathMap) Add(cfg xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { var err error var file *os.File errMsg := "ClientPath sanity check error (%d): %v" @@ -92,24 +93,24 @@ func (p *PathMap) Delete() error { } // GetProject Get public part of project config -func (p *PathMap) GetProject() *apiv1.ProjectConfig { +func (p *PathMap) GetProject() *xaapiv1.ProjectConfig { prj := p.server.FolderToProject(*p.folder) prj.ServerID = p.server.ID return &prj } // Setup Setup local project config -func (p *PathMap) Setup(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *PathMap) Setup(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { p.folder = p.server.ProjectToFolder(prj) np := p.GetProject() - if err := p.events.Emit(apiv1.EVTProjectChange, np, ""); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectChange, np, ""); err != nil { return np, err } return np, nil } // Update Update some field of a project -func (p *PathMap) Update(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *PathMap) Update(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { if p.folder.ID != prj.ID { return nil, fmt.Errorf("Invalid id") } diff --git a/lib/agent/project-st.go b/lib/agent/project-st.go index c4e8fce..d5939e6 100644 --- a/lib/agent/project-st.go +++ b/lib/agent/project-st.go @@ -3,8 +3,9 @@ package agent import ( "fmt" - "github.com/iotbzh/xds-agent/lib/apiv1" st "github.com/iotbzh/xds-agent/lib/syncthing" + "github.com/iotbzh/xds-agent/lib/xaapiv1" + "github.com/iotbzh/xds-server/lib/xsapiv1" ) // IPROJECT interface implementation for syncthing projects @@ -13,7 +14,7 @@ import ( type STProject struct { *Context server *XdsServer - folder *XdsFolderConfig + folder *xsapiv1.FolderConfig eventIDs []int } @@ -22,13 +23,13 @@ func NewProjectST(ctx *Context, svr *XdsServer) *STProject { p := STProject{ Context: ctx, server: svr, - folder: &XdsFolderConfig{}, + folder: &xsapiv1.FolderConfig{}, } return &p } // Add a new project -func (p *STProject) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *STProject) Add(cfg xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { var err error // Add project/folder into XDS Server @@ -51,7 +52,7 @@ func (p *STProject) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { locPrj, err := p.SThg.FolderConfigGet(id) if err != nil { - svrPrj.Status = apiv1.StatusErrorConfig + svrPrj.Status = xaapiv1.StatusErrorConfig return nil, err } if svrPrj.ID != locPrj.ID { @@ -73,14 +74,14 @@ func (p *STProject) Delete() error { } // GetProject Get public part of project config -func (p *STProject) GetProject() *apiv1.ProjectConfig { +func (p *STProject) GetProject() *xaapiv1.ProjectConfig { prj := p.server.FolderToProject(*p.folder) prj.ServerID = p.server.ID return &prj } // Setup Setup local project config -func (p *STProject) Setup(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *STProject) Setup(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { // Update folder p.folder = p.server.ProjectToFolder(prj) svrPrj := p.GetProject() @@ -106,7 +107,7 @@ func (p *STProject) Setup(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) } // Update Update some field of a project -func (p *STProject) Update(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) { +func (p *STProject) Update(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) { if p.folder.ID != prj.ID { return nil, fmt.Errorf("Invalid id") @@ -146,7 +147,7 @@ func (p *STProject) IsInSync() (bool, error) { // callback use to update (XDS Server) folder IsInSync status func (p *STProject) _cbServerFolderChanged(pData interface{}, data interface{}) error { - evt := data.(XdsEventFolderChange) + evt := data.(xsapiv1.EventMsg) // Only process event that concerns this project/folder ID if p.folder.ID != evt.Folder.ID { @@ -159,7 +160,7 @@ func (p *STProject) _cbServerFolderChanged(pData interface{}, data interface{}) p.folder.DataCloudSync.STSvrIsInSync = evt.Folder.IsInSync p.folder.DataCloudSync.STSvrStatus = evt.Folder.Status - if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil { p.Log.Warningf("Cannot notify project change (from server): %v", err) } } @@ -180,15 +181,15 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) { to := ev.Data["to"] switch to { case "scanning", "syncing": - sts = apiv1.StatusSyncing + sts = xaapiv1.StatusSyncing case "idle": - sts = apiv1.StatusEnable + sts = xaapiv1.StatusEnable } inSync = (to == "idle") case st.EventFolderPaused: - if sts == apiv1.StatusEnable { - sts = apiv1.StatusPause + if sts == xaapiv1.StatusEnable { + sts = xaapiv1.StatusPause } inSync = false } @@ -198,7 +199,7 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) { p.folder.DataCloudSync.STLocIsInSync = inSync p.folder.DataCloudSync.STLocStatus = sts - if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil { p.Log.Warningf("Cannot notify project change (local): %v", err) } } diff --git a/lib/agent/projects.go b/lib/agent/projects.go index 966c231..1d21931 100644 --- a/lib/agent/projects.go +++ b/lib/agent/projects.go @@ -7,8 +7,9 @@ import ( "time" "github.com/franciscocpg/reflectme" - "github.com/iotbzh/xds-agent/lib/apiv1" "github.com/iotbzh/xds-agent/lib/syncthing" + "github.com/iotbzh/xds-agent/lib/xaapiv1" + "github.com/iotbzh/xds-server/lib/xsapiv1" "github.com/syncthing/syncthing/lib/sync" ) @@ -45,7 +46,7 @@ func (p *Projects) Init(server *XdsServer) error { if svr.Disabled { continue } - xFlds := []XdsFolderConfig{} + xFlds := []xsapiv1.FolderConfig{} if err := svr.GetFolders(&xFlds); err != nil { errMsg += fmt.Sprintf("Cannot retrieve folders config of XDS server ID %s : %v \n", svr.ID, err.Error()) continue @@ -102,7 +103,7 @@ func (p *Projects) Get(id string) *IPROJECT { } // GetProjectArr returns the config of all folders as an array -func (p *Projects) GetProjectArr() []apiv1.ProjectConfig { +func (p *Projects) GetProjectArr() []xaapiv1.ProjectConfig { pjMutex.Lock() defer pjMutex.Unlock() @@ -110,8 +111,8 @@ func (p *Projects) GetProjectArr() []apiv1.ProjectConfig { } // GetProjectArrUnsafe Same as GetProjectArr without mutex protection -func (p *Projects) GetProjectArrUnsafe() []apiv1.ProjectConfig { - conf := []apiv1.ProjectConfig{} +func (p *Projects) GetProjectArrUnsafe() []xaapiv1.ProjectConfig { + conf := []xaapiv1.ProjectConfig{} for _, v := range p.projects { prj := (*v).GetProject() conf = append(conf, *prj) @@ -120,14 +121,14 @@ func (p *Projects) GetProjectArrUnsafe() []apiv1.ProjectConfig { } // Add adds a new folder -func (p *Projects) Add(newF apiv1.ProjectConfig, fromSid string) (*apiv1.ProjectConfig, error) { +func (p *Projects) Add(newF xaapiv1.ProjectConfig, fromSid string) (*xaapiv1.ProjectConfig, error) { prj, err := p.createUpdate(newF, true, false) if err != nil { return prj, err } // Notify client with event - if err := p.events.Emit(apiv1.EVTProjectAdd, *prj, fromSid); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectAdd, *prj, fromSid); err != nil { p.Log.Warningf("Cannot notify project deletion: %v", err) } @@ -135,7 +136,7 @@ func (p *Projects) Add(newF apiv1.ProjectConfig, fromSid string) (*apiv1.Project } // CreateUpdate creates or update a folder -func (p *Projects) createUpdate(newF apiv1.ProjectConfig, create bool, initial bool) (*apiv1.ProjectConfig, error) { +func (p *Projects) createUpdate(newF xaapiv1.ProjectConfig, create bool, initial bool) (*xaapiv1.ProjectConfig, error) { var err error pjMutex.Lock() @@ -167,7 +168,7 @@ func (p *Projects) createUpdate(newF apiv1.ProjectConfig, create bool, initial b var fld IPROJECT switch newF.Type { // SYNCTHING - case apiv1.TypeCloudSync: + case xaapiv1.TypeCloudSync: if p.SThg != nil { fld = NewProjectST(p.Context, svr) } else { @@ -175,24 +176,24 @@ func (p *Projects) createUpdate(newF apiv1.ProjectConfig, create bool, initial b } // PATH MAP - case apiv1.TypePathMap: + case xaapiv1.TypePathMap: fld = NewProjectPathMap(p.Context, svr) default: return nil, fmt.Errorf("Unsupported folder type") } - var newPrj *apiv1.ProjectConfig + var newPrj *xaapiv1.ProjectConfig if create { // Add project on server if newPrj, err = fld.Add(newF); err != nil { - newF.Status = apiv1.StatusErrorConfig + newF.Status = xaapiv1.StatusErrorConfig log.Printf("ERROR Adding project: %v\n", err) return newPrj, err } } else { // Just update project config if newPrj, err = fld.Setup(newF); err != nil { - newF.Status = apiv1.StatusErrorConfig + newF.Status = xaapiv1.StatusErrorConfig log.Printf("ERROR Updating project: %v\n", err) return newPrj, err } @@ -218,13 +219,13 @@ func (p *Projects) createUpdate(newF apiv1.ProjectConfig, create bool, initial b } // Delete deletes a specific folder -func (p *Projects) Delete(id, fromSid string) (apiv1.ProjectConfig, error) { +func (p *Projects) Delete(id, fromSid string) (xaapiv1.ProjectConfig, error) { var err error pjMutex.Lock() defer pjMutex.Unlock() - fld := apiv1.ProjectConfig{} + fld := xaapiv1.ProjectConfig{} fc, exist := p.projects[id] if !exist { return fld, fmt.Errorf("Unknown id") @@ -239,7 +240,7 @@ func (p *Projects) Delete(id, fromSid string) (apiv1.ProjectConfig, error) { delete(p.projects, id) // Notify client with event - if err := p.events.Emit(apiv1.EVTProjectDelete, *prj, fromSid); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectDelete, *prj, fromSid); err != nil { p.Log.Warningf("Cannot notify project deletion: %v", err) } @@ -265,7 +266,7 @@ func (p *Projects) IsProjectInSync(id string) (bool, error) { } // Update Update some field of a project -func (p *Projects) Update(id string, prj apiv1.ProjectConfig, fromSid string) (*apiv1.ProjectConfig, error) { +func (p *Projects) Update(id string, prj xaapiv1.ProjectConfig, fromSid string) (*xaapiv1.ProjectConfig, error) { pjMutex.Lock() defer pjMutex.Unlock() @@ -276,12 +277,12 @@ func (p *Projects) Update(id string, prj apiv1.ProjectConfig, fromSid string) (* } // Copy current in a new object to change nothing in case of an error rises - newFld := apiv1.ProjectConfig{} + newFld := xaapiv1.ProjectConfig{} reflectme.Copy((*fc).GetProject(), &newFld) // Only update some fields dirty := false - for _, fieldName := range apiv1.ProjectConfigUpdatableFields { + for _, fieldName := range xaapiv1.ProjectConfigUpdatableFields { valNew, err := reflectme.GetField(prj, fieldName) if err == nil { valCur, err := reflectme.GetField(newFld, fieldName) @@ -305,7 +306,7 @@ func (p *Projects) Update(id string, prj apiv1.ProjectConfig, fromSid string) (* } // Notify client with event - if err := p.events.Emit(apiv1.EVTProjectChange, *upPrj, fromSid); err != nil { + if err := p.events.Emit(xaapiv1.EVTProjectChange, *upPrj, fromSid); err != nil { p.Log.Warningf("Cannot notify project change: %v", err) } return upPrj, err diff --git a/lib/agent/webserver.go b/lib/agent/webserver.go index 13572b4..c9f3acd 100644 --- a/lib/agent/webserver.go +++ b/lib/agent/webserver.go @@ -11,7 +11,7 @@ import ( "github.com/gin-contrib/static" "github.com/gin-gonic/gin" "github.com/googollee/go-socket.io" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" ) // WebServer . @@ -233,7 +233,7 @@ func (s *WebServer) socketHandler(c *gin.Context) { so.On("disconnection", func() { s.Log.Debugf("WS disconnected (WSID=%s, SID=%s)", so.Id(), sess.ID) - s.events.UnRegister(apiv1.EVTAll, sess.ID) + s.events.UnRegister(xaapiv1.EVTAll, sess.ID) s.sessions.UpdateIOSocket(sess.ID, nil) }) }) diff --git a/lib/agent/xdsserver.go b/lib/agent/xdsserver.go index e2c38c1..620bae9 100644 --- a/lib/agent/xdsserver.go +++ b/lib/agent/xdsserver.go @@ -11,9 +11,10 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/iotbzh/xds-agent/lib/apiv1" + "github.com/iotbzh/xds-agent/lib/xaapiv1" "github.com/iotbzh/xds-agent/lib/xdsconfig" common "github.com/iotbzh/xds-common/golib" + "github.com/iotbzh/xds-server/lib/xsapiv1" uuid "github.com/satori/go.uuid" sio_client "github.com/sebd71/go-socket.io-client" ) @@ -28,7 +29,7 @@ type XdsServer struct { ConnRetry int Connected bool Disabled bool - ServerConfig *XdsServerConfig + ServerConfig *xsapiv1.APIConfig // Events management CBOnError func(error) @@ -43,80 +44,6 @@ type XdsServer struct { apiRouter *gin.RouterGroup } -// XdsServerConfig Data return by GET /config -type XdsServerConfig struct { - ID string `json:"id"` - Version string `json:"version"` - APIVersion string `json:"apiVersion"` - VersionGitTag string `json:"gitTag"` - SupportedSharing map[string]bool `json:"supportedSharing"` - Builder XdsBuilderConfig `json:"builder"` -} - -// XdsBuilderConfig represents the builder container configuration -type XdsBuilderConfig struct { - IP string `json:"ip"` - Port string `json:"port"` - SyncThingID string `json:"syncThingID"` -} - -// XdsFolderType XdsServer folder type -type XdsFolderType string - -const ( - // XdsTypePathMap Path Mapping folder type - XdsTypePathMap = "PathMap" - // XdsTypeCloudSync Cloud synchronization (AKA syncthing) folder type - XdsTypeCloudSync = "CloudSync" - // XdsTypeCifsSmb CIFS (AKA samba) folder type - XdsTypeCifsSmb = "CIFS" -) - -// XdsFolderConfig XdsServer folder config -type XdsFolderConfig struct { - ID string `json:"id"` - Label string `json:"label"` - ClientPath string `json:"path"` - Type XdsFolderType `json:"type"` - Status string `json:"status"` - IsInSync bool `json:"isInSync"` - DefaultSdk string `json:"defaultSdk"` - ClientData string `json:"clientData"` // free form field that can used by client - - // Specific data depending on which Type is used - DataPathMap XdsPathMapConfig `json:"dataPathMap,omitempty"` - DataCloudSync XdsCloudSyncConfig `json:"dataCloudSync,omitempty"` -} - -// XdsPathMapConfig Path mapping specific data -type XdsPathMapConfig struct { - ServerPath string `json:"serverPath"` - CheckFile string `json:"checkFile"` - CheckContent string `json:"checkContent"` -} - -// XdsCloudSyncConfig CloudSync (AKA Syncthing) specific data -type XdsCloudSyncConfig struct { - SyncThingID string `json:"syncThingID"` - STSvrStatus string `json:"-"` - STSvrIsInSync bool `json:"-"` - STLocStatus string `json:"-"` - STLocIsInSync bool `json:"-"` -} - -// XdsEventRegisterArgs arguments used to register to XDS server events -type XdsEventRegisterArgs struct { - Name string `json:"name"` - ProjectID string `json:"filterProjectID"` -} - -// XdsEventFolderChange Folder change event structure -type XdsEventFolderChange struct { - Time string `json:"time"` - Type string `json:"type"` - Folder XdsFolderConfig `json:"folder"` -} - // EventCB Event emitter callback type EventCB func(privData interface{}, evtData interface{}) error @@ -203,12 +130,12 @@ func (xs *XdsServer) SetLoggerOutput(out io.Writer) { } // SendCommand Send a command to XDS Server -func (xs *XdsServer) SendCommand(cmd string, body []byte) (*http.Response, error) { +func (xs *XdsServer) SendCommand(cmd string, body []byte, res interface{}) error { url := cmd if !strings.HasPrefix("/", cmd) { url = "/" + cmd } - return xs.client.HTTPPostWithRes(url, string(body)) + return xs.client.Post(url, string(body), res) } // GetVersion Send Get request to retrieve XDS Server version @@ -217,12 +144,12 @@ func (xs *XdsServer) GetVersion(res interface{}) error { } // GetFolders Send GET request to get current folder configuration -func (xs *XdsServer) GetFolders(folders *[]XdsFolderConfig) error { +func (xs *XdsServer) GetFolders(folders *[]xsapiv1.FolderConfig) error { return xs.client.Get("/folders", folders) } // FolderAdd Send POST request to add a folder -func (xs *XdsServer) FolderAdd(fld *XdsFolderConfig, res interface{}) error { +func (xs *XdsServer) FolderAdd(fld *xsapiv1.FolderConfig, res interface{}) error { err := xs.client.Post("/folders", fld, res) if err != nil { return fmt.Errorf("FolderAdd error: %s", err.Error()) @@ -241,7 +168,7 @@ func (xs *XdsServer) FolderSync(id string) error { } // FolderUpdate Send PUT request to update a folder -func (xs *XdsServer) FolderUpdate(fld *XdsFolderConfig, resFld *XdsFolderConfig) error { +func (xs *XdsServer) FolderUpdate(fld *xsapiv1.FolderConfig, resFld *xsapiv1.FolderConfig) error { return xs.client.Put("/folders/"+fld.ID, fld, resFld) } @@ -325,7 +252,7 @@ func (xs *XdsServer) PassthroughPost(url string) { func (xs *XdsServer) EventRegister(evName string, id string) error { return xs.client.Post( "/events/register", - XdsEventRegisterArgs{ + xsapiv1.EventRegisterArgs{ Name: evName, ProjectID: id, }, @@ -345,10 +272,10 @@ func (xs *XdsServer) EventOn(evName string, privData interface{}, f EventCB) (uu // Register listener only the first time evn := evName - // FIXME: use generic type: data interface{} instead of data XdsEventFolderChange + // FIXME: use generic type: data interface{} instead of data xsapiv1.EventMsg var err error if evName == "event:folder-state-change" { - err = xs.ioSock.On(evn, func(data XdsEventFolderChange) error { + err = xs.ioSock.On(evn, func(data xsapiv1.EventMsg) error { xs.sockEventsLock.Lock() sEvts := make([]*caller, len(xs.sockEvents[evn])) copy(sEvts, xs.sockEvents[evn]) @@ -408,25 +335,25 @@ func (xs *XdsServer) EventOff(evName string, id uuid.UUID) error { } // ProjectToFolder Convert Project structure to Folder structure -func (xs *XdsServer) ProjectToFolder(pPrj apiv1.ProjectConfig) *XdsFolderConfig { +func (xs *XdsServer) ProjectToFolder(pPrj xaapiv1.ProjectConfig) *xsapiv1.FolderConfig { stID := "" - if pPrj.Type == XdsTypeCloudSync { + if pPrj.Type == xsapiv1.TypeCloudSync { stID, _ = xs.SThg.IDGet() } // TODO: limit ClientData size and gzip it (see https://golang.org/pkg/compress/gzip/) - fPrj := XdsFolderConfig{ + fPrj := xsapiv1.FolderConfig{ ID: pPrj.ID, Label: pPrj.Label, ClientPath: pPrj.ClientPath, - Type: XdsFolderType(pPrj.Type), + Type: xsapiv1.FolderType(pPrj.Type), Status: pPrj.Status, IsInSync: pPrj.IsInSync, DefaultSdk: pPrj.DefaultSdk, ClientData: pPrj.ClientData, - DataPathMap: XdsPathMapConfig{ + DataPathMap: xsapiv1.PathMapConfig{ ServerPath: pPrj.ServerPath, }, - DataCloudSync: XdsCloudSyncConfig{ + DataCloudSync: xsapiv1.CloudSyncConfig{ SyncThingID: stID, STLocIsInSync: pPrj.IsInSync, STLocStatus: pPrj.Status, @@ -439,36 +366,36 @@ func (xs *XdsServer) ProjectToFolder(pPrj apiv1.ProjectConfig) *XdsFolderConfig } // FolderToProject Convert Folder structure to Project structure -func (xs *XdsServer) FolderToProject(fPrj XdsFolderConfig) apiv1.ProjectConfig { +func (xs *XdsServer) FolderToProject(fPrj xsapiv1.FolderConfig) xaapiv1.ProjectConfig { inSync := fPrj.IsInSync sts := fPrj.Status - if fPrj.Type == XdsTypeCloudSync { + if fPrj.Type == xsapiv1.TypeCloudSync { inSync = fPrj.DataCloudSync.STSvrIsInSync && fPrj.DataCloudSync.STLocIsInSync sts = fPrj.DataCloudSync.STSvrStatus switch fPrj.DataCloudSync.STLocStatus { - case apiv1.StatusErrorConfig, apiv1.StatusDisable, apiv1.StatusPause: + case xaapiv1.StatusErrorConfig, xaapiv1.StatusDisable, xaapiv1.StatusPause: sts = fPrj.DataCloudSync.STLocStatus break - case apiv1.StatusSyncing: - if sts != apiv1.StatusErrorConfig && sts != apiv1.StatusDisable && sts != apiv1.StatusPause { - sts = apiv1.StatusSyncing + case xaapiv1.StatusSyncing: + if sts != xaapiv1.StatusErrorConfig && sts != xaapiv1.StatusDisable && sts != xaapiv1.StatusPause { + sts = xaapiv1.StatusSyncing } break - case apiv1.StatusEnable: + case xaapiv1.StatusEnable: // keep STSvrStatus break } } - pPrj := apiv1.ProjectConfig{ + pPrj := xaapiv1.ProjectConfig{ ID: fPrj.ID, ServerID: xs.ID, Label: fPrj.Label, ClientPath: fPrj.ClientPath, ServerPath: fPrj.DataPathMap.ServerPath, - Type: apiv1.ProjectType(fPrj.Type), + Type: xaapiv1.ProjectType(fPrj.Type), Status: sts, IsInSync: inSync, DefaultSdk: fPrj.DefaultSdk, @@ -523,7 +450,7 @@ func (xs *XdsServer) _reconnect() error { // Established HTTP and WS connection and retrieve XDSServer config func (xs *XdsServer) _connect(reConn bool) error { - xdsCfg := XdsServerConfig{} + xdsCfg := xsapiv1.APIConfig{} if err := xs.client.Get("/config", &xdsCfg); err != nil { xs.Connected = false if !reConn { @@ -532,12 +459,12 @@ func (xs *XdsServer) _connect(reConn bool) error { return err } - if reConn && xs.ID != xdsCfg.ID { - xs.Log.Warningf("Reconnected to server but ID differs: old=%s, new=%s", xs.ID, xdsCfg.ID) + if reConn && xs.ID != xdsCfg.ServerUID { + xs.Log.Warningf("Reconnected to server but ID differs: old=%s, new=%s", xs.ID, xdsCfg.ServerUID) } // Update local XDS config - xs.ID = xdsCfg.ID + xs.ID = xdsCfg.ServerUID xs.ServerConfig = &xdsCfg // Establish WS connection and register listen @@ -618,7 +545,7 @@ func (xs *XdsServer) _SocketConnect() error { // Send event to notify changes func (xs *XdsServer) _NotifyState() { - evSts := apiv1.ServerCfg{ + evSts := xaapiv1.ServerCfg{ ID: xs.ID, URL: xs.BaseURL, APIURL: xs.APIURL, @@ -626,7 +553,7 @@ func (xs *XdsServer) _NotifyState() { ConnRetry: xs.ConnRetry, Connected: xs.Connected, } - if err := xs.events.Emit(apiv1.EVTServerConfig, evSts, ""); err != nil { + if err := xs.events.Emit(xaapiv1.EVTServerConfig, evSts, ""); err != nil { xs.Log.Warningf("Cannot notify XdsServer state change: %v", err) } } diff --git a/lib/apiv1/config.go b/lib/apiv1/config.go deleted file mode 100644 index f5c1fb5..0000000 --- a/lib/apiv1/config.go +++ /dev/null @@ -1,22 +0,0 @@ -package apiv1 - -// APIConfig parameters (json format) of /config command -type APIConfig struct { - Servers []ServerCfg `json:"servers"` - - // Not exposed outside in JSON - Version string `json:"-"` - APIVersion string `json:"-"` - VersionGitTag string `json:"-"` -} - -// ServerCfg . -type ServerCfg struct { - ID string `json:"id"` - URL string `json:"url"` - APIURL string `json:"apiUrl"` - PartialURL string `json:"partialUrl"` - ConnRetry int `json:"connRetry"` - Connected bool `json:"connected"` - Disabled bool `json:"disabled"` -} diff --git a/lib/apiv1/events.go b/lib/apiv1/events.go deleted file mode 100644 index b2fda62..0000000 --- a/lib/apiv1/events.go +++ /dev/null @@ -1,77 +0,0 @@ -package apiv1 - -import ( - "encoding/json" - "fmt" -) - -// EventRegisterArgs is the parameters (json format) of /events/register command -type EventRegisterArgs struct { - Name string `json:"name"` - ProjectID string `json:"filterProjectID"` -} - -// EventUnRegisterArgs is the parameters (json format) of /events/unregister command -type EventUnRegisterArgs struct { - Name string `json:"name"` - ID int `json:"id"` -} - -// Events Type definitions -const ( - // EventTypePrefix Used as event prefix - EventTypePrefix = "event:" // following by event type - - // Supported Events type - EVTAll = EventTypePrefix + "all" - EVTServerConfig = EventTypePrefix + "server-config" // type EventMsg with Data type apiv1.ServerCfg - EVTProjectAdd = EventTypePrefix + "project-add" // type EventMsg with Data type apiv1.ProjectConfig - EVTProjectDelete = EventTypePrefix + "project-delete" // type EventMsg with Data type apiv1.ProjectConfig - EVTProjectChange = EventTypePrefix + "project-state-change" // type EventMsg with Data type apiv1.ProjectConfig -) - -// EVTAllList List of all supported events -var EVTAllList = []string{ - EVTServerConfig, - EVTProjectAdd, - EVTProjectDelete, - EVTProjectChange, -} - -// EventMsg Event message send over Websocket, data format depend to Type (see DecodeXXX function) -type EventMsg struct { - Time string `json:"time"` // Timestamp - FromSessionID string `json:"sessionID"` // Session ID of client that emits this event - Type string `json:"type"` // Data type - Data interface{} `json:"data"` // Data -} - -// DecodeServerCfg Helper to decode Data field type ServerCfg -func (e *EventMsg) DecodeServerCfg() (ServerCfg, error) { - p := ServerCfg{} - if e.Type != EVTServerConfig { - return p, fmt.Errorf("Invalid type") - } - d, err := json.Marshal(e.Data) - if err == nil { - err = json.Unmarshal(d, &p) - } - return p, err -} - -// DecodeProjectConfig Helper to decode Data field type ProjectConfig -func (e *EventMsg) DecodeProjectConfig() (ProjectConfig, error) { - var err error - p := ProjectConfig{} - switch e.Type { - case EVTProjectAdd, EVTProjectChange, EVTProjectDelete: - d := []byte{} - d, err = json.Marshal(e.Data) - if err == nil { - err = json.Unmarshal(d, &p) - } - default: - err = fmt.Errorf("Invalid type") - } - return p, err -} diff --git a/lib/apiv1/exec.go b/lib/apiv1/exec.go deleted file mode 100644 index 914ed79..0000000 --- a/lib/apiv1/exec.go +++ /dev/null @@ -1,64 +0,0 @@ -package apiv1 - -type ( - // ExecArgs JSON parameters of /exec command - ExecArgs struct { - ID string `json:"id" binding:"required"` - SdkID string `json:"sdkID"` // sdk ID to use for setting env - CmdID string `json:"cmdID"` // command unique ID - Cmd string `json:"cmd" binding:"required"` - Args []string `json:"args"` - Env []string `json:"env"` - RPath string `json:"rpath"` // relative path into project - TTY bool `json:"tty"` // Use a tty, specific to gdb --tty option - TTYGdbserverFix bool `json:"ttyGdbserverFix"` // Set to true to activate gdbserver workaround about inferior output - ExitImmediate bool `json:"exitImmediate"` // when true, exit event sent immediately when command exited (IOW, don't wait file synchronization) - CmdTimeout int `json:"timeout"` // command completion timeout in Second - } - - // ExecInMsg Message used to received input characters (stdin) - ExecInMsg struct { - CmdID string `json:"cmdID"` - Timestamp string `json:"timestamp"` - Stdin string `json:"stdin"` - } - - // ExecOutMsg Message used to send output characters (stdout+stderr) - ExecOutMsg struct { - CmdID string `json:"cmdID"` - Timestamp string `json:"timestamp"` - Stdout string `json:"stdout"` - Stderr string `json:"stderr"` - } - - // ExecExitMsg Message sent when executed command exited - ExecExitMsg struct { - CmdID string `json:"cmdID"` - Timestamp string `json:"timestamp"` - Code int `json:"code"` - Error error `json:"error"` - } - - // ExecSignalArgs JSON parameters of /exec/signal command - ExecSignalArgs struct { - CmdID string `json:"cmdID" binding:"required"` // command id - Signal string `json:"signal" binding:"required"` // signal number - } -) - -const ( - // ExecInEvent Event send in WS when characters are sent (stdin) - ExecInEvent = "exec:input" - - // ExecOutEvent Event send in WS when characters are received (stdout or stderr) - ExecOutEvent = "exec:output" - - // ExecExitEvent Event send in WS when program exited - ExecExitEvent = "exec:exit" - - // ExecInferiorInEvent Event send in WS when characters are sent to an inferior (used by gdb inferior/tty) - ExecInferiorInEvent = "exec:inferior-input" - - // ExecInferiorOutEvent Event send in WS when characters are received by an inferior - ExecInferiorOutEvent = "exec:inferior-output" -) diff --git a/lib/apiv1/projects.go b/lib/apiv1/projects.go deleted file mode 100644 index b1e64c8..0000000 --- a/lib/apiv1/projects.go +++ /dev/null @@ -1,38 +0,0 @@ -package apiv1 - -// ProjectType definition -type ProjectType string - -const ( - TypePathMap = "PathMap" - TypeCloudSync = "CloudSync" - TypeCifsSmb = "CIFS" -) - -// Project Status definition -const ( - StatusErrorConfig = "ErrorConfig" - StatusDisable = "Disable" - StatusEnable = "Enable" - StatusPause = "Pause" - StatusSyncing = "Syncing" -) - -// ProjectConfig is the config for one project -type ProjectConfig struct { - ID string `json:"id"` - ServerID string `json:"serverId"` - Label string `json:"label"` - ClientPath string `json:"clientPath"` - ServerPath string `json:"serverPath"` - Type ProjectType `json:"type"` - Status string `json:"status"` - IsInSync bool `json:"isInSync"` - DefaultSdk string `json:"defaultSdk"` - ClientData string `json:"clientData"` // free form field that can used by client -} - -// ProjectConfigUpdatableFields List fields that can be updated using Update function -var ProjectConfigUpdatableFields = []string{ - "Label", "DefaultSdk", "ClientData", -} diff --git a/lib/apiv1/sdks.go b/lib/apiv1/sdks.go deleted file mode 100644 index dfa44e2..0000000 --- a/lib/apiv1/sdks.go +++ /dev/null @@ -1,11 +0,0 @@ -package apiv1 - -// SDK Define a cross tool chain used to build application -type SDK struct { - ID string `json:"id" binding:"required"` - Name string `json:"name"` - Profile string `json:"profile"` - Version string `json:"version"` - Arch string `json:"arch"` - Path string `json:"path"` -} diff --git a/lib/apiv1/version.go b/lib/apiv1/version.go deleted file mode 100644 index 956f890..0000000 --- a/lib/apiv1/version.go +++ /dev/null @@ -1,15 +0,0 @@ -package apiv1 - -// VersionData -type VersionData struct { - ID string `json:"id"` - Version string `json:"version"` - APIVersion string `json:"apiVersion"` - VersionGitTag string `json:"gitTag"` -} - -// XDSVersion -type XDSVersion struct { - Client VersionData `json:"client"` - Server []VersionData `json:"servers"` -} diff --git a/lib/syncthing/stfolder.go b/lib/syncthing/stfolder.go index 196e3c7..2273f1a 100644 --- a/lib/syncthing/stfolder.go +++ b/lib/syncthing/stfolder.go @@ -20,7 +20,7 @@ type FolderChangeArg struct { // FolderLoadFromStConfig Load/Retrieve folder config from syncthing database /* -func (s *SyncThing) FolderLoadFromStConfig(f *[]XdsFolderConfig) error { +func (s *SyncThing) FolderLoadFromStConfig(f *[]xsapiv1.FolderConfig) error { defaultSdk := "" // cannot know which was the default sdk @@ -40,15 +40,15 @@ func (s *SyncThing) FolderLoadFromStConfig(f *[]XdsFolderConfig) error { } for _, stFld := range stCfg.Folders { - *f = append(*f, XdsFolderConfig{ + *f = append(*f, xsapiv1.FolderConfig{ ID: stFld.ID, Label: stFld.Label, ClientPath: strings.TrimRight(stFld.Path, "/"), - Type: XdsTypeCloudSync, + Type: xsapiv1.TypeCloudSync, Status: StatusDisable, DefaultSdk: defaultSdk, RootPath: "", - DataCloudSync: XdsCloudSyncConfig{SyncThingID: devID}, + DataCloudSync: xsapiv1.CloudSyncConfig{SyncThingID: devID}, }) } diff --git a/lib/xaapiv1/config.go b/lib/xaapiv1/config.go new file mode 100644 index 0000000..ae853dd --- /dev/null +++ b/lib/xaapiv1/config.go @@ -0,0 +1,22 @@ +package xaapiv1 + +// APIConfig parameters (json format) of /config command +type APIConfig struct { + Servers []ServerCfg `json:"servers"` + + // Not exposed outside in JSON + Version string `json:"-"` + APIVersion string `json:"-"` + VersionGitTag string `json:"-"` +} + +// ServerCfg . +type ServerCfg struct { + ID string `json:"id"` + URL string `json:"url"` + APIURL string `json:"apiUrl"` + PartialURL string `json:"partialUrl"` + ConnRetry int `json:"connRetry"` + Connected bool `json:"connected"` + Disabled bool `json:"disabled"` +} diff --git a/lib/xaapiv1/events.go b/lib/xaapiv1/events.go new file mode 100644 index 0000000..12c8cb2 --- /dev/null +++ b/lib/xaapiv1/events.go @@ -0,0 +1,77 @@ +package xaapiv1 + +import ( + "encoding/json" + "fmt" +) + +// EventRegisterArgs is the parameters (json format) of /events/register command +type EventRegisterArgs struct { + Name string `json:"name"` + ProjectID string `json:"filterProjectID"` +} + +// EventUnRegisterArgs is the parameters (json format) of /events/unregister command +type EventUnRegisterArgs struct { + Name string `json:"name"` + ID int `json:"id"` +} + +// Events Type definitions +const ( + // EventTypePrefix Used as event prefix + EventTypePrefix = "event:" // following by event type + + // Supported Events type + EVTAll = EventTypePrefix + "all" + EVTServerConfig = EventTypePrefix + "server-config" // type EventMsg with Data type xaapiv1.ServerCfg + EVTProjectAdd = EventTypePrefix + "project-add" // type EventMsg with Data type xaapiv1.ProjectConfig + EVTProjectDelete = EventTypePrefix + "project-delete" // type EventMsg with Data type xaapiv1.ProjectConfig + EVTProjectChange = EventTypePrefix + "project-state-change" // type EventMsg with Data type xaapiv1.ProjectConfig +) + +// EVTAllList List of all supported events +var EVTAllList = []string{ + EVTServerConfig, + EVTProjectAdd, + EVTProjectDelete, + EVTProjectChange, +} + +// EventMsg Event message send over Websocket, data format depend to Type (see DecodeXXX function) +type EventMsg struct { + Time string `json:"time"` // Timestamp + FromSessionID string `json:"sessionID"` // Session ID of client that emits this event + Type string `json:"type"` // Data type + Data interface{} `json:"data"` // Data +} + +// DecodeServerCfg Helper to decode Data field type ServerCfg +func (e *EventMsg) DecodeServerCfg() (ServerCfg, error) { + p := ServerCfg{} + if e.Type != EVTServerConfig { + return p, fmt.Errorf("Invalid type") + } + d, err := json.Marshal(e.Data) + if err == nil { + err = json.Unmarshal(d, &p) + } + return p, err +} + +// DecodeProjectConfig Helper to decode Data field type ProjectConfig +func (e *EventMsg) DecodeProjectConfig() (ProjectConfig, error) { + var err error + p := ProjectConfig{} + switch e.Type { + case EVTProjectAdd, EVTProjectChange, EVTProjectDelete: + d := []byte{} + d, err = json.Marshal(e.Data) + if err == nil { + err = json.Unmarshal(d, &p) + } + default: + err = fmt.Errorf("Invalid type") + } + return p, err +} diff --git a/lib/xaapiv1/exec.go b/lib/xaapiv1/exec.go new file mode 100644 index 0000000..b96be79 --- /dev/null +++ b/lib/xaapiv1/exec.go @@ -0,0 +1,64 @@ +package xaapiv1 + +type ( + // ExecArgs JSON parameters of /exec command + ExecArgs struct { + ID string `json:"id" binding:"required"` + SdkID string `json:"sdkID"` // sdk ID to use for setting env + CmdID string `json:"cmdID"` // command unique ID + Cmd string `json:"cmd" binding:"required"` + Args []string `json:"args"` + Env []string `json:"env"` + RPath string `json:"rpath"` // relative path into project + TTY bool `json:"tty"` // Use a tty, specific to gdb --tty option + TTYGdbserverFix bool `json:"ttyGdbserverFix"` // Set to true to activate gdbserver workaround about inferior output + ExitImmediate bool `json:"exitImmediate"` // when true, exit event sent immediately when command exited (IOW, don't wait file synchronization) + CmdTimeout int `json:"timeout"` // command completion timeout in Second + } + + // ExecInMsg Message used to received input characters (stdin) + ExecInMsg struct { + CmdID string `json:"cmdID"` + Timestamp string `json:"timestamp"` + Stdin string `json:"stdin"` + } + + // ExecOutMsg Message used to send output characters (stdout+stderr) + ExecOutMsg struct { + CmdID string `json:"cmdID"` + Timestamp string `json:"timestamp"` + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + } + + // ExecExitMsg Message sent when executed command exited + ExecExitMsg struct { + CmdID string `json:"cmdID"` + Timestamp string `json:"timestamp"` + Code int `json:"code"` + Error error `json:"error"` + } + + // ExecSignalArgs JSON parameters of /exec/signal command + ExecSignalArgs struct { + CmdID string `json:"cmdID" binding:"required"` // command id + Signal string `json:"signal" binding:"required"` // signal number + } +) + +const ( + // ExecInEvent Event send in WS when characters are sent (stdin) + ExecInEvent = "exec:input" + + // ExecOutEvent Event send in WS when characters are received (stdout or stderr) + ExecOutEvent = "exec:output" + + // ExecExitEvent Event send in WS when program exited + ExecExitEvent = "exec:exit" + + // ExecInferiorInEvent Event send in WS when characters are sent to an inferior (used by gdb inferior/tty) + ExecInferiorInEvent = "exec:inferior-input" + + // ExecInferiorOutEvent Event send in WS when characters are received by an inferior + ExecInferiorOutEvent = "exec:inferior-output" +) diff --git a/lib/xaapiv1/projects.go b/lib/xaapiv1/projects.go new file mode 100644 index 0000000..51c5837 --- /dev/null +++ b/lib/xaapiv1/projects.go @@ -0,0 +1,38 @@ +package xaapiv1 + +// ProjectType definition +type ProjectType string + +const ( + TypePathMap = "PathMap" + TypeCloudSync = "CloudSync" + TypeCifsSmb = "CIFS" +) + +// Project Status definition +const ( + StatusErrorConfig = "ErrorConfig" + StatusDisable = "Disable" + StatusEnable = "Enable" + StatusPause = "Pause" + StatusSyncing = "Syncing" +) + +// ProjectConfig is the config for one project +type ProjectConfig struct { + ID string `json:"id"` + ServerID string `json:"serverId"` + Label string `json:"label"` + ClientPath string `json:"clientPath"` + ServerPath string `json:"serverPath"` + Type ProjectType `json:"type"` + Status string `json:"status"` + IsInSync bool `json:"isInSync"` + DefaultSdk string `json:"defaultSdk"` + ClientData string `json:"clientData"` // free form field that can used by client +} + +// ProjectConfigUpdatableFields List fields that can be updated using Update function +var ProjectConfigUpdatableFields = []string{ + "Label", "DefaultSdk", "ClientData", +} diff --git a/lib/xaapiv1/sdks.go b/lib/xaapiv1/sdks.go new file mode 100644 index 0000000..63ef357 --- /dev/null +++ b/lib/xaapiv1/sdks.go @@ -0,0 +1,11 @@ +package xaapiv1 + +// SDK Define a cross tool chain used to build application +type SDK struct { + ID string `json:"id" binding:"required"` + Name string `json:"name"` + Profile string `json:"profile"` + Version string `json:"version"` + Arch string `json:"arch"` + Path string `json:"path"` +} diff --git a/lib/xaapiv1/version.go b/lib/xaapiv1/version.go new file mode 100644 index 0000000..5fed4e2 --- /dev/null +++ b/lib/xaapiv1/version.go @@ -0,0 +1,15 @@ +package xaapiv1 + +// VersionData +type VersionData struct { + ID string `json:"id"` + Version string `json:"version"` + APIVersion string `json:"apiVersion"` + VersionGitTag string `json:"gitTag"` +} + +// XDSVersion +type XDSVersion struct { + Client VersionData `json:"client"` + Server []VersionData `json:"servers"` +} -- cgit 1.2.3-korg