diff --git a/internal/msg.go b/internal/msg.go new file mode 100644 index 0000000..5ff8ce9 --- /dev/null +++ b/internal/msg.go @@ -0,0 +1,42 @@ +package internal + +import "time" + +// A StatusUpdateMsg represents a msg when +// a worker has done syncing +type StatusUpdateMsg struct { + Name string `json:"name"` + Worker string `json:"worker"` + IsMaster bool `json:"is_master"` + Status SyncStatus `json:"status"` + LastUpdate time.Time `json:"last_update"` + Upstream string `json:"upstream"` + Size string `json:"size"` +} + +// A WorkerInfoMsg is +type WorkerInfoMsg struct { + Name string `json:"name"` +} + +type CmdVerb uint8 + +const ( + CmdStart CmdVerb = iota + CmdStop // stop syncing keep the job + CmdDisable // disable the job (stops goroutine) + CmdRestart // restart syncing + CmdPing // ensure the goroutine is alive +) + +type WorkerCmd struct { + Cmd CmdVerb `json:"cmd"` + Args []string `json:"args"` +} + +type ClientCmd struct { + Cmd CmdVerb `json:"cmd"` + MirrorID string `json:"mirror_id"` + WorkerID string `json:"worker_id"` + Args []string `json:"args"` +} diff --git a/manager/db.go b/manager/db.go new file mode 100644 index 0000000..4cf3edd --- /dev/null +++ b/manager/db.go @@ -0,0 +1,23 @@ +package manager + +import "github.com/boltdb/bolt" + +type dbAdapter interface { + GetWorker(workerID string) + UpdateMirrorStatus(workerID, mirrorID string, status mirrorStatus) + GetMirrorStatus(workerID, mirrorID string) + GetMirrorStatusList(workerID string) + Close() +} + +type boltAdapter struct { + db *bolt.DB + dbFile string +} + +func (b *boltAdapter) Close() error { + if b.db != nil { + return b.db.Close() + } + return nil +} diff --git a/manager/server.go b/manager/server.go index 3c41889..4d674bd 100644 --- a/manager/server.go +++ b/manager/server.go @@ -23,14 +23,20 @@ func makeHTTPServer(debug bool) *gin.Engine { r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"msg": "pong"}) }) - // List jobs, status page + // list jobs, status page r.GET("/jobs", func(c *gin.Context) {}) // worker online r.POST("/workers/:name", func(c *gin.Context) {}) - // post job list - r.POST("/workers/:name/jobs", func(c *gin.Context) {}) + // get job list + r.GET("/workers/:name/jobs", func(c *gin.Context) {}) // post job status r.POST("/workers/:name/jobs/:job", func(c *gin.Context) {}) + // worker command polling + r.GET("/workers/:name/cmd_stream", func(c *gin.Context) {}) + + // for tunasynctl to post commands + r.POST("/cmd/", func(c *gin.Context) {}) + return r }