diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 6eb6365e..66fe11ec 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -52,8 +52,9 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) { m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, STOP) } - if m.Option(AUTO_RESTART) == ice.TRUE { - m.Cmd(DAEMON, START) + switch cb := m.Optionv(kit.Keycb(DAEMON)).(type) { + case func(): + cb() } if w, ok := m.Optionv(CMD_OUTPUT).(io.Closer); ok { @@ -86,8 +87,6 @@ const ( RESTART = "restart" RELOAD = "reload" STOP = "stop" - - AUTO_RESTART = "auto_restart" ) const DAEMON = "daemon" diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 05d23072..a43ec894 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -422,10 +422,33 @@ const ( CACHE_FIELD = "cache.field" CACHE_VALUE = "cache.value" CACHE_OFFEND = "cache.offend" + CACHE_FILTER = "cache.filter" CACHE_CLEAR_ON_EXIT = "cache.clear.on.exit" ) +func PrevPage(m *ice.Message, total string, arg ...string) { + limit, offend := kit.Select("10", arg, 0), kit.Select("0", arg, 1) + offends := kit.Int(offend) - kit.Int(limit) + if offends <= -kit.Int(total) || offends >= kit.Int(total) { + m.Toast("已经是最前一页啦!") + m.ProcessHold() + return + } + m.ProcessRewrite("offend", offends) + +} +func NextPage(m *ice.Message, total string, arg ...string) { + limit, offend := kit.Select("10", arg, 0), kit.Select("0", arg, 1) + offends := kit.Int(offend) + kit.Int(limit) + if offends <= -kit.Int(total) || offends >= kit.Int(total) { + m.Toast("已经是最后一页啦!") + m.ProcessHold() + return + } + m.ProcessRewrite("offend", offends) +} + const MDB = "mdb" var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: map[string]*ice.Command{ diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index 4691e759..381b3f0a 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -3,7 +3,6 @@ package nfs import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" - kit "github.com/shylinux/toolkits" ) var Index = &ice.Context{Name: "nfs", Help: "存储模块", Commands: map[string]*ice.Command{ @@ -12,11 +11,6 @@ var Index = &ice.Context{Name: "nfs", Help: "存储模块", Commands: map[string m.Cmd(mdb.RENDER, mdb.CREATE, CAT) m.Cmd(mdb.SEARCH, mdb.CREATE, DIR) m.Cmd(mdb.RENDER, mdb.CREATE, DIR) - - m.Richs(TAIL, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - value, _ = kit.GetMeta(value), m.Option(kit.MDB_HASH, key) - m.Cmd(TAIL, mdb.CREATE, kit.MDB_FILE, kit.Format(value[kit.MDB_FILE]), kit.MDB_NAME, kit.Format(value[kit.MDB_NAME])) - }) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() diff --git a/base/nfs/tail.go b/base/nfs/tail.go index 7f201de6..0fa45d0f 100644 --- a/base/nfs/tail.go +++ b/base/nfs/tail.go @@ -3,6 +3,7 @@ package nfs import ( "bufio" "io" + "strings" ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/cli" @@ -11,16 +12,14 @@ import ( ) func _tail_create(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_HASH) == "" { - m.Option(kit.MDB_HASH, m.Cmdx(mdb.INSERT, TAIL, "", mdb.HASH, arg)) - } + h := m.Cmdx(mdb.INSERT, m.Prefix(TAIL), "", kit.MDB_HASH, arg) kit.ForEach(kit.Split(m.Option(kit.MDB_FILE), ","), func(file string) { r, w := io.Pipe() m.Go(func() { for bio := bufio.NewScanner(r); bio.Scan(); { m.Log_IMPORT(kit.MDB_FILE, file, kit.MDB_SIZE, len(bio.Text())) - m.Grow(TAIL, kit.Keys(kit.MDB_HASH, m.Option(kit.MDB_HASH)), kit.Dict( + m.Grow(TAIL, kit.Keys(kit.MDB_HASH, h), kit.Dict( kit.MDB_FILE, file, kit.MDB_SIZE, len(bio.Text()), kit.MDB_TEXT, bio.Text(), )) } @@ -32,46 +31,54 @@ func _tail_create(m *ice.Message, arg ...string) { m.Cmd(cli.DAEMON, TAIL, "-n", "0", "-f", file) }) } +func _tail_count(m *ice.Message, name string) string { + return m.Conf(TAIL, kit.Keys(kit.MDB_HASH, kit.Hashs(name), kit.MDB_META, kit.MDB_COUNT)) + +} const TAIL = "tail" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - TAIL: {Name: TAIL, Help: "日志流", Value: kit.Data()}, + TAIL: {Name: TAIL, Help: "日志流", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, }, Commands: map[string]*ice.Command{ - TAIL: {Name: "tail hash id limit offend auto prev next create", Help: "日志流", Action: map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(TAIL, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + value, _ = kit.GetMeta(value), m.Option(kit.MDB_HASH, key) + m.Cmd(TAIL, mdb.CREATE, kit.MDB_FILE, kit.Format(value[kit.MDB_FILE]), kit.MDB_NAME, kit.Format(value[kit.MDB_NAME])) + }) + }}, + TAIL: {Name: "tail name id auto create page", Help: "日志流", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create file name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { _tail_create(m, arg...) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, TAIL, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + m.Cmdy(mdb.DELETE, TAIL, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)) }}, "prev": {Name: "prev", Help: "上一页", Hand: func(m *ice.Message, arg ...string) { - offend := kit.Int(kit.Select("0", arg, 3)) + kit.Int(kit.Select("10", arg, 2)) - total := kit.Int(m.Conf(TAIL, kit.Keys(kit.MDB_HASH, arg[0], kit.MDB_META, kit.MDB_COUNT))) - if offend >= total { - offend = total - kit.Int(kit.Select("10", arg, 2)) - m.Toast("已经是最后一页啦!") - } - m.ProcessRewrite("offend", offend) + mdb.PrevPage(m, _tail_count(m, arg[0]), kit.Slice(arg, 2)...) }}, "next": {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { - offend := kit.Int(kit.Select("0", arg, 3)) - kit.Int(kit.Select("10", arg, 2)) - if offend < 0 { - offend = 0 - m.Toast("已经是第一页啦!") - } - m.ProcessRewrite("offend", offend) + mdb.NextPage(m, _tail_count(m, arg[0]), kit.Slice(arg, 2)...) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(true, kit.Select("time,hash,count,name,file", "time,id,file,text", len(arg) > 1 && arg[1] != "")) + m.Fields(len(arg) < 2 || (len(arg) > 1 && arg[1] == ""), kit.Select("time,name,count,name,file", "time,id,file,text", len(arg) > 0 && arg[0] != "")) + 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)) - if m.Cmdy(mdb.SELECT, TAIL, "", mdb.ZONE, arg); len(arg) == 0 { + m.Cmd(mdb.SELECT, TAIL, "", mdb.ZONE, arg).Table(func(index int, value map[string]string, head []string) { + if strings.Contains(value[kit.MDB_TEXT], m.Option(mdb.CACHE_FILTER)) { + m.Push("", value, head) + } + }) + + if len(arg) == 0 { m.PushAction(mdb.REMOVE) + } else { + m.StatusTimeCount("total", m.Conf(TAIL, kit.Keys(kit.MDB_HASH, kit.Hashs(arg[0]), kit.MDB_META, kit.MDB_COUNT))) } }}, }, diff --git a/core/chat/meet.go b/core/chat/meet.go index 1650772b..2d847383 100644 --- a/core/chat/meet.go +++ b/core/chat/meet.go @@ -1,7 +1,10 @@ package chat import ( + "math/rand" + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" @@ -63,6 +66,12 @@ func init() { m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) }) }}, + "random": {Name: "random max auto", Help: "随机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + max := kit.Int(kit.Select("6", arg, 0)) + n := rand.Intn(max + 1) + m.Echo(`%s`, cli.Color(m, cli.RED, kit.Format(n))) + m.Status("time", m.Time(), "max", max) + }}, }, }, nil) } diff --git a/data.go b/data.go index 73db00e2..1c8bf266 100644 --- a/data.go +++ b/data.go @@ -1,6 +1,7 @@ package ice import ( + "strings" "sync" kit "github.com/shylinux/toolkits" @@ -64,7 +65,7 @@ func (m *Message) Grows(prefix string, chain interface{}, match string, value st } return miss.Grows(kit.Keys(prefix, chain), cache, - kit.Int(kit.Select("0", m.Option("cache.offend"))), + kit.Int(kit.Select("0", strings.TrimPrefix(m.Option("cache.offend"), "-"))), kit.Int(kit.Select("10", m.Option("cache.limit"))), match, value, cb) } diff --git a/type.go b/type.go index 76b0a1ab..7d7e3712 100644 --- a/type.go +++ b/type.go @@ -229,6 +229,14 @@ func (c *Context) Merge(s *Context) *Context { func (c *Context) _split(name string) []interface{} { button, list := false, []interface{}{} for _, v := range kit.Split(kit.Select("key", name), " ", " ")[1:] { + if v == "page" { + list = append(list, kit.List(kit.MDB_INPUT, "text", "name", "limit")...) + list = append(list, kit.List(kit.MDB_INPUT, "text", "name", "offend")...) + list = append(list, kit.List(kit.MDB_INPUT, "text", "name", "filter")...) + list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "prev")...) + list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "next")...) + continue + } if v == "auto" { list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...) list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "返回")...)