diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 1a19d561..f86c0284 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -76,6 +76,12 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) { defer m.SortStrR(TIME) fields := _hash_fields(m) defer RLock(m, prefix)() + if strings.Contains(value, ",") { + kit.For(kit.Split(value), func(value string) { + Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) }) + }) + return + } Richs(m, prefix, chain, value, func(key string, value Map) { _mdb_select(m, m.OptionCB(""), key, value, fields, nil) }) } func _hash_select_field(m *ice.Message, prefix, chain string, key string, field string) (value string) { @@ -221,7 +227,7 @@ func HashModify(m *ice.Message, arg ...Any) *ice.Message { return m.Cmd(MODIFY, m.PrefixKey(), m.Option(SUBKEY), HASH, arg) } func HashSelect(m *ice.Message, arg ...string) *ice.Message { - if len(arg) > 0 && arg[0] == FOREACH { + if len(arg) > 0 && (arg[0] == FOREACH || strings.Contains(arg[0], ",")) { m.Fields(0, HashField(m)) } else { m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m)) diff --git a/conf.go b/conf.go index 73a1932b..b42f0731 100644 --- a/conf.go +++ b/conf.go @@ -247,6 +247,7 @@ const ( // MSG LOG_TRACEID = "log.id" TOAST_DURATION = "toast.duration" + TABLE_CHECKBOX = "table.checkbox" ) const ( // RENDER RENDER_BUTTON = "_button" diff --git a/misc/ssh/relay/relay.go b/misc/ssh/relay/relay.go index fd7ebec8..0a7d2bf4 100644 --- a/misc/ssh/relay/relay.go +++ b/misc/ssh/relay/relay.go @@ -158,7 +158,7 @@ func (s relay) Stats(m *ice.Message) { } return nil }).ProcessInner() - s.ForEach(m.Spawn(ice.Maps{MACHINE: "", ice.CMD: "contexts/bin/ice.bin web.admin runtime"})).Table(func(value ice.Maps) { + s.ForEach(m.Spawn(ice.Maps{MACHINE: m.Option(MACHINE), ice.CMD: "contexts/bin/ice.bin web.admin runtime"})).Table(func(value ice.Maps) { res := kit.UnMarshal(value[ice.RES]) data := kit.Value(res, cli.MAKE) s.Modify(m, kit.Simple(MACHINE, value[MACHINE], kit.Dict( @@ -227,6 +227,7 @@ func (s relay) List(m *ice.Message, arg ...string) *ice.Message { }) _stats := kit.Dict(MEM, kit.FmtSize(stats[MEM_FREE], stats[MEM_TOTAL]), DISK, kit.FmtSize(stats[DISK_USED], stats[DISK_TOTAL])) m.StatusTimeCount(m.Spawn().Options(stats, _stats).OptionSimple(VCPU, MEM, DISK, SOCKET, PROC)) + m.Option(ice.TABLE_CHECKBOX, ice.TRUE) m.RewriteAppend(func(value, key string, index int) string { if key == MEM { if ls := kit.Split(value, " /"); len(ls) > 0 && kit.Int(ls[0]) < 256*1024*1024 { @@ -241,7 +242,7 @@ func (s relay) Install(m *ice.Message, arg ...string) { s.shell(m, m.Template(INSTALL_SH), arg...) } func (s relay) Upgrade(m *ice.Message, arg ...string) { - if len(arg) == 0 && m.Option(MACHINE) == "" { + if len(arg) == 0 && (m.Option(MACHINE) == "" || strings.Contains(m.Option(MACHINE), ",")) { m.Options(ice.CMD, m.Template(UPGRADE_SH), cli.DELAY, "0", "interval", "3s") s.ForFlow(m) } else { @@ -294,7 +295,7 @@ func (s relay) shell(m *ice.Message, init string, arg ...string) { } func (s relay) foreach(m *ice.Message, cb func(*ice.Message, []string)) { cmd := kit.Filters(strings.Split(m.Option(ice.CMD), lex.NL), "") - s.Hash.ForEach(m, "", func(msg *ice.Message) { cb(msg, cmd) }) + s.Hash.ForEach(m, MACHINE, func(msg *ice.Message) { cb(msg, cmd) }) } func (s relay) foreachModify(m *ice.Message, key, cmd string, cb func([]string) string) { kit.If(cb == nil, func() { cb = func(ls []string) string { return kit.Join(ls) } })