diff --git a/base.go b/base.go index 6af28972..23e1d51c 100644 --- a/base.go +++ b/base.go @@ -70,6 +70,13 @@ var Index = &Context{Name: "ice", Help: "冰山模块", c.Close(m.Spawn(c), arg...) os.Exit(kit.Int(kit.Select("0", arg, 0))) }}, + "restart": {Name: "restart", Help: "hello", Hand: func(m *Message, c *Context, cmd string, arg ...string) { + switch kit.Select("0", arg, 0) { + case "0": + c.Close(m.Spawn(c), arg...) + os.Exit(kit.Int(kit.Select("0", arg, 0))) + } + }}, "_exit": {Name: "_init", Help: "hello", Hand: func(m *Message, c *Context, cmd string, arg ...string) { }}, }, diff --git a/base/cli/cli.go b/base/cli/cli.go index b34ace58..c7eab0a9 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -44,15 +44,30 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", }}, "runtime": {Name: "runtime", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }}, - "system": {Name: "system", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + "system": {Name: "system", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + cmd := exec.Command(arg[0], arg[1:]...) + cmd.Dir = m.Option("cmd_dir") + + if m.Option("cmd_type") == "daemon" { + m.Gos(m, func(m *ice.Message) { + if e := cmd.Start(); e != nil { + m.Log("warn", "%v start %s", arg, e) + } else if e := cmd.Wait(); e != nil { + m.Log("warn", "%v wait %s", arg, e) + } else { + m.Log("info", "%v exit", arg) + } + }) + return + } + out := bytes.NewBuffer(make([]byte, 0, 1024)) err := bytes.NewBuffer(make([]byte, 0, 1024)) - sys := exec.Command(arg[0], arg[1:]...) - sys.Stdout = out - sys.Stderr = err + cmd.Stdout = out + cmd.Stderr = err - if e := sys.Run(); e != nil { + if e := cmd.Run(); e != nil { m.Echo("error: ").Echo(kit.Select(e.Error(), err.String())) return } diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 1ce64c59..5998a0c8 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -3,6 +3,7 @@ package mdb import ( "github.com/shylinux/icebergs" "github.com/shylinux/toolkits" + "strings" ) var Index = &ice.Context{Name: "mdb", Help: "数据模块", @@ -18,6 +19,24 @@ var Index = &ice.Context{Name: "mdb", Help: "数据模块", kit.Value(data, arg[i], arg[i+1]) } }}, + "select": {Name: "select config table index offend limit match value", Help: "修改数据", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 3 { + meta := m.Confm(arg[0], arg[1]+".meta") + index := kit.Int(arg[2]) - kit.Int(meta["offset"]) - 1 + + data := m.Confm(arg[0], arg[1]+".list."+kit.Format(index)) + m.Push(arg[2], data) + } else { + m.Option("cache.offend", kit.Select("0", arg, 3)) + m.Option("cache.limit", kit.Select("10", arg, 4)) + m.Option("cache.match", kit.Select("", arg, 5)) + m.Option("cache.value", kit.Select("", arg, 6)) + fields := strings.Split(arg[7], " ") + m.Grows(arg[0], arg[1], func(index int, value map[string]interface{}) { + m.Push("id", value, fields) + }) + } + }}, }, } diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index 732a26c0..86b9068b 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -1,11 +1,13 @@ package nfs import ( + "github.com/shylinux/icebergs" + "github.com/shylinux/toolkits" + "bufio" "crypto/sha1" "encoding/hex" "fmt" - "github.com/shylinux/icebergs" "io/ioutil" "os" "path" @@ -132,7 +134,7 @@ var Index = &ice.Context{Name: "nfs", Help: "文件模块", "dir": {Name: "dir", Help: "目录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { rg, _ := regexp.Compile(m.Option("dir_reg")) dir(m, arg[0], arg[1], 0, false, "both", rg, - strings.Split("time size line path", " "), "2006-01-02 15:04:05") + strings.Split(kit.Select("time size line path", arg, 2), " "), "2006-01-02 15:04:05") }}, }, } diff --git a/base/web/web.go b/base/web/web.go index e8b7dad2..e28da58f 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -44,7 +44,7 @@ func (web *WEB) Login(msg *ice.Message, w http.ResponseWriter, r *http.Request) msg.Option("username", sub.Append("username"))) } - msg.Runs("_login", msg.Option("path"), kit.Simple(msg.Optionv("cmds"))...) + msg.Runs("_login", msg.Option("url"), kit.Simple(msg.Optionv("cmds"))...) return true } func (web *WEB) HandleWSS(m *ice.Message, safe bool, c *websocket.Conn) { @@ -154,7 +154,7 @@ func (web *WEB) HandleCmd(m *ice.Message, key string, cmd *ice.Command) { msg.Option("referer", r.Header.Get("Referer")) msg.Option("accept", r.Header.Get("Accept")) msg.Option("method", r.Method) - msg.Option("path", r.URL.Path) + msg.Option("url", r.URL.Path) msg.Option("sessid", "") // 请求环境 @@ -200,8 +200,7 @@ func (web *WEB) HandleCmd(m *ice.Message, key string, cmd *ice.Command) { if web.Login(msg, w, r) { msg.Log("cmd", "%s %s", msg.Target().Name, key) - cmd.Hand(msg, msg.Target(), msg.Option("path"), kit.Simple(msg.Optionv("cmds"))...) - msg.Set("option") + cmd.Hand(msg, msg.Target(), msg.Option("url"), kit.Simple(msg.Optionv("cmds"))...) w.Write([]byte(msg.Formats("meta"))) } }) @@ -335,10 +334,18 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", web := m.Target().Server().(*WEB) m.Gos(m, func(m *ice.Message) { web.HandleWSS(m, false, s) + m.Log("space", "close %v %v", h, kit.Formats(m.Confv("space"))) + m.Confv("space", []string{"hash", h}, "") }) } }}, "space": &ice.Command{Name: "space", Help: "", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + m.Conf("space", "hash", func(key string, value map[string]interface{}) { + m.Push(key, value) + }) + return + } web := m.Target().Server().(*WEB) switch arg[0] { case "connect": @@ -381,7 +388,7 @@ var Index = &ice.Context{Name: "web", Help: "网页模块", web := m.Target().Server().(*WEB) web.send[id] = m - m.Add("detail", arg[1:]...) + m.Set("detail", arg[1:]...) socket.WriteMessage(MSG_MAPS, []byte(m.Format("meta"))) m.Call(true, func(msg *ice.Message) *ice.Message { m.Copy(msg) diff --git a/core/team/team.go b/core/team/team.go index a350d146..636d1f48 100644 --- a/core/team/team.go +++ b/core/team/team.go @@ -5,12 +5,63 @@ import ( _ "github.com/shylinux/icebergs/base" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/toolkits" + "os" + "path" + "strings" ) var Index = &ice.Context{Name: "team", Help: "团队模块", - Caches: map[string]*ice.Cache{}, - Configs: map[string]*ice.Config{}, + Caches: map[string]*ice.Cache{}, + Configs: map[string]*ice.Config{ + "miss": {Value: map[string]interface{}{ + "meta": map[string]interface{}{ + "path": "usr/local/work", + "cmd": []interface{}{"cli.system", "sh", "ice.sh", "start", "web.space", "connect"}, + }, + "list": map[string]interface{}{}, + "hash": map[string]interface{}{}, + }}, + }, Commands: map[string]*ice.Command{ + "miss": {Name: "miss", Help: "任务", Meta: map[string]interface{}{ + "exports": []interface{}{"you", "name"}, + "detail": []interface{}{"启动", "停止"}, + }, List: []interface{}{ + map[string]interface{}{"type": "text", "value": "", "name": "name"}, + map[string]interface{}{"type": "text", "value": "", "name": "type"}, + map[string]interface{}{"type": "button", "value": "创建"}, + }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + if len(arg) > 1 { + switch arg[1] { + case "启动": + case "停止": + m.Cmd("web.space", arg[0], "exit", "1") + return + } + } + + if len(arg) > 0 { + if !strings.Contains(arg[0], "-") { + arg[0] = m.Time("20060102-") + arg[0] + } + + p := path.Join(m.Conf("miss", "meta.path"), arg[0]) + if _, e := os.Stat(p); e != nil { + os.MkdirAll(p, 0777) + } + + if !m.Confs("web.space", "hash."+arg[0]) { + m.Option("cmd_dir", p) + m.Option("cmd_type", "daemon") + m.Cmd(m.Confv("miss", "meta.cmd")) + } + } + + m.Cmdy("nfs.dir", "", m.Conf("miss", "meta.path"), "time name") + m.Table(func(index int, value map[string]string, head []string) { + m.Push("status", kit.Select("stop", "start", m.Confs("web.space", "hash."+value["name"]))) + }) + }}, "task": {Name: "task", Help: "任务", List: []interface{}{ map[string]interface{}{"type": "select", "value": "create", "values": "create action cancel finish"}, map[string]interface{}{"type": "text", "value": "", "name": "name"}, @@ -19,16 +70,14 @@ var Index = &ice.Context{Name: "team", Help: "团队模块", }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { switch arg[0] { case "create": - m.Log("waht", "%v", m.Conf("web.chat.group", "hash."+m.Option("sess.river")+".task")) meta := m.Grow("web.chat.group", []string{"hash", m.Option("sess.river"), "task"}, map[string]interface{}{ "name": arg[1], "text": kit.Select("", arg, 2), - "status": "prepare", + "status": "准备", "begin_time": m.Time(), "close_time": m.Time("3h"), }) m.Log("info", "create task %v", kit.Format(meta)) - m.Log("waht", "%v %v", meta["count"], m.Conf("web.chat.group", "hash."+m.Option("sess.river")+".task")) m.Echo("%v", meta["count"]) case "action": case "cancel": @@ -42,42 +91,37 @@ var Index = &ice.Context{Name: "team", Help: "团队模块", map[string]interface{}{"type": "text", "value": "", "name": "match"}, map[string]interface{}{"type": "text", "value": "", "name": "value"}, map[string]interface{}{"type": "button", "value": "查看"}, - }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - prefix := []string{"mdb.update", "web.chat.group", "hash." + m.Option("sess.river") + ".task", arg[0]} + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + msg := m.Cmd("mdb.select", "web.chat.group", "hash."+m.Option("sess.river")+".task", arg[0]) + switch arg[1] { - case "准备": - m.Cmd(prefix, "status", arg[1], - "extra.list.-2.time", m.Time(), - "extra.list.-3.status", arg[1], - ) - arg = arg[4:] - case "开始": - m.Cmd(prefix, "status", arg[1], "begin_time", m.Time(), - "extra.list.-2.time", m.Time(), - "extra.list.-3.status", arg[1], - ) - arg = arg[4:] - case "取消": - m.Cmd(prefix, "status", arg[1], "close_time", m.Time(), - "extra.list.-2.time", m.Time(), - "extra.list.-3.status", arg[1], - ) - arg = arg[4:] - case "完成": - m.Cmd(prefix, "status", arg[1], "close_time", m.Time(), - "extra.list.-2.time", m.Time(), - "extra.list.-3.status", arg[1], - ) + case "准备", "开始", "取消", "完成": + msg.Log("what", "%v %v", msg.Append("status"), arg[1]) + if msg.Append("status") == arg[1] { + arg = arg[4:] + break + } + prefix := []string{"mdb.update", "web.chat.group", "hash." + m.Option("sess.river") + ".task", arg[0], "status", arg[1]} + status := map[string][]string{ + "准备->开始": []string{"begin_time", m.Time(), "close_time", m.Time("3h")}, + "准备->取消": []string{"begin_time", m.Time(), "close_time", m.Time()}, + "准备->完成": []string{"begin_time", m.Time(), "close_time", m.Time()}, + + "开始->准备": []string{"begin_time", m.Time(), "close_time", m.Time("3h")}, + "开始->取消": []string{"close_time", m.Time()}, + "开始->完成": []string{"close_time", m.Time()}, + }[msg.Append("status")+"->"+arg[1]] + suffix := []string{"extra.list.-2.time", m.Time(), "extra.list.-3.status", arg[1]} + + if len(status) > 0 { + m.Cmd(prefix, status, suffix) + } arg = arg[4:] } - m.Option("cache.offend", kit.Select("0", arg, 0)) - m.Option("cache.limit", kit.Select("10", arg, 1)) - m.Option("cache.match", kit.Select("", arg, 2)) - m.Option("cache.value", kit.Select("", arg, 3)) - m.Grows("web.chat.group", []string{"hash", m.Option("sess.river"), "task"}, func(index int, value map[string]interface{}) { - m.Push("id", value, []string{"id", "status", "begin_time", "close_time", "name", "text"}) - }) + m.Cmdy("mdb.select", "web.chat.group", "hash."+m.Option("sess.river")+".task", "0", + kit.Select("0", arg, 0), kit.Select("10", arg, 1), kit.Select("", arg, 2), kit.Select("", arg, 3), + kit.Select("id status begin_time close_time name text", arg, 4)) }}, }, } diff --git a/demo/build.sh b/demo/build.sh index eff8f67c..f578ef6e 100755 --- a/demo/build.sh +++ b/demo/build.sh @@ -1,5 +1,6 @@ #! /bin/sh +export ice_app=${ice_app:="ice.app"} export ice_err=${ice_err:="boot.log"} export ice_serve=${ice_serve:="web.serve"} @@ -37,7 +38,7 @@ build() { start() { [ -d usr/volcanos ] || git clone https://github.com/shylinux/volcanos usr/volcanos while true; do - date && bin/shy 2>$ice_err && log "\n\nrestarting..." && sleep 1 || break + date && $ice_app $* 2>$ice_err && log "\n\nrestarting..." && sleep 1 || break done } log() { echo -e $*; } diff --git a/demo/miss.md b/demo/miss.md index 3fa96add..fd439132 100644 --- a/demo/miss.md +++ b/demo/miss.md @@ -14,4 +14,7 @@ context cli.go ctx.go toolkits + type.go + core.go + misc.go `}} diff --git a/type.go b/type.go index b688b79b..3bef8db1 100644 --- a/type.go +++ b/type.go @@ -315,7 +315,11 @@ func (m *Message) Push(key string, value interface{}, arg ...interface{}) *Messa sort.Strings(list) } for _, k := range list { - m.Add("append", k, kit.Format(value[k])) + if k == "key" { + m.Add("append", k, k) + } else { + m.Add("append", k, kit.Format(value[k])) + } } return m } @@ -325,6 +329,27 @@ func (m *Message) Echo(str string, arg ...interface{}) *Message { m.meta["result"] = append(m.meta["result"], fmt.Sprintf(str, arg...)) return m } +func (m *Message) Table(cbs ...interface{}) *Message { + if len(cbs) > 0 { + switch cb := cbs[0].(type) { + case func(int, map[string]string, []string): + nrow := 0 + for _, k := range m.meta["append"] { + if len(m.meta[k]) > nrow { + nrow = len(m.meta[k]) + } + } + for i := 0; i < nrow; i++ { + line := map[string]string{} + for _, k := range m.meta["append"] { + line[k] = kit.Select("", m.meta[k], i) + } + cb(i, line, m.meta["append"]) + } + } + } + return m +} func (m *Message) Option(key string, arg ...interface{}) string { return kit.Select("", kit.Simple(m.Optionv(key, arg...)), 0) }