mirror of
https://shylinux.com/x/icebergs
synced 2025-06-26 18:37:29 +08:00
opt some
This commit is contained in:
parent
cbdabc9a74
commit
9fb2e967a9
@ -224,7 +224,7 @@ func HashCreate(m *ice.Message, arg ...ice.Any) *ice.Message {
|
|||||||
args[i] = kit.Keys("extra", args[i])
|
args[i] = kit.Keys("extra", args[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return m.Cmd(INSERT, m.PrefixKey(), "", HASH, args)
|
return m.Cmdy(INSERT, m.PrefixKey(), "", HASH, args)
|
||||||
}
|
}
|
||||||
func HashRemove(m *ice.Message, arg ...ice.Any) *ice.Message {
|
func HashRemove(m *ice.Message, arg ...ice.Any) *ice.Message {
|
||||||
m.OptionFields(m.Config(FIELD))
|
m.OptionFields(m.Config(FIELD))
|
||||||
@ -278,3 +278,15 @@ func HashExport(m *ice.Message, arg ...ice.Any) *ice.Message {
|
|||||||
func HashImport(m *ice.Message, arg ...ice.Any) *ice.Message {
|
func HashImport(m *ice.Message, arg ...ice.Any) *ice.Message {
|
||||||
return m.Cmd(IMPORT, m.PrefixKey(), "", HASH, kit.Simple(arg...))
|
return m.Cmd(IMPORT, m.PrefixKey(), "", HASH, kit.Simple(arg...))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func HashCache(m *ice.Message, h string, add func() ice.Any) ice.Any {
|
||||||
|
defer m.Lock()()
|
||||||
|
|
||||||
|
if add != nil && m.Confv(m.PrefixKey(), kit.Keys(HASH, h, "_cache")) == nil {
|
||||||
|
m.Debug("add cache %s:%s", m.PrefixKey(), kit.Keys(HASH, h, "_cache"))
|
||||||
|
m.Confv(m.PrefixKey(), kit.Keys(HASH, h, "_cache"), add()) // 添加
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Debug("get cache %s:%s", m.PrefixKey(), kit.Keys(HASH, h, "_cache"))
|
||||||
|
return m.Confv(m.PrefixKey(), kit.Keys(HASH, h, "_cache")) // 读取
|
||||||
|
}
|
||||||
|
@ -24,9 +24,10 @@ func init() {
|
|||||||
aaa.USERNAME, m.Option(ice.MSG_USERNAME),
|
aaa.USERNAME, m.Option(ice.MSG_USERNAME),
|
||||||
aaa.USERNICK, m.Option(ice.MSG_USERNICK),
|
aaa.USERNICK, m.Option(ice.MSG_USERNICK),
|
||||||
)
|
)
|
||||||
m.Cmdy(GRANT, mdb.INSERT, web.SPACE, m.Option(web.SPACE),
|
|
||||||
aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
|
|
||||||
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid))
|
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid))
|
||||||
|
|
||||||
|
// m.Cmdy(GRANT, mdb.INSERT, web.SPACE, m.Option(web.SPACE),
|
||||||
|
// aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
|
||||||
// web.RenderCookie(m, sessid, web.CookieName(m.Option("back")))
|
// web.RenderCookie(m, sessid, web.CookieName(m.Option("back")))
|
||||||
// m.RenderRedirect(kit.MergeURL(m.Option("back")))
|
// m.RenderRedirect(kit.MergeURL(m.Option("back")))
|
||||||
}},
|
}},
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
pty "shylinux.com/x/creackpty"
|
pty "shylinux.com/x/creackpty"
|
||||||
@ -17,28 +16,28 @@ import (
|
|||||||
kit "shylinux.com/x/toolkits"
|
kit "shylinux.com/x/toolkits"
|
||||||
)
|
)
|
||||||
|
|
||||||
const XTERM = "xterm"
|
func _xterm_socket(m *ice.Message, h, t string) {
|
||||||
|
defer m.RLock()()
|
||||||
func init() {
|
m.Option(ice.MSG_DAEMON, m.Conf("", kit.Keys(mdb.HASH, h, mdb.META, mdb.TEXT)))
|
||||||
cache := sync.Map{}
|
m.Option(mdb.TEXT, t)
|
||||||
add := func(m *ice.Message, key string) string {
|
}
|
||||||
|
func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
|
||||||
|
f, _ = mdb.HashCache(m, h, func() ice.Any {
|
||||||
|
if !must {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
cmd := exec.Command(cli.SystemFind(m, kit.Select("sh", m.Option(mdb.TYPE))))
|
cmd := exec.Command(cli.SystemFind(m, kit.Select("sh", m.Option(mdb.TYPE))))
|
||||||
cmd.Env = append(os.Environ(), "TERM=xterm")
|
cmd.Env = append(os.Environ(), "TERM=xterm")
|
||||||
|
m.Option(mdb.HASH, h)
|
||||||
|
|
||||||
tty, err := pty.Start(cmd)
|
tty, err := pty.Start(cmd)
|
||||||
m.Assert(err)
|
m.Assert(err)
|
||||||
cache.Store(key, tty)
|
|
||||||
|
|
||||||
m.Go(func() {
|
m.Go(func() {
|
||||||
defer m.Cmd(m.PrefixKey(), mdb.PRUNES)
|
|
||||||
defer cache.Delete(key)
|
|
||||||
|
|
||||||
buf := make([]byte, ice.MOD_BUFS)
|
buf := make([]byte, ice.MOD_BUFS)
|
||||||
for {
|
for {
|
||||||
if n, e := tty.Read(buf); !m.Warn(e) {
|
if n, e := tty.Read(buf); !m.Warn(e) {
|
||||||
m.Option(mdb.HASH, key)
|
_xterm_socket(m, h, base64.StdEncoding.EncodeToString(buf[:n]))
|
||||||
m.Option(mdb.TEXT, base64.StdEncoding.EncodeToString(buf[:n]))
|
|
||||||
m.Option(ice.MSG_DAEMON, m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, key, mdb.META, mdb.TEXT)))
|
|
||||||
m.PushNoticeGrow("data")
|
m.PushNoticeGrow("data")
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
@ -46,23 +45,14 @@ func init() {
|
|||||||
}
|
}
|
||||||
m.PushNoticeGrow("exit")
|
m.PushNoticeGrow("exit")
|
||||||
})
|
})
|
||||||
return key
|
return tty
|
||||||
}
|
}).(*os.File)
|
||||||
get := func(m *ice.Message, key string) *os.File {
|
return
|
||||||
if w, ok := cache.Load(key); ok {
|
|
||||||
if w, ok := w.(*os.File); ok {
|
|
||||||
return w
|
|
||||||
}
|
|
||||||
}
|
|
||||||
add(m, key)
|
|
||||||
if w, ok := cache.Load(key); ok {
|
|
||||||
if w, ok := w.(*os.File); ok {
|
|
||||||
return w
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const XTERM = "xterm"
|
||||||
|
|
||||||
|
func init() {
|
||||||
Index.MergeCommands(ice.Commands{
|
Index.MergeCommands(ice.Commands{
|
||||||
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{
|
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{
|
||||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||||
@ -77,16 +67,12 @@ func init() {
|
|||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
mdb.CREATE: {Name: "create type name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
mdb.CREATE: {Name: "create type name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||||
if m.Option(mdb.TEXT, m.Option(ice.MSG_DAEMON)) != "" {
|
mdb.HashCreate(m, arg, mdb.TEXT, m.Option(ice.MSG_DAEMON))
|
||||||
m.Echo(add(m, mdb.HashCreate(m, arg, m.OptionSimple(mdb.TEXT)).Result()))
|
_xterm_get(m, m.Result(), true)
|
||||||
}
|
|
||||||
}},
|
}},
|
||||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||||
if w, ok := cache.Load(m.Option(mdb.HASH)); ok {
|
if f := _xterm_get(m, m.Option(mdb.HASH), false); f != nil {
|
||||||
if w, ok := w.(*os.File); ok {
|
f.Close()
|
||||||
w.Close()
|
|
||||||
}
|
|
||||||
cache.Delete(m.Option(mdb.HASH))
|
|
||||||
}
|
}
|
||||||
mdb.HashRemove(m, m.OptionSimple(mdb.HASH))
|
mdb.HashRemove(m, m.OptionSimple(mdb.HASH))
|
||||||
}},
|
}},
|
||||||
@ -95,25 +81,29 @@ func init() {
|
|||||||
}},
|
}},
|
||||||
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||||
mdb.HashSelect(m).Tables(func(value ice.Maps) {
|
mdb.HashSelect(m).Tables(func(value ice.Maps) {
|
||||||
if _, ok := cache.Load(value[mdb.HASH]); !ok || kit.Time(m.Time())-kit.Time(value[mdb.TIME]) > int64(time.Hour) {
|
if f := _xterm_get(m, value[mdb.HASH], false); f != nil {
|
||||||
m.Cmd(m.PrefixKey(), mdb.REMOVE, kit.Dict(value))
|
if kit.Time(m.Time())-kit.Time(value[mdb.TIME]) < int64(time.Hour) {
|
||||||
|
return // 有效终端
|
||||||
}
|
}
|
||||||
|
f.Close()
|
||||||
|
}
|
||||||
|
m.Cmd("", mdb.REMOVE, kit.Dict(value))
|
||||||
})
|
})
|
||||||
}},
|
}},
|
||||||
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
|
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
|
||||||
pty.Setsize(get(m, m.Option(mdb.HASH)), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
|
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
|
||||||
}},
|
}},
|
||||||
"rename": {Name: "rename", Help: "重命名", Hand: func(m *ice.Message, arg ...string) {
|
"rename": {Name: "rename", Help: "重命名", Hand: func(m *ice.Message, arg ...string) {
|
||||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
|
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
|
||||||
}},
|
}},
|
||||||
"select": {Name: "select", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
|
"select": {Name: "select", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
|
||||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.TEXT, m.Option(ice.MSG_DAEMON))
|
mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.TEXT, m.Option(ice.MSG_DAEMON))
|
||||||
m.Cmd(m.PrefixKey(), "input", arg)
|
m.Cmd("", "input", arg)
|
||||||
}},
|
}},
|
||||||
"input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) {
|
"input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) {
|
||||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.TIME, m.Time())
|
mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.TIME, m.Time())
|
||||||
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); m.Assert(e) {
|
if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); m.Assert(e) {
|
||||||
get(m, m.Option(mdb.HASH)).Write(b)
|
_xterm_get(m, m.Option(mdb.HASH), true).Write(b)
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,extra"), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,extra"), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||||
|
9
lock.go
9
lock.go
@ -9,7 +9,10 @@ import (
|
|||||||
var lock = map[string]*sync.RWMutex{}
|
var lock = map[string]*sync.RWMutex{}
|
||||||
var _lock = sync.Mutex{}
|
var _lock = sync.Mutex{}
|
||||||
|
|
||||||
func _get_lock(key string) (*sync.RWMutex, string) {
|
func (m *Message) _lock(key string) (*sync.RWMutex, string) {
|
||||||
|
if key == "" {
|
||||||
|
key = m.PrefixKey()
|
||||||
|
}
|
||||||
_lock.Lock()
|
_lock.Lock()
|
||||||
defer _lock.Unlock()
|
defer _lock.Unlock()
|
||||||
|
|
||||||
@ -21,7 +24,7 @@ func _get_lock(key string) (*sync.RWMutex, string) {
|
|||||||
return l, key
|
return l, key
|
||||||
}
|
}
|
||||||
func (m *Message) Lock(arg ...Any) func() {
|
func (m *Message) Lock(arg ...Any) func() {
|
||||||
l, key := _get_lock(kit.Keys(arg...))
|
l, key := m._lock(kit.Keys(arg...))
|
||||||
m.Debug("before lock %v", key)
|
m.Debug("before lock %v", key)
|
||||||
l.Lock()
|
l.Lock()
|
||||||
m.Debug("success lock %v", key)
|
m.Debug("success lock %v", key)
|
||||||
@ -31,7 +34,7 @@ func (m *Message) Lock(arg ...Any) func() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (m *Message) RLock(arg ...Any) func() {
|
func (m *Message) RLock(arg ...Any) func() {
|
||||||
l, key := _get_lock(kit.Keys(arg...))
|
l, key := m._lock(kit.Keys(arg...))
|
||||||
m.Debug("before rlock %v", key)
|
m.Debug("before rlock %v", key)
|
||||||
l.RLock()
|
l.RLock()
|
||||||
m.Debug("success rlock %v", key)
|
m.Debug("success rlock %v", key)
|
||||||
|
3
misc.go
3
misc.go
@ -209,6 +209,9 @@ func (m *Message) _command(arg ...Any) *Message {
|
|||||||
if len(list) == 0 {
|
if len(list) == 0 {
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
if list[0] == "" {
|
||||||
|
list[0] = m.PrefixKey()
|
||||||
|
}
|
||||||
|
|
||||||
ok := false
|
ok := false
|
||||||
run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) {
|
run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) {
|
||||||
|
3
type.go
3
type.go
@ -528,6 +528,9 @@ func (m *Message) Confv(arg ...Any) (val Any) { // key sub val
|
|||||||
}
|
}
|
||||||
|
|
||||||
key := kit.Format(arg[0])
|
key := kit.Format(arg[0])
|
||||||
|
if key == "" {
|
||||||
|
key = m.PrefixKey()
|
||||||
|
}
|
||||||
if conf, ok := m.target.Configs[key]; ok {
|
if conf, ok := m.target.Configs[key]; ok {
|
||||||
run(conf)
|
run(conf)
|
||||||
} else if conf, ok := m.source.Configs[key]; ok {
|
} else if conf, ok := m.source.Configs[key]; ok {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user