1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00

add nfs.tail

This commit is contained in:
shaoying 2020-10-14 20:37:52 +08:00
parent cdc0ac35ff
commit 3ab519b309
3 changed files with 69 additions and 5 deletions

View File

@ -1,6 +1,8 @@
package cli
import (
"io"
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
@ -10,13 +12,20 @@ import (
)
func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
if f, p, e := kit.Create(out); m.Assert(e) {
if w, ok := m.Optionv(CMD_STDOUT).(io.Writer); ok {
cmd.Stdout = w
cmd.Stderr = w
} else if f, p, e := kit.Create(out); m.Assert(e) {
m.Log_EXPORT(kit.MDB_META, DAEMON, CMD_STDOUT, p)
m.Optionv(CMD_STDOUT, f)
cmd.Stdout = f
cmd.Stderr = f
}
if f, p, e := kit.Create(err); m.Assert(e) {
if w, ok := m.Optionv(CMD_STDERR).(io.Writer); ok {
cmd.Stderr = w
} else if f, p, e := kit.Create(err); m.Assert(e) {
m.Log_EXPORT(kit.MDB_META, DAEMON, CMD_STDERR, p)
m.Optionv(CMD_STDERR, f)
cmd.Stderr = f
}
@ -40,6 +49,12 @@ 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, Status.Stop)
}
if w, ok := m.Optionv(CMD_STDOUT).(io.Closer); ok {
w.Close()
}
if w, ok := m.Optionv(CMD_STDERR).(io.Closer); ok {
w.Close()
}
})
}
@ -68,6 +83,7 @@ func init() {
DAEMON: {Name: "daemon hash auto 添加 清理", Help: "守护进程", Action: map[string]*ice.Action{
RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(DAEMON, STOP)
m.Sleep("1s")
m.Cmd(DAEMON, START)
}},
START: {Name: "start cmd env dir", Help: "添加", Hand: func(m *ice.Message, arg ...string) {

View File

@ -286,6 +286,7 @@ const (
SAVE = "save"
COPY = "copy"
LINK = "link"
TAIL = "tail"
)
const (
DIR_ROOT = "dir_root"
@ -316,14 +317,28 @@ var Index = &ice.Context{Name: "nfs", Help: "存储模块",
),
)},
TRASH: {Name: TRASH, Help: "删除", Value: kit.Data("path", "var/trash")},
TAIL: {Name: TAIL, Help: "跟踪", Value: kit.Data()},
},
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
m.Cmd(mdb.SEARCH, mdb.CREATE, DIR)
m.Cmd(mdb.RENDER, mdb.CREATE, DIR)
m.Cmd(mdb.SEARCH, mdb.CREATE, FILE, m.Prefix(FILE))
m.Cmd(mdb.RENDER, mdb.CREATE, FILE, m.Prefix(FILE))
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()
}},
DIR: {Name: "dir path field... auto 上传", Help: "目录", Action: map[string]*ice.Action{
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
@ -385,7 +400,42 @@ var Index = &ice.Context{Name: "nfs", Help: "存储模块",
TRASH: {Name: "trash file", Help: "删除", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_file_trash(m, arg[0])
}},
TAIL: {Name: "tail hash id auto create", Help: "文件", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create file name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_HASH) == "" {
m.Cmdy(mdb.INSERT, TAIL, "", mdb.HASH, arg)
m.Option(kit.MDB_HASH, m.Result())
}
h := m.Option(kit.MDB_HASH)
for _, file := range kit.Split(m.Option(kit.MDB_FILE), ",") {
func(file string) {
r, w := io.Pipe()
m.Go(func(msg *ice.Message) {
for bio := bufio.NewScanner(r); bio.Scan(); {
m.Grow(TAIL, kit.Keys(kit.MDB_HASH, h), kit.Dict(
kit.MDB_FILE, file, kit.MDB_TEXT, bio.Text(),
))
}
})
m.Option(cli.CMD_STDOUT, w)
m.Option(cli.CMD_STDERR, w)
m.Cmd(cli.DAEMON, "tail", "-n", "0", "-f", file)
}(file)
}
}},
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))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select("time,hash,count,name,file", kit.Select("time,id,file,text", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
m.Cmdy(mdb.SELECT, TAIL, "", mdb.ZONE, arg)
m.PushAction(kit.Select("", mdb.REMOVE, len(arg) == 0))
if len(arg) == 1 {
m.Option(ice.MSG_CONTROL, "_page")
}
}},
},
}
func init() { ice.Index.Register(Index, nil, DIR, CAT, SAVE, COPY, LINK, TRASH) }
func init() { ice.Index.Register(Index, nil, DIR, CAT, SAVE, COPY, LINK, TRASH, TAIL) }

View File

@ -127,7 +127,6 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
// 用户请求
msg.Option(ice.MSG_OUTPUT, "")
msg.Option("cache.limit", "10")
msg.Option(ice.MSG_METHOD, r.Method)
msg.Option(ice.MSG_USERWEB, kit.Select(msg.Conf(SHARE, "meta.domain"), r.Header.Get("Referer")))
msg.Option(ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP))
@ -267,7 +266,6 @@ func init() {
Commands: map[string]*ice.Command{
SERVE: {Name: "serve name auto start", Help: "服务器", Action: map[string]*ice.Action{
gdb.START: {Name: "start dev= name=self proto=http host= port=9020", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Debug("what %v %v", m.Option("name"), m.Option("dev"))
if cli.NodeInfo(m, SERVER, ice.Info.HostName); m.Option(tcp.PORT) == "random" {
m.Option(tcp.PORT, m.Cmdx(tcp.PORT, aaa.Right))
}