1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 17:44:05 +08:00
This commit is contained in:
shaoying 2020-09-27 08:52:59 +08:00
parent 76fce2d013
commit fe92530fcd
3 changed files with 34 additions and 50 deletions

View File

@ -3,6 +3,7 @@ package gdb
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/nfs"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -107,6 +108,7 @@ const (
ACTION = "action" ACTION = "action"
) )
const ( const (
ROUTINE = "routine"
SIGNAL = "signal" SIGNAL = "signal"
TIMER = "timer" TIMER = "timer"
EVENT = "event" EVENT = "event"
@ -115,6 +117,8 @@ const (
var Index = &ice.Context{Name: "gdb", Help: "事件模块", var Index = &ice.Context{Name: "gdb", Help: "事件模块",
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
ROUTINE: {Name: "routine", Help: "协程", Value: kit.Data()},
SIGNAL: {Name: "signal", Help: "信号器", Value: kit.Dict( SIGNAL: {Name: "signal", Help: "信号器", Value: kit.Dict(
kit.MDB_META, kit.Dict("pid", "var/run/ice.pid"), kit.MDB_META, kit.Dict("pid", "var/run/ice.pid"),
kit.MDB_LIST, kit.List(), kit.MDB_LIST, kit.List(),
@ -160,6 +164,15 @@ var Index = &ice.Context{Name: "gdb", Help: "事件模块",
} }
}}, }},
ROUTINE: {Name: "routine hash auto", Help: "协程", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, ROUTINE, "", mdb.LIST, arg)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,fileline")
m.Cmdy(mdb.SELECT, ROUTINE, "", mdb.LIST, arg)
}},
SIGNAL: {Name: "signal", Help: "信号器", Action: map[string]*ice.Action{ SIGNAL: {Name: "signal", Help: "信号器", Action: map[string]*ice.Action{
LISTEN: {Name: "listen signal cmd...", Help: "监听事件", Hand: func(m *ice.Message, arg ...string) { LISTEN: {Name: "listen signal cmd...", Help: "监听事件", Hand: func(m *ice.Message, arg ...string) {
m.Rich(SIGNAL, arg[0], arg[1:]) m.Rich(SIGNAL, arg[0], arg[1:])

View File

@ -18,7 +18,6 @@ import (
"os/exec" "os/exec"
"path" "path"
"strings" "strings"
"time"
"github.com/kr/pty" "github.com/kr/pty"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
@ -184,40 +183,13 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh
request.Reply(true, nil) request.Reply(true, nil)
} }
} }
func _ssh_listen(m *ice.Message, l net.Listener, hostport string) { func _ssh_accept(m *ice.Message, c net.Conn) {
h := m.Cmdx(mdb.INSERT, m.Prefix(LISTEN), "", mdb.HASH, aaa.HOSTPORT, hostport, kit.MDB_STATUS, "listen") sc, sessions, req, err := ssh.NewServerConn(c, _ssh_config(m))
defer m.Cmd(mdb.MODIFY, m.Prefix(LISTEN), "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, "close")
config := _ssh_config(m)
for {
c, e := l.Accept()
if m.Warn(e != nil, e) {
continue
}
func(c net.Conn) {
m.Gos(m.Spawn(), func(msg *ice.Message) {
defer c.Close()
m.Logs(CONNECT, aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
defer m.Logs("disconn", aaa.HOSTPORT, c.RemoteAddr(), "->", c.LocalAddr())
sc, sessions, req, err := ssh.NewServerConn(c, config)
if m.Warn(err != nil, err) { if m.Warn(err != nil, err) {
return return
} }
hostname := sc.Permissions.Extensions["hostname"] m.Gos(m, func(m *ice.Message) { ssh.DiscardRequests(req) })
username := sc.Permissions.Extensions["username"]
begin := time.Now()
h := m.Cmdx(mdb.INSERT, m.Prefix(CONNECT), "", mdb.HASH, aaa.HOSTPORT, c.RemoteAddr().String(), kit.MDB_STATUS, "connect", "hostname", hostname, "username", username)
defer m.Cmd(mdb.MODIFY, m.Prefix(CONNECT), "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, "close", "close_time", time.Now().Format(ice.MOD_TIME), "duration", time.Now().Sub(begin).String())
sc.Permissions.Extensions[CONNECT] = h
m.Gos(m, func(m *ice.Message) {
ssh.DiscardRequests(req)
})
for session := range sessions { for session := range sessions {
channel, requests, err := session.Accept() channel, requests, err := session.Accept()
@ -231,9 +203,6 @@ func _ssh_listen(m *ice.Message, l net.Listener, hostport string) {
}) })
}(channel, requests) }(channel, requests)
} }
})
}(c)
}
} }
func _ssh_config(m *ice.Message) *ssh.ServerConfig { func _ssh_config(m *ice.Message) *ssh.ServerConfig {
config := &ssh.ServerConfig{ config := &ssh.ServerConfig{
@ -378,8 +347,8 @@ func init() {
LISTEN: {Name: "listen hash=auto auto", Help: "服务", Action: map[string]*ice.Action{ LISTEN: {Name: "listen hash=auto auto", Help: "服务", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create name=tcp port=9030", Help: "启动", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create name=tcp port=9030", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Option(tcp.LISTEN_CB, func(l net.Listener) { m.Option(tcp.LISTEN_CB, func(c net.Conn) {
_ssh_listen(m, l, ":"+m.Option("port")) m.Gos(m.Spawn(), func(msg *ice.Message) { _ssh_accept(msg, c) })
}) })
m.Gos(m, func(m *ice.Message) { m.Gos(m, func(m *ice.Message) {
m.Cmdy(tcp.SERVER, tcp.LISTEN, kit.MDB_NAME, "ssh", tcp.PORT, m.Option(tcp.PORT)) m.Cmdy(tcp.SERVER, tcp.LISTEN, kit.MDB_NAME, "ssh", tcp.PORT, m.Option(tcp.PORT))

View File

@ -110,6 +110,8 @@ func (m *Message) Back(res *Message) *Message {
return m return m
} }
func (m *Message) Gos(msg *Message, cb func(*Message)) *Message { func (m *Message) Gos(msg *Message, cb func(*Message)) *Message {
m.Cmd("gdb.routine", "create", "fileline", kit.FileLine(cb, 3))
task.Put(nil, func(task *task.Task) error { task.Put(nil, func(task *task.Task) error {
msg.Optionv("_task", task) msg.Optionv("_task", task)
msg.TryCatch(msg, true, func(msg *Message) { cb(msg) }) msg.TryCatch(msg, true, func(msg *Message) { cb(msg) })