1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shaoying 2019-07-16 23:40:24 +08:00
parent 9d3eafbc70
commit 436c230b5f
6 changed files with 385 additions and 349 deletions

View File

@ -225,6 +225,10 @@ func main() {
"template_tar_gz": "usr/template",
"librarys_tar_gz": "usr/librarys",
},
"script": map[string]interface{}{
"worker": "usr/publish/hello/local.shy",
"server": "usr/publish/docker/local.shy",
},
}, Help: "版本发布"},
"upgrade": &ctx.Config{Name: "upgrade", Value: map[string]interface{}{
"system": []interface{}{"boot.sh", "node.sh", "init.shy", "common.shy", "exit.shy"},
@ -601,51 +605,256 @@ func main() {
}
return
}},
"plugin": &ctx.Command{Name: "plugin [action] file", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
suffix, action, target := "go", "build", path.Join(m.Conf("runtime", "boot.ctx_home"), "src/examples/app/bench.go")
"source": &ctx.Command{Name: "source [script|stdio|snippet]", Help: "解析脚本, script: 脚本文件, stdio: 命令终端, snippet: 代码片段", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if len(arg) == 0 {
arg = append(arg, target)
}
if cs := strings.Split(arg[0], "."); len(cs) > 1 {
suffix = cs[len(cs)-1]
} else if cs := strings.Split(arg[1], "."); len(cs) > 1 {
suffix, action, arg = cs[len(cs)-1], arg[0], arg[1:]
m.Cmdy("dir", "", "dir_deep", "dir_reg", ".*\\.(sh|shy|py)$")
return
}
if target = m.Cmdx("nfs.path", arg[0]); target == "" {
target = m.Cmdx("nfs.path", path.Join("src/plugin/", arg[0]))
}
for suffix != "" && action != "" {
m.Log("info", "%v %v %v", suffix, action, target)
cook := m.Confv("plugin", suffix)
next := strings.Replace(target, "."+suffix, "."+kit.Chains(cook, "next.0"), -1)
args := []string{}
if suffix == "so" {
if p, e := plugin.Open(target); m.Assert(e) {
s, e := p.Lookup("Index")
m.Assert(e)
w := *(s.(**ctx.Context))
w.Name = kit.Select(w.Name, arg, 1)
c.Register(w, nil)
m.Spawn(w).Cmd("_init", arg[1:])
}
} else {
if suffix == "go" {
args = append(args, "-o", next)
}
m.Assert(m.Cmd("cli.system", kit.Chain(cook, action), args, target))
// 解析脚本文件
if p := m.Cmdx("nfs.path", arg[0]); p != "" && strings.Contains(p, ".") {
arg[0] = p
switch path.Ext(p) {
case "":
case ".shy":
m.Option("scan_end", "false")
m.Start(fmt.Sprintf("shell%d", m.Capi("nshell", 1)), "shell", arg...)
m.Wait()
default:
m.Cmdy("system", m.Conf("system", []string{"script", strings.TrimPrefix(path.Ext(p), ".")}), arg)
}
m.Append("directory", "")
return
}
suffix = kit.Chains(cook, "next.0")
action = kit.Chains(cook, "next.1")
target = next
// 解析终端命令
if arg[0] == "stdio" {
m.Option("scan_end", "false")
m.Start("shy", "shell", "stdio", "engine")
m.Wait()
return
}
text := strings.Join(arg, " ")
if !strings.HasPrefix(text, "sess") && m.Options("remote") {
text = m.Current(text)
}
// 解析代码片段
m.Sess("yac").Call(func(msg *ctx.Message) *ctx.Message {
switch msg.Cmd().Detail(0) {
case "cmd":
m.Set("append").Copy(msg, "append")
m.Set("result").Copy(msg, "result")
}
return nil
}, "parse", "line", "void", text)
return
}},
"sleep": &ctx.Command{Name: "sleep time", Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if d, e := time.ParseDuration(arg[0]); m.Assert(e) {
m.Log("info", "sleep %v", d)
time.Sleep(d)
m.Log("info", "sleep %v done", d)
}
return
}},
"timer": &ctx.Command{Name: "timer [begin time] [repeat] [order time] time cmd", Help: "定时任务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if cli, ok := c.Server.(*CLI); m.Assert(ok) {
// 定时列表
if len(arg) == 0 {
m.Confm("timer", func(key string, timer map[string]interface{}) {
m.Add("append", "key", key)
m.Add("append", "action_time", time.Unix(0, timer["action_time"].(int64)/int64(m.Confi("time_unit"))*1000000000).Format(m.Conf("time_format")))
m.Add("append", "order", timer["order"])
m.Add("append", "time", timer["time"])
m.Add("append", "cmd", timer["cmd"])
m.Add("append", "msg", timer["msg"])
m.Add("append", "results", kit.Format(timer["result"]))
})
m.Table()
return
}
switch arg[0] {
case "stop":
if timer := m.Confm("timer", arg[1]); timer != nil {
timer["stop"] = true
}
cli.schedule(m)
return
case "start":
if timer := m.Confm("timer", arg[1]); timer != nil {
timer["stop"] = false
}
cli.schedule(m)
return
case "delete":
delete(m.Confm("timer"), arg[1])
cli.schedule(m)
return
}
now := m.Sess("cli").Cmd("time").Appendi("timestamp")
begin := now
if len(arg) > 0 && arg[0] == "begin" {
begin, arg = int64(m.Sess("cli").Cmd("time", arg[1]).Appendi("timestamp")), arg[2:]
}
repeat := false
if len(arg) > 0 && arg[0] == "repeat" {
repeat, arg = true, arg[1:]
}
order := ""
if len(arg) > 0 && arg[0] == "order" {
order, arg = arg[1], arg[2:]
}
action := int64(m.Sess("cli").Cmd("time", begin, order, arg[0]).Appendi("timestamp"))
// 创建任务
hash := m.Sess("aaa").Cmd("hash", "timer", arg, "time", "rand").Result(0)
m.Confv("timer", hash, map[string]interface{}{
"create_time": now,
"begin_time": begin,
"action_time": action,
"repeat": repeat,
"order": order,
"done": false,
"stop": false,
"time": arg[0],
"cmd": arg[1:],
"msg": 0,
"result": "",
})
if cli.Timer == nil { // 创建时间队列
cli.Timer = time.NewTimer((time.Duration)((action - now) / int64(m.Confi("time_unit")) * 1000000000))
m.GoLoop(m, func(m *ctx.Message) {
select {
case <-cli.Timer.C:
if m.Conf("timer_next") == "" {
break
}
if timer := m.Confm("timer", m.Conf("timer_next")); timer != nil && !kit.Right(timer["stop"]) {
m.Log("info", "timer %s %v", m.Conf("timer_next"), timer["cmd"])
msg := m.Sess("cli").Cmd("source", timer["cmd"])
timer["result"] = msg.Meta["result"]
timer["msg"] = msg.Code()
if timer["repeat"].(bool) {
timer["action_time"] = int64(m.Sess("cli").Cmd("time", msg.Time(), timer["order"], timer["time"]).Appendi("timestamp"))
} else {
timer["done"] = true
}
}
cli.schedule(m)
}
})
}
// 调度任务
cli.schedule(m)
m.Echo(hash)
}
return
}},
"time": &ctx.Command{Name: "time when [begin|end|yestoday|tommorow|monday|sunday|first|last|new|eve] [offset]",
Help: "查看时间, when: 输入的时间戳, 剩余参数是时间偏移",
Form: map[string]int{"time_format": 1, "time_close": 1},
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
t, stamp := time.Now(), true
if len(arg) > 0 {
if i, e := strconv.ParseInt(arg[0], 10, 64); e == nil {
t, stamp, arg = time.Unix(int64(i/int64(m.Confi("time_unit"))), 0), false, arg[1:]
} else if n, e := time.ParseInLocation(m.Confx("time_format"), arg[0], time.Local); e == nil {
t, arg = n, arg[1:]
} else {
for _, v := range []string{"01-02", "2006-01-02", "15:04:05", "15:04"} {
if n, e := time.ParseInLocation(v, arg[0], time.Local); e == nil {
t, arg = n, arg[1:]
break
}
}
}
}
if len(arg) > 0 {
switch arg[0] {
case "begin":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(-d), arg[1:]
case "end":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds%dns", t.Hour(), t.Minute(), t.Second(), t.Nanosecond()))
m.Assert(e)
t, arg = t.Add(time.Duration(24*time.Hour)-d), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "yestoday":
t, arg = t.Add(-time.Duration(24*time.Hour)), arg[1:]
case "tomorrow":
t, arg = t.Add(time.Duration(24*time.Hour)), arg[1:]
case "monday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(-d), arg[1:]
case "sunday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(time.Duration(7*24*time.Hour)-d), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "first":
t, arg = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local), arg[1:]
case "last":
month, year := t.Month()+1, t.Year()
if month >= 13 {
month, year = 1, year+1
}
t, arg = time.Date(year, month, 1, 0, 0, 0, 0, time.Local), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "new":
t, arg = time.Date(t.Year(), 1, 1, 0, 0, 0, 0, time.Local), arg[1:]
case "eve":
t, arg = time.Date(t.Year()+1, 1, 1, 0, 0, 0, 0, time.Local), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "":
arg = arg[1:]
}
}
if len(arg) > 0 {
if d, e := time.ParseDuration(arg[0]); e == nil {
t, arg = t.Add(d), arg[1:]
}
}
m.Append("datetime", t.Format(m.Confx("time_format")))
m.Append("timestamp", t.Unix()*int64(m.Confi("time_unit")))
if stamp {
m.Echo("%d", t.Unix()*int64(m.Confi("time_unit")))
} else {
m.Echo(t.Format(m.Confx("time_format")))
}
return
}},
"proc": &ctx.Command{Name: "proc", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
m.Cmdy("cli.system", "cmd_parse", "cut", "ps", kit.Select("ax", arg, 0))
if len(arg) > 0 {
m.Cmd("select", "reg", "COMMAND", arg[1])
}
return
}},
"quit": &ctx.Command{Name: "quit code", Help: "停止服务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
@ -790,7 +999,7 @@ func main() {
if m.Cmdy("cli.system", env, "go", "build", o, "-o", q, p); m.Result(0) == "" {
m.Append("time", m.Time())
m.Append("hash", kit.Hashs(q)[:8])
m.Append("hash", kit.Hashs(q)[:8])
m.Append("bin", q)
m.Table()
}
@ -816,9 +1025,9 @@ func main() {
m.Confm("project", "plugin.list", func(index int, value map[string]interface{}) {
m.Cmd("nfs.copy", path.Join(q, kit.Format(value["name"])), path.Join(p, kit.Format(value["name"])))
})
for _, v := range arg[1:] {
m.Cmd("nfs.copy", path.Join(q, v), path.Join(p, v))
}
for _, v := range arg[1:] {
m.Cmd("nfs.copy", path.Join(q, v), path.Join(p, v))
}
m.Cmdy("nfs.dir", q, "time", "size", "hashs", "path")
return e
}
@ -834,9 +1043,10 @@ func main() {
} else {
m.Cmd("nfs.copy", q, p)
}
m.Add("append", "time", m.Time())
m.Add("append", "time", s.ModTime())
m.Add("append", "size", s.Size())
m.Add("append", "hash", kit.Hashs(p)[:8])
m.Add("append", "file", q)
m.Add("append", "hash", kit.Hashs(p))
}
}
m.Table()
@ -858,7 +1068,7 @@ func main() {
case "script":
if len(arg) == 1 {
m.Cmdy("nfs.dir", m.Conf("project", "script.path"), "time", "size", "line", "hash", "path")
m.Cmdy("nfs.dir", m.Conf("project", "script.path"), "time", "line", "hashs", "path")
break
}
miss := ""
@ -982,6 +1192,49 @@ func main() {
return
}},
"plugin": &ctx.Command{Name: "plugin [action] file", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
suffix, action, target := "go", "build", path.Join(m.Conf("runtime", "boot.ctx_home"), "src/examples/app/bench.go")
if len(arg) == 0 {
arg = append(arg, target)
}
if cs := strings.Split(arg[0], "."); len(cs) > 1 {
suffix = cs[len(cs)-1]
} else if cs := strings.Split(arg[1], "."); len(cs) > 1 {
suffix, action, arg = cs[len(cs)-1], arg[0], arg[1:]
}
if target = m.Cmdx("nfs.path", arg[0]); target == "" {
target = m.Cmdx("nfs.path", path.Join("src/plugin/", arg[0]))
}
for suffix != "" && action != "" {
m.Log("info", "%v %v %v", suffix, action, target)
cook := m.Confv("plugin", suffix)
next := strings.Replace(target, "."+suffix, "."+kit.Chains(cook, "next.0"), -1)
args := []string{}
if suffix == "so" {
if p, e := plugin.Open(target); m.Assert(e) {
s, e := p.Lookup("Index")
m.Assert(e)
w := *(s.(**ctx.Context))
w.Name = kit.Select(w.Name, arg, 1)
c.Register(w, nil)
m.Spawn(w).Cmd("_init", arg[1:])
}
} else {
if suffix == "go" {
args = append(args, "-o", next)
}
m.Assert(m.Cmd("cli.system", kit.Chain(cook, action), args, target))
}
suffix = kit.Chains(cook, "next.0")
action = kit.Chains(cook, "next.1")
target = next
}
return
}},
"version": &ctx.Command{Name: "version", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if len(arg) == 0 {
types := reflect.TypeOf(version)
@ -1010,251 +1263,6 @@ var version = struct {
m.Append("directory", "")
return
}},
"source": &ctx.Command{Name: "source [script|stdio|snippet]", Help: "解析脚本, script: 脚本文件, stdio: 命令终端, snippet: 代码片段", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if len(arg) == 0 {
m.Cmdy("dir", "", "dir_deep", "dir_reg", ".*\\.(sh|shy|py)$")
return
}
// 解析脚本文件
if p := m.Cmdx("nfs.path", arg[0]); p != "" && strings.Contains(p, ".") {
arg[0] = p
switch path.Ext(p) {
case "":
case ".shy":
m.Option("scan_end", "false")
m.Start(fmt.Sprintf("shell%d", m.Capi("nshell", 1)), "shell", arg...)
m.Wait()
default:
m.Cmdy("system", m.Conf("system", []string{"script", strings.TrimPrefix(path.Ext(p), ".")}), arg)
}
m.Append("directory", "")
return
}
// 解析终端命令
if arg[0] == "stdio" {
m.Option("scan_end", "false")
m.Start("shy", "shell", "stdio", "engine")
m.Wait()
return
}
text := strings.Join(arg, " ")
if !strings.HasPrefix(text, "sess") && m.Options("remote") {
text = m.Current(text)
}
// 解析代码片段
m.Sess("yac").Call(func(msg *ctx.Message) *ctx.Message {
switch msg.Cmd().Detail(0) {
case "cmd":
m.Set("append").Copy(msg, "append")
m.Set("result").Copy(msg, "result")
}
return nil
}, "parse", "line", "void", text)
return
}},
"timer": &ctx.Command{Name: "timer [begin time] [repeat] [order time] time cmd", Help: "定时任务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if cli, ok := c.Server.(*CLI); m.Assert(ok) {
// 定时列表
if len(arg) == 0 {
m.Confm("timer", func(key string, timer map[string]interface{}) {
m.Add("append", "key", key)
m.Add("append", "action_time", time.Unix(0, timer["action_time"].(int64)/int64(m.Confi("time_unit"))*1000000000).Format(m.Conf("time_format")))
m.Add("append", "order", timer["order"])
m.Add("append", "time", timer["time"])
m.Add("append", "cmd", timer["cmd"])
m.Add("append", "msg", timer["msg"])
m.Add("append", "results", kit.Format(timer["result"]))
})
m.Table()
return
}
switch arg[0] {
case "stop":
if timer := m.Confm("timer", arg[1]); timer != nil {
timer["stop"] = true
}
cli.schedule(m)
return
case "start":
if timer := m.Confm("timer", arg[1]); timer != nil {
timer["stop"] = false
}
cli.schedule(m)
return
case "delete":
delete(m.Confm("timer"), arg[1])
cli.schedule(m)
return
}
now := m.Sess("cli").Cmd("time").Appendi("timestamp")
begin := now
if len(arg) > 0 && arg[0] == "begin" {
begin, arg = int64(m.Sess("cli").Cmd("time", arg[1]).Appendi("timestamp")), arg[2:]
}
repeat := false
if len(arg) > 0 && arg[0] == "repeat" {
repeat, arg = true, arg[1:]
}
order := ""
if len(arg) > 0 && arg[0] == "order" {
order, arg = arg[1], arg[2:]
}
action := int64(m.Sess("cli").Cmd("time", begin, order, arg[0]).Appendi("timestamp"))
// 创建任务
hash := m.Sess("aaa").Cmd("hash", "timer", arg, "time", "rand").Result(0)
m.Confv("timer", hash, map[string]interface{}{
"create_time": now,
"begin_time": begin,
"action_time": action,
"repeat": repeat,
"order": order,
"done": false,
"stop": false,
"time": arg[0],
"cmd": arg[1:],
"msg": 0,
"result": "",
})
if cli.Timer == nil { // 创建时间队列
cli.Timer = time.NewTimer((time.Duration)((action - now) / int64(m.Confi("time_unit")) * 1000000000))
m.GoLoop(m, func(m *ctx.Message) {
select {
case <-cli.Timer.C:
if m.Conf("timer_next") == "" {
break
}
if timer := m.Confm("timer", m.Conf("timer_next")); timer != nil && !kit.Right(timer["stop"]) {
m.Log("info", "timer %s %v", m.Conf("timer_next"), timer["cmd"])
msg := m.Sess("cli").Cmd("source", timer["cmd"])
timer["result"] = msg.Meta["result"]
timer["msg"] = msg.Code()
if timer["repeat"].(bool) {
timer["action_time"] = int64(m.Sess("cli").Cmd("time", msg.Time(), timer["order"], timer["time"]).Appendi("timestamp"))
} else {
timer["done"] = true
}
}
cli.schedule(m)
}
})
}
// 调度任务
cli.schedule(m)
m.Echo(hash)
}
return
}},
"sleep": &ctx.Command{Name: "sleep time", Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if d, e := time.ParseDuration(arg[0]); m.Assert(e) {
m.Log("info", "sleep %v", d)
time.Sleep(d)
m.Log("info", "sleep %v done", d)
}
return
}},
"time": &ctx.Command{Name: "time when [begin|end|yestoday|tommorow|monday|sunday|first|last|new|eve] [offset]",
Help: "查看时间, when: 输入的时间戳, 剩余参数是时间偏移",
Form: map[string]int{"time_format": 1, "time_close": 1},
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
t, stamp := time.Now(), true
if len(arg) > 0 {
if i, e := strconv.ParseInt(arg[0], 10, 64); e == nil {
t, stamp, arg = time.Unix(int64(i/int64(m.Confi("time_unit"))), 0), false, arg[1:]
} else if n, e := time.ParseInLocation(m.Confx("time_format"), arg[0], time.Local); e == nil {
t, arg = n, arg[1:]
} else {
for _, v := range []string{"01-02", "2006-01-02", "15:04:05", "15:04"} {
if n, e := time.ParseInLocation(v, arg[0], time.Local); e == nil {
t, arg = n, arg[1:]
break
}
}
}
}
if len(arg) > 0 {
switch arg[0] {
case "begin":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(-d), arg[1:]
case "end":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds%dns", t.Hour(), t.Minute(), t.Second(), t.Nanosecond()))
m.Assert(e)
t, arg = t.Add(time.Duration(24*time.Hour)-d), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "yestoday":
t, arg = t.Add(-time.Duration(24*time.Hour)), arg[1:]
case "tomorrow":
t, arg = t.Add(time.Duration(24*time.Hour)), arg[1:]
case "monday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(-d), arg[1:]
case "sunday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t, arg = t.Add(time.Duration(7*24*time.Hour)-d), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "first":
t, arg = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local), arg[1:]
case "last":
month, year := t.Month()+1, t.Year()
if month >= 13 {
month, year = 1, year+1
}
t, arg = time.Date(year, month, 1, 0, 0, 0, 0, time.Local), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "new":
t, arg = time.Date(t.Year(), 1, 1, 0, 0, 0, 0, time.Local), arg[1:]
case "eve":
t, arg = time.Date(t.Year()+1, 1, 1, 0, 0, 0, 0, time.Local), arg[1:]
if m.Confx("time_close") == "close" {
t = t.Add(-time.Second)
}
case "":
arg = arg[1:]
}
}
if len(arg) > 0 {
if d, e := time.ParseDuration(arg[0]); e == nil {
t, arg = t.Add(d), arg[1:]
}
}
m.Append("datetime", t.Format(m.Confx("time_format")))
m.Append("timestamp", t.Unix()*int64(m.Confi("time_unit")))
if stamp {
m.Echo("%d", t.Unix()*int64(m.Confi("time_unit")))
} else {
m.Echo(t.Format(m.Confx("time_format")))
}
return
}},
"notice": &ctx.Command{Name: "notice", Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
m.Cmd("cli.system", "osascript", "-e", fmt.Sprintf("display notification \"%s\"", kit.Select("", arg, 0)))
return

View File

@ -4,5 +4,5 @@ var version = struct {
host string
self int
}{
"2019-07-16 10:50:22", "ZYB-20190522USI.ubuntu", 177,
"2019-07-16 19:44:54", "ZYB-20190522USI", 171,
}

View File

@ -3,6 +3,7 @@ package ctx
import (
"encoding/json"
"fmt"
"regexp"
"strconv"
"strings"
@ -1185,8 +1186,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
}
return
}},
"select": &Command{Name: "select key value field",
Form: map[string]int{"eq": 2, "expand": 2, "hide": -1, "fields": -1, "group": 1, "order": 2, "limit": 1, "offset": 1, "format": -1, "trans_map": -1, "vertical": 0},
"select": &Command{Name: "select field...",
Form: map[string]int{"reg": 2, "eq": 2, "expand": 2, "hide": -1, "fields": -1, "group": 1, "order": 2, "limit": 1, "offset": 1, "format": -1, "trans_map": -1, "vertical": 0},
Help: "选取数据", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) {
msg := m.Set("result").Spawn()
@ -1263,6 +1264,11 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
continue
}
}
if m.Has("reg") {
if b, e := regexp.MatchString(m.Meta["reg"][1], m.Meta[m.Meta["reg"][0]][i]); e != nil || !b {
continue
}
}
for _, k := range arg {
if hides[k] {
continue

View File

@ -133,11 +133,11 @@ func dir(m *ctx.Message, name string, level int, deep bool, dir_type string, tri
m.Assert(e)
h := sha1.Sum(f)
if field == "hash" {
m.Add("append", "hash", hex.EncodeToString(h[:]))
} else {
m.Add("append", "hash", hex.EncodeToString(h[:4]))
}
if field == "hash" {
m.Add("append", "hash", hex.EncodeToString(h[:]))
} else {
m.Add("append", "hash", hex.EncodeToString(h[:4]))
}
}
}
}
@ -1282,7 +1282,7 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
strings.Split(m.Confx("dir_fields", strings.Join(arg[1:], " ")), " "),
m.Conf("time_format"))
} else {
if s.Size() < 100 {
if s.Size() < int64(m.Confi("buf_size")) {
p0 := p + ".tmp0"
f, e := os.Open(p0)
if e != nil {
@ -1405,6 +1405,7 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
return
}},
"grep": &ctx.Command{Name: "grep", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
hold := false
if len(arg) > 0 {
switch arg[0] {
case "add":
@ -1421,6 +1422,7 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
}
})
return
case "tail":
m.Confm("grep", "list", func(index int, value map[string]interface{}) {
if len(arg) == 1 {
@ -1429,6 +1431,9 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
}
})
return
case "hold":
hold, arg = true, arg[1:]
}
}
@ -1450,6 +1455,7 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
m.Assert(e)
n := 0
offset := kit.Int(value["offset"])
bio := bufio.NewScanner(f)
for i := 0; i < m.Optioni("page.limit") && bio.Scan(); i++ {
text := bio.Text()
@ -1459,16 +1465,19 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
// m.Add("append", "pos",begin+int64(n))
// m.Add("append", "len",len(text))
// m.Add("append", "end",s.Size())
m.Add("append", "line", kit.Int(value["offset"]))
m.Add("append", "line", offset)
m.Add("append", "text", text)
} else {
i--
}
n += len(text) + 1
value["offset"] = kit.Int(value["offset"]) + 1
offset += 1
}
value["pos"] = begin + int64(n)
if !hold {
value["offset"] = offset
value["pos"] = begin + int64(n)
}
})
m.Table()
return

View File

@ -70,11 +70,11 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
map[string]interface{}{"componet_name": "script", "componet_help": "脚本",
"componet_tmpl": "componet", "componet_view": "Compile", "componet_init": "",
"componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route",
"componet_args": []interface{}{"$$", "context", "cli", "upgrade"}, "inputs": []interface{}{
"componet_args": []interface{}{"$$", "context", "cli", "upgrade", "script"}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "pod", "imports": "plugin_pod"},
map[string]interface{}{"type": "select", "name": "action", "values": []interface{}{"script", "portal", "system", "bench"}},
map[string]interface{}{"type": "text", "name": "action", "view": "long"},
map[string]interface{}{"type": "button", "value": "升级"},
map[string]interface{}{"type": "text", "name": "you", "imports": "plugin_you", "view": "long"},
map[string]interface{}{"type": "text", "name": "txt", "view": "long", "value": "test.php"},
map[string]interface{}{"type": "button", "value": "上传"},
},
"display": map[string]interface{}{"show_result": true},
},
@ -92,7 +92,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route",
"componet_args": []interface{}{"$$", "context", "nfs", "grep"}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "pod", "value": "", "imports": "plugin_pod"},
map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{"", "tail", "head"}},
map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{"", "hold", "tail", "head"}},
map[string]interface{}{"type": "button", "value": "执行"},
},
},
@ -134,13 +134,14 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
map[string]interface{}{"type": "text", "name": "who"},
map[string]interface{}{"type": "button", "value": "执行"},
},
"exports": []interface{}{"see", "filename", "see"},
},
map[string]interface{}{"componet_name": "compile", "componet_help": "编译",
"componet_tmpl": "componet", "componet_view": "componet", "componet_init": "",
"componet_type": "private", "componet_ctx": "cli", "componet_cmd": "compile",
"componet_args": []interface{}{}, "inputs": []interface{}{
map[string]interface{}{"type": "select", "name": "cmd", "values": []interface{}{"plugin", "windows", "darwin", "linux", "self", "all"}},
map[string]interface{}{"type": "text", "name": "who"},
map[string]interface{}{"type": "text", "name": "who", "imports": "plugin_see"},
map[string]interface{}{"type": "button", "value": "编译"},
},
},
@ -148,7 +149,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"componet_tmpl": "componet", "componet_view": "componet", "componet_init": "",
"componet_type": "private", "componet_ctx": "cli", "componet_cmd": "publish",
"componet_args": []interface{}{}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "who"},
map[string]interface{}{"type": "text", "name": "who", "imports": "plugin_see"},
map[string]interface{}{"type": "button", "value": "发布"},
},
},
@ -283,7 +284,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route",
"componet_args": []interface{}{"$$", "context", "nfs", "dir", "$$", "time", "size", "line", "path"}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "pod", "imports": []interface{}{"plugin_you", "plugin_pod"}},
map[string]interface{}{"type": "text", "name": "dir", "value": "", "view": "long", "imports": "plugin_dir", "action": "auto"},
map[string]interface{}{"type": "text", "name": "dir", "value": "usr/script", "view": "long", "imports": "plugin_dir", "action": "auto"},
map[string]interface{}{"type": "button", "value": "查看", "action": "auto"},
map[string]interface{}{"type": "button", "value": "回退", "click": "Back"},
},
@ -350,6 +351,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"componet_type": "private", "componet_ctx": "ssh", "componet_cmd": "_route",
"componet_args": []interface{}{"$$", "context", "cli", "proc"}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "pod", "value": "", "imports": "plugin_pod"},
map[string]interface{}{"type": "text", "name": "cmd", "value": ""},
map[string]interface{}{"type": "text", "name": "cmd", "view": "long"},
map[string]interface{}{"type": "button", "value": "执行"},
},
@ -387,7 +389,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Add("append", "pod", key)
m.Add("append", "type", value["type"])
})
m.Sort("key").Table()
m.Sort("pod").Table()
return
}
@ -557,10 +559,10 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Add("append", "help", value["componet_help"])
m.Add("append", "view", value["componet_view"])
if kit.Right(value["componet_init"]) {
script := m.Cmdx("nfs.load", path.Join(m.Conf("cli.publish", "path"), arg[0], kit.Format(value["componet_init"])), -1)
if script == "" {
script = m.Cmdx("nfs.load", path.Join("usr/librarys/plugin", kit.Format(value["componet_init"])), -1)
}
script := m.Cmdx("nfs.load", path.Join(m.Conf("cli.publish", "path"), arg[0], kit.Format(value["componet_init"])), -1)
if script == "" {
script = m.Cmdx("nfs.load", path.Join("usr/librarys/plugin", kit.Format(value["componet_init"])), -1)
}
m.Add("append", "init", script)
} else {
m.Add("append", "init", "")
@ -649,6 +651,8 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
} else if node.Appends("user.route") && !m.Confs("runtime", "user.route") {
m.Cmd("ssh.user", "create", node.Append("user.route"))
}
m.Log("info", "script %v", m.Append("work.script"))
m.Cmd("nfs.save", "etc/temp.shy", m.Append("work.script"))
// 工作路由
if node.Appends("work.route") && !m.Confs("runtime", "work.route") {
@ -676,6 +680,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Append("node.route", m.Conf("runtime", "node.route"))
m.Append("user.route", m.Conf("runtime", "user.route"))
m.Append("work.route", m.Conf("runtime", "work.route"))
m.Append("work.script", m.Cmdx("nfs.load", path.Join(m.Conf("cli.publish", "script."+arg[2]))))
m.Echo(name).Back(m)
default:

View File

@ -554,7 +554,7 @@ function Pane(page, field) {
return typeof value == "object"? {className: value[0], select: [value.slice(1), function(value, event) {
value = event.target.value
typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value)
}]}: value == ""? {view: ["space"]} :value == "br"? {type: "br"}: {button: [value, function(event) {
}]}: value == ""? {view: ["space"]} :value == "br"? {type: "br"}: {button: [value, function(value, event) {
typeof pane.Action == "function"? pane.Action(value, event): pane.Action[value](event, value)
}]}
})).className="action "+name)
@ -754,41 +754,6 @@ function Plugin(page, pane, field) {
},
ondaemon: {
editor: function(msg, cb) {
output.innerHTML = ""
!display.hide_append && msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), ctx.Table(msg), msg.append), exports[1], function(event, value, name, line) {
page.Sync("plugin_"+exports[0]).set(plugin.onexport[exports[2]||""](value, name, line))
});
var args = [option.pod.value, option.dir.value]
if (msg.file) {
var action = kit.AppendAction(kit.AppendChild(output, [{view: ["action"]}]).last, [
"追加", "提交", "取消",
], function(value, event) {
switch (value) {
case "追加":
field.Run(event, args.concat(["dir_sed", "add"]))
break
case "提交":
field.Run(event, args.concat(["dir_sed", "put"]))
break
case "取消":
break
}
})
kit.AppendChild(output, [{view: ["edit", "table"], list: msg.result.map(function(value, index) {
return {view: ["line", "tr"], list: [{view: ["num", "td", index+1]}, {view: ["txt", "td"], list: [{value: value, input: [value, function(event) {
if (event.key == "Enter") {
field.Run(event, args.concat(["dir_sed", "set", index, event.target.value]))
}
}]}]}]}
})}])
}
typeof cb == "function" && cb(msg)
},
table: function(msg, cb) {
output.innerHTML = ""
!display.hide_append && msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), ctx.Table(msg), msg.append), exports[1], function(event, value, name, line) {
@ -797,6 +762,12 @@ function Plugin(page, pane, field) {
(display.show_result || !msg.append) && msg.result && kit.OrderCode(kit.AppendChild(output, [{view: ["code", "div", msg.Results()]}]).first)
typeof cb == "function" && cb(msg)
},
editor: function(msg, cb) {
(output.innerHTML = "", Editor(plugin, option, output, output.clientWidth-40, 400, 10, msg))
},
canvas: function(msg, cb) {
typeof cb == "function" && !cb(msg) || (output.innerHTML = "", Canvas(plugin, option, output, output.clientWidth-40, 400, 10, msg))
},
trend: function(msg, cb) {
typeof cb == "function" && !cb(msg) || (output.innerHTML = "", Canvas(plugin, output, output.clientWidth-40, 400, 10, msg))
},
@ -830,6 +801,9 @@ function Plugin(page, pane, field) {
"": function(value, name) {
return value
},
see: function(value, name, line) {
return value.split("/")[0]
},
you: function(value, name, line) {
window.event.Plugin = plugin
line.you && name == "status" && (line.status == "start"? function() {
@ -883,7 +857,40 @@ function Plugin(page, pane, field) {
plugin.init(page, pane, field, option, output)
return page[field.id] = pane[field.id] = plugin.Field = field, field.Plugin = plugin
}
function Canvas(plugin, output, width, height, space, msg) {
function Editor(plugin, option, output, width, height, space, msg) {
exports = ["dir", "path", "dir"]
msg.append && kit.OrderTable(kit.AppendTable(kit.AppendChild(output, "table"), ctx.Table(msg), msg.append), exports[1], function(event, value, name, line) {
page.Sync("plugin_"+exports[0]).set(plugin.onexport[exports[2]||""](value, name, line))
});
var args = [option.pod.value, option.dir.value]
if (msg.file) {
var action = kit.AppendAction(kit.AppendChild(output, [{view: ["action"]}]).last, [
"追加", "提交", "取消",
], function(value, event) {
switch (value) {
case "追加":
field.Run(event, args.concat(["dir_sed", "add"]))
break
case "提交":
field.Run(event, args.concat(["dir_sed", "put"]))
break
case "取消":
break
}
})
kit.AppendChild(output, [{view: ["edit", "table"], list: msg.result.map(function(value, index) {
return {view: ["line", "tr"], list: [{view: ["num", "td", index+1]}, {view: ["txt", "td"], list: [{value: value, style: {width: width+"px"}, input: [value, function(event) {
if (event.key == "Enter") {
field.Run(event, args.concat(["dir_sed", "set", index, event.target.value]))
}
}]}]}]}
})}])
}
}
function Canvas(plugin, option, output, width, height, space, msg) {
var keys = [], data = {}, max = {}, nline = 0
var nrow = msg[msg.append[0]].length
var step = width / (nrow - 1)
@ -1603,3 +1610,4 @@ function Canvas(plugin, output, width, height, space, msg) {
return what.reset().refresh()
}