diff --git a/base/aaa/role.go b/base/aaa/role.go
index 96a5d425..9d2b41c3 100644
--- a/base/aaa/role.go
+++ b/base/aaa/role.go
@@ -17,16 +17,16 @@ func _role_user(m *ice.Message, userrole string, username ...string) {
}
func _role_list(m *ice.Message, userrole string) {
m.Richs(ROLE, nil, kit.Select(kit.MDB_FOREACH, userrole), func(key string, value map[string]interface{}) {
- for k := range value[WHITE].(map[string]interface{}) {
+ kit.Fetch(value[WHITE], func(k string, v interface{}) {
m.Push(ROLE, kit.Value(value, kit.MDB_NAME))
m.Push(kit.MDB_ZONE, WHITE)
m.Push(kit.MDB_KEY, k)
- }
- for k := range value[BLACK].(map[string]interface{}) {
+ })
+ kit.Fetch(value[BLACK], func(k string, v interface{}) {
m.Push(ROLE, kit.Value(value, kit.MDB_NAME))
m.Push(kit.MDB_ZONE, BLACK)
m.Push(kit.MDB_KEY, k)
- }
+ })
})
}
func _role_chain(arg ...string) string {
diff --git a/base/aaa/totp.go b/base/aaa/totp.go
index 736629b8..a869d4e0 100644
--- a/base/aaa/totp.go
+++ b/base/aaa/totp.go
@@ -70,7 +70,7 @@ func init() {
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
mdb.HashSelect(m.Spawn(c), arg...).Table(func(index int, value map[string]string, head []string) {
if len(arg) > 0 {
- m.OptionFields("detail")
+ m.OptionFields(mdb.DETAIL)
}
m.Push(kit.MDB_TIME, m.Time())
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index c7d3eeab..00e5d110 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -142,8 +142,7 @@ func init() {
m.Cmdy(mdb.PRUNES, DAEMON, "", mdb.HASH, kit.MDB_STATUS, ERROR)
}},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), m.Config(kit.MDB_FIELD))
- m.Cmdy(mdb.SELECT, DAEMON, "", mdb.HASH, kit.MDB_HASH, arg).Table(func(index int, value map[string]string, head []string) {
+ mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) {
switch value[kit.MDB_STATUS] {
case START:
m.PushButton(RESTART, STOP)
diff --git a/base/cli/system.go b/base/cli/system.go
index c9c4c1f0..469ff4e6 100644
--- a/base/cli/system.go
+++ b/base/cli/system.go
@@ -7,7 +7,6 @@ import (
"os/exec"
ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
@@ -76,16 +75,6 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) {
m.Push(kit.MDB_TIME, m.Time())
m.Push(kit.MDB_CODE, int(cmd.ProcessState.ExitCode()))
}
-func SystemProcess(m *ice.Message, text string, arg ...string) {
- if len(arg) > 0 && arg[0] == ice.RUN {
- m.Cmdy(SYSTEM, arg[1:])
- return
- }
-
- m.Cmdy(ctx.COMMAND, SYSTEM)
- m.ProcessField(SYSTEM, ice.RUN)
- m.Push(ice.ARG, kit.Split(text))
-}
func IsSuccess(m *ice.Message) bool {
return m.Append(kit.MDB_CODE) == "0"
}
@@ -110,8 +99,7 @@ func init() {
}, Commands: map[string]*ice.Command{
SYSTEM: {Name: "system cmd run:button", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) {
if len(arg) == 0 {
- m.Fields(len(arg), m.Config(kit.MDB_FIELD))
- m.Cmdy(mdb.SELECT, SYSTEM, "", mdb.LIST)
+ mdb.ListSelect(m, arg)
return
}
m.Grow(SYSTEM, "", kit.Dict(kit.MDB_TIME, m.Time(), ice.CMD, kit.Join(arg, ice.SP)))
diff --git a/base/ctx/command.go b/base/ctx/command.go
index 7d3bba89..9631906b 100644
--- a/base/ctx/command.go
+++ b/base/ctx/command.go
@@ -28,8 +28,8 @@ func _command_list(m *ice.Message, name string) {
m.Push(kit.MDB_INDEX, kit.Keys(s.Cap(ice.CTX_FOLLOW), key))
m.Push(kit.MDB_NAME, kit.Format(cmd.Name))
m.Push(kit.MDB_HELP, kit.Format(cmd.Help))
- m.Push(kit.MDB_META, kit.Formats(cmd.Meta))
- m.Push(kit.MDB_LIST, kit.Formats(cmd.List))
+ m.Push(kit.MDB_META, kit.Format(cmd.Meta))
+ m.Push(kit.MDB_LIST, kit.Format(cmd.List))
})
}
func _command_search(m *ice.Message, kind, name, text string) {
diff --git a/base/ctx/ctx.go b/base/ctx/ctx.go
index c9bc3cc1..1229e8e0 100644
--- a/base/ctx/ctx.go
+++ b/base/ctx/ctx.go
@@ -6,11 +6,6 @@ import (
const CTX = "ctx"
-var Index = &ice.Context{Name: CTX, Help: "标准模块", Commands: map[string]*ice.Command{
- ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- }},
- ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- }},
-}}
+var Index = &ice.Context{Name: CTX, Help: "标准模块"}
func init() { ice.Index.Register(Index, nil, CONTEXT, COMMAND, CONFIG, MESSAGE) }
diff --git a/base/gdb/gdb.go b/base/gdb/gdb.go
index f56258cc..36a9ed08 100644
--- a/base/gdb/gdb.go
+++ b/base/gdb/gdb.go
@@ -9,8 +9,8 @@ import (
)
type Frame struct {
- t <-chan time.Time
s chan os.Signal
+ t time.Duration
e chan bool
}
@@ -18,22 +18,22 @@ func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server
return &Frame{}
}
func (f *Frame) Begin(m *ice.Message, arg ...string) ice.Server {
- f.t = time.Tick(kit.Duration(m.Conf(TIMER, kit.Keym(TICK))))
f.s = make(chan os.Signal, ice.MOD_CHAN)
f.e = make(chan bool, 1)
return f
}
func (f *Frame) Start(m *ice.Message, arg ...string) bool {
+ f.t = kit.Duration(m.Conf(TIMER, kit.Keym(TICK)))
for {
select {
case <-f.e:
return true
+ case <-time.Tick(f.t):
+ // m.Cmd(TIMER, ACTION)
+
case s := <-f.s:
m.Cmd(SIGNAL, ACTION, SIGNAL, s)
-
- // case <-f.t:
- // m.Cmd(TIMER, ACTION)
}
}
return true
@@ -46,8 +46,6 @@ const GDB = "gdb"
var Index = &ice.Context{Name: GDB, Help: "事件模块", Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Cmd(SIGNAL, LISTEN, SIGNAL, "3", kit.MDB_NAME, "退出", ice.CMD, "exit 0")
- m.Cmd(SIGNAL, LISTEN, SIGNAL, "2", kit.MDB_NAME, "重启", ice.CMD, "exit 1")
m.Load()
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
diff --git a/base/gdb/timer.go b/base/gdb/timer.go
index d1c54675..5efe459e 100644
--- a/base/gdb/timer.go
+++ b/base/gdb/timer.go
@@ -44,7 +44,7 @@ func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
TIMER: {Name: TIMER, Help: "定时器", Value: kit.Data(
kit.MDB_FIELD, "time,hash,delay,interval,order,next,cmd",
- TICK, "10ms",
+ TICK, "1s",
)},
}, Commands: map[string]*ice.Command{
TIMER: {Name: "timer hash id auto create prunes", Help: "定时器", Action: ice.MergeAction(map[string]*ice.Action{
diff --git a/base/mdb/engine.go b/base/mdb/engine.go
index 1ec6249f..ec84784c 100644
--- a/base/mdb/engine.go
+++ b/base/mdb/engine.go
@@ -8,29 +8,27 @@ import (
const ENGINE = "engine"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- ENGINE: {Name: "engine", Help: "引擎", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
- },
- Commands: map[string]*ice.Command{
- ENGINE: {Name: "engine type name text auto", Help: "引擎", Action: map[string]*ice.Action{
- CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- m.Rich(ENGINE, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 || arg[0] == "" {
- m.Richs(ENGINE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
- })
- return
- }
-
- if len(arg) == 2 {
- arg = append(arg, "")
- }
- m.Richs(ENGINE, nil, arg[0], func(key string, value map[string]interface{}) {
- m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), ENGINE, arg[0], arg[1], arg[2], arg[3:])
- })
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ ENGINE: {Name: "engine", Help: "引擎", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
+ }, Commands: map[string]*ice.Command{
+ ENGINE: {Name: "engine type name text auto", Help: "引擎", Action: map[string]*ice.Action{
+ CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Rich(ENGINE, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
}},
- }})
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" {
+ m.Richs(ENGINE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
+ m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
+ })
+ return
+ }
+
+ if len(arg) == 2 {
+ arg = append(arg, "")
+ }
+ m.Richs(ENGINE, nil, arg[0], func(key string, value map[string]interface{}) {
+ m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), ENGINE, arg[0], arg[1], arg[2], arg[3:])
+ })
+ }},
+ }})
}
diff --git a/base/mdb/hash.go b/base/mdb/hash.go
index 39405566..ad7dfc05 100644
--- a/base/mdb/hash.go
+++ b/base/mdb/hash.go
@@ -4,26 +4,21 @@ import (
"encoding/json"
"os"
"path"
- "strings"
ice "shylinux.com/x/icebergs"
kit "shylinux.com/x/toolkits"
)
func _hash_fields(m *ice.Message) []string {
- return kit.Split(kit.Select("time,hash,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
+ return kit.Split(kit.Select("time,hash,type,name,text", kit.Join(kit.Simple(m.Optionv(FIELDS)))))
}
func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) {
list := map[string]int{}
m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
- if val = kit.GetMeta(val); field == kit.MDB_HASH {
- list[key]++
+ if val = kit.GetMeta(val); kit.Format(val[kit.MDB_COUNT]) != "" {
+ list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT])
} else {
- if kit.Format(val[kit.MDB_COUNT]) != "" {
- list[kit.Format(val[field])] = kit.Int(val[kit.MDB_COUNT])
- } else {
- list[kit.Format(val[field])]++
- }
+ list[kit.Format(val[field])]++
}
})
for k, i := range list {
@@ -89,6 +84,7 @@ func _hash_export(m *ice.Message, prefix, chain, file string) {
e = en.Encode(m.Confv(prefix, kit.Keys(chain, HASH)))
m.Log_EXPORT(kit.MDB_KEY, path.Join(prefix, chain), kit.MDB_FILE, p)
+ m.Conf(prefix, kit.Keys(chain, kit.MDB_HASH), "")
m.Echo(p)
}
func _hash_import(m *ice.Message, prefix, chain, file string) {
@@ -164,15 +160,16 @@ func HashAction(fields ...string) map[string]*ice.Action {
m.Cmdy(MODIFY, m.PrefixKey(), "", HASH, m.OptionSimple(_key(m)), arg)
}},
EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
+ m.OptionFields(m.Config(kit.META_FIELD))
m.Cmdy(EXPORT, m.PrefixKey(), "", HASH, arg)
}},
IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(IMPORT, m.PrefixKey(), "", HASH, arg)
}},
PRUNES: {Name: "prunes before@date", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
- list := []string{}
+ list, before := []string{}, kit.Time(kit.Select(m.Time("-72h"), m.Option(kit.MDB_BEFORE)))
m.Richs(m.PrefixKey(), "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- if value = kit.GetMeta(value); kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Option(kit.MDB_BEFORE)) {
+ if value = kit.GetMeta(value); kit.Time(kit.Format(value[kit.MDB_TIME])) < before {
list = append(list, key)
}
})
diff --git a/base/mdb/list.go b/base/mdb/list.go
index ebd4b10e..4cae0bce 100644
--- a/base/mdb/list.go
+++ b/base/mdb/list.go
@@ -5,14 +5,28 @@ import (
"os"
"path"
"sort"
- "strings"
ice "shylinux.com/x/icebergs"
kit "shylinux.com/x/toolkits"
)
func _list_fields(m *ice.Message) []string {
- return kit.Split(kit.Select("time,id,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ",")))
+ return kit.Split(kit.Select("time,id,type,name,text", kit.Join(kit.Simple(m.Optionv(FIELDS)))))
+}
+func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
+ list := map[string]int{}
+ m.Grows(prefix, chain, "", "", func(index int, 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])
+ } else {
+ list[kit.Format(val[field])]++
+ }
+ })
+ for k, i := range list {
+ m.Push(field, k)
+ m.Push(kit.MDB_COUNT, i)
+ }
+ m.SortIntR(kit.MDB_COUNT)
}
func _list_insert(m *ice.Message, prefix, chain string, arg ...string) {
m.Log_INSERT(kit.MDB_KEY, path.Join(prefix, chain), arg[0], arg[1])
@@ -20,6 +34,18 @@ func _list_insert(m *ice.Message, prefix, chain string, arg ...string) {
}
func _list_delete(m *ice.Message, prefix, chain, field, value string) {
}
+func _list_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) {
+ m.Grows(prefix, chain, field, value, func(index int, val map[string]interface{}) {
+ val = kit.GetMeta(val)
+ m.Log_MODIFY(kit.MDB_KEY, path.Join(prefix, chain), field, value, arg)
+ for i := 0; i < len(arg); i += 2 {
+ if arg[i] == field {
+ continue
+ }
+ kit.Value(val, arg[i], kit.Select("", arg, i+1))
+ }
+ })
+}
func _list_select(m *ice.Message, prefix, chain, field, value string) {
if value == "" {
field = ""
@@ -27,12 +53,11 @@ func _list_select(m *ice.Message, prefix, chain, field, value string) {
fields := _list_fields(m)
cb := m.Optionv(kit.Keycb(SELECT))
m.Grows(prefix, chain, kit.Select(m.Option(CACHE_FIELD), field), kit.Select(m.Option(CACHE_VALUE), value), func(index int, val map[string]interface{}) {
- val = kit.GetMeta(val)
- switch cb := cb.(type) {
+ switch val = kit.GetMeta(val); cb := cb.(type) {
case func(fields []string, value map[string]interface{}):
cb(fields, val)
default:
- if m.Option(FIELDS) == DETAIL {
+ if m.OptionFields() == DETAIL {
m.Push(DETAIL, val)
} else {
m.Push("", val, fields)
@@ -40,18 +65,6 @@ func _list_select(m *ice.Message, prefix, chain, field, value string) {
}
})
}
-func _list_modify(m *ice.Message, prefix, chain string, field, value string, arg ...string) {
- m.Grows(prefix, chain, field, value, func(index int, val map[string]interface{}) {
- val = kit.GetMeta(val)
- for i := 0; i < len(arg); i += 2 {
- if arg[i] == field {
- continue
- }
- kit.Value(val, arg[i], kit.Select("", arg, i+1))
- }
- m.Log_MODIFY(kit.MDB_KEY, path.Join(prefix, chain), field, value, arg)
- })
-}
func _list_export(m *ice.Message, prefix, chain, file string) {
f, p, e := kit.Create(kit.Keys(file, CSV))
m.Assert(e)
@@ -117,49 +130,45 @@ func _list_import(m *ice.Message, prefix, chain, file string) {
}
func _list_prunes(m *ice.Message, prefix, chain string, arg ...string) {
}
-func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
- list := map[string]int{}
- m.Grows(prefix, chain, "", "", func(index int, val map[string]interface{}) {
- val = kit.GetMeta(val)
- list[kit.Format(val[field])]++
- })
- for k, i := range list {
- m.Push(field, k)
- m.Push(kit.MDB_COUNT, i)
- }
- m.SortIntR(kit.MDB_COUNT)
-}
const LIST = "list"
func ListAction(fields ...string) map[string]*ice.Action {
return ice.SelectAction(map[string]*ice.Action{
+ INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(INPUTS, m.PrefixKey(), "", LIST, arg)
+ }},
INSERT: {Name: "insert type=go name=hi text=hello", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(INSERT, m.PrefixKey(), "", LIST, arg)
}},
+ DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(DELETE, m.PrefixKey(), "", LIST, m.OptionSimple(kit.MDB_ID), arg)
+ }},
MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(MODIFY, m.PrefixKey(), "", LIST, m.OptionSimple(kit.MDB_ID), arg)
}},
- REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(DELETE, m.PrefixKey(), "", LIST, m.OptionSimple(kit.MDB_ID))
- }},
EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
- m.OptionFields(m.Conf(m.PrefixKey(), kit.META_FIELD))
+ m.OptionFields(m.Config(kit.META_FIELD))
m.Cmdy(EXPORT, m.PrefixKey(), "", LIST)
m.Conf(m.PrefixKey(), kit.MDB_LIST, "")
- m.Conf(m.PrefixKey(), kit.Keym(kit.MDB_COUNT), 0)
+ m.Config(kit.MDB_COUNT, 0)
}},
IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(IMPORT, m.PrefixKey(), "", LIST)
}},
- INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(INPUTS, m.PrefixKey(), "", LIST, arg)
+ PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(PRUNES, m.PrefixKey(), "", LIST, arg)
}},
PREV: {Name: "prev", Help: "上一页", Hand: func(m *ice.Message, arg ...string) {
- PrevPage(m, m.Conf(m.PrefixKey(), kit.Keym(kit.MDB_COUNT)), kit.Slice(arg, 1)...)
+ PrevPage(m, m.Config(kit.MDB_COUNT), kit.Slice(arg, 1)...)
}},
NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) {
- NextPage(m, m.Conf(m.PrefixKey(), kit.Keym(kit.MDB_COUNT)), kit.Slice(arg, 1)...)
+ NextPage(m, m.Config(kit.MDB_COUNT), kit.Slice(arg, 1)...)
}},
}, fields...)
}
+func ListSelect(m *ice.Message, arg ...string) *ice.Message {
+ m.Fields(len(arg), m.Config(kit.MDB_FIELD))
+ m.Cmdy(SELECT, m.PrefixKey(), "", LIST, kit.MDB_ID, arg)
+ return m
+}
diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go
index b99c73de..094c30d2 100644
--- a/base/mdb/mdb.go
+++ b/base/mdb/mdb.go
@@ -8,7 +8,7 @@ import (
)
func _file_name(m *ice.Message, arg ...string) string {
- return kit.Select(path.Join(m.Option(ice.MSG_LOCAL), ice.USR_LOCAL, EXPORT, path.Join(arg[:2]...), arg[2]), arg, 3)
+ return kit.Select(path.Join(ice.USR_LOCAL_EXPORT, m.Option(ice.MSG_DOMAIN), path.Join(arg[:2]...), arg[2]), arg, 3)
}
func _domain_chain(m *ice.Message, chain string) string {
return kit.Keys(m.Option(ice.MSG_DOMAIN), chain)
@@ -21,7 +21,6 @@ const (
const (
DICT = "dict"
META = "meta"
- ZONE = "zone"
)
const (
FIELDS = "fields"
@@ -29,19 +28,19 @@ const (
RANDOM = "random"
CREATE = "create"
+ REMOVE = "remove"
INSERT = "insert"
+ DELETE = "delete"
MODIFY = "modify"
SELECT = "select"
- DELETE = "delete"
- REMOVE = "remove"
EXPORT = "export"
IMPORT = "import"
- INPUTS = "inputs"
PRUNES = "prunes"
- REVERT = "revert"
- REPEAT = "repeat"
+ INPUTS = "inputs"
UPLOAD = "upload"
+ REPEAT = "repeat"
+ REVERT = "revert"
NEXT = "next"
PREV = "prev"
@@ -93,6 +92,11 @@ func NextPageLimit(m *ice.Message, total string, arg ...string) {
m.ProcessHold()
}
}
+func SetPage(m *ice.Message, arg ...string) {
+ m.Option(CACHE_LIMIT, kit.Select("10", arg, 0))
+ m.Option(CACHE_OFFEND, kit.Select("0", arg, 1))
+ m.Option(CACHE_FILTER, kit.Select("", arg, 2))
+}
const MDB = "mdb"
@@ -100,7 +104,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*
INSERT: {Name: "insert key sub type arg...", Help: "添加", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] {
case ZONE:
- _list_insert(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.SubKey(arg[3]))), arg[4:]...)
+ _list_insert(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4:]...)
case HASH:
_hash_insert(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...)
case LIST:
@@ -110,7 +114,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*
DELETE: {Name: "delete key sub type field value", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] {
case ZONE:
- _list_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4])
+ _list_delete(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4], arg[5])
case HASH:
_hash_delete(m, arg[0], _domain_chain(m, arg[1]), arg[3], arg[4])
case LIST:
@@ -120,7 +124,7 @@ 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:
- _list_modify(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.SubKey(arg[3]))), kit.MDB_ID, arg[4], arg[5:]...)
+ _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:]...)
case LIST:
@@ -160,7 +164,7 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*
INPUTS: {Name: "inputs key sub type field value", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] {
case ZONE:
- _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.SubKey(arg[3]))), kit.Select("name", arg, 4), kit.Select("", arg, 5))
+ _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.Select("name", arg, 4), kit.Select("", arg, 5))
case HASH:
_hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select("name", arg, 3), kit.Select("", arg, 4))
case LIST:
@@ -169,6 +173,8 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*
}},
PRUNES: {Name: "prunes key sub type [field value]...", Help: "清理", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[2] {
+ case ZONE:
+ _list_prunes(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), arg[4:]...)
case HASH:
_hash_prunes(m, arg[0], _domain_chain(m, arg[1]), arg[3:]...)
case LIST:
diff --git a/base/mdb/plugin.go b/base/mdb/plugin.go
index d9f6afa2..4b7b88f7 100644
--- a/base/mdb/plugin.go
+++ b/base/mdb/plugin.go
@@ -8,26 +8,24 @@ import (
const PLUGIN = "plugin"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- PLUGIN: {Name: "plugin", Help: "插件", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
- },
- Commands: map[string]*ice.Command{
- PLUGIN: {Name: "plugin type name text auto", Help: "插件", Action: map[string]*ice.Action{
- CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- m.Rich(PLUGIN, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 || arg[0] == "" {
- m.Richs(PLUGIN, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
- })
- return
- }
-
- m.Richs(PLUGIN, nil, arg[0], func(key string, value map[string]interface{}) {
- m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), PLUGIN, arg[0], arg[1], kit.Select("", arg, 2))
- })
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ PLUGIN: {Name: "plugin", Help: "插件", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
+ }, Commands: map[string]*ice.Command{
+ PLUGIN: {Name: "plugin type name text auto", Help: "插件", Action: map[string]*ice.Action{
+ CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Rich(PLUGIN, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
}},
- }})
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" {
+ m.Richs(PLUGIN, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
+ m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
+ })
+ return
+ }
+
+ m.Richs(PLUGIN, nil, arg[0], func(key string, value map[string]interface{}) {
+ m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), PLUGIN, arg[0], arg[1], kit.Select("", arg, 2))
+ })
+ }},
+ }})
}
diff --git a/base/mdb/render.go b/base/mdb/render.go
index e9778732..cfb3434f 100644
--- a/base/mdb/render.go
+++ b/base/mdb/render.go
@@ -8,26 +8,24 @@ import (
const RENDER = "render"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- RENDER: {Name: "render", Help: "渲染", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
- },
- Commands: map[string]*ice.Command{
- RENDER: {Name: "render type name text auto", Help: "渲染", Action: map[string]*ice.Action{
- CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- m.Rich(RENDER, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 || arg[0] == "" {
- m.Richs(RENDER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
- })
- return
- }
-
- m.Richs(RENDER, nil, arg[0], func(key string, value map[string]interface{}) {
- m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), RENDER, arg[0], arg[1], kit.Select("", arg, 2))
- })
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ RENDER: {Name: "render", Help: "渲染", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
+ }, Commands: map[string]*ice.Command{
+ RENDER: {Name: "render type name text auto", Help: "渲染", Action: map[string]*ice.Action{
+ CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Rich(RENDER, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
}},
- }})
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" {
+ m.Richs(RENDER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
+ m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
+ })
+ return
+ }
+
+ m.Richs(RENDER, nil, arg[0], func(key string, value map[string]interface{}) {
+ m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), RENDER, arg[0], arg[1], kit.Select("", arg, 2))
+ })
+ }},
+ }})
}
diff --git a/base/mdb/search.go b/base/mdb/search.go
index fc48b82b..0d57f43c 100644
--- a/base/mdb/search.go
+++ b/base/mdb/search.go
@@ -10,34 +10,29 @@ import (
const SEARCH = "search"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- SEARCH: {Name: "search", Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
- },
- Commands: map[string]*ice.Command{
- SEARCH: {Name: "search type word text auto", Help: "搜索", Action: map[string]*ice.Action{
- CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- if kit.Select(arg[0], arg, 1) == "" {
- m.Debug(m.Format("stack"))
- }
- m.Rich(SEARCH, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 || arg[0] == "" {
- m.Richs(SEARCH, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
- })
- return
- }
-
- m.Option(ice.MSG_FIELDS, kit.Select("ctx,cmd,time,size,type,name,text", kit.Select(m.Option(ice.MSG_FIELDS), arg, 2)))
- for _, k := range strings.Split(arg[0], ",") {
- for _, kk := range strings.Split(arg[1], ",") {
- m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) {
- m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, k, kk, kit.Select("", arg, 2))
- })
- }
- }
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ SEARCH: {Name: "search", Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
+ }, Commands: map[string]*ice.Command{
+ SEARCH: {Name: "search type word text auto", Help: "搜索", Action: map[string]*ice.Action{
+ CREATE: {Name: "create type cmd ctx", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Rich(SEARCH, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, kit.Select(arg[0], arg, 1), kit.MDB_TEXT, kit.Select("", arg, 2)))
}},
- }})
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" {
+ m.Richs(SEARCH, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
+ m.Push(key, value, []string{kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
+ })
+ return
+ }
+
+ m.Option(ice.MSG_FIELDS, kit.Select("ctx,cmd,time,size,type,name,text", kit.Select(m.Option(ice.MSG_FIELDS), arg, 2)))
+ for _, k := range strings.Split(arg[0], ",") {
+ for _, kk := range strings.Split(arg[1], ",") {
+ m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) {
+ m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, k, kk, kit.Select("", arg, 2))
+ })
+ }
+ }
+ }},
+ }})
}
diff --git a/base/mdb/zone.go b/base/mdb/zone.go
index 823e83d8..d8fae0cd 100644
--- a/base/mdb/zone.go
+++ b/base/mdb/zone.go
@@ -20,8 +20,7 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
fields := _zone_fields(m)
cb := m.Optionv(kit.Keycb(SELECT))
m.Richs(prefix, chain, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) {
- val = kit.GetMeta(val)
- if zone == "" {
+ if val = kit.GetMeta(val); zone == "" {
if m.Option(FIELDS) == DETAIL {
m.Push(DETAIL, val)
} else {
@@ -31,9 +30,7 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
}
m.Grows(prefix, kit.Keys(chain, kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) {
- value = kit.GetMeta(value)
-
- switch cb := cb.(type) {
+ switch value = kit.GetMeta(value); cb := cb.(type) {
case func(string, []string, map[string]interface{}, map[string]interface{}):
cb(key, fields, value, val)
case func(string, map[string]interface{}, map[string]interface{}):
@@ -125,7 +122,7 @@ func _zone_import(m *ice.Message, prefix, chain, file string) {
m.Echo("%d", count)
}
-const ZONE_FIELD = "time,zone,count"
+const ZONE = "zone"
func ZoneAction(fields ...string) map[string]*ice.Action {
_zone := func(m *ice.Message) string { return kit.Select(kit.MDB_ZONE, m.Config(kit.MDB_SHORT)) }
@@ -155,7 +152,6 @@ func ZoneAction(fields ...string) map[string]*ice.Action {
EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.OptionFields(_zone(m), m.Config(kit.MDB_FIELD))
m.Cmdy(EXPORT, m.PrefixKey(), "", ZONE)
- m.Conf(m.PrefixKey(), kit.MDB_HASH, "")
}},
IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.OptionFields(_zone(m))
diff --git a/base/nfs/save.go b/base/nfs/save.go
index f1a54638..5bbb5cf4 100644
--- a/base/nfs/save.go
+++ b/base/nfs/save.go
@@ -85,15 +85,15 @@ func init() {
}
_save_file(m, arg[0], arg[1:]...)
}},
+ DEFS: {Name: "defs file text...", Help: "默认", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _defs_file(m, arg[0], arg[1:]...)
+ }},
PUSH: {Name: "push file text...", Help: "追加", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 1 {
arg = append(arg, m.Option(kit.MDB_CONTENT))
}
_push_file(m, arg[0], arg[1:]...)
}},
- DEFS: {Name: "defs file text...", Help: "默认", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _defs_file(m, arg[0], arg[1:]...)
- }},
COPY: {Name: "copy file from...", Help: "复制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_copy_file(m, arg[0], arg[1:]...)
}},
diff --git a/base/nfs/tail.go b/base/nfs/tail.go
index 188bc836..cc2dcd77 100644
--- a/base/nfs/tail.go
+++ b/base/nfs/tail.go
@@ -65,10 +65,8 @@ func init() {
_tail_create(m, arg...)
}},
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(kit.Slice(arg, 0, 2)), "time,name,count,file", "time,id,file,text")
- m.Option(mdb.CACHE_FILTER, kit.Select("", arg, 4))
- m.Option(mdb.CACHE_OFFEND, kit.Select("0", arg, 3))
- m.Option(mdb.CACHE_LIMIT, kit.Select("10", arg, 2))
+ m.Fields(len(kit.Slice(arg, 0, 2)), "time,name,count,file", m.Config(kit.MDB_FIELD))
+ mdb.SetPage(m, kit.Slice(arg, 2)...)
mdb.ZoneSelect(m.Spawn(c), arg...).Table(func(index int, value map[string]string, head []string) {
if strings.Contains(value[kit.MDB_TEXT], m.Option(mdb.CACHE_FILTER)) {
diff --git a/base/ssh/ssh.go b/base/ssh/ssh.go
index 70ac0381..367e6aae 100644
--- a/base/ssh/ssh.go
+++ b/base/ssh/ssh.go
@@ -8,6 +8,4 @@ const SSH = "ssh"
var Index = &ice.Context{Name: SSH, Help: "终端模块"}
-func init() {
- ice.Index.Register(Index, &Frame{}, SOURCE, TARGET, PROMPT, PRINTF, SCREEN, RETURN)
-}
+func init() { ice.Index.Register(Index, &Frame{}, SOURCE, TARGET, PROMPT, PRINTF, SCREEN, RETURN) }
diff --git a/base/web/cache.go b/base/web/cache.go
index 756693c6..212c01ee 100644
--- a/base/web/cache.go
+++ b/base/web/cache.go
@@ -13,7 +13,7 @@ import (
)
func _cache_name(m *ice.Message, h string) string {
- return path.Join(m.Conf(CACHE, kit.META_PATH), h[:2], h)
+ return path.Join(m.Config(kit.MDB_PATH), h[:2], h)
}
func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // file size
if name == "" {
@@ -43,8 +43,7 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
m.Push(DATA, h)
}
func _cache_watch(m *ice.Message, key, file string) {
- m.Option(mdb.FIELDS, "time,hash,size,type,name,text,file")
- m.Cmd(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, key).Table(func(index int, value map[string]string, head []string) {
+ mdb.HashSelect(m.Spawn(), key).Table(func(index int, value map[string]string, head []string) {
if value[kit.MDB_FILE] == "" {
m.Cmdy(nfs.SAVE, file, value[kit.MDB_TEXT])
} else {
@@ -137,57 +136,53 @@ const (
const CACHE = "cache"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- CACHE: {Name: CACHE, Help: "缓存池", Value: kit.Data(
- kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_PATH, ice.VAR_FILE,
- kit.MDB_STORE, ice.VAR_DATA, kit.MDB_FSIZE, "200000",
- kit.MDB_LIMIT, "50", kit.MDB_LEAST, "30",
- )},
- },
- Commands: map[string]*ice.Command{
- CACHE: {Name: "cache hash auto", Help: "缓存池", Action: map[string]*ice.Action{
- WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
- _cache_watch(m, arg[0], arg[1])
- }},
- CATCH: {Name: "catch type name", Help: "捕获", Hand: func(m *ice.Message, arg ...string) {
- file, size := _cache_catch(m, arg[1])
- _cache_save(m, arg[0], arg[1], "", file, size)
- }},
- WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- _cache_save(m, arg[0], arg[1], arg[2])
- }},
- UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
- kind, name, file, size := _cache_upload(m, m.R)
- _cache_save(m, kind, name, "", file, size)
- }},
- DOWNLOAD: {Name: "download type name", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
- if r, ok := m.Optionv(RESPONSE).(*http.Response); ok {
- file, size := _cache_download(m, r)
- _cache_save(m, arg[0], arg[1], "", file, size)
- }
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), "time,hash,size,type,name,text")
- if m.Cmdy(mdb.SELECT, CACHE, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) == 0 {
- return
- }
-
- if m.Append(kit.MDB_FILE) == "" {
- m.Push(kit.MDB_LINK, m.Append(kit.MDB_TEXT))
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ CACHE: {Name: CACHE, Help: "缓存池", Value: kit.Data(
+ kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_SHORT, "time,hash,size,type,name,text",
+ kit.MDB_STORE, ice.VAR_DATA, kit.MDB_PATH, ice.VAR_FILE, kit.MDB_FSIZE, "200000",
+ kit.MDB_LIMIT, "50", kit.MDB_LEAST, "30",
+ )},
+ }, Commands: map[string]*ice.Command{
+ "/cache/": {Name: "/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Richs(CACHE, nil, arg[0], func(key string, value map[string]interface{}) {
+ if kit.Format(value[kit.MDB_FILE]) != "" {
+ m.RenderDownload(value[kit.MDB_FILE])
} else {
- m.PushAnchor(DOWNLOAD, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+arg[0]))
+ m.RenderResult(value[kit.MDB_TEXT])
+ }
+ })
+ }},
+ CACHE: {Name: "cache hash auto", Help: "缓存池", Action: ice.MergeAction(map[string]*ice.Action{
+ WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
+ _cache_watch(m, arg[0], arg[1])
+ }},
+ CATCH: {Name: "catch type name", Help: "捕获", Hand: func(m *ice.Message, arg ...string) {
+ file, size := _cache_catch(m, arg[1])
+ _cache_save(m, arg[0], arg[1], "", file, size)
+ }},
+ WRITE: {Name: "write type name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ _cache_save(m, arg[0], arg[1], arg[2])
+ }},
+ UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
+ kind, name, file, size := _cache_upload(m, m.R)
+ _cache_save(m, kind, name, "", file, size)
+ }},
+ DOWNLOAD: {Name: "download type name", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
+ if r, ok := m.Optionv(RESPONSE).(*http.Response); ok {
+ file, size := _cache_download(m, r)
+ _cache_save(m, arg[0], arg[1], "", file, size)
}
}},
+ }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if mdb.HashSelect(m, arg...); len(arg) == 0 {
+ return
+ }
- "/cache/": {Name: "/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Richs(CACHE, nil, arg[0], func(key string, value map[string]interface{}) {
- if kit.Format(value[kit.MDB_FILE]) == "" {
- m.RenderDownload(value[kit.MDB_FILE])
- } else {
- m.RenderResult(value[kit.MDB_TEXT])
- }
- })
- }},
- }})
+ if m.Append(kit.MDB_FILE) == "" {
+ m.PushScript("inner", m.Append(kit.MDB_TEXT))
+ } else {
+ m.PushDownload(m.Append(kit.MDB_NAME), kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+arg[0]))
+ }
+ }},
+ }})
}
diff --git a/base/web/dream.go b/base/web/dream.go
index f4a0c54f..50f1309b 100644
--- a/base/web/dream.go
+++ b/base/web/dream.go
@@ -16,15 +16,15 @@ import (
)
func _dream_list(m *ice.Message) {
- m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "time,size,name").Table(func(index int, value map[string]string, head []string) {
+ m.Cmdy(nfs.DIR, m.Config(kit.MDB_PATH), "time,size,name").Table(func(index int, value map[string]string, head []string) {
if m.Richs(SPACE, nil, value[kit.MDB_NAME], func(key string, value map[string]interface{}) {
m.Push(kit.MDB_TYPE, value[kit.MDB_TYPE])
- m.Push(kit.MDB_STATUS, tcp.START)
- m.PushButton(tcp.STOP)
+ m.Push(kit.MDB_STATUS, cli.START)
+ m.PushButton(cli.STOP)
}) == nil {
m.Push(kit.MDB_TYPE, WORKER)
- m.Push(kit.MDB_STATUS, tcp.STOP)
- m.PushButton(tcp.START)
+ m.Push(kit.MDB_STATUS, cli.STOP)
+ m.PushButton(cli.START)
}
})
m.SortStrR(kit.MDB_TIME)
@@ -36,9 +36,9 @@ func _dream_show(m *ice.Message, name string) {
m.Option(kit.MDB_NAME, name)
// 任务目录
- p := path.Join(m.Conf(DREAM, kit.META_PATH), name)
+ p := path.Join(m.Config(kit.MDB_PATH), name)
if m.Option(kit.SSH_REPOS) != "" { // 下载源码
- m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, m.Option(kit.SSH_REPOS), kit.MDB_PATH, p)
+ m.Cmd("web.code.git.repos", mdb.CREATE, m.OptionSimple(kit.SSH_REPOS), kit.MDB_PATH, p)
} else { // 创建目录
os.MkdirAll(p, ice.MOD_DIR)
}
@@ -62,7 +62,7 @@ func _dream_show(m *ice.Message, name string) {
// 任务脚本
miss := path.Join(p, ice.ETC_MISS_SH)
if _, e := os.Stat(miss); os.IsNotExist(e) {
- m.Cmd(nfs.SAVE, miss, m.Conf(DREAM, kit.Keym("miss")))
+ m.Cmd(nfs.SAVE, miss, m.Config("miss"))
}
if b, e := ioutil.ReadFile(path.Join(p, m.Conf(gdb.SIGNAL, kit.Keym(cli.PID)))); e == nil {
@@ -77,13 +77,12 @@ func _dream_show(m *ice.Message, name string) {
m.Optionv(cli.CMD_ENV, kit.Simple(
cli.CTX_DEV, "http://:"+m.Cmd(SERVE).Append(tcp.PORT),
cli.PATH, kit.Path(path.Join(p, ice.BIN))+":"+kit.Path(ice.BIN)+":"+os.Getenv(cli.PATH),
- "USER", ice.Info.UserName, m.Confv(DREAM, kit.Keym(cli.ENV)),
+ cli.USER, ice.Info.UserName, m.Confv(DREAM, kit.Keym(cli.ENV)),
))
- // 启动任务
- kit.Path(os.Args[0])
- m.Optionv(cli.CMD_ERRPUT, path.Join(p, m.Conf(DREAM, kit.Keym(cli.ENV, "ctx_log"))))
- m.Cmd(cli.DAEMON, m.Confv(DREAM, kit.Keym(ice.CMD)), ice.DEV, ice.DEV, kit.MDB_NAME, name, RIVER, m.Option(RIVER))
+ // 启动任务
+ m.Optionv(cli.CMD_OUTPUT, path.Join(p, m.Config(kit.Keys(cli.ENV, cli.CTX_LOG))))
+ m.Cmd(cli.DAEMON, m.Confv(DREAM, kit.Keym(ice.CMD)), ice.DEV, ice.DEV, kit.MDB_NAME, name, m.OptionSimple(RIVER))
m.Event(DREAM_CREATE, kit.MDB_TYPE, m.Option(kit.MDB_TYPE), kit.MDB_NAME, name)
m.Sleep(ice.MOD_TICK)
}
@@ -98,50 +97,41 @@ const (
const DREAM = "dream"
func init() {
- Index.Merge(&ice.Context{
- Commands: map[string]*ice.Command{
- DREAM: {Name: "dream name path auto start create", Help: "梦想家", Action: map[string]*ice.Action{
- mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
- switch arg[0] {
- case kit.MDB_NAME:
- m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,time")
- case kit.MDB_TEMPLATE:
- m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "path,size,time")
- m.SortStrR(kit.MDB_PATH)
- }
- }},
- mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg)
- m.ProcessInner()
- }},
- cli.START: {Name: "start name repos river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(kit.MDB_NAME) == ice.OPS {
- m.Option(kit.MDB_NAME, "")
- }
- _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME))))
- }},
- cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0")
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 {
- _dream_list(m)
- return
- }
-
- m.Option(nfs.DIR_ROOT, path.Join(m.Conf(DREAM, kit.META_PATH), arg[0]))
- if len(arg) == 1 || strings.HasSuffix(arg[1], "/") {
- m.Cmdy(nfs.DIR, arg[1:])
- } else {
- m.Cmdy(nfs.CAT, arg[1:])
+ Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
+ DREAM: {Name: "dream name path auto start create", Help: "梦想家", Action: map[string]*ice.Action{
+ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
+ switch arg[0] {
+ case kit.MDB_NAME:
+ m.Cmdy(nfs.DIR, m.Config(kit.MDB_PATH), "name,time")
+ case kit.MDB_TEMPLATE:
+ m.Cmdy(nfs.DIR, m.Config(kit.MDB_PATH), "path,size,time")
+ m.SortStrR(kit.MDB_PATH)
}
}},
- },
- Configs: map[string]*ice.Config{
- DREAM: {Name: DREAM, Help: "梦想家", Value: kit.Data(kit.MDB_PATH, ice.USR_LOCAL_WORK,
- ice.CMD, []interface{}{"ice.bin", SPACE, tcp.DIAL},
- cli.ENV, kit.Dict(cli.CTX_LOG, ice.BIN_BOOT_LOG),
- "miss", `#!/bin/bash
+ mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg)
+ m.ProcessInner()
+ }},
+ cli.START: {Name: "start name repos river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
+ _dream_show(m, m.Option(kit.MDB_NAME, kit.Select(path.Base(m.Option(kit.SSH_REPOS)), m.Option(kit.MDB_NAME))))
+ }},
+ cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SPACE, m.Option(kit.MDB_NAME), "exit", "0")
+ }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 {
+ _dream_list(m)
+ return
+ }
+
+ m.Option(nfs.DIR_ROOT, path.Join(m.Config(kit.MDB_PATH), arg[0]))
+ m.Cmdy(nfs.CAT, arg[1:])
+ }},
+ }, Configs: map[string]*ice.Config{
+ DREAM: {Name: DREAM, Help: "梦想家", Value: kit.Data(kit.MDB_PATH, ice.USR_LOCAL_WORK,
+ ice.CMD, []interface{}{"ice.bin", SPACE, tcp.DIAL},
+ cli.ENV, kit.Dict(cli.CTX_LOG, ice.BIN_BOOT_LOG),
+ "miss", `#!/bin/bash
if [ "$ISH_CONF_PRE" = "" ]; then
[ -f $PWD/.ish/plug.sh ] || [ -f $HOME/.ish/plug.sh ] || git clone ${ISH_CONF_HUB_PROXY:="https://"}shylinux.com/x/intshell $PWD/.ish
source $PWD/.ish/plug.sh || source $HOME/.ish/plug.sh
@@ -168,7 +158,6 @@ ish_miss_prepare_contexts
make
`,
- )},
- },
- })
+ )},
+ }})
}
diff --git a/base/web/render.go b/base/web/render.go
index c04bfdd4..4f83bb54 100644
--- a/base/web/render.go
+++ b/base/web/render.go
@@ -8,6 +8,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
+ "shylinux.com/x/icebergs/base/cli"
kit "shylinux.com/x/toolkits"
)
@@ -93,3 +94,18 @@ func RenderType(w http.ResponseWriter, name, mime string) {
default:
}
}
+
+type Buffer struct {
+ m *ice.Message
+ n string
+}
+
+func (b *Buffer) Write(buf []byte) (int, error) {
+ b.m.Cmd(SPACE, b.n, "grow", string(buf))
+ return len(buf), nil
+}
+func (b *Buffer) Close() error { return nil }
+
+func PushStream(m *ice.Message) {
+ m.Option(cli.CMD_OUTPUT, &Buffer{m: m, n: m.Option(ice.MSG_DAEMON)})
+}
diff --git a/base/web/route.go b/base/web/route.go
index 24cb3b5f..bf3109cc 100644
--- a/base/web/route.go
+++ b/base/web/route.go
@@ -66,78 +66,76 @@ func _route_list(m *ice.Message) {
const ROUTE = "route"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.SSH_ROUTE)},
- },
- Commands: map[string]*ice.Command{
- ROUTE: {Name: "route route ctx cmd auto invite share", Help: "路由器", Action: map[string]*ice.Action{
- SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
- p := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN))
- m.EchoAnchor(p)
- m.EchoScript(p)
- m.EchoQRCode(p)
- }},
- aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
- for _, k := range []string{"tmux", "base", "miss"} {
- m.Cmdy("web.code.publish", ice.CONTEXTS, k)
- }
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.SSH_ROUTE)},
+ }, Commands: map[string]*ice.Command{
+ ROUTE: {Name: "route route ctx cmd auto invite share", Help: "路由器", Action: map[string]*ice.Action{
+ SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
+ p := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN))
+ m.EchoAnchor(p)
+ m.EchoScript(p)
+ m.EchoQRCode(p)
+ }},
+ aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
+ for _, k := range []string{"tmux", "base", "miss"} {
+ m.Cmdy("web.code.publish", ice.CONTEXTS, k)
+ }
- m.EchoScript("shell", "# 共享环境", m.Option(ice.MSG_USERWEB))
- m.EchoQRCode(m.Option(ice.MSG_USERWEB))
- m.EchoAnchor(m.Option(ice.MSG_USERWEB))
- }},
- mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
- switch m.Option(ctx.ACTION) {
- case mdb.CREATE:
- m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.INPUTS, arg)
- return
- }
+ m.EchoScript("shell", "# 共享环境", m.Option(ice.MSG_USERWEB))
+ m.EchoQRCode(m.Option(ice.MSG_USERWEB))
+ m.EchoAnchor(m.Option(ice.MSG_USERWEB))
+ }},
+ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
+ switch m.Option(ctx.ACTION) {
+ case mdb.CREATE:
+ m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.INPUTS, arg)
+ return
+ }
- switch arg[0] {
- case kit.MDB_NAME:
- m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,size,time")
- m.SortStrR(kit.MDB_PATH)
+ switch arg[0] {
+ case kit.MDB_NAME:
+ m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "name,size,time")
+ m.SortStrR(kit.MDB_PATH)
- case kit.MDB_TEMPLATE:
- m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "path,size,time")
- m.SortStrR(kit.MDB_PATH)
- }
- }},
-
- mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg)
- m.ProcessInner()
- }},
- tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg)
- m.ProcessInner()
- }},
- ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
- m.Debug(m.Option(ROUTE))
- m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 || arg[0] == "" { // 路由列表
- if _route_travel(m, kit.Select("", arg, 0)); m.W != nil {
- _route_list(m)
- }
-
- } else if len(arg) > 2 { // 加载插件
- m.ShowPlugin(arg[0], arg[1], arg[2], ctx.ACTION, ctx.COMMAND)
-
- } else if len(arg) > 1 { // 命令列表
- m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Table(func(index int, value map[string]string, head []string) {
- m.Push(ice.CMD, value[kit.MDB_KEY])
- m.Push("", value, []string{kit.MDB_NAME, kit.MDB_HELP})
- })
-
- } else if len(arg) > 0 { // 模块列表
- m.Cmd(SPACE, arg[0], ctx.CONTEXT).Table(func(index int, value map[string]string, head []string) {
- m.Push(ice.CTX, kit.Keys(value["ups"], value[kit.MDB_NAME]))
- m.Push("", value, []string{ice.CTX_STATUS, ice.CTX_STREAM, kit.MDB_HELP})
- })
+ case kit.MDB_TEMPLATE:
+ m.Cmdy(nfs.DIR, m.Conf(DREAM, kit.META_PATH), "path,size,time")
+ m.SortStrR(kit.MDB_PATH)
}
}},
- }})
+
+ mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SPACE, m.Option(ROUTE), "web.code.autogen", mdb.CREATE, arg)
+ m.ProcessInner()
+ }},
+ tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg)
+ m.ProcessInner()
+ }},
+ ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
+ m.Debug(m.Option(ROUTE))
+ m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
+ }},
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" { // 路由列表
+ if _route_travel(m, kit.Select("", arg, 0)); m.W != nil {
+ _route_list(m)
+ }
+
+ } else if len(arg) > 2 { // 加载插件
+ m.ShowPlugin(arg[0], arg[1], arg[2], ctx.ACTION, ctx.COMMAND)
+
+ } else if len(arg) > 1 { // 命令列表
+ m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Table(func(index int, value map[string]string, head []string) {
+ m.Push(ice.CMD, value[kit.MDB_KEY])
+ m.Push("", value, []string{kit.MDB_NAME, kit.MDB_HELP})
+ })
+
+ } else if len(arg) > 0 { // 模块列表
+ m.Cmd(SPACE, arg[0], ctx.CONTEXT).Table(func(index int, value map[string]string, head []string) {
+ m.Push(ice.CTX, kit.Keys(value["ups"], value[kit.MDB_NAME]))
+ m.Push("", value, []string{ice.CTX_STATUS, ice.CTX_STREAM, kit.MDB_HELP})
+ })
+ }
+ }},
+ }})
}
diff --git a/base/web/serve.go b/base/web/serve.go
index 9b930621..6e7170de 100644
--- a/base/web/serve.go
+++ b/base/web/serve.go
@@ -37,7 +37,7 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
m.Info("").Info("%s %s %s", r.Header.Get(ice.MSG_USERIP), r.Method, r.URL)
// 参数日志
- if m.Conf(SERVE, kit.Keym(LOGHEADERS)) == ice.TRUE {
+ if m.Config(LOGHEADERS) == ice.TRUE {
for k, v := range r.Header {
m.Info("%s: %v", k, kit.Format(v))
}
@@ -67,7 +67,7 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool {
msg := m.Spawn()
msg.W, msg.R = w, r
repos := kit.Select(ice.INTSHELL, ice.VOLCANOS, strings.Contains(r.Header.Get("User-Agent"), "Mozilla/5.0"))
- Render(msg, ice.RENDER_DOWNLOAD, path.Join(m.Conf(SERVE, kit.Keym(repos, kit.MDB_PATH)), m.Conf(SERVE, kit.Keym(repos, kit.MDB_INDEX))))
+ Render(msg, ice.RENDER_DOWNLOAD, path.Join(m.Config(kit.Keys(repos, kit.MDB_PATH)), m.Config(kit.Keys(repos, kit.MDB_INDEX))))
return false
}
@@ -107,7 +107,6 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
}
// 请求变量
- _serve_params(msg, r.URL.Path)
if u, e := url.Parse(r.Header.Get("Referer")); e == nil {
_serve_params(msg, u.Path)
for k, v := range u.Query() {
@@ -115,6 +114,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
msg.Option(k, v)
}
}
+ _serve_params(msg, r.URL.Path)
// 请求地址
msg.Option(ice.MSG_USERWEB, kit.Select(msg.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), r.Header.Get("Referer")))
@@ -142,7 +142,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
}
}
default:
- r.ParseMultipartForm(kit.Int64(kit.Select(r.Header.Get(ContentLength), "4096")))
+ r.ParseMultipartForm(kit.Int64(kit.Select("4096", r.Header.Get(ContentLength))))
if r.ParseForm(); len(r.PostForm) > 0 {
for k, v := range r.PostForm {
msg.Logs("form", k, v)
@@ -152,11 +152,9 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
// 请求参数
for k, v := range r.Form {
- if r.Header.Get(ContentType) != ContentJSON {
- if msg.IsCliUA() {
- for i, p := range v {
- v[i], _ = url.QueryUnescape(p)
- }
+ if msg.IsCliUA() {
+ for i, p := range v {
+ v[i], _ = url.QueryUnescape(p)
}
}
if msg.Optionv(k, v); k == ice.MSG_SESSID {
@@ -191,7 +189,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
// 会话认证
}
- if msg.Option(ice.MSG_USERNAME) == "" && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) && msg.Conf(SERVE, kit.Keym(tcp.LOCALHOST)) == ice.TRUE {
+ if msg.Option(ice.MSG_USERNAME) == "" && msg.Config(tcp.LOCALHOST) == ice.TRUE && tcp.IsLocalHost(msg, msg.Option(ice.MSG_USERIP)) {
aaa.UserRoot(msg)
// 主机认证
}
@@ -199,12 +197,12 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
if _, ok := msg.Target().Commands[WEB_LOGIN]; ok {
// 权限检查
msg.Target().Cmd(msg, WEB_LOGIN, cmds...)
- return cmds, msg.Result(0) != ice.ErrWarn && msg.Result() != ice.FALSE
+ return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE
}
- if ls := strings.Split(r.URL.Path, "/"); msg.Conf(SERVE, kit.Keym(aaa.BLACK, ls[1])) == ice.TRUE {
+ if ls := strings.Split(r.URL.Path, "/"); msg.Config(kit.Keys(aaa.BLACK, ls[1])) == ice.TRUE {
return cmds, false // 黑名单
- } else if msg.Conf(SERVE, kit.Keym(aaa.WHITE, ls[1])) == ice.TRUE {
+ } else if msg.Config(kit.Keys(aaa.WHITE, ls[1])) == ice.TRUE {
if msg.Option(ice.MSG_USERNAME) == "" && msg.Option(SHARE) != "" {
switch share := msg.Cmd(SHARE, msg.Option(SHARE)); share.Append(kit.MDB_TYPE) {
case LOGIN:
@@ -236,82 +234,86 @@ const (
const SERVE = "serve"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
- tcp.LOCALHOST, true, aaa.BLACK, kit.Dict(), aaa.WHITE, kit.Dict(
- LOGIN, true, SPACE, true, SHARE, true,
- ice.VOLCANOS, true, ice.INTSHELL, true,
- ice.REQUIRE, true, ice.PUBLISH, true,
- "x", true, ice.PUBLISH, true,
- ), LOGHEADERS, false,
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(
+ kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,status,name,port,dev",
+ tcp.LOCALHOST, ice.TRUE, aaa.BLACK, kit.Dict(), aaa.WHITE, kit.Dict(
+ LOGIN, ice.TRUE, SHARE, ice.TRUE, SPACE, ice.TRUE,
+ ice.VOLCANOS, ice.TRUE, ice.PUBLISH, ice.TRUE,
+ ice.INTSHELL, ice.TRUE, ice.REQUIRE, ice.TRUE,
+ "x", ice.TRUE,
+ ), LOGHEADERS, ice.FALSE,
- "static", kit.Dict("/", ice.USR_VOLCANOS),
- ice.VOLCANOS, kit.Dict(kit.MDB_PATH, ice.USR_VOLCANOS, kit.MDB_INDEX, "page/index.html",
- kit.SSH_REPOS, "https://shylinux.com/x/volcanos", kit.SSH_BRANCH, kit.SSH_MASTER,
- ), ice.PUBLISH, ice.USR_PUBLISH,
+ kit.MDB_PATH, kit.Dict("/", ice.USR_VOLCANOS),
+ ice.VOLCANOS, kit.Dict(kit.MDB_PATH, ice.USR_VOLCANOS, kit.MDB_INDEX, "page/index.html",
+ kit.SSH_REPOS, "https://shylinux.com/x/volcanos", kit.SSH_BRANCH, kit.SSH_MASTER,
+ ), ice.PUBLISH, ice.USR_PUBLISH,
- ice.INTSHELL, kit.Dict(kit.MDB_PATH, ice.USR_INTSHELL, kit.MDB_INDEX, ice.INDEX_SH,
- kit.SSH_REPOS, "https://shylinux.com/x/intshell", kit.SSH_BRANCH, kit.SSH_MASTER,
- ), ice.REQUIRE, ".ish/pluged",
- )},
- },
- Commands: map[string]*ice.Command{
- SERVE: {Name: "serve name auto start", Help: "服务器", Action: map[string]*ice.Action{
- aaa.BLACK: {Name: "black", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
- for _, k := range arg {
- m.Conf(SERVE, kit.Keys(kit.MDB_META, aaa.BLACK, k), true)
- }
- }},
- aaa.WHITE: {Name: "white", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
- for _, k := range arg {
- m.Conf(SERVE, kit.Keys(kit.MDB_META, aaa.WHITE, k), 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 {
- m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT))
- }
-
- m.Target().Start(m, kit.MDB_NAME, m.Option(kit.MDB_NAME), tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT))
- m.Sleep(ice.MOD_TICK)
-
- m.Option(kit.MDB_NAME, "")
- for _, k := range kit.Split(m.Option(ice.DEV)) {
- m.Cmd(SPACE, tcp.DIAL, ice.DEV, k, kit.MDB_NAME, ice.Info.NodeName)
- }
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), "time,status,name,port,dev")
- m.Cmdy(mdb.SELECT, SERVE, "", mdb.HASH, kit.MDB_NAME, arg)
- }},
-
- "/volcanos/": {Name: "/volcanos/", Help: "浏览器", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.RenderIndex(SERVE, ice.VOLCANOS, arg...)
- }},
- "/intshell/": {Name: "/intshell/", Help: "命令行", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.RenderIndex(SERVE, ice.INTSHELL, arg...)
- }},
- "/publish/": {Name: "/publish/", Help: "私有云", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if arg[0] == ice.ORDER_JS {
- if p := path.Join(ice.USR_PUBLISH, ice.ORDER_JS); m.PodCmd(nfs.CAT, p) {
- m.RenderResult()
- return
- }
+ ice.INTSHELL, kit.Dict(kit.MDB_PATH, ice.USR_INTSHELL, kit.MDB_INDEX, ice.INDEX_SH,
+ kit.SSH_REPOS, "https://shylinux.com/x/intshell", kit.SSH_BRANCH, kit.SSH_MASTER,
+ ), ice.REQUIRE, ".ish/pluged",
+ )},
+ }, Commands: map[string]*ice.Command{
+ ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Done(true)
+ m.Cmd(SERVE).Table(func(index int, value map[string]string, head []string) {
+ m.Done(value[kit.MDB_STATUS] == tcp.START)
+ })
+ }},
+ SERVE: {Name: "serve name auto start", Help: "服务器", Action: ice.MergeAction(map[string]*ice.Action{
+ aaa.BLACK: {Name: "black", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
+ for _, k := range arg {
+ m.Config(kit.Keys(aaa.BLACK, k), ice.TRUE)
}
- _share_local(m, m.Conf(SERVE, kit.Keym(ice.PUBLISH)), path.Join(arg...))
}},
- "/require/": {Name: "/require/", Help: "公有云", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
- }},
- "/help/": {Name: "/help/", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 0 {
- arg = append(arg, "tutor.shy")
+ aaa.WHITE: {Name: "white", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
+ for _, k := range arg {
+ m.Config(kit.Keys(aaa.WHITE, k), ice.TRUE)
}
- if len(arg) > 0 && arg[0] != ctx.ACTION {
- arg[0] = "src/help/" + arg[0]
- }
- m.Cmdy("web.chat./cmd/", arg)
}},
- }})
+ 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 {
+ m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.RIGHT))
+ }
+
+ m.Target().Start(m, m.OptionSimple(kit.MDB_NAME, tcp.HOST, tcp.PORT)...)
+ m.Sleep(ice.MOD_TICK)
+
+ m.Option(kit.MDB_NAME, "")
+ for _, k := range kit.Split(m.Option(ice.DEV)) {
+ m.Cmd(SPACE, tcp.DIAL, ice.DEV, k, kit.MDB_NAME, ice.Info.NodeName)
+ }
+ }},
+ }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ mdb.HashSelect(m, arg...)
+ }},
+
+ "/intshell/": {Name: "/intshell/", Help: "命令行", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.RenderIndex(SERVE, ice.INTSHELL, arg...)
+ }},
+ "/volcanos/": {Name: "/volcanos/", Help: "浏览器", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.RenderIndex(SERVE, ice.VOLCANOS, arg...)
+ }},
+ "/require/": {Name: "/require/", Help: "代码库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
+ }},
+ "/publish/": {Name: "/publish/", Help: "定制化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if arg[0] == ice.ORDER_JS {
+ if p := path.Join(ice.USR_PUBLISH, ice.ORDER_JS); m.PodCmd(nfs.CAT, p) {
+ m.RenderResult()
+ return
+ }
+ }
+ _share_local(m, m.Conf(SERVE, kit.Keym(ice.PUBLISH)), path.Join(arg...))
+ }},
+ "/help/": {Name: "/help/", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if len(arg) == 0 {
+ arg = append(arg, "tutor.shy")
+ }
+ if len(arg) > 0 && arg[0] != ctx.ACTION {
+ arg[0] = "src/help/" + arg[0]
+ }
+ m.Cmdy("web.chat./cmd/", arg)
+ }},
+ }})
}
diff --git a/base/web/share.go b/base/web/share.go
index 9481b1a7..a6022113 100644
--- a/base/web/share.go
+++ b/base/web/share.go
@@ -19,7 +19,25 @@ import (
func _share_link(m *ice.Message, p string, arg ...interface{}) string {
p = kit.Select("", "/share/local/", !strings.HasPrefix(p, "/")) + p
- return tcp.ReplaceLocalhost(m, kit.MergeURL2(kit.Select(m.Option(ice.MSG_USERWEB), m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN))), p, arg...))
+ return tcp.ReplaceLocalhost(m, kit.MergeURL2(m.Option(ice.MSG_USERWEB), p, arg...))
+}
+func _share_repos(m *ice.Message, repos string, arg ...string) {
+ prefix := kit.Path(m.Conf(SERVE, kit.Keym(ice.REQUIRE)))
+ if _, e := os.Stat(path.Join(prefix, repos)); e != nil { // 克隆代码
+ m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, "https://"+repos, kit.MDB_PATH, path.Join(prefix, repos))
+ }
+ m.RenderDownload(path.Join(prefix, repos, path.Join(arg...)))
+}
+func _share_proxy(m *ice.Message, arg ...string) {
+ switch p := path.Join(ice.VAR_PROXY, m.Option(ice.POD), m.Option(kit.MDB_PATH)); m.R.Method {
+ case http.MethodGet: // 下发文件
+ m.RenderDownload(path.Join(p, m.Option(kit.MDB_NAME)))
+
+ case http.MethodPost: // 上传文件
+ m.Cmdy(CACHE, UPLOAD)
+ m.Cmdy(CACHE, WATCH, m.Option(kit.MDB_DATA), p)
+ m.RenderResult(m.Option(kit.MDB_PATH))
+ }
}
func _share_cache(m *ice.Message, arg ...string) {
if pod := m.Option(ice.POD); m.PodCmd(CACHE, arg[0]) {
@@ -64,7 +82,7 @@ func _share_local(m *ice.Message, arg ...string) {
p = pp
}
}
- if p == path.Join(ice.USR_PUBLISH, ice.ORDER_JS) {
+ if strings.HasSuffix(p, path.Join(ice.USR_PUBLISH, ice.ORDER_JS)) {
if _, e := os.Stat(p); os.IsNotExist(e) {
m.RenderResult("")
return
@@ -72,24 +90,6 @@ func _share_local(m *ice.Message, arg ...string) {
}
m.RenderDownload(p)
}
-func _share_proxy(m *ice.Message, arg ...string) {
- switch p := path.Join(ice.VAR_PROXY, m.Option(ice.POD), m.Option(kit.MDB_PATH)); m.R.Method {
- case http.MethodGet: // 下发文件
- m.RenderDownload(path.Join(p, m.Option(kit.MDB_NAME)))
-
- case http.MethodPost: // 上传文件
- m.Cmdy(CACHE, UPLOAD)
- m.Cmdy(CACHE, WATCH, m.Option(kit.MDB_DATA), p)
- m.RenderResult(m.Option(kit.MDB_PATH))
- }
-}
-func _share_repos(m *ice.Message, repos string, arg ...string) {
- prefix := kit.Path(m.Conf(SERVE, kit.Keym(ice.REQUIRE)))
- if _, e := os.Stat(path.Join(prefix, repos)); e != nil { // 克隆代码
- m.Cmd("web.code.git.repos", mdb.CREATE, kit.SSH_REPOS, "https://"+repos, kit.MDB_PATH, path.Join(prefix, repos))
- }
- m.RenderDownload(path.Join(prefix, repos, path.Join(arg...)))
-}
const (
LOGIN = "login"
@@ -100,84 +100,79 @@ const (
const SHARE = "share"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- SHARE: {Name: SHARE, Help: "共享链", Value: kit.Data(
- kit.MDB_EXPIRE, "72h", kit.MDB_FIELD, "time,hash,userrole,username,river,storm,type,name,text",
- )},
- },
- Commands: map[string]*ice.Command{
- ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- ice.AddRender(ice.RENDER_DOWNLOAD, func(m *ice.Message, cmd string, args ...interface{}) string {
- list := []string{}
- if m.Option(ice.MSG_USERPOD) != "" {
- list = append(list, ice.POD, m.Option(ice.MSG_USERPOD))
- }
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ SHARE: {Name: SHARE, Help: "共享链", Value: kit.Data(
+ kit.MDB_EXPIRE, "72h", kit.MDB_FIELD, "time,hash,userrole,username,river,storm,type,name,text",
+ )},
+ }, Commands: map[string]*ice.Command{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ ice.AddRender(ice.RENDER_DOWNLOAD, func(msg *ice.Message, cmd string, args ...interface{}) string {
+ list := []string{}
+ if msg.Option(ice.MSG_USERPOD) != "" {
+ list = append(list, ice.POD, msg.Option(ice.MSG_USERPOD))
+ }
- arg := kit.Simple(args...)
- if len(arg) > 1 {
- list = append(list, "filename", arg[0])
- }
- return fmt.Sprintf(`%s`,
- _share_link(m, kit.Select(arg[0], arg, 1), list), path.Base(arg[0]), arg[0])
- })
- }},
- SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{
- mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)),
- aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
- RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg)
- // m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result()))
- m.Option(kit.MDB_LINK, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+m.Result()))
- }},
- LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
- msg := m.Cmd(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, m.OptionSimple(aaa.USERROLE, aaa.USERNAME))
- m.EchoQRCode(msg.Option(kit.MDB_LINK))
- m.ProcessInner()
- }},
- }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if m.PodCmd(SHARE, arg) {
- return
+ arg := kit.Simple(args...)
+ if len(arg) > 1 {
+ list = append(list, "filename", arg[0])
}
- m.Fields(len(arg), m.Conf(SHARE, kit.META_FIELD))
- if m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
- link := _share_link(m, "/share/"+arg[0])
- m.PushQRCode(cli.QRCODE, link)
- m.PushScript(ssh.SCRIPT, link)
- m.PushAnchor(link)
- } else {
- m.Action(LOGIN)
- }
- m.PushAction(mdb.REMOVE)
- m.StatusTimeCount()
+ return fmt.Sprintf(`%s`,
+ _share_link(msg, kit.Select(arg[0], arg, 1), list), path.Base(arg[0]), arg[0])
+ })
+ }},
+ SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{
+ mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)),
+ aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
+ RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg)
+ m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result()))
}},
- "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Option(SHARE, kit.Select(m.Option(SHARE), arg, 0))
- if msg := m.Cmd(SHARE, m.Option(SHARE)); kit.Int(msg.Append(kit.MDB_TIME)) < kit.Int(msg.FormatTime()) {
- m.RenderResult("共享超时")
- return
- }
- m.RenderIndex(SERVE, ice.VOLCANOS)
+ LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
+ msg := m.Cmd(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, m.OptionSimple(aaa.USERROLE, aaa.USERNAME))
+ m.EchoQRCode(msg.Option(kit.MDB_LINK))
+ m.ProcessInner()
}},
+ }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ if m.PodCmd(SHARE, arg) {
+ return
+ }
+ if mdb.HashSelect(m, arg...); len(arg) > 0 {
+ link := _share_link(m, "/share/"+arg[0])
+ m.PushQRCode(cli.QRCODE, link)
+ m.PushScript(ssh.SCRIPT, link)
+ m.PushAnchor(link)
+ } else {
+ m.Action(LOGIN)
+ }
+ m.PushAction(mdb.REMOVE)
+ m.StatusTimeCount()
+ }},
+ "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Option(SHARE, kit.Select(m.Option(SHARE), arg, 0))
+ if msg := m.Cmd(SHARE, m.Option(SHARE)); kit.Int(msg.Append(kit.MDB_TIME)) < kit.Int(msg.FormatTime()) {
+ m.RenderResult("共享超时")
+ return
+ }
+ m.RenderIndex(SERVE, ice.VOLCANOS)
+ }},
- "/share/cache/": {Name: "/share/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _share_cache(m, arg...)
- }},
- "/share/proxy/": {Name: "/share/proxy/", Help: "文件流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _share_proxy(m, arg...)
- }},
- "/share/repos/": {Name: "/share/repos/", Help: "代码库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
- }},
- "/share/local/": {Name: "/share/local/", Help: "文件夹", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _share_local(m, arg...)
- }},
- "/share/local/avatar": {Name: "avatar", Help: "头像", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.RenderDownload(strings.TrimPrefix(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)).Append(aaa.AVATAR), "/share/local/"))
- }},
- "/share/local/background": {Name: "background", Help: "壁纸", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.RenderDownload(strings.TrimPrefix(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)).Append(aaa.BACKGROUND), "/share/local/"))
- }},
- },
- })
+ "/share/repos/": {Name: "/share/repos/", Help: "代码库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
+ }},
+ "/share/proxy/": {Name: "/share/proxy/", Help: "文件流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _share_proxy(m, arg...)
+ }},
+ "/share/cache/": {Name: "/share/cache/", Help: "缓存池", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _share_cache(m, arg...)
+ }},
+ "/share/local/": {Name: "/share/local/", Help: "文件夹", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ _share_local(m, arg...)
+ }},
+ "/share/local/avatar": {Name: "avatar", Help: "头像", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.RenderDownload(strings.TrimPrefix(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)).Append(aaa.AVATAR), "/share/local/"))
+ }},
+ "/share/local/background": {Name: "background", Help: "壁纸", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.RenderDownload(strings.TrimPrefix(m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)).Append(aaa.BACKGROUND), "/share/local/"))
+ }},
+ }})
}
diff --git a/base/web/space.go b/base/web/space.go
index 15b2fe49..6c9f8a4d 100644
--- a/base/web/space.go
+++ b/base/web/space.go
@@ -3,7 +3,6 @@ package web
import (
"math/rand"
"net"
- "net/url"
"strings"
"time"
@@ -19,30 +18,21 @@ import (
func _space_link(m *ice.Message, pod string, arg ...interface{}) string {
return tcp.ReplaceLocalhost(m, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/chat/pod/"+pod, arg...))
}
-func _space_domain(m *ice.Message) string {
- link := m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN))
+func _space_domain(m *ice.Message) (link string) {
if link == "" {
link = m.Cmd(SPACE, ice.DEV, cli.PWD).Append(kit.MDB_LINK)
}
if link == "" {
link = m.Cmd(SPACE, ice.SHY, cli.PWD).Append(kit.MDB_LINK)
}
+ if link == "" {
+ link = m.Option(ice.MSG_USERWEB)
+ }
if link == "" {
link = kit.Format("http://localhost:%s", m.Cmd(SERVE).Append(tcp.PORT))
}
return tcp.ReplaceLocalhost(m, link)
}
-func _space_list(m *ice.Message, space string) {
- m.OptionFields(kit.Select(ice.MSG_DETAIL, "time,type,name,text", space == ""))
- m.Cmdy(mdb.SELECT, SPACE, "", mdb.HASH, kit.MDB_NAME, space)
-
- if space == "" {
- m.Table(func(index int, value map[string]string, head []string) {
- m.PushAnchor(value[kit.MDB_NAME], _space_link(m, kit.Keys(m.Option(ice.MSG_USERPOD), value[kit.MDB_NAME])))
- })
- m.SortStrR(kit.MDB_NAME)
- }
-}
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{})
@@ -53,95 +43,36 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
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, ice.Info.CtxShare, RIVER, kit.Select(ice.Info.CtxRiver, m.Option(RIVER)), arg)
+ u := kit.ParseURL(uri)
- if u, e := url.Parse(uri); m.Assert(e) {
- 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 != nil, e) {
- return
+ 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 != nil, e) {
+ return
+ }
+
+ if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e != nil, 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))
- if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e != nil, 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", u)
- time.Sleep(sleep)
- }
- })
- }
- })
-}
-func _space_send(m *ice.Message, space string, arg ...string) {
- if space == "" || space == MYSELF || space == ice.Info.NodeName {
- m.Cmdy(arg) // 本地命令
- return
- }
-
- target := kit.Split(space, ".", ".")
- m.Warn(m.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) {
- if socket, ok := value[SOCKET].(*websocket.Conn); !m.Warn(!ok, ice.ErrNotFound, SOCKET) {
-
- // 复制选项
- for _, k := range kit.Simple(m.Optionv(ice.MSG_OPTS)) {
- switch k {
- case ice.MSG_DETAIL, ice.MSG_CMDS, ice.MSG_SESSID:
- default:
- m.Optionv(k, m.Optionv(k))
- }
+ // 断线重连
+ sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond
+ msg.Cost("order", i, "sleep", sleep, "reconnect", u)
+ time.Sleep(sleep)
}
- m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTS))
- m.Optionv(ice.MSG_OPTION, m.Optionv(ice.MSG_OPTS))
-
- // 构造路由
- frame := m.Target().Server().(*Frame)
- id := kit.Format(m.Target().ID())
- frame.send[id] = m
-
- // 下发命令
- _space_echo(m.Set(ice.MSG_DETAIL, arg...), []string{id}, target[1:], socket, target[0])
-
- m.Option("timeout", m.Conf(SPACE, "meta.timeout.c"))
- m.Call(m.Option("_async") == "", func(res *ice.Message) *ice.Message {
- // 返回结果
- if delete(frame.send, id); res != nil && m != nil {
- return m.Cost(kit.Format("[%v]->%v %v %v", id, target, arg, m.Copy(res).Format(ice.MSG_APPEND)))
- }
- return nil
- })
- }
- }) == nil, ice.ErrNotFound, space)
-}
-
-func _space_echo(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
- msg.Optionv(ice.MSG_SOURCE, source)
- msg.Optionv(ice.MSG_TARGET, target)
- msg.Assert(c.WriteMessage(1, []byte(msg.Format(kit.MDB_META))))
-
- target = append([]string{name}, target...)
- msg.Log("send", "%v->%v %v %v", source, target, msg.Detailv(), msg.Format(kit.MDB_META))
-}
-func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
- if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotRight) {
- msg = msg.Cmd()
- }
-
- msg.Set(ice.MSG_OPTS)
- _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
- msg.Cost(kit.Format("%v->%v %v %v", source, target, msg.Detailv(), msg.Format(ice.MSG_APPEND)))
+ })
+ })
}
func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool {
for running := true; running; {
@@ -195,6 +126,63 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
}
return false
}
+func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
+ if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotRight) {
+ msg = msg.Cmd()
+ }
+
+ msg.Set(ice.MSG_OPTS)
+ _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
+ msg.Cost(kit.Format("%v->%v %v %v", source, target, msg.Detailv(), msg.Format(ice.MSG_APPEND)))
+}
+func _space_echo(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
+ msg.Optionv(ice.MSG_SOURCE, source)
+ msg.Optionv(ice.MSG_TARGET, target)
+ msg.Assert(c.WriteMessage(1, []byte(msg.Format(kit.MDB_META))))
+
+ target = append([]string{name}, target...)
+ msg.Log("send", "%v->%v %v %v", source, target, msg.Detailv(), msg.Format(kit.MDB_META))
+}
+func _space_send(m *ice.Message, space string, arg ...string) {
+ if space == "" || space == MYSELF || space == ice.Info.NodeName {
+ m.Cmdy(arg) // 本地命令
+ return
+ }
+
+ target := kit.Split(space, ice.PT, ice.PT)
+ m.Warn(m.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) {
+ if socket, ok := value[SOCKET].(*websocket.Conn); !m.Warn(!ok, ice.ErrNotFound, SOCKET) {
+
+ // 复制选项
+ for _, k := range kit.Simple(m.Optionv(ice.MSG_OPTS)) {
+ switch k {
+ case ice.MSG_DETAIL, ice.MSG_CMDS, ice.MSG_SESSID:
+ default:
+ m.Optionv(k, m.Optionv(k))
+ }
+ }
+ m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTS))
+ m.Optionv(ice.MSG_OPTION, m.Optionv(ice.MSG_OPTS))
+
+ // 构造路由
+ frame := m.Target().Server().(*Frame)
+ id := kit.Format(m.Target().ID())
+ frame.send[id] = m
+
+ // 下发命令
+ _space_echo(m.Set(ice.MSG_DETAIL, arg...), []string{id}, target[1:], socket, target[0])
+
+ m.Option("timeout", m.Config("timeout.c"))
+ m.Call(m.Option("_async") == "", func(res *ice.Message) *ice.Message {
+ // 返回结果
+ if delete(frame.send, id); res != nil && m != nil {
+ return m.Cost(kit.Format("[%v]->%v %v %v", id, target, arg, m.Copy(res).Format(ice.MSG_APPEND)))
+ }
+ return nil
+ })
+ }
+ }) == nil, ice.ErrNotFound, space)
+}
func _space_search(m *ice.Message, kind, name, text string, arg ...string) {
m.Richs(SPACE, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
if value = kit.GetMeta(value); !strings.Contains(kit.Format(value[kit.MDB_NAME]), name) {
@@ -233,7 +221,6 @@ const (
SERVER = "server"
WORKER = "worker"
)
-
const (
SPACE_START = "space.start"
SPACE_STOP = "space.stop"
@@ -244,29 +231,38 @@ const SPACE = "space"
func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
- SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
+ SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(
+ kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,type,name,text",
"redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", ice.MOD_BUFS, "w", ice.MOD_BUFS),
"timeout", kit.Dict("c", "180s"),
)},
}, Commands: map[string]*ice.Command{
- SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Conf(SPACE, kit.MDB_HASH, "")
+ 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) {
_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) {
_space_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 { // 节点列表
- _space_list(m, kit.Select("", arg, 0))
+ if mdb.HashSelect(m, arg...); len(arg) == 0 {
+ m.Table(func(index int, value map[string]string, head []string) {
+ m.PushAnchor(value[kit.MDB_NAME], _space_link(m, kit.Keys(m.Option(ice.MSG_USERPOD), value[kit.MDB_NAME])))
+ })
+ m.SortStrR(kit.MDB_NAME)
+ }
return
}
// 下发命令
_space_send(m, arg[0], arg[1:]...)
}},
-
"/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) {
+ if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Config("buffer.r")), kit.Int(m.Config("buffer.w"))); m.Assert(e) {
name := kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME))
name = m.Option(kit.MDB_NAME, strings.Replace(name, ".", "_", -1))
name = m.Option(kit.MDB_NAME, strings.Replace(name, ":", "-", -1))
diff --git a/base/web/spide.go b/base/web/spide.go
index fa3f24d4..1b1d55dc 100644
--- a/base/web/spide.go
+++ b/base/web/spide.go
@@ -14,6 +14,7 @@ import (
"time"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
kit "shylinux.com/x/toolkits"
@@ -28,17 +29,17 @@ func _spide_create(m *ice.Message, name, address string) {
dir, file := path.Split(uri.EscapedPath())
m.Echo(m.Rich(SPIDE, nil, kit.Dict(
SPIDE_COOKIE, kit.Dict(), SPIDE_HEADER, kit.Dict(), SPIDE_CLIENT, kit.Dict(
- kit.MDB_NAME, name, "url", address, SPIDE_METHOD, SPIDE_POST,
+ kit.MDB_NAME, name, SPIDE_METHOD, SPIDE_POST, "url", address,
tcp.PROTOCOL, uri.Scheme, tcp.HOSTNAME, uri.Host,
kit.MDB_PATH, dir, kit.MDB_FILE, file, "query", uri.RawQuery,
- kit.MDB_TIMEOUT, "600s", LOGHEADERS, false,
+ kit.MDB_TIMEOUT, "600s", LOGHEADERS, ice.FALSE,
),
)))
}
m.Log_CREATE(SPIDE, name, ADDRESS, address)
}
}
-func _spide_show(m *ice.Message, arg ...string) {
+func _spide_list(m *ice.Message, arg ...string) {
m.Richs(SPIDE, nil, arg[0], func(key string, value map[string]interface{}) {
// 缓存方式
cache, save := "", ""
@@ -88,7 +89,7 @@ func _spide_show(m *ice.Message, arg ...string) {
return
}
- if m.Config("logheaders") == ice.TRUE {
+ if m.Config(LOGHEADERS) == ice.TRUE {
for k, v := range res.Header {
m.Debug("%v: %v", k, v)
}
@@ -101,27 +102,24 @@ func _spide_show(m *ice.Message, arg ...string) {
// 缓存配置
for _, v := range res.Cookies() {
kit.Value(value, kit.Keys(SPIDE_COOKIE, v.Name), v.Value)
- m.Log(ice.LOG_IMPORT, "%s: %s", v.Name, v.Value)
+ m.Log_IMPORT(v.Name, v.Value)
}
// 错误信息
if m.Warn(res.StatusCode != http.StatusOK, res.Status) {
switch m.Set(ice.MSG_RESULT); res.StatusCode {
case http.StatusNotFound:
- m.Warn(true, ice.ErrNotFound, " of ", uri)
+ m.Warn(true, ice.ErrNotFound, ice.OF, uri)
return
case http.StatusUnauthorized:
- m.Warn(true, ice.ErrNotRight, " of ", uri)
+ m.Warn(true, ice.ErrNotRight, ice.OF, uri)
return
- default:
-
}
}
// 解析结果
_spide_save(m, cache, save, uri, res)
})
-
}
func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, map[string]string, []string) {
head := map[string]string{}
@@ -215,18 +213,18 @@ func _spide_head(m *ice.Message, req *http.Request, head map[string]string, valu
})
kit.Fetch(value[SPIDE_COOKIE], func(key string, value string) {
req.AddCookie(&http.Cookie{Name: key, Value: value})
- m.Info("%s: %s", key, value)
+ m.Logs(key, value)
})
list := kit.Simple(m.Optionv(SPIDE_HEADER))
for i := 0; i < len(list)-1; i += 2 {
req.Header.Set(list[i], list[i+1])
- m.Info("%s: %s", list[i], list[i+1])
+ m.Logs(list[i], list[i+1])
}
for k, v := range head {
req.Header.Set(k, v)
}
if req.Method == SPIDE_POST {
- m.Info("%s: %s", req.Header.Get(ContentLength), req.Header.Get(ContentType))
+ m.Logs(req.Header.Get(ContentLength), req.Header.Get(ContentType))
}
}
func _spide_send(m *ice.Message, req *http.Request, timeout string) (*http.Response, error) {
@@ -297,20 +295,15 @@ const (
SPIDE_POST = "POST"
SPIDE_DELETE = "DELETE"
+ SPIDE_BODY = "body"
SPIDE_FORM = "form"
SPIDE_PART = "part"
- SPIDE_JSON = "json"
SPIDE_DATA = "data"
SPIDE_FILE = "file"
- SPIDE_BODY = "body"
+ SPIDE_JSON = "json"
SPIDE_RES = "content_data"
- SPIDE_CLIENT = "client"
- SPIDE_METHOD = "method"
- SPIDE_HEADER = "header"
- SPIDE_COOKIE = "cookie"
-
ContentType = "Content-Type"
ContentLength = "Content-Length"
@@ -320,6 +313,11 @@ const (
ContentPNG = "image/png"
)
const (
+ SPIDE_CLIENT = "client"
+ SPIDE_METHOD = "method"
+ SPIDE_HEADER = "header"
+ SPIDE_COOKIE = "cookie"
+
ADDRESS = "address"
REQUEST = "request"
RESPONSE = "response"
@@ -330,46 +328,43 @@ const (
const SPIDE = "spide"
func init() {
- Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{
- SPIDE: {Name: SPIDE, Help: "蜘蛛侠", Value: kit.Data(
- kit.MDB_SHORT, CLIENT_NAME, kit.MDB_FIELD, "time,client.name,client.url",
- "logheaders", "false",
- )},
- },
- Commands: map[string]*ice.Command{
- SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run:button create", Help: "蜘蛛侠", Action: ice.MergeAction(map[string]*ice.Action{
- mdb.CREATE: {Name: "create name address", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- _spide_create(m, m.Option(kit.MDB_NAME), m.Option(ADDRESS))
- }},
- }, 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] == "") {
- m.Fields(len(kit.Slice(arg, 0, 1)), m.Conf(SPIDE, kit.META_FIELD))
- m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, CLIENT_NAME, arg)
- m.PushAction(mdb.REMOVE)
- return
- }
- _spide_show(m, arg...)
+ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
+ SPIDE: {Name: SPIDE, Help: "蜘蛛侠", Value: kit.Data(
+ kit.MDB_SHORT, CLIENT_NAME, kit.MDB_FIELD, "time,client.name,client.url",
+ LOGHEADERS, ice.FALSE,
+ )},
+ }, Commands: map[string]*ice.Command{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_ops")))
+ m.Cmd(SPIDE, mdb.CREATE, ice.DEV, kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_dev")))
+ m.Cmd(SPIDE, mdb.CREATE, ice.SHY, kit.Select("https://shylinux.com:443", m.Conf(cli.RUNTIME, "conf.ctx_shy")))
+ }},
+ SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run:button create", Help: "蜘蛛侠", Action: ice.MergeAction(map[string]*ice.Action{
+ mdb.CREATE: {Name: "create name address", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ _spide_create(m, m.Option(kit.MDB_NAME), m.Option(ADDRESS))
}},
+ }, 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.PushAction(mdb.REMOVE)
+ return
+ }
+ _spide_list(m, arg...)
+ }},
- SPIDE_GET: {Name: "GET url key value run:button", Help: "蜘蛛侠", Action: map[string]*ice.Action{
- mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.DELETE, SPIDE, "", mdb.HASH, CLIENT_NAME, m.Option(CLIENT_NAME))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, SPIDE_GET, arg[0], arg[1:]))))
+ SPIDE_GET: {Name: "GET url key value run:button", Help: "蜘蛛侠", Action: map[string]*ice.Action{
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, SPIDE, "", mdb.HASH, m.OptionSimple(CLIENT_NAME))
}},
- SPIDE_POST: {Name: "POST url key value run:button", Help: "蜘蛛侠", Action: map[string]*ice.Action{
- mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.DELETE, SPIDE, "", mdb.HASH, CLIENT_NAME, m.Option(CLIENT_NAME))
- }},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- if len(arg) == 2 {
- m.Option(SPIDE_HEADER, ContentType, ContentJSON)
- m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, SPIDE_POST, arg[0], SPIDE_DATA, arg[1:]))))
- return
- }
- m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, SPIDE_POST, arg[0], SPIDE_JSON, arg[1:]))))
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, SPIDE_GET, arg[0], arg[1:]))))
+ }},
+ SPIDE_POST: {Name: "POST url key value run:button", Help: "蜘蛛侠", Action: map[string]*ice.Action{
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, SPIDE, "", mdb.HASH, m.OptionSimple(CLIENT_NAME))
}},
- }})
+ }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+ m.Echo(kit.Formats(kit.UnMarshal(m.Cmdx(SPIDE, ice.DEV, SPIDE_RAW, SPIDE_POST, arg[0], arg[1:]))))
+ }},
+ }})
}
diff --git a/base/web/stream.go b/base/web/stream.go
deleted file mode 100644
index 9e1d0b96..00000000
--- a/base/web/stream.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package web
-
-import (
- ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/cli"
-)
-
-type Buffer struct {
- m *ice.Message
- n string
-}
-
-func (b *Buffer) Write(buf []byte) (int, error) {
- b.m.Cmd(SPACE, b.n, "grow", string(buf))
- return len(buf), nil
-}
-func (b *Buffer) Close() error { return nil }
-
-func PushStream(m *ice.Message) {
- m.Option(cli.CMD_OUTPUT, &Buffer{m: m, n: m.Option(ice.MSG_DAEMON)})
-}
diff --git a/base/web/web.go b/base/web/web.go
index ddad2716..7b50c559 100644
--- a/base/web/web.go
+++ b/base/web/web.go
@@ -6,7 +6,6 @@ import (
"path"
ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
kit "shylinux.com/x/toolkits"
@@ -43,7 +42,7 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool {
// 静态路由
msg := m.Spawn(s)
- m.Confm(SERVE, kit.Keym("static"), func(key string, value string) {
+ m.Confm(SERVE, kit.META_PATH, func(key string, value string) {
m.Log("route", "%s <- %s <- %s", s.Name, key, value)
w.Handle(key, http.StripPrefix(key, http.FileServer(http.Dir(value))))
})
@@ -94,25 +93,7 @@ func (web *Frame) Close(m *ice.Message, arg ...string) bool {
const WEB = "web"
-var Index = &ice.Context{Name: WEB, Help: "网络模块", Commands: map[string]*ice.Command{
- ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Load()
- m.Conf(SPACE, kit.MDB_HASH, "")
- m.Cmd(mdb.SEARCH, mdb.CREATE, SPACE, m.Prefix(SPACE))
-
- m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_ops")))
- m.Cmd(SPIDE, mdb.CREATE, ice.DEV, kit.Select("http://:9020", m.Conf(cli.RUNTIME, "conf.ctx_dev")))
- m.Cmd(SPIDE, mdb.CREATE, ice.SHY, kit.Select("https://shylinux.com:443", m.Conf(cli.RUNTIME, "conf.ctx_shy")))
- }},
- ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Save()
-
- m.Done(true)
- m.Cmd(SERVE).Table(func(index int, value map[string]string, head []string) {
- m.Done(value[kit.MDB_STATUS] == tcp.START)
- })
- }},
-}}
+var Index = &ice.Context{Name: WEB, Help: "网络模块"}
func init() {
ice.Index.Register(Index, &Frame{},
diff --git a/core/chat/room.go b/core/chat/room.go
index 59601847..a0b08264 100644
--- a/core/chat/room.go
+++ b/core/chat/room.go
@@ -40,8 +40,7 @@ func init() {
}},
"exit": {Name: "exit", Help: "退出"},
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(ROOM, kit.META_FIELD))
- m.Cmdy(mdb.SELECT, m.Prefix(ROOM), "", mdb.ZONE, arg)
+ mdb.ZoneSelect(m, arg...)
}},
JOIN: {Name: "join zone hash auto", Help: "join", Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
@@ -58,8 +57,7 @@ func init() {
m.Cmdy(mdb.DELETE, m.Prefix(JOIN), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, m.OptionSimple(web.SOCKET))
}},
}), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(JOIN, kit.META_FIELD))
- if len(arg) == 0 {
+ if mdb.ZoneSelect(m, arg...); len(arg) == 0 {
m.Cmdy(mdb.SELECT, m.Prefix(JOIN), "", mdb.HASH)
} else {
m.Cmdy(mdb.SELECT, m.Prefix(JOIN), kit.KeyHash(arg[0]), mdb.HASH, arg[1:])
diff --git a/misc/chrome/field.go b/misc/chrome/field.go
index 0b60cead..a76ca186 100644
--- a/misc/chrome/field.go
+++ b/misc/chrome/field.go
@@ -27,8 +27,7 @@ func init() {
})
}},
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(FIELD, kit.META_FIELD))
- if m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.ZONE, arg); len(arg) == 0 {
+ if mdb.ZoneSelect(m, arg...); len(arg) == 0 {
m.PushAction(mdb.REMOVE)
}
}},
diff --git a/misc/chrome/style.go b/misc/chrome/style.go
index 1ce88ef1..b00e281b 100644
--- a/misc/chrome/style.go
+++ b/misc/chrome/style.go
@@ -24,8 +24,7 @@ func init() {
})
}},
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(STYLE, kit.META_FIELD))
- if m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.ZONE, arg); len(arg) == 0 {
+ if mdb.ZoneSelect(m, arg...); len(arg) == 0 {
m.PushAction(mdb.REMOVE)
}
}},