1
0
forked from x/icebergs
This commit is contained in:
harveyshao 2021-12-27 23:02:51 +08:00
parent 569e2791d7
commit c83549f7e5
22 changed files with 104 additions and 62 deletions

View File

@ -21,7 +21,7 @@ func _runtime_init(m *ice.Message) {
})
// 环境变量
for _, k := range []string{CTX_SHY, CTX_DEV, CTX_OPS, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} {
for _, k := range []string{CTX_SHY, CTX_DEV, CTX_OPS, CTX_ARG, CTX_PID, CTX_USER, CTX_SHARE, CTX_RIVER} {
m.Conf(RUNTIME, kit.Keys(CONF, k), os.Getenv(k))
}
@ -118,6 +118,7 @@ const (
CTX_SHY = "ctx_shy"
CTX_DEV = "ctx_dev"
CTX_OPS = "ctx_ops"
CTX_ARG = "ctx_arg"
CTX_PID = "ctx_pid"
CTX_LOG = "ctx_log"

View File

@ -14,7 +14,6 @@ func _hash_fields(m *ice.Message) []string {
}
func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) {
list := map[string]int{}
m.Debug("what %v %v", prefix, chain)
m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" {
list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT])
@ -143,6 +142,9 @@ func HashAction(fields ...string) map[string]*ice.Action {
if m.Config(kit.MDB_HASH) == "uniq" {
return kit.MDB_HASH
}
if m.Config(kit.MDB_SHORT) == "uniq" {
return kit.MDB_HASH
}
return kit.Select(kit.MDB_HASH, m.Config(kit.MDB_SHORT))
}
return ice.SelectAction(map[string]*ice.Action{

View File

@ -115,7 +115,6 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*
MODIFY: {Name: "modify key sub type field value arg...", Help: "编辑", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] {
case ZONE: // modify key sub type zone id field value
m.Debug("what %v %v", arg[3], kit.KeyHash(arg[3]))
_list_modify(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.MDB_ID, arg[4], arg[5:]...)
case HASH:
_hash_modify(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4], arg[5:]...)

View File

@ -102,9 +102,6 @@ func _cache_download(m *ice.Message, r *http.Response) (file, size string) {
})
default:
if s != step && s%10 == 0 {
m.Debug("what %v", m.OptionCB(SPIDE))
m.Debug("what %v", m.OptionCB(SPIDE))
m.Debug("what %v", kit.FileLine(m.OptionCB(SPIDE), 3))
m.Log_IMPORT(kit.MDB_FILE, p, kit.MDB_STEP, s,
kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total)))
}

View File

@ -43,7 +43,7 @@ func _dream_show(m *ice.Message, name string) {
os.MkdirAll(p, ice.MOD_DIR)
}
m.ProcessOpen(m.MergeURL2("/chat/pod/" + name))
defer m.ProcessOpen(m.MergeURL2("/chat/pod/" + name))
// 任务模板
if m.Option(kit.MDB_TEMPLATE) != "" {

View File

@ -125,6 +125,11 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
msg.Option(ice.MSG_USERADDR, msg.Option(ice.MSG_USERIP))
}
cookie := ice.MSG_SESSID + "_" + strings.ReplaceAll(strings.ReplaceAll(kit.ParseURLMap(msg.Option(ice.MSG_USERWEB))["host"], ".", "_"), ":", "_")
if sessid := msg.Option(cookie); sessid != "" {
msg.Option(ice.MSG_SESSID, sessid)
}
// 请求数据
switch r.Header.Get(ContentType) {
case ContentJSON:
@ -286,8 +291,8 @@ func init() {
m.Config(kit.Keys(aaa.WHITE, k), ice.TRUE)
}
}},
cli.START: {Name: "start dev name=ops proto=http host port=9020", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
if cli.NodeInfo(m, SERVER, ice.Info.HostName); m.Option(tcp.PORT) == tcp.RANDOM {
cli.START: {Name: "start dev name=ops proto=http host port=9020 nodename", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
if cli.NodeInfo(m, SERVER, kit.Select(ice.Info.HostName, m.Option("nodename"))); m.Option(tcp.PORT) == tcp.RANDOM {
m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT))
}

View File

@ -35,49 +35,50 @@ func _space_domain(m *ice.Message) (link string) {
return tcp.ReplaceLocalhost(m, link)
}
func _space_dial(m *ice.Message, dev, name string, arg ...string) {
m.Richs(SPIDE, nil, dev, func(key string, value map[string]interface{}) {
client := kit.Value(value, tcp.CLIENT).(map[string]interface{})
redial := m.Confm(SPACE, kit.Keym("redial"))
if strings.HasPrefix(dev, "http") {
m.Cmd(SPIDE, mdb.CREATE, ice.DEV, dev)
dev = ice.DEV
}
value := m.Richs(SPIDE, nil, dev, nil)
client := kit.Value(value, tcp.CLIENT).(map[string]interface{})
host := kit.Format(client[tcp.HOSTNAME])
proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1)
uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, kit.MDB_NAME, name,
SHARE, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_share")), RIVER, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_river")), arg)
m.Go(func() {
u := kit.ParseURL(uri)
redial := m.Configm("redial")
frame := m.Target().Server().(*Frame)
host := kit.Format(client[tcp.HOSTNAME])
proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1)
uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, kit.MDB_NAME, name,
SHARE, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_share")), RIVER, m.Conf(cli.RUNTIME, kit.Keys("conf.ctx_river")), arg)
u := kit.ParseURL(uri)
for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ {
msg := m.Spawn()
msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn) {
if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) {
msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host))
msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri)
m.Go(func() {
for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ {
msg := m.Spawn()
msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) {
if msg.Warn(e) {
return
// 连接成功
if i = 0; _space_handle(msg, true, frame.send, s, dev) {
i = -2 // 连接关闭
}
}
})
ls := strings.Split(host, ":")
msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.SimpleKV("type,name,host,port", proto, dev, ls[0], kit.Select("443", ls, 1)))
if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) {
msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host))
msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri)
// 连接成功
if i = 0; _space_handle(msg, true, frame.send, s, dev) {
i = -2 // 连接关闭
}
}
})
ls := strings.Split(host, ":")
msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, kit.Select("443", ls, 1))
// 断线重连
sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond
msg.Cost("order", i, "sleep", sleep, "reconnect", dev)
time.Sleep(sleep)
}
})
// 断线重连
sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond
msg.Cost("order", i, "sleep", sleep, "reconnect", dev)
time.Sleep(sleep)
}
})
}
func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool {
for running := true; running; {
if _, b, e := c.ReadMessage(); m.Warn(e, "space", name) {
if _, b, e := c.ReadMessage(); m.Warn(e, SPACE, name) {
break
} else {
socket, msg := c, m.Spawn(b)
@ -90,7 +91,12 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
if msg.Optionv(ice.MSG_HANDLE, ice.TRUE); safe {
msg.Go(func() { _space_exec(msg, source, target, c, name) })
} else {
msg.Push(kit.MDB_LINK, kit.MergePOD(_space_domain(msg), name))
url := kit.ParseURL(_space_domain(msg))
pod := url.Query().Get(ice.POD)
if strings.HasPrefix(url.Path, "/chat/pod") {
pod = strings.Split(url.Path, ice.PS)[3]
}
msg.Push(kit.MDB_LINK, kit.MergeURL2(url.String(), "/chat/pod/"+kit.Keys(pod, name), ice.POD, ""))
_space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
}
@ -120,7 +126,7 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
}
} else { // 接收响应
m.Sleep("30ms")
m.Sleep30ms()
res.Back(msg)
}
}
@ -243,7 +249,7 @@ func init() {
m.Cmd(mdb.SEARCH, mdb.CREATE, SPACE, m.Prefix(SPACE))
}},
SPACE: {Name: "space name cmd auto", Help: "空间站", Action: ice.MergeAction(map[string]*ice.Action{
tcp.DIAL: {Name: "dial dev name river", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
tcp.DIAL: {Name: "dial dev=ops name river", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
_space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME)))
}},
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
@ -282,11 +288,11 @@ func init() {
case CHROME: // 交互节点
m.Go(func(msg *ice.Message) {
switch m.Option("cmd") {
case "pwd":
case cli.PWD:
link := kit.MergeURL(_space_domain(msg), "grant", name)
msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link))
msg.Sleep("100ms").Cmd(SPACE, name, cli.PWD, name, link, msg.Cmdx(cli.QRCODE, link))
default:
msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name)
msg.Sleep("100ms").Cmd(SPACE, name, cli.PWD, name)
}
})
case WORKER: // 工作节点

View File

@ -346,6 +346,7 @@ func init() {
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 || arg[0] == "" || (len(arg) > 3 && arg[3] == "") {
mdb.HashSelect(m, kit.Slice(arg, 0, 1)...)
m.Sort("client.name")
return
}
_spide_list(m, arg...)

View File

@ -68,6 +68,9 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool {
}
})
m.Event(SERVE_START)
defer m.Event(SERVE_STOP)
web.m, web.Server = m, &http.Server{Handler: web}
switch cb := m.Optionv(kit.Keycb(SERVE)).(type) {
case func(http.Handler):
@ -93,6 +96,10 @@ func (web *Frame) Close(m *ice.Message, arg ...string) bool {
}
const WEB = "web"
const (
SERVE_START = "serve.start"
SERVE_STOP = "serve.stop"
)
var Index = &ice.Context{Name: WEB, Help: "网络模块"}

View File

@ -35,6 +35,7 @@ const (
OPS = "ops"
ICE = "ice"
ENV = "env"
RUN = "run"
RES = "res"
ERR = "err"

View File

@ -13,5 +13,6 @@ func init() {
web.Index.Register(Index, &web.Frame{},
HEADER, RIVER, STORM, ACTION, FOOTER,
SCAN, PASTE, FILES, LOCATION,
WEBSITE,
)
}

View File

@ -30,7 +30,6 @@ func init() {
mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(kit.MDB_ZONE), arg[2:])
m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, ice.Option{mdb.FIELDS, "time,space"}).Table(func(index int, value map[string]string, head []string) {
m.Debug("what %v", value)
m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name"))
})
}},

View File

@ -35,7 +35,6 @@ func _bench_http(m *ice.Message, target string, arg ...string) {
m.Assert(err)
list = append(list, req)
}
m.Debug("what %v", v)
}
var body int64

View File

@ -141,7 +141,7 @@ func init() {
))},
GO: {Name: GO, Help: "后端", Value: kit.Data(PLUG, kit.Dict(
SPLIT, kit.Dict("space", "\t ", "operator", "{[(&.,:;!|<>)]}"),
PREFIX, kit.Dict("//", COMMENT, "/*", COMMENT, "* ", COMMENT),
PREFIX, kit.Dict("// ", COMMENT, "/*", COMMENT, "* ", COMMENT),
PREPARE, kit.Dict(
KEYWORD, kit.Simple(
"package", "import", "type", "struct", "interface", "const", "var", "func",

View File

@ -32,7 +32,7 @@ func init() {
}, PlugAction())},
}, Configs: map[string]*ice.Config{
SHY: {Name: SHY, Help: "脚本", Value: kit.Data(PLUG, kit.Dict(
PREFIX, kit.Dict("#", COMMENT),
PREFIX, kit.Dict("# ", COMMENT),
PREPARE, kit.Dict(
KEYWORD, kit.Simple(
"title",

View File

@ -50,9 +50,7 @@ func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message {
m.Push(key, value, fields, val)
m.PushButton(_task_action(m, value[STATUS], mdb.PLUGIN))
})
m.Debug("what %v", 123)
m.Cmd(mdb.SELECT, m.Prefix(TASK), "", mdb.ZONE, kit.MDB_FOREACH)
m.Debug("what %v", 123)
return m
}

View File

@ -22,6 +22,7 @@ func (m *Message) Config(key string, arg ...interface{}) string {
m.Conf(m.PrefixKey(), kit.Keym(key), arg[0])
}
return m.Conf(m.PrefixKey(), kit.Keym(key))
// return kit.Format(m.Configv(key, arg...))
}
func (m *Message) Configv(key string, arg ...interface{}) interface{} {
if len(arg) > 0 {
@ -29,6 +30,10 @@ func (m *Message) Configv(key string, arg ...interface{}) interface{} {
}
return m.Confv(m.PrefixKey(), kit.Keym(key))
}
func (m *Message) Configm(key string, arg ...interface{}) map[string]interface{} {
v, _ := m.Configv(key, arg...).(map[string]interface{})
return v
}
func (m *Message) ConfigSimple(key ...string) (list []string) {
for _, k := range kit.Split(kit.Join(key)) {
list = append(list, k, m.Config(k))

View File

@ -104,6 +104,9 @@ func Run(arg ...string) string {
if len(arg) == 0 {
arg = append(arg, HELP)
}
if os.Getenv("ctx_arg") != "" {
arg = append(arg, kit.Split(os.Getenv("ctx_arg"))...)
}
Index.root, Pulse.root = Index, Pulse
Pulse.Option(CACHE_LIMIT, "10")

16
misc.go
View File

@ -37,7 +37,14 @@ func (m *Message) CSV(text string, head ...string) *Message {
}
return m
}
func (m *Message) Split(str string, field string, sp string, nl string) *Message {
func (m *Message) SplitIndex(str string, arg ...string) *Message {
return m.Split(str, kit.Simple("index", arg)...)
}
func (m *Message) Split(str string, arg ...string) *Message {
m.Set(MSG_APPEND).Set(MSG_RESULT)
field := kit.Select("", arg, 0)
sp := kit.Select(SP, arg, 1)
nl := kit.Select(NL, arg, 2)
fields, indexs := kit.Split(field, sp, sp, sp), []int{}
for i, l := range kit.Split(str, nl, nl, nl) {
if strings.HasPrefix(l, "Binary") {
@ -58,9 +65,9 @@ func (m *Message) Split(str string, field string, sp string, nl string) *Message
if len(indexs) > 0 { // 按位切分
for i, v := range indexs {
if i == len(indexs)-1 {
m.Push(kit.Select(SP, fields, i), l[v:])
m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:]))
} else {
m.Push(kit.Select(SP, fields, i), l[v:indexs[i+1]])
m.Push(strings.TrimSpace(kit.Select(SP, fields, i)), strings.TrimSpace(l[v:indexs[i+1]]))
}
}
continue
@ -113,6 +120,9 @@ func (m *Message) OptionUserWeb() *url.URL {
func (m *Message) SetAppend(arg ...string) *Message {
return m.Set(MSG_APPEND, arg...)
}
func (m *Message) SetResult(arg ...string) *Message {
return m.Set(MSG_RESULT, arg...)
}
func (m *Message) RenameAppend(from, to string) {
for i, v := range m.meta[MSG_APPEND] {
if v == from {

View File

@ -83,7 +83,6 @@ func init() {
QRCODE: {Name: "qrcode path scene", Help: "扫码", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.SPIDE, MP, web.SPIDE_POST, "/wxa/getwxacodeunlimit?access_token="+m.Cmdx(LOGIN, TOKENS),
m.OptionSimple("path,scene"))
m.Debug("what %v", msg.FormatMeta())
m.Echo(kit.Format(`<img src="data:image/png;base64,%s" title='%s'>`, base64.StdEncoding.EncodeToString([]byte(msg.Result())), "some"))
m.ProcessInner()
}},

View File

@ -96,7 +96,14 @@ func (m *Message) Upload(dir string) {
m.Cmdy("spide", DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0])))
}
}
func (m *Message) Action(arg ...string) {
func (m *Message) Action(arg ...interface{}) {
for i, v := range arg {
switch v.(type) {
case string:
default:
arg[i] = kit.Format(v)
}
}
m.Option(MSG_ACTION, kit.Format(arg))
}
func (m *Message) Status(arg ...interface{}) {

View File

@ -17,7 +17,10 @@ func Render(m *Message, cmd string, args ...interface{}) string {
switch arg := kit.Simple(args...); cmd {
case RENDER_ANCHOR: // [name] link
p := m.MergeURL2(kit.Select(arg[0], arg, 1))
p := kit.Select(arg[0], arg, 1)
if !strings.HasPrefix(p, "http") {
p = m.MergeURL2(p)
}
return kit.Format(`<a href="%s" target="_blank">%s</a>`, p, arg[0])
case RENDER_BUTTON: // name...
@ -169,7 +172,6 @@ func (m *Message) PushPodCmd(cmd string, arg ...string) {
val[POD] = kit.Keys(value[kit.MDB_NAME], val[POD])
m.Push("", val, head)
})
m.Debug(m.FormatMeta())
}
})
}