mirror of
https://shylinux.com/x/icebergs
synced 2025-06-26 10:27:31 +08:00
add some
This commit is contained in:
parent
0cc064db96
commit
5a1f38e7d9
@ -1,6 +1,7 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -18,6 +19,8 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
|
|||||||
if r, ok := m.Optionv(CMD_INPUT).(io.Reader); ok {
|
if r, ok := m.Optionv(CMD_INPUT).(io.Reader); ok {
|
||||||
cmd.Stdin = r
|
cmd.Stdin = r
|
||||||
}
|
}
|
||||||
|
err := bytes.NewBuffer(make([]byte, 0, ice.MOD_BUFS))
|
||||||
|
cmd.Stderr = err
|
||||||
if w := _system_out(m, CMD_OUTPUT); w != nil {
|
if w := _system_out(m, CMD_OUTPUT); w != nil {
|
||||||
cmd.Stdout, cmd.Stderr = w, w
|
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),
|
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),
|
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)
|
mdb.HashModify(m, h, STATUS, ERROR, ERROR, e)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid })
|
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value[PID] = cmd.Process.Pid })
|
||||||
m.Echo("%d", cmd.Process.Pid)
|
m.Echo("%d", cmd.Process.Pid)
|
||||||
m.Go(func() {
|
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)
|
mdb.HashModify(m, mdb.HASH, h, STATUS, STOP)
|
||||||
m.Cost(CODE, "0", ctx.ARGS, cmd.Args)
|
m.Cost(CODE, "0", ctx.ARGS, cmd.Args)
|
||||||
} else {
|
} 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) {
|
switch status := mdb.HashSelectField(m.Sleep300ms(), h, STATUS); cb := m.OptionCB("").(type) {
|
||||||
case func(string) bool:
|
case func(string) bool:
|
||||||
|
@ -172,7 +172,9 @@ func HashKey(m *ice.Message) string {
|
|||||||
func HashShort(m *ice.Message) string {
|
func HashShort(m *ice.Message) string {
|
||||||
return kit.Select(HASH, Config(m, SHORT), Config(m, SHORT) != UNIQ)
|
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 {
|
func HashInputs(m *ice.Message, arg ...Any) *ice.Message {
|
||||||
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, arg)
|
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, arg)
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,6 @@ const NFS = "nfs"
|
|||||||
var Index = &ice.Context{Name: NFS, Help: "存储模块"}
|
var Index = &ice.Context{Name: NFS, Help: "存储模块"}
|
||||||
|
|
||||||
func init() {
|
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) }
|
func Prefix(arg ...string) string { return kit.Keys(NFS, arg) }
|
||||||
|
@ -2,7 +2,6 @@ package nfs
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"archive/zip"
|
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
@ -14,23 +13,12 @@ import (
|
|||||||
kit "shylinux.com/x/toolkits"
|
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)) {
|
func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) {
|
||||||
Open(m, p, func(r io.Reader) {
|
Open(m, p, func(r io.Reader) {
|
||||||
for {
|
for {
|
||||||
switch kit.Ext(p) {
|
switch kit.Ext(p) {
|
||||||
|
case "tgz":
|
||||||
|
p = kit.Keys(kit.TrimExt(p, kit.Ext(p)), TAR, GZ)
|
||||||
case GZ:
|
case GZ:
|
||||||
if f, e := gzip.NewReader(r); m.Warn(e, ice.ErrNotValid, p) {
|
if f, e := gzip.NewReader(r); m.Warn(e, ice.ErrNotValid, p) {
|
||||||
return
|
return
|
||||||
@ -61,8 +49,7 @@ func _tar_list(m *ice.Message, p string, cb func(*tar.Header, io.Reader, int)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
GZ = "gz"
|
GZ = "gz"
|
||||||
ZIP = "zip"
|
|
||||||
)
|
)
|
||||||
const TAR = "tar"
|
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.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.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) {
|
mdb.EXPORT: {Hand: func(m *ice.Message, arg ...string) {
|
||||||
list, size := kit.Dict(), 0
|
|
||||||
if kit.Ext(m.Option(PATH)) == ZIP {
|
if kit.Ext(m.Option(PATH)) == ZIP {
|
||||||
_zip_list(m, m.Option(PATH), func(h zip.FileHeader, r io.Reader, i int) {
|
m.Cmdy(ZIP, mdb.EXPORT, arg)
|
||||||
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) })
|
|
||||||
})
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
list, size := kit.Dict(), 0
|
||||||
_tar_list(m, m.Option(PATH), func(h *tar.Header, r io.Reader, i int) {
|
_tar_list(m, m.Option(PATH), func(h *tar.Header, r io.Reader, i int) {
|
||||||
if h.Name == m.Option(FILE) || m.Option(FILE) == "" {
|
if h.Name == m.Option(FILE) || m.Option(FILE) == "" {
|
||||||
p := path.Join(path.Dir(m.Option(PATH)), h.Name)
|
p := path.Join(path.Dir(m.Option(PATH)), h.Name)
|
||||||
@ -110,6 +85,13 @@ func init() {
|
|||||||
m.Cmdy(DIR, arg)
|
m.Cmdy(DIR, arg)
|
||||||
return
|
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)...)
|
page, size := mdb.OptionPages(m, kit.Slice(arg, 2)...)
|
||||||
_tar_list(m, arg[0], func(h *tar.Header, r io.Reader, i int) {
|
_tar_list(m, arg[0], func(h *tar.Header, r io.Reader, i int) {
|
||||||
if len(kit.Slice(arg, 0, 2)) > 1 {
|
if len(kit.Slice(arg, 0, 2)) > 1 {
|
||||||
|
72
base/nfs/zip.go
Normal file
72
base/nfs/zip.go
Normal 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)
|
||||||
|
}},
|
||||||
|
})
|
||||||
|
}
|
@ -53,7 +53,7 @@ func _spide_show(m *ice.Message, name string, arg ...string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer res.Body.Close()
|
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) })
|
kit.For(res.Header, func(k string, v []string) { m.Logs("response", k, v) })
|
||||||
mdb.HashSelectUpdate(m, name, func(value ice.Map) {
|
mdb.HashSelectUpdate(m, name, func(value ice.Map) {
|
||||||
kit.For(res.Cookies(), func(v *http.Cookie) {
|
kit.For(res.Cookies(), func(v *http.Cookie) {
|
||||||
|
@ -116,7 +116,7 @@ func _install_start(m *ice.Message, arg ...string) {
|
|||||||
m.ErrorNotImplement(cb)
|
m.ErrorNotImplement(cb)
|
||||||
return
|
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) {
|
func _install_stop(m *ice.Message, arg ...string) {
|
||||||
m.Cmd(cli.DAEMON, func(value ice.Maps) {
|
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) {
|
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.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir")
|
||||||
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH, func(value ice.Maps) {
|
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] {
|
switch m.Push("", value, kit.Split(m.OptionFields())); value[mdb.STATUS] {
|
||||||
case cli.START:
|
case cli.START:
|
||||||
m.PushButton(gdb.DEBUG, cli.STOP)
|
m.PushButton(gdb.DEBUG, cli.STOP)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user