1
0
mirror of https://shylinux.com/x/icebergs synced 2025-06-26 10:27:31 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-05-29 14:45:45 +08:00
parent 0cc064db96
commit 5a1f38e7d9
7 changed files with 100 additions and 39 deletions

View File

@ -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:

View File

@ -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)
}

View File

@ -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) }

View File

@ -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 {

72
base/nfs/zip.go Normal file
View File

@ -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)
}},
})
}

View File

@ -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) {

View File

@ -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)