mirror of
https://github.com/tuna/tunasync.git
synced 2025-04-20 03:32:43 +00:00
131 lines
3.2 KiB
Go
131 lines
3.2 KiB
Go
package internal
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// A MirrorStatus represents a msg when
|
|
// a worker has done syncing
|
|
type MirrorStatus struct {
|
|
Name string `json:"name"`
|
|
Worker string `json:"worker"`
|
|
IsMaster bool `json:"is_master"`
|
|
Status SyncStatus `json:"status"`
|
|
LastUpdate time.Time `json:"last_update"`
|
|
LastStarted time.Time `json:"last_started"`
|
|
LastEnded time.Time `json:"last_ended"`
|
|
Scheduled time.Time `json:"next_schedule"`
|
|
Upstream string `json:"upstream"`
|
|
Size string `json:"size"`
|
|
ErrorMsg string `json:"error_msg"`
|
|
}
|
|
|
|
// A WorkerStatus is the information struct that describe
|
|
// a worker, and sent from the manager to clients.
|
|
type WorkerStatus struct {
|
|
ID string `json:"id"`
|
|
URL string `json:"url"` // worker url
|
|
Token string `json:"token"` // session token
|
|
LastOnline time.Time `json:"last_online"` // last seen
|
|
LastRegister time.Time `json:"last_register"` // last register time
|
|
}
|
|
|
|
type MirrorSchedules struct {
|
|
Schedules []MirrorSchedule `json:"schedules"`
|
|
}
|
|
|
|
type MirrorSchedule struct {
|
|
MirrorName string `json:"name"`
|
|
NextSchedule time.Time `json:"next_schedule"`
|
|
}
|
|
|
|
// A CmdVerb is an action to a job or worker
|
|
type CmdVerb uint8
|
|
|
|
const (
|
|
// CmdStart start a job
|
|
CmdStart CmdVerb = iota
|
|
// CmdStop stop syncing, but keep the job
|
|
CmdStop
|
|
// CmdDisable disable the job (stops goroutine)
|
|
CmdDisable
|
|
// CmdRestart restart a syncing job
|
|
CmdRestart
|
|
// CmdPing ensures the goroutine is alive
|
|
CmdPing
|
|
|
|
// CmdReload tells a worker to reload mirror config
|
|
CmdReload
|
|
)
|
|
|
|
func (c CmdVerb) String() string {
|
|
mapping := map[CmdVerb]string{
|
|
CmdStart: "start",
|
|
CmdStop: "stop",
|
|
CmdDisable: "disable",
|
|
CmdRestart: "restart",
|
|
CmdPing: "ping",
|
|
CmdReload: "reload",
|
|
}
|
|
return mapping[c]
|
|
}
|
|
|
|
func NewCmdVerbFromString(s string) CmdVerb {
|
|
mapping := map[string]CmdVerb{
|
|
"start": CmdStart,
|
|
"stop": CmdStop,
|
|
"disable": CmdDisable,
|
|
"restart": CmdRestart,
|
|
"ping": CmdPing,
|
|
"reload": CmdReload,
|
|
}
|
|
return mapping[s]
|
|
}
|
|
|
|
// Marshal and Unmarshal for CmdVerb
|
|
func (s CmdVerb) MarshalJSON() ([]byte, error) {
|
|
buffer := bytes.NewBufferString(`"`)
|
|
buffer.WriteString(s.String())
|
|
buffer.WriteString(`"`)
|
|
return buffer.Bytes(), nil
|
|
}
|
|
|
|
func (s *CmdVerb) UnmarshalJSON(b []byte) error {
|
|
var j string
|
|
err := json.Unmarshal(b, &j)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*s = NewCmdVerbFromString(j)
|
|
return nil
|
|
}
|
|
|
|
// A WorkerCmd is the command message send from the
|
|
// manager to a worker
|
|
type WorkerCmd struct {
|
|
Cmd CmdVerb `json:"cmd"`
|
|
MirrorID string `json:"mirror_id"`
|
|
Args []string `json:"args"`
|
|
Options map[string]bool `json:"options"`
|
|
}
|
|
|
|
func (c WorkerCmd) String() string {
|
|
if len(c.Args) > 0 {
|
|
return fmt.Sprintf("%v (%s, %v)", c.Cmd, c.MirrorID, c.Args)
|
|
}
|
|
return fmt.Sprintf("%v (%s)", c.Cmd, c.MirrorID)
|
|
}
|
|
|
|
// A ClientCmd is the command message send from client
|
|
// to the manager
|
|
type ClientCmd struct {
|
|
Cmd CmdVerb `json:"cmd"`
|
|
MirrorID string `json:"mirror_id"`
|
|
WorkerID string `json:"worker_id"`
|
|
Args []string `json:"args"`
|
|
Options map[string]bool `json:"options"`
|
|
}
|