diff --git a/base/web/space.go b/base/web/space.go index 8dcd566d..af9ca6a8 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -59,7 +59,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { } }) ls := strings.Split(host, ":") - msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, ls[1]) + msg.Cmd(tcp.CLIENT, tcp.DIAL, kit.MDB_TYPE, "wss", kit.MDB_NAME, dev, tcp.HOST, ls[0], tcp.PORT, kit.Select("443", ls, 1)) // 断线重连 sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond diff --git a/core/code/install.go b/core/code/install.go index 6c8b0db4..43313382 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -16,6 +16,21 @@ import ( kit "github.com/shylinux/toolkits" ) +type Buffer struct { + data []byte + m *ice.Message + n string +} + +func (b *Buffer) Write(buf []byte) (int, error) { + b.data = append(b.data, buf...) + b.m.Cmd(web.SPACE, b.n, "grow", string(buf)) + return len(buf), nil +} +func (b *Buffer) Close() error { + return nil +} + const PREPARE = "prepare" const INSTALL = "install" @@ -31,66 +46,65 @@ func init() { web.DOWNLOAD: {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) { link := m.Option(kit.MDB_LINK) name := path.Base(link) - p := path.Join(m.Conf(INSTALL, kit.META_PATH), name) + file := path.Join(m.Conf(INSTALL, kit.META_PATH), name) - m.Option(ice.MSG_PROCESS, ice.PROCESS_PROGRESS) - m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD)) - if m.Cmd(mdb.SELECT, INSTALL, "", mdb.HASH, kit.MDB_NAME, name).Table(func(index int, value map[string]string, head []string) { - if _, e := os.Stat(p); e == nil { - m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) - } - }); len(m.Appendv(kit.MDB_NAME)) > 0 { - return // 已经下载 + defer m.Cmdy(nfs.DIR, file) + if _, e := os.Stat(file); e == nil { + return // 文件存在 } - // 占位 - m.Cmd(nfs.SAVE, p, "") + // 文件占位 + m.Cmd(nfs.SAVE, file, "") - // 进度 - m.Cmd(mdb.INSERT, INSTALL, "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, link) - m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { - value = kit.GetMeta(value) - m.Optionv(web.DOWNLOAD_CB, func(size int, total int) { - s := size * 100 / total - if s != kit.Int(value[kit.SSH_STEP]) && s%10 == 0 { - m.Log_IMPORT(kit.MDB_FILE, name, kit.SSH_STEP, s, kit.MDB_SIZE, kit.FmtSize(int64(size)), kit.MDB_TOTAL, kit.FmtSize(int64(total))) - } - value[kit.SSH_STEP], value[kit.MDB_SIZE], value[kit.MDB_TOTAL] = s, size, total + m.GoToast("download", func(toast func(string, int, int)) { + // 进度 + m.Cmd(mdb.INSERT, INSTALL, "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, link) + m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) + + p := 0 + m.Optionv(web.DOWNLOAD_CB, func(size int, total int) { + if n := size * 100 / total; p != n { + value[kit.SSH_STEP], value[kit.MDB_SIZE], value[kit.MDB_TOTAL] = n, size, total + toast(name, size, total) + p = n + } + }) }) - }) - // 下载 - m.Go(func() { + // 下载 os.MkdirAll(m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH)), ice.MOD_DIR) msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, link) - m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE)) + // 解压 + m.Cmdy(nfs.LINK, file, msg.Append(kit.MDB_FILE)) m.Cmd(cli.SYSTEM, "tar", "xvf", name) }) }}, gdb.BUILD: {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) { - cli.Follow(m, gdb.BUILD, func() { - defer m.Cmdy(cli.OUTPUT, mdb.MODIFY, kit.MDB_STATUS, cli.Status.Stop) - defer m.Option(kit.MDB_HASH, m.Option("cache.hash")) - p := m.Option(cli.CMD_DIR, path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(m.Option(kit.MDB_LINK)))) - pp := kit.Path(path.Join(p, "_install")) - switch cb := m.Optionv("prepare").(type) { - case func(string): - cb(p) - default: - if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+pp, arg[1:]); m.Append(cli.CMD_CODE) != "0" { - return - } - } + m.Option(cli.CMD_OUTPUT, &Buffer{m: m, n: m.Option(ice.MSG_DAEMON)}) + defer func() { + m.Toast("success", "build") + m.ProcessHold() + }() - if m.Cmdy(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" { + p := m.Option(cli.CMD_DIR, path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(m.Option(kit.MDB_LINK)))) + pp := kit.Path(path.Join(p, "_install")) + switch cb := m.Optionv("prepare").(type) { + case func(string): + cb(p) + default: + if m.Cmd(cli.SYSTEM, "./configure", "--prefix="+pp, arg[1:]).Append(cli.CMD_CODE) != "0" { return } + } - m.Cmdy(cli.SYSTEM, "make", "PREFIX="+pp, "install") + if m.Cmd(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" { + return + } - }) + m.Cmd(cli.SYSTEM, "make", "PREFIX="+pp, "install") }}, gdb.SPAWN: {Name: "spawn link", Help: "新建", Hand: func(m *ice.Message, arg ...string) { port := m.Cmdx(tcp.PORT, aaa.RIGHT) diff --git a/misc.go b/misc.go index 517f53bd..d3b2046d 100644 --- a/misc.go +++ b/misc.go @@ -276,11 +276,11 @@ func (m *Message) Toast(content string, arg ...interface{}) { } m.Cmd("web.space", m.Option("_daemon"), "toast", "", content, arg) } -func (m *Message) GoToast(title string, cb func(func(string, int, int))) { +func (m *Message) GoToast(title string, cb func(toast func(string, int, int))) { m.Go(func() { cb(func(name string, count, total int) { m.Toast( - kit.Format("%s %d/%d", name, count, total), + kit.Format("%s %s/%s", name, strings.TrimSuffix(kit.FmtSize(int64(count)), "B"), strings.TrimSuffix(kit.FmtSize(int64(total)), "B")), kit.Format("%s %d%%", title, count*100/total), kit.Select("1000", "10000", count < total), count*100/total, diff --git a/misc/bash/bash.go b/misc/bash/bash.go index e8932fd7..2d5d2a9b 100644 --- a/misc/bash/bash.go +++ b/misc/bash/bash.go @@ -1,13 +1,13 @@ package bash import ( + "path" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/gdb" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" - - "path" ) const BASH = "bash" @@ -15,7 +15,7 @@ const BASH = "bash" var Index = &ice.Context{Name: BASH, Help: "命令行", Configs: map[string]*ice.Config{ BASH: {Name: BASH, Help: "命令行", Value: kit.Data( - "source", "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", + kit.SSH_SOURCE, "http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz", )}, }, Commands: map[string]*ice.Command{