mirror of
https://shylinux.com/x/icebergs
synced 2025-04-25 17:18:05 +08:00
112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
package ssh
|
|
|
|
import (
|
|
"github.com/shylinux/icebergs"
|
|
"github.com/shylinux/toolkits"
|
|
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type Frame struct {
|
|
in io.ReadCloser
|
|
out io.WriteCloser
|
|
target *ice.Context
|
|
count int
|
|
}
|
|
|
|
func (f *Frame) prompt(m *ice.Message) *ice.Message {
|
|
prompt := "[15:04:05]%s> "
|
|
fmt.Fprintf(f.out, kit.Format("%d", f.count))
|
|
fmt.Fprintf(f.out, m.Time(prompt, f.target.Name))
|
|
return m
|
|
}
|
|
func (f *Frame) printf(m *ice.Message, res string) *ice.Message {
|
|
fmt.Fprint(f.out, res)
|
|
if !strings.HasSuffix(res, "\n") {
|
|
fmt.Fprint(f.out, "\n")
|
|
}
|
|
return m
|
|
}
|
|
|
|
func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server {
|
|
return &Frame{}
|
|
}
|
|
func (f *Frame) Begin(m *ice.Message, arg ...string) ice.Server {
|
|
return f
|
|
}
|
|
func (f *Frame) Start(m *ice.Message, arg ...string) bool {
|
|
switch kit.Select("stdio", arg, 0) {
|
|
default:
|
|
f.in = os.Stdin
|
|
f.out = os.Stdout
|
|
m.Cap(ice.CTX_STREAM, "stdio")
|
|
}
|
|
|
|
f.count = 0
|
|
f.target = m.Target()
|
|
bio := bufio.NewScanner(f.in)
|
|
for f.prompt(m); bio.Scan(); f.prompt(m) {
|
|
ls := kit.Split(bio.Text())
|
|
m.Log(ice.LOG_IMPORT, "stdin: %v", ls)
|
|
|
|
if len(ls) > 0 && strings.HasPrefix(ls[0], "~") {
|
|
// 切换模块
|
|
target := ls[0][1:]
|
|
if ls = ls[1:]; len(target) == 0 {
|
|
target, ls = ls[0], ls[1:]
|
|
}
|
|
ice.Pulse.Search(target+".", func(p *ice.Context, s *ice.Context, key string) {
|
|
m.Info("choice: %s", s.Name)
|
|
f.target = s
|
|
})
|
|
}
|
|
|
|
if len(ls) == 0 {
|
|
continue
|
|
}
|
|
|
|
// 执行命令
|
|
msg := m.Spawns(f.target)
|
|
if msg.Cmdy(ls); !msg.Hand {
|
|
msg = msg.Set("result").Cmdy(ice.CLI_SYSTEM, ls)
|
|
}
|
|
|
|
// 生成结果
|
|
res := msg.Result()
|
|
if res == "" {
|
|
res = msg.Table().Result()
|
|
}
|
|
|
|
// 输出结果
|
|
msg.Cost("stdin:%v", ls)
|
|
f.printf(msg, res)
|
|
f.count++
|
|
}
|
|
return true
|
|
}
|
|
func (f *Frame) Close(m *ice.Message, arg ...string) bool {
|
|
return true
|
|
}
|
|
|
|
var Index = &ice.Context{Name: "ssh", Help: "终端模块",
|
|
Caches: map[string]*ice.Cache{},
|
|
Configs: map[string]*ice.Config{},
|
|
Commands: map[string]*ice.Command{
|
|
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
|
}},
|
|
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
|
if f, ok := m.Target().Server().(*Frame); ok {
|
|
// 关闭终端
|
|
f.in.Close()
|
|
m.Done()
|
|
}
|
|
}},
|
|
},
|
|
}
|
|
|
|
func init() { ice.Index.Register(Index, &Frame{}) }
|