mirror of
https://shylinux.com/x/icebergs
synced 2025-05-03 12:07:00 +08:00
opt ssh/connect.go
This commit is contained in:
parent
e1bb4568d9
commit
aad9c09e96
@ -143,6 +143,7 @@ const (
|
|||||||
FIND = "find"
|
FIND = "find"
|
||||||
GREP = "grep"
|
GREP = "grep"
|
||||||
EXEC = "exec"
|
EXEC = "exec"
|
||||||
|
EXIT = "exit"
|
||||||
ECHO = "echo"
|
ECHO = "echo"
|
||||||
REST = "rest"
|
REST = "rest"
|
||||||
OPENS = "opens"
|
OPENS = "opens"
|
||||||
|
@ -231,6 +231,13 @@ func HashSelect(m *ice.Message, arg ...string) *ice.Message {
|
|||||||
if m.PushAction(Config(m, ACTION), REMOVE); !m.FieldsIsDetail() {
|
if m.PushAction(Config(m, ACTION), REMOVE); !m.FieldsIsDetail() {
|
||||||
return m.Action(CREATE, PRUNES)
|
return m.Action(CREATE, PRUNES)
|
||||||
}
|
}
|
||||||
|
if m.FieldsIsDetail() {
|
||||||
|
m.Table(func(value ice.Maps) {
|
||||||
|
m.SetAppend().OptionFields(ice.FIELDS_DETAIL)
|
||||||
|
kit.For(kit.Split(HashField(m)), func(key string) { m.Push(key, value[key]); delete(value, key) })
|
||||||
|
kit.For(kit.SortedKey(value), func(k string) { m.Push(k, value[k]) })
|
||||||
|
})
|
||||||
|
}
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
func HashPrunes(m *ice.Message, cb func(Map) bool) *ice.Message {
|
func HashPrunes(m *ice.Message, cb func(Map) bool) *ice.Message {
|
||||||
|
@ -2,6 +2,7 @@ package tcp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
ice "shylinux.com/x/icebergs"
|
ice "shylinux.com/x/icebergs"
|
||||||
"shylinux.com/x/icebergs/base/mdb"
|
"shylinux.com/x/icebergs/base/mdb"
|
||||||
@ -29,7 +30,7 @@ func (c *Conn) Write(b []byte) (int, error) {
|
|||||||
func (c *Conn) Close() error { return c.Conn.Close() }
|
func (c *Conn) Close() error { return c.Conn.Close() }
|
||||||
|
|
||||||
func _client_dial(m *ice.Message, arg ...string) {
|
func _client_dial(m *ice.Message, arg ...string) {
|
||||||
c, e := net.Dial(TCP, m.Option(HOST)+nfs.DF+m.Option(PORT))
|
c, e := net.DialTimeout(TCP, m.Option(HOST)+nfs.DF+m.Option(PORT), 3*time.Second)
|
||||||
c = &Conn{Conn: c, m: m, s: &Stat{}}
|
c = &Conn{Conn: c, m: m, s: &Stat{}}
|
||||||
defer kit.If(e == nil, func() { c.Close() })
|
defer kit.If(e == nil, func() { c.Close() })
|
||||||
switch cb := m.OptionCB("").(type) {
|
switch cb := m.OptionCB("").(type) {
|
||||||
|
@ -7,9 +7,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
H1 = "h1"
|
H1 = "h1"
|
||||||
H2 = "h2"
|
H2 = "h2"
|
||||||
H3 = "h3"
|
H3 = "h3"
|
||||||
|
SPAN = "span"
|
||||||
|
|
||||||
|
STYLE = "style"
|
||||||
|
WIDTH = "width"
|
||||||
|
HEIGHT = "height"
|
||||||
|
|
||||||
|
BACKGROUND_COLOR = "background-color"
|
||||||
|
|
||||||
|
COLOR = "color"
|
||||||
)
|
)
|
||||||
const (
|
const (
|
||||||
DARK = "dark"
|
DARK = "dark"
|
||||||
@ -30,11 +39,6 @@ const (
|
|||||||
LAYOUT = "layout"
|
LAYOUT = "layout"
|
||||||
RESIZE = "resize"
|
RESIZE = "resize"
|
||||||
FILTER = "filter"
|
FILTER = "filter"
|
||||||
HEIGHT = "height"
|
|
||||||
WIDTH = "width"
|
|
||||||
|
|
||||||
COLOR = "color"
|
|
||||||
BACKGROUND_COLOR = "background-color"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -63,3 +67,13 @@ const (
|
|||||||
Record1 = "record1"
|
Record1 = "record1"
|
||||||
Record2 = "record2"
|
Record2 = "record2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func Format(tag string, inner string, arg ...string) string {
|
||||||
|
return kit.Format("<%s %s>%s</%s>", tag, kit.JoinProperty(arg...), inner, tag)
|
||||||
|
}
|
||||||
|
func FormatDanger(value string) string {
|
||||||
|
return Format(SPAN, value, STYLE, kit.JoinCSS(
|
||||||
|
BACKGROUND_COLOR, "var(--danger-bg-color)",
|
||||||
|
COLOR, "var(--danger-fg-color)",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
@ -103,7 +103,7 @@ func PushImages(m *ice.Message, name string) {
|
|||||||
}
|
}
|
||||||
func PushNotice(m *ice.Message, arg ...ice.Any) {
|
func PushNotice(m *ice.Message, arg ...ice.Any) {
|
||||||
opts := ice.Map{ice.MSG_OPTION: []string{}, ice.MSG_OPTS: []string{}}
|
opts := ice.Map{ice.MSG_OPTION: []string{}, ice.MSG_OPTS: []string{}}
|
||||||
kit.For([]string{ice.LOG_DEBUG, ice.LOG_TRACEID}, func(key string) {
|
kit.For([]string{ctx.DISPLAY, ctx.STYLE, ice.LOG_DEBUG, ice.LOG_TRACEID}, func(key string) {
|
||||||
opts[ice.MSG_OPTION] = kit.Simple(opts[ice.MSG_OPTION], key)
|
opts[ice.MSG_OPTION] = kit.Simple(opts[ice.MSG_OPTION], key)
|
||||||
opts[key] = m.Option(key)
|
opts[key] = m.Option(key)
|
||||||
})
|
})
|
||||||
|
@ -188,4 +188,6 @@ const (
|
|||||||
CHAT_FLOWS = "web.chat.flows"
|
CHAT_FLOWS = "web.chat.flows"
|
||||||
CHAT_GRANT = "web.chat.grant"
|
CHAT_GRANT = "web.chat.grant"
|
||||||
TEAM_PLAN = "web.team.plan"
|
TEAM_PLAN = "web.team.plan"
|
||||||
|
|
||||||
|
PLUGIN_XTERM = "/plugin/local/code/xterm.js"
|
||||||
)
|
)
|
||||||
|
@ -190,6 +190,8 @@ func init() {
|
|||||||
m.Cmdy(tcp.WIFI).CutTo(tcp.SSID, arg[0])
|
m.Cmdy(tcp.WIFI).CutTo(tcp.SSID, arg[0])
|
||||||
case mdb.ICON:
|
case mdb.ICON:
|
||||||
m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH).CutTo(nfs.PATH, arg[0])
|
m.Cmdy(nfs.DIR, ice.USR_ICONS, nfs.PATH).CutTo(nfs.PATH, arg[0])
|
||||||
|
case aaa.PASSWORD:
|
||||||
|
m.SetAppend()
|
||||||
case ctx.INDEX:
|
case ctx.INDEX:
|
||||||
if space := m.Option(SPACE); space != "" {
|
if space := m.Option(SPACE); space != "" {
|
||||||
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND)
|
m.Options(SPACE, []string{}).Cmdy(SPACE, space, ctx.COMMAND)
|
||||||
|
6
meta.go
6
meta.go
@ -152,6 +152,12 @@ func (m *Message) Copy(msg *Message, arg ...string) *Message {
|
|||||||
return m.Add(MSG_RESULT, msg.value(MSG_RESULT)...)
|
return m.Add(MSG_RESULT, msg.value(MSG_RESULT)...)
|
||||||
}
|
}
|
||||||
func (m *Message) Length() (max int) {
|
func (m *Message) Length() (max int) {
|
||||||
|
if m.FieldsIsDetail() {
|
||||||
|
if len(m.value(KEY)) > 0 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
kit.For(m.value(MSG_APPEND), func(k string) { max = kit.Max(len(m.value(k)), max) })
|
kit.For(m.value(MSG_APPEND), func(k string) { max = kit.Max(len(m.value(k)), max) })
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,9 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
@ -24,6 +26,7 @@ import (
|
|||||||
"shylinux.com/x/icebergs/core/code"
|
"shylinux.com/x/icebergs/core/code"
|
||||||
"shylinux.com/x/icebergs/misc/xterm"
|
"shylinux.com/x/icebergs/misc/xterm"
|
||||||
kit "shylinux.com/x/toolkits"
|
kit "shylinux.com/x/toolkits"
|
||||||
|
"shylinux.com/x/toolkits/task"
|
||||||
)
|
)
|
||||||
|
|
||||||
func _ssh_open(m *ice.Message, arg ...string) {
|
func _ssh_open(m *ice.Message, arg ...string) {
|
||||||
@ -38,9 +41,7 @@ func _ssh_open(m *ice.Message, arg ...string) {
|
|||||||
defer c.Write([]byte(cmd + lex.NL))
|
defer c.Write([]byte(cmd + lex.NL))
|
||||||
m.Sleep300ms()
|
m.Sleep300ms()
|
||||||
})
|
})
|
||||||
m.Go(func() {
|
m.Go(func() { io.Copy(c, os.Stdin) })
|
||||||
io.Copy(c, os.Stdin)
|
|
||||||
})
|
|
||||||
io.Copy(os.Stdout, c)
|
io.Copy(os.Stdout, c)
|
||||||
}, arg...)
|
}, arg...)
|
||||||
}
|
}
|
||||||
@ -70,11 +71,11 @@ func _ssh_dial(m *ice.Message, cb func(net.Conn), arg ...string) {
|
|||||||
fmt.Sscanf(string(buf[:n]), "#height:%d,width:%d", &h, &w)
|
fmt.Sscanf(string(buf[:n]), "#height:%d,width:%d", &h, &w)
|
||||||
}
|
}
|
||||||
m.Go(func() {
|
m.Go(func() {
|
||||||
defer c.Close()
|
|
||||||
s, e := client.NewSession()
|
s, e := client.NewSession()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer c.Close()
|
||||||
s.Stdin, s.Stdout, s.Stderr = c, c, c
|
s.Stdin, s.Stdout, s.Stderr = c, c, c
|
||||||
s.RequestPty(kit.Env(cli.TERM), h, w, ssh.TerminalModes{ssh.ECHO: 1, ssh.TTY_OP_ISPEED: 14400, ssh.TTY_OP_OSPEED: 14400})
|
s.RequestPty(kit.Env(cli.TERM), h, w, ssh.TerminalModes{ssh.ECHO: 1, ssh.TTY_OP_ISPEED: 14400, ssh.TTY_OP_OSPEED: 14400})
|
||||||
gdb.SignalNotify(m, 28, func() { w, h, _ := terminal.GetSize(int(os.Stdin.Fd())); s.WindowChange(h, w) })
|
gdb.SignalNotify(m, 28, func() { w, h, _ := terminal.GetSize(int(os.Stdin.Fd())); s.WindowChange(h, w) })
|
||||||
@ -93,7 +94,7 @@ func _ssh_dial(m *ice.Message, cb func(net.Conn), arg ...string) {
|
|||||||
func _ssh_conn(m *ice.Message, cb func(*ssh.Client), arg ...string) {
|
func _ssh_conn(m *ice.Message, cb func(*ssh.Client), arg ...string) {
|
||||||
methods := []ssh.AuthMethod{}
|
methods := []ssh.AuthMethod{}
|
||||||
methods = append(methods, ssh.PublicKeysCallback(func() ([]ssh.Signer, error) {
|
methods = append(methods, ssh.PublicKeysCallback(func() ([]ssh.Signer, error) {
|
||||||
key, err := ssh.ParsePrivateKey([]byte(m.Cmdx(nfs.CAT, kit.HomePath(m.Option(PRIVATE)))))
|
key, err := ssh.ParsePrivateKey([]byte(m.Cmdx(nfs.CAT, kit.HomePath(m.OptionDefault(PRIVATE, ".ssh/id_rsa")))))
|
||||||
return []ssh.Signer{key}, err
|
return []ssh.Signer{key}, err
|
||||||
}))
|
}))
|
||||||
methods = append(methods, ssh.PasswordCallback(func() (string, error) { return m.Option(aaa.PASSWORD), nil }))
|
methods = append(methods, ssh.PasswordCallback(func() (string, error) { return m.Option(aaa.PASSWORD), nil }))
|
||||||
@ -228,3 +229,71 @@ func (s session) Read(buf []byte) (int, error) { return s.pty.Read(buf) }
|
|||||||
func (s session) Close() error { return s.sess.Close() }
|
func (s session) Close() error { return s.sess.Close() }
|
||||||
|
|
||||||
func init() { xterm.AddCommand(SSH, NewSession) }
|
func init() { xterm.AddCommand(SSH, NewSession) }
|
||||||
|
func CombinedOutput(m *ice.Message, cmd string, cb func(string)) {
|
||||||
|
_ssh_conn(m, func(c *ssh.Client) {
|
||||||
|
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) {
|
||||||
|
defer s.Close()
|
||||||
|
m.Debug("cmd %v", cmd)
|
||||||
|
if b, e := s.CombinedOutput(cmd); !m.Warn(e, ice.ErrNotValid) {
|
||||||
|
cb(string(b))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func PushOutput(m *ice.Message, cmd string, cb func(string)) {
|
||||||
|
_ssh_conn(m, func(c *ssh.Client) {
|
||||||
|
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) {
|
||||||
|
defer s.Close()
|
||||||
|
r, _ := s.StdoutPipe()
|
||||||
|
m.Debug("res %v", cmd)
|
||||||
|
s.Run(cmd)
|
||||||
|
kit.For(r, func(res []byte) {
|
||||||
|
m.Debug("res %v", string(res))
|
||||||
|
cb(string(res))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func PushShell(m *ice.Message, cmds []string, cb func(string)) {
|
||||||
|
_ssh_conn(m, func(c *ssh.Client) {
|
||||||
|
if s, e := c.NewSession(); !m.Warn(e, ice.ErrNotValid) {
|
||||||
|
defer s.Close()
|
||||||
|
w, _ := s.StdinPipe()
|
||||||
|
r, _ := s.StdoutPipe()
|
||||||
|
width, height, _ := terminal.GetSize(int(os.Stdin.Fd()))
|
||||||
|
s.RequestPty(kit.Env(cli.TERM), height, width, ssh.TerminalModes{ssh.ECHO: 1, ssh.TTY_OP_ISPEED: 14400, ssh.TTY_OP_OSPEED: 14400})
|
||||||
|
defer s.Wait()
|
||||||
|
s.Shell()
|
||||||
|
lock := task.Lock{}
|
||||||
|
list := [][]string{}
|
||||||
|
cmd := kit.Format("%s@%s[%s]%s$ ssh %s@%s\r\n",
|
||||||
|
m.Option(aaa.USERNAME), ice.Info.Hostname, kit.Split(time.Now().Format(ice.MOD_TIME))[1], path.Base(kit.Path("")),
|
||||||
|
m.Option(aaa.USERNAME), m.Option(tcp.HOST))
|
||||||
|
list = append(list, []string{cmd})
|
||||||
|
m.Debug("cmd %v", cmd)
|
||||||
|
cb(cmd)
|
||||||
|
defer cb("\r\n\r\n")
|
||||||
|
m.Go(func() {
|
||||||
|
kit.For(append(cmds, cli.EXIT), func(cmd string) {
|
||||||
|
for {
|
||||||
|
m.Sleep300ms()
|
||||||
|
if func() bool { defer lock.Lock()(); return len(list[len(list)-1]) > 1 }() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m.Debug("cmd %v", cmd)
|
||||||
|
fmt.Fprintln(w, cmd)
|
||||||
|
defer lock.Lock()()
|
||||||
|
list = append(list, []string{cmd})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
kit.For(r, func(res []byte) {
|
||||||
|
m.Debug("res %v", string(res))
|
||||||
|
m.Debug("res %v", res)
|
||||||
|
cb(string(res))
|
||||||
|
defer lock.Lock()()
|
||||||
|
list[len(list)-1] = append(list[len(list)-1], string(res))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user