mirror of https://github.com/shunfei/cronsun
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.4 KiB
73 lines
1.4 KiB
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/<cmd> |
|
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()) |
|
}
|
|
|