From 5a1f38e7d9e2a87362c0a2334537e6e6d108eb1b Mon Sep 17 00:00:00 2001 From: shylinux Date: Mon, 29 May 2023 14:45:45 +0800 Subject: [PATCH] add some --- base/cli/daemon.go | 11 +++++-- base/mdb/hash.go | 4 ++- base/nfs/nfs.go | 2 +- base/nfs/tar.go | 42 ++++++++------------------ base/nfs/zip.go | 72 ++++++++++++++++++++++++++++++++++++++++++++ base/web/spide.go | 2 +- core/code/install.go | 6 ++-- 7 files changed, 100 insertions(+), 39 deletions(-) create mode 100644 base/nfs/zip.go diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 32c61f89..b746a058 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -1,6 +1,7 @@ package cli import ( + "bytes" "io" "os/exec" "runtime" @@ -18,6 +19,8 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) { if r, ok := m.Optionv(CMD_INPUT).(io.Reader); ok { cmd.Stdin = r } + err := bytes.NewBuffer(make([]byte, 0, ice.MOD_BUFS)) + cmd.Stderr = err if w := _system_out(m, CMD_OUTPUT); w != nil { cmd.Stdout, cmd.Stderr = w, w } @@ -28,18 +31,20 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) { ice.CMD, kit.Join(cmd.Args, lex.SP), DIR, cmd.Dir, ENV, kit.Select("", cmd.Env), m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ONEXIT), ) - if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) { + if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args, err.String()) { + m.Debug("what %v", e) mdb.HashModify(m, h, STATUS, ERROR, ERROR, e) return } mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid }) m.Echo("%d", cmd.Process.Pid) m.Go(func() { - if e := cmd.Wait(); !m.Warn(e, ice.ErrNotStart, cmd.Args) && cmd.ProcessState != nil && cmd.ProcessState.Success() { + if e := cmd.Wait(); !m.Warn(e, ice.ErrNotStart, cmd.Args, err.String()) && cmd.ProcessState != nil && cmd.ProcessState.Success() { mdb.HashModify(m, mdb.HASH, h, STATUS, STOP) m.Cost(CODE, "0", ctx.ARGS, cmd.Args) } else { - mdb.HashSelectUpdate(m, h, func(value ice.Map) { kit.If(value[STATUS] == START, func() { value[STATUS], value[ERROR] = ERROR, e }) }) + mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[STATUS], value[ERROR] = ERROR, e }) + m.Debug("what %v", e) } switch status := mdb.HashSelectField(m.Sleep300ms(), h, STATUS); cb := m.OptionCB("").(type) { case func(string) bool: diff --git a/base/mdb/hash.go b/base/mdb/hash.go index c556318b..28558822 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -172,7 +172,9 @@ func HashKey(m *ice.Message) string { func HashShort(m *ice.Message) string { return kit.Select(HASH, Config(m, SHORT), Config(m, SHORT) != UNIQ) } -func HashField(m *ice.Message) string { return kit.Select(HASH_FIELD, Config(m, FIELD)) } +func HashField(m *ice.Message) string { + return kit.Select(HASH_FIELD, Config(m, FIELD), Config(m, FIELDS)) +} func HashInputs(m *ice.Message, arg ...Any) *ice.Message { return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, arg) } diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index e036fc10..0dcc4731 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -10,6 +10,6 @@ const NFS = "nfs" var Index = &ice.Context{Name: NFS, Help: "存储模块"} func init() { - ice.Index.Register(Index, nil, TAR, CAT, DIR, PACK, DEFS, SAVE, PUSH, COPY, LINK, GREP, TRASH) + ice.Index.Register(Index, nil, ZIP, TAR, CAT, DIR, PACK, DEFS, SAVE, PUSH, COPY, LINK, GREP, TRASH) } func Prefix(arg ...string) string { return kit.Keys(NFS, arg) } diff --git a/base/nfs/tar.go b/base/nfs/tar.go index ee3b03f8..a560e9ad 100644 --- a/base/nfs/tar.go +++ b/base/nfs/tar.go @@ -2,7 +2,6 @@ package nfs import ( "archive/tar" - "archive/zip" "compress/gzip" "io" "os" @@ -14,23 +13,12 @@ import ( kit "shylinux.com/x/toolkits" ) -func _zip_list(m *ice.Message, p string, cb func(zip.FileHeader, io.Reader, int)) { - if f, e := zip.OpenReader(p); m.Warn(e, ice.ErrNotValid, p) { - return - } else { - defer f.Close() - for i, f := range f.File { - if r, e := f.Open(); e == nil { - defer r.Close() - cb(f.FileHeader, r, i) - } - } - } -} func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) { Open(m, p, func(r io.Reader) { for { switch kit.Ext(p) { + case "tgz": + p = kit.Keys(kit.TrimExt(p, kit.Ext(p)), TAR, GZ) case GZ: if f, e := gzip.NewReader(r); m.Warn(e, ice.ErrNotValid, p) { return @@ -61,8 +49,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) { } const ( - GZ = "gz" - ZIP = "zip" + GZ = "gz" ) const TAR = "tar" @@ -72,23 +59,11 @@ func init() { mdb.NEXT: {Hand: func(m *ice.Message, arg ...string) { mdb.PrevPage(m, arg[0], kit.Slice(arg, 1)...) }}, mdb.PREV: {Hand: func(m *ice.Message, arg ...string) { mdb.NextPageLimit(m, arg[0], kit.Slice(arg, 1)...) }}, mdb.EXPORT: {Hand: func(m *ice.Message, arg ...string) { - list, size := kit.Dict(), 0 if kit.Ext(m.Option(PATH)) == ZIP { - _zip_list(m, m.Option(PATH), func(h zip.FileHeader, r io.Reader, i int) { - p := path.Join(path.Dir(m.Option(PATH)), kit.Split(path.Base(m.Option(PATH)), "-.")[0], h.Name) - if strings.HasSuffix(h.Name, PS) { - MkdirAll(m, p) - return - } - kit.IfNoKey(list, path.Dir(p), func(p string) { MkdirAll(m, p) }) - Create(m, p, func(w io.Writer) { - os.Chmod(p, os.FileMode(h.Mode())) - Copy(m, w, r, func(n int) { size += n }) - kit.If(m.Option(FILE), func() { m.Cmdy(DIR, p).Cmdy(CAT, p) }) - }) - }) + m.Cmdy(ZIP, mdb.EXPORT, arg) return } + list, size := kit.Dict(), 0 _tar_list(m, m.Option(PATH), func(h *tar.Header, r io.Reader, i int) { if h.Name == m.Option(FILE) || m.Option(FILE) == "" { p := path.Join(path.Dir(m.Option(PATH)), h.Name) @@ -110,6 +85,13 @@ func init() { m.Cmdy(DIR, arg) return } + defer func() { + m.Debug("waht %v", m.FormatMeta()) + }() + if kit.Ext(arg[0]) == ZIP { + m.Cmdy(ZIP, arg) + return + } page, size := mdb.OptionPages(m, kit.Slice(arg, 2)...) _tar_list(m, arg[0], func(h *tar.Header, r io.Reader, i int) { if len(kit.Slice(arg, 0, 2)) > 1 { diff --git a/base/nfs/zip.go b/base/nfs/zip.go new file mode 100644 index 00000000..6b73a706 --- /dev/null +++ b/base/nfs/zip.go @@ -0,0 +1,72 @@ +package nfs + +import ( + "archive/zip" + "io" + "os" + "path" + "strings" + + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/mdb" + kit "shylinux.com/x/toolkits" +) + +func _zip_list(m *ice.Message, p string, cb func(zip.FileHeader, io.Reader, int)) { + if f, e := zip.OpenReader(p); m.Warn(e, ice.ErrNotValid, p) { + return + } else { + defer f.Close() + for i, f := range f.File { + if r, e := f.Open(); e == nil { + defer r.Close() + cb(f.FileHeader, r, i) + } + } + } +} + +const ZIP = "zip" + +func init() { + Index.MergeCommands(ice.Commands{ + ZIP: {Name: "zip path file auto page", Help: "打包", Actions: ice.MergeActions(ice.Actions{ + mdb.NEXT: {Hand: func(m *ice.Message, arg ...string) { mdb.PrevPage(m, arg[0], kit.Slice(arg, 1)...) }}, + mdb.PREV: {Hand: func(m *ice.Message, arg ...string) { mdb.NextPageLimit(m, arg[0], kit.Slice(arg, 1)...) }}, + mdb.EXPORT: {Hand: func(m *ice.Message, arg ...string) { + list, size := kit.Dict(), 0 + _zip_list(m, m.Option(PATH), func(h zip.FileHeader, r io.Reader, i int) { + p := path.Join(path.Dir(m.Option(PATH)), kit.Split(path.Base(m.Option(PATH)), "_-.")[0], h.Name) + if strings.HasSuffix(h.Name, PS) { + MkdirAll(m, p) + return + } + kit.IfNoKey(list, path.Dir(p), func(p string) { MkdirAll(m, p) }) + Create(m, p, func(w io.Writer) { + os.Chmod(p, os.FileMode(h.Mode())) + Copy(m, w, r, func(n int) { size += n }) + kit.If(m.Option(FILE), func() { m.Cmdy(DIR, p).Cmdy(CAT, p) }) + }) + }) + }}, + }, mdb.PageListAction()), Hand: func(m *ice.Message, arg ...string) { + if len(arg) == 0 || strings.HasSuffix(arg[0], PS) { + m.Cmdy(DIR, arg) + return + } + page, size := mdb.OptionPages(m, kit.Slice(arg, 2)...) + _zip_list(m, arg[0], func(h zip.FileHeader, r io.Reader, i int) { + if len(kit.Slice(arg, 0, 2)) > 1 { + if h.Name != arg[1] { + return + } + m.Echo(string(ReadAll(m, r)[:])) + } + if i >= (page-1)*size && i < page*size { + m.Push(mdb.TIME, h.ModTime().Format(ice.MOD_TIME)).Push(FILE, h.Name).Push(SIZE, kit.FmtSize(int64(h.UncompressedSize))) + } + }) + m.PushAction(mdb.EXPORT) + }}, + }) +} diff --git a/base/web/spide.go b/base/web/spide.go index be55609a..c6bf8df4 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -53,7 +53,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) { return } defer res.Body.Close() - m.Cost(cli.STATUS, res.Status, nfs.SIZE, res.Header.Get(ContentLength), mdb.TYPE, res.Header.Get(ContentType)) + m.Cost(cli.STATUS, res.Status, nfs.SIZE, kit.FmtSize(kit.Int64(res.Header.Get(ContentLength))), mdb.TYPE, res.Header.Get(ContentType)) kit.For(res.Header, func(k string, v []string) { m.Logs("response", k, v) }) mdb.HashSelectUpdate(m, name, func(value ice.Map) { kit.For(res.Cookies(), func(v *http.Cookie) { diff --git a/core/code/install.go b/core/code/install.go index a3d3ab9e..c2204b7a 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -116,7 +116,7 @@ func _install_start(m *ice.Message, arg ...string) { m.ErrorNotImplement(cb) return } - m.Cmdy(cli.DAEMON, kit.Select(path.Join(ice.BIN, kit.Split(path.Base(arg[0]), "-.")[0]), arg, 1), kit.Slice(arg, 2), args) + m.Cmdy(cli.DAEMON, kit.Select(path.Join(ice.BIN, path.Base(_install_path(m, ""))), arg, 1), kit.Slice(arg, 2), args) } func _install_stop(m *ice.Message, arg ...string) { m.Cmd(cli.DAEMON, func(value ice.Maps) { @@ -138,10 +138,10 @@ func _install_trash(m *ice.Message, arg ...string) { } } func _install_service(m *ice.Message, arg ...string) { - arg = kit.Split(path.Base(arg[0]), "_-.")[:1] + name := kit.Split(path.Base(arg[0]), "_-.")[0] m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir") m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH, func(value ice.Maps) { - if strings.Contains(value[ice.CMD], path.Join(ice.BIN, arg[0])) { + if strings.Contains(value[ice.CMD], path.Join(ice.BIN, name)) { switch m.Push("", value, kit.Split(m.OptionFields())); value[mdb.STATUS] { case cli.START: m.PushButton(gdb.DEBUG, cli.STOP)