diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index 8bf2eaab..bd3deb0c 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -28,7 +28,7 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
}
cmd.Env = append(cmd.Env, fmt.Sprintf("PATH=%s", os.Getenv("PATH")))
- if e := cmd.Start(); m.Warn(e != nil, "%v start: %s", cmd.Args, e) {
+ if e := cmd.Start(); m.Warn(e != nil, ice.ErrStart, cmd.Args, " ", e) {
return
}
@@ -42,7 +42,7 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
m.Gos(m, func(m *ice.Message) {
if e := cmd.Wait(); e != nil {
- m.Warn(e != nil, "%v wait: %s", cmd.Args, e)
+ m.Warn(e != nil, ice.ErrStart, cmd.Args, " ", e)
m.Richs(DAEMON, nil, h, func(key string, value map[string]interface{}) {
kit.Value(value, kit.MDB_STATUS, StatusError)
kit.Value(value, kit.Keys(kit.MDB_EXTRA, kit.MDB_ERROR), e)
@@ -61,28 +61,38 @@ const DAEMON = "daemon"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- DAEMON: {Name: "daemon", Help: "守护进程", Value: kit.Data()},
+ DAEMON: {Name: DAEMON, Help: "守护进程", Value: kit.Data(kit.MDB_PATH, "var/daemon")},
},
Commands: map[string]*ice.Command{
DAEMON: {Name: "daemon hash 查看:button=auto 清理:button", Help: "守护进程", Action: map[string]*ice.Action{
"delete": {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy("mdb.delete", DAEMON, "", "hash", "hash", m.Option("hash"))
+ m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) {
+ m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
+ m.Log_DELETE(DAEMON, kit.Format(value))
+ })
}},
-
"prune": {Name: "prune", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
m.Richs(DAEMON, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
- if strings.Count(m.Cmdx(SYSTEM, "ps", value["pid"]), "\n") > 1 {
- value["status"] = "start"
- return
+ if strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.MDB_PID]), "\n") == 1 {
+ m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, key), "")
+ m.Log_DELETE(DAEMON, kit.Format(value))
+ }
+ })
+ }},
+ "stop": {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
+ m.Richs(DAEMON, "", m.Option(kit.MDB_HASH), func(key string, value map[string]interface{}) {
+ m.Cmdy(SYSTEM, "kill", value[kit.MDB_PID])
+ if strings.Count(m.Cmdx(SYSTEM, "ps", value[kit.MDB_PID]), "\n") == 1 {
+ value[kit.MDB_STATUS] = StatusClose
}
- m.Conf(DAEMON, kit.Keys("hash", key), "")
})
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Option("fields", "time,hash,status,pid,name,dir")
- m.Cmdy("mdb.select", DAEMON, "", "hash")
+ m.Cmdy("mdb.select", DAEMON, "", kit.MDB_HASH)
m.Sort("time", "time_r")
+ m.PushAction("停止", "删除")
return
}
diff --git a/base/ctx/cmd.go b/base/ctx/cmd.go
index d533c38b..1ff678e2 100644
--- a/base/ctx/cmd.go
+++ b/base/ctx/cmd.go
@@ -66,7 +66,7 @@ func _command_make(m *ice.Message, cmd *ice.Command) {
cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "返回", "value", "Last")...)
button = true
default:
- kind, value := "text", ""
+ kind, value := kit.Select("text", "button", button), ""
if len(ls) == 3 {
kind, value = ls[1], ls[2]
} else if len(ls) == 2 {
diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go
index 4d73c7d9..4b96ea8e 100644
--- a/base/nfs/nfs.go
+++ b/base/nfs/nfs.go
@@ -26,6 +26,12 @@ func _file_ext(name string) string {
func _file_list(m *ice.Message, root string, name string, level int, deep bool, dir_type string, dir_reg *regexp.Regexp, fields []string) {
switch strings.Split(name, "/")[0] {
case "etc", "var":
+ if m.Option(ice.MSG_USERROLE) == "root" {
+ break
+ }
+ if m.Option(ice.MSG_USERROLE) == "tech" {
+ break
+ }
return
}
@@ -48,13 +54,14 @@ func _file_list(m *ice.Message, root string, name string, level int, deep bool,
}
p := path.Join(root, name, f.Name())
- if f, e = os.Lstat(p); e != nil {
- m.Log("info", "%s", e)
- continue
- } else if (f.Mode()&os.ModeSymlink) != 0 && f.IsDir() {
- continue
- }
-
+ // if f, e = os.Lstat(p); e != nil {
+ // m.Log("info", "%s", e)
+ // continue
+ // } else if (f.Mode()&os.ModeSymlink) != 0 && f.IsDir() {
+ // // continue
+ // } else {
+ // }
+ //
if !(dir_type == "file" && f.IsDir() || dir_type == "dir" && !f.IsDir()) && (dir_reg == nil || dir_reg.MatchString(f.Name())) {
for _, field := range fields {
switch field {
@@ -93,7 +100,15 @@ func _file_list(m *ice.Message, root string, name string, level int, deep bool,
m.Push("tree", strings.Repeat("| ", level-1)+"|-"+f.Name())
}
case "size":
- m.Push("size", kit.FmtSize(f.Size()))
+ if f.IsDir() {
+ if ls, e := ioutil.ReadDir(path.Join(root, name, f.Name())); e == nil {
+ m.Push("size", len(ls))
+ } else {
+ m.Push("size", 0)
+ }
+ } else {
+ m.Push("size", kit.FmtSize(f.Size()))
+ }
case "line":
if f.IsDir() {
if d, e := ioutil.ReadDir(p); m.Assert(e) {
diff --git a/base/web/render.go b/base/web/render.go
index f6be24da..df3f1f8b 100644
--- a/base/web/render.go
+++ b/base/web/render.go
@@ -105,6 +105,7 @@ func RenderStatus(msg *ice.Message, code int, text string) { // name path expire
var RENDER = struct {
A string
IMG string
+ Video string
Field string
Frame string
Button string
@@ -113,6 +114,7 @@ var RENDER = struct {
}{
A: "a",
IMG: "img",
+ Video: "video",
Field: "field",
Frame: "frame",
Button: "button",
@@ -132,6 +134,9 @@ func init() {
RENDER.IMG: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(`
`, arg[0], kit.Select("120", arg, 1))
}},
+ RENDER.Video: {Hand: func(m *ice.Message, arg ...string) {
+ m.Echo(`