package cronsun import ( "encoding/json" "errors" client "github.com/coreos/etcd/clientv3" "github.com/shunfei/cronsun/conf" ) const ( NodeCmdUnknown NodeCmd = iota NodeCmdRmOld NodeCmdSync NodeCmdMax ) var ( InvalidNodeCmdErr = errors.New("invalid node command") NodeCmds = []string{ "unknown", "rmold", "sync", } ) type NodeCmd int func (cmd NodeCmd) String() string { if NodeCmdMax <= cmd || cmd <= NodeCmdUnknown { return "unknown" } return NodeCmds[cmd] } func ToNodeCmd(cmd string) (NodeCmd, error) { for nc := NodeCmdUnknown + 1; nc < NodeCmdMax; nc++ { if cmd == NodeCmds[nc] { return nc, nil } } return NodeCmdUnknown, InvalidNodeCmdErr } type CsctlCmd struct { // the command send to node Cmd NodeCmd // the node ids that needs to execute the command, empty means all node Include []string // the node ids that doesn't need to execute the command, empty means none Exclude []string } // 执行 csctl 发送的命令 // 注册到 /cronsun/csctl/ func PutCsctl(cmd *CsctlCmd) error { if NodeCmdMax <= cmd.Cmd || cmd.Cmd <= NodeCmdUnknown { return InvalidNodeCmdErr } params, err := json.Marshal(cmd) if err != nil { return err } _, err = DefalutClient.Put(conf.Config.Csctl+NodeCmds[cmd.Cmd], string(params)) return err } func WatchCsctl() client.WatchChan { return DefalutClient.Watch(conf.Config.Csctl, client.WithPrefix()) }