1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-04-10 00:32:48 +08:00
parent 3fee88f2bf
commit 144bacc365
8 changed files with 115 additions and 21 deletions

View File

@ -26,6 +26,11 @@ func DisplayStory(m *ice.Message, file string, arg ...ice.Any) *ice.Message {
kit.If(isLocalFile(file), func() { file = path.Join(ice.PLUGIN_STORY, file) }) kit.If(isLocalFile(file), func() { file = path.Join(ice.PLUGIN_STORY, file) })
return DisplayBase(m, file, arg...) return DisplayBase(m, file, arg...)
} }
func DisplayInput(m *ice.Message, file string, arg ...ice.Any) *ice.Message {
kit.If(file == "", func() { file = kit.Keys(m.CommandKey(), nfs.JS) })
kit.If(isLocalFile(file), func() { file = path.Join(ice.PLUGIN_INPUT, file) })
return DisplayBase(m, file, arg...)
}
func DisplayStoryForm(m *ice.Message, arg ...ice.Any) *ice.Message { func DisplayStoryForm(m *ice.Message, arg ...ice.Any) *ice.Message {
args := kit.List() args := kit.List()
for i := range arg { for i := range arg {
@ -43,6 +48,9 @@ func DisplayStoryForm(m *ice.Message, arg ...ice.Any) *ice.Message {
kit.For(args, func(v ice.Map) { m.Push("", v, kit.Split("type,name,value,values,need,action")) }) kit.For(args, func(v ice.Map) { m.Push("", v, kit.Split("type,name,value,values,need,action")) })
return DisplayStory(m, "form") return DisplayStory(m, "form")
} }
func DisplayInputKey(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayInput(m, "key", arg...)
}
func DisplayStoryJSON(m *ice.Message, arg ...ice.Any) *ice.Message { func DisplayStoryJSON(m *ice.Message, arg ...ice.Any) *ice.Message {
return DisplayStory(m, "json", arg...) return DisplayStory(m, "json", arg...)
} }

View File

@ -116,7 +116,7 @@ func _dream_start(m *ice.Message, name string) {
return return
} }
if !m.IsCliUA() { if !m.IsCliUA() {
defer m.ProcessOpenAndRefresh(m.MergePod(name)) // defer m.ProcessOpenAndRefresh(m.MergePod(name))
defer ToastProcess(m, mdb.CREATE, name)() defer ToastProcess(m, mdb.CREATE, name)()
} }
defer mdb.Lock(m, m.PrefixKey(), cli.START, name)() defer mdb.Lock(m, m.PrefixKey(), cli.START, name)()
@ -435,6 +435,18 @@ func init() {
TOKEN: {Hand: func(m *ice.Message, arg ...string) { TOKEN: {Hand: func(m *ice.Message, arg ...string) {
m.Options(m.Cmd(SPIDE, m.Option(mdb.NAME)).AppendSimple()).Cmdy(SPIDE, mdb.DEV_REQUEST) m.Options(m.Cmd(SPIDE, m.Option(mdb.NAME)).AppendSimple()).Cmdy(SPIDE, mdb.DEV_REQUEST)
}}, }},
SERVER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
kit.If(value[mdb.TYPE] == m.ActionKey(), func() { m.PushRecord(value, head...) })
})
m.Sort(mdb.TIME, ice.STR_R)
}},
ORIGIN: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SPACE).Table(func(value ice.Maps, index int, head []string) {
kit.If(value[mdb.TYPE] == m.ActionKey(), func() { m.PushRecord(value, head...) })
})
m.Sort(mdb.TIME, ice.STR_R)
}},
DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
if !aaa.IsTechOrRoot(m) { if !aaa.IsTechOrRoot(m) {
m.PushButton(OPEN) m.PushButton(OPEN)

View File

@ -81,6 +81,7 @@ func _matrix_action(m *ice.Message, action string, arg ...string) {
func _matrix_dream(m *ice.Message, action string, arg ...string) { func _matrix_dream(m *ice.Message, action string, arg ...string) {
m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, kit.Select(m.ActionKey(), action), m.OptionSimple(mdb.NAME), arg) m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, kit.Select(m.ActionKey(), action), m.OptionSimple(mdb.NAME), arg)
} }
func _matrix_cmd(m *ice.Message, cmd string, arg ...string) *ice.Message { func _matrix_cmd(m *ice.Message, cmd string, arg ...string) *ice.Message {
return m.Cmdy(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), kit.Select(m.ActionKey(), cmd), arg) return m.Cmdy(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), kit.Select(m.ActionKey(), cmd), arg)
} }
@ -113,11 +114,10 @@ func init() {
m.OptionDefault(nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME))) m.OptionDefault(nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME)))
} }
_matrix_dream(m, mdb.CREATE, kit.Simple(m.OptionSimple(mdb.ICONS, nfs.REPOS, nfs.BINARY))...) _matrix_dream(m, mdb.CREATE, kit.Simple(m.OptionSimple(mdb.ICONS, nfs.REPOS, nfs.BINARY))...)
m.Cmd(SPACE, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME)), MESSAGE, mdb.CREATE, m.Cmd(SPACE, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME)), MESSAGE, mdb.CREATE, mdb.TYPE, ORIGIN, mdb.ICONS, m.Option(mdb.ICONS), TARGET, kit.Keys(nfs.FROM, m.Option(mdb.NAME)))
mdb.TYPE, ORIGIN, mdb.ICONS, m.Option(mdb.ICONS), TARGET, kit.Keys(nfs.FROM, m.Option(mdb.NAME))) m.Cmd(SPACE, m.Option(mdb.NAME), MESSAGE, mdb.CREATE, mdb.TYPE, SERVER, mdb.ICONS, m.Option(mdb.ICONS), TARGET, kit.Keys(ice.OPS, m.Option(DOMAIN), m.Option(mdb.NAME)))
m.Cmd(SPACE, m.Option(mdb.NAME), MESSAGE, mdb.CREATE,
mdb.TYPE, SERVER, mdb.ICONS, m.Option(mdb.ICONS), TARGET, kit.Keys(ice.OPS, m.Option(DOMAIN), m.Option(mdb.NAME)))
StreamPushRefreshConfirm(m, m.Trans("refresh for new space ", "刷新列表查看新空间 ")+kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))) StreamPushRefreshConfirm(m, m.Trans("refresh for new space ", "刷新列表查看新空间 ")+kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME)))
SpaceEvent(m, OPS_DREAM_SPAWN, "", m.OptionSimple(mdb.NAME, DOMAIN)...)
}}, }},
}, ctx.ConfAction( }, ctx.ConfAction(
mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version,access", mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version,access",

View File

@ -79,7 +79,7 @@ func _space_fork(m *ice.Message) {
} }
} }
if m.Option(mdb.ICONS) != "" && !kit.HasPrefix(m.Option(mdb.ICONS), nfs.PS, HTTP) { if m.Option(mdb.ICONS) != "" && !kit.HasPrefix(m.Option(mdb.ICONS), nfs.PS, HTTP) {
m.Option(mdb.ICONS, kit.MergeURL("/require/"+m.Option(mdb.ICONS), ice.POD, name)) m.Option(mdb.ICONS, kit.MergeURL(nfs.REQUIRE+m.Option(mdb.ICONS), ice.POD, name))
} }
args := kit.Simple(mdb.TYPE, m.Option(mdb.TYPE), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(mdb.ICONS, mdb.TIME, nfs.MODULE, nfs.VERSION, cli.DAEMON)) args := kit.Simple(mdb.TYPE, m.Option(mdb.TYPE), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(mdb.ICONS, mdb.TIME, nfs.MODULE, nfs.VERSION, cli.DAEMON))
args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE)) args = append(args, aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE))
@ -275,6 +275,7 @@ const (
const ( const (
OPS_ORIGIN_OPEN = "ops.origin.open" OPS_ORIGIN_OPEN = "ops.origin.open"
OPS_SERVER_OPEN = "ops.server.open" OPS_SERVER_OPEN = "ops.server.open"
OPS_DREAM_SPAWN = "ops.dream.spawn"
SPACE_LOGIN = "space.login" SPACE_LOGIN = "space.login"
SPACE_LOGIN_CLOSE = "space.login.close" SPACE_LOGIN_CLOSE = "space.login.close"

View File

@ -37,10 +37,12 @@ func _ssh_open(m *ice.Message, arg ...string) {
} }
w, h, _ := terminal.GetSize(fd) w, h, _ := terminal.GetSize(fd)
c.Write([]byte(fmt.Sprintf("#height:%d,width:%d"+lex.NL, h, w))) c.Write([]byte(fmt.Sprintf("#height:%d,width:%d"+lex.NL, h, w)))
kit.For(kit.Simple(m.Optionv(ice.INIT)), func(cmd string) { if m.Option(ice.INIT) != "" {
defer c.Write([]byte(cmd + lex.NL)) kit.For(kit.Simple(m.Optionv(ice.INIT)), func(cmd string) {
m.Sleep300ms() defer c.Write([]byte(cmd + lex.NL))
}) m.Sleep300ms()
})
}
m.Go(func() { io.Copy(c, os.Stdin) }) m.Go(func() { io.Copy(c, os.Stdin) })
io.Copy(os.Stdout, c) io.Copy(os.Stdout, c)
}, arg...) }, arg...)

42
misc/ssh/relay/auths.go Normal file
View File

@ -0,0 +1,42 @@
package relay
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/misc/ssh"
kit "shylinux.com/x/toolkits"
)
const (
SSH_AUTHS = "ssh.auths"
)
type auths struct {
list string `name:"list auto"`
}
func (s auths) List(m *ice.Message, arg ...string) {
list := map[string]map[string]bool{}
head := []string{}
m.AdminCmd(web.DREAM, web.ORIGIN).Table(func(val ice.Maps) {
head = append(head, val[mdb.NAME])
m.AdminCmd(web.SPACE, val[mdb.NAME], ssh.RSA, ssh.AUTHS).Table(func(value ice.Maps) {
if _, ok := list[value[mdb.NAME]]; !ok {
list[value[mdb.NAME]] = map[string]bool{}
}
list[value[mdb.NAME]][val[mdb.NAME]] = true
})
})
m.AdminCmd(web.DREAM, web.SERVER).Table(func(value ice.Maps) {
kit.For(head, func(key string) {
if data, ok := list[value[mdb.NAME]]; ok && data[key] {
m.Push(key, "ok")
} else {
m.Push(key, "")
}
})
})
}
func init() { ice.Cmd(SSH_AUTHS, auths{}) }

View File

@ -63,7 +63,7 @@ type relay struct {
checkbox string `data:"true"` checkbox string `data:"true"`
export string `data:"true"` export string `data:"true"`
short string `data:"machine"` short string `data:"machine"`
tools string `data:"ssh.trans,ssh.auth,aaa.cert"` tools string `data:"ssh.trans,ssh.auths,aaa.rsa"`
field string `data:"time,icons,machine,username,host,port,portal,dream,module,version,commitTime,compileTime,bootTime,go,git,package,shell,kernel,arch,vcpu,ncpu,mhz,mem,disk,network,listen,socket,proc,vendor"` field string `data:"time,icons,machine,username,host,port,portal,dream,module,version,commitTime,compileTime,bootTime,go,git,package,shell,kernel,arch,vcpu,ncpu,mhz,mem,disk,network,listen,socket,proc,vendor"`
create string `name:"create host* port=22 username=root machine icons"` create string `name:"create host* port=22 username=root machine icons"`
upgrade string `name:"upgrade machine"` upgrade string `name:"upgrade machine"`
@ -75,7 +75,7 @@ type relay struct {
install string `name:"install dream portal nodename dev"` install string `name:"install dream portal nodename dev"`
pushbin string `name:"pushbin dream portal nodename dev" icon:"bi bi-box-arrow-in-up"` pushbin string `name:"pushbin dream portal nodename dev" icon:"bi bi-box-arrow-in-up"`
adminCmd string `name:"adminCmd cmd" icon:"bi bi-terminal-plus"` adminCmd string `name:"adminCmd cmd" icon:"bi bi-terminal-plus"`
pushkey string `name:"pushkey" icon:"bi bi-person-fill-up"` pushkey string `name:"pushkey server" icon:"bi bi-person-fill-up"`
} }
func (s relay) Init(m *ice.Message, arg ...string) { func (s relay) Init(m *ice.Message, arg ...string) {
@ -108,6 +108,9 @@ func (s relay) Inputs(m *ice.Message, arg ...string) {
m.Push(arg[0], tcp.PORT_443, tcp.PORT_80, tcp.PORT_9020, "9030", "9040", "9050") m.Push(arg[0], tcp.PORT_443, tcp.PORT_80, tcp.PORT_9020, "9030", "9040", "9050")
case tcp.NODENAME: case tcp.NODENAME:
m.Cmdy("").CutTo(MACHINE, arg[0]) m.Cmdy("").CutTo(MACHINE, arg[0])
case web.SERVER:
m.Copy(m.AdminCmd(web.DREAM, web.SERVER))
ctx.DisplayInputKey(m.Message, "style", "_nameicon")
} }
} }
func (s relay) Create(m *ice.Message, arg ...string) { func (s relay) Create(m *ice.Message, arg ...string) {
@ -293,12 +296,13 @@ func (s relay) Pushkey(m *ice.Message, arg ...string) {
p := kit.Format("/home/%s/"+SSH_AUTHORIZED, m.Option(aaa.USERNAME)) p := kit.Format("/home/%s/"+SSH_AUTHORIZED, m.Option(aaa.USERNAME))
kit.If(m.Option(aaa.USERNAME) == aaa.ROOT, func() { p = kit.Format("/root/" + SSH_AUTHORIZED) }) kit.If(m.Option(aaa.USERNAME) == aaa.ROOT, func() { p = kit.Format("/root/" + SSH_AUTHORIZED) })
list := kit.Split(m.AdminCmdx(web.SPACE, m.Option(MACHINE), nfs.CAT, p), lex.NL, lex.NL) list := kit.Split(m.AdminCmdx(web.SPACE, m.Option(MACHINE), nfs.CAT, p), lex.NL, lex.NL)
if key := ssh.PublicKey(m.Message); !kit.IsIn(key, list...) { if key := ssh.PublicKey(m.Message, m.Option(web.SERVER)); !kit.IsIn(key, list...) {
m.AdminCmd(web.SPACE, m.Option(MACHINE), nfs.PUSH, p, key) m.AdminCmd(web.SPACE, m.Option(MACHINE), nfs.PUSH, p, key+lex.NL)
m.Echo(m.AdminCmdx(web.SPACE, m.Option(MACHINE), nfs.CAT, p)).ProcessInner() m.Echo(m.AdminCmdx(web.SPACE, m.Option(MACHINE), nfs.CAT, p)).ProcessInner()
} else { } else {
m.Echo(strings.Join(list, lex.NL)).ProcessInner() m.Echo(strings.Join(list, lex.NL)).ProcessInner()
} }
m.ProcessInner()
} }
func (s relay) Login(m *ice.Message, arg ...string) { func (s relay) Login(m *ice.Message, arg ...string) {
if m.Options(m.Cmd("", m.Option(MACHINE)).AppendSimple()); m.Option(ice.BACK) == "" { if m.Options(m.Cmd("", m.Option(MACHINE)).AppendSimple()); m.Option(ice.BACK) == "" {

View File

@ -21,6 +21,8 @@ import (
const ( const (
PRIVATE = "private" PRIVATE = "private"
PUBLIC = "public" PUBLIC = "public"
AUTHS = "auths"
PUSHS = "pushs"
) )
const RSA = "rsa" const RSA = "rsa"
@ -33,13 +35,16 @@ func init() {
) )
aaa.Index.MergeCommands(ice.Commands{ aaa.Index.MergeCommands(ice.Commands{
RSA: {Name: "rsa hash auto", Help: "密钥", Actions: ice.MergeActions(ice.Actions{ RSA: {Name: "rsa hash auto", Help: "密钥", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
}},
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case TITLE: case TITLE:
m.Push(arg[0], kit.Format("%s@%s", m.Option(ice.MSG_USERNAME), ice.Info.Hostname)) m.Push(arg[0], kit.Format("%s@%s", m.Option(ice.MSG_USERNAME), ice.Info.Hostname))
} }
}}, }},
mdb.CREATE: {Name: "create bits=2048,4096 title=some", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create bits=2048,4096 title", Hand: func(m *ice.Message, arg ...string) {
m.OptionDefault(TITLE, kit.Format("%s@%s", m.Option(ice.MSG_USERNAME), ice.Info.Hostname))
if key, err := rsa.GenerateKey(rand.Reader, kit.Int(m.Option(BITS))); !m.WarnNotValid(err) { if key, err := rsa.GenerateKey(rand.Reader, kit.Int(m.Option(BITS))); !m.WarnNotValid(err) {
if pub, err := ssh.NewPublicKey(key.Public()); !m.WarnNotValid(err) { if pub, err := ssh.NewPublicKey(key.Public()); !m.WarnNotValid(err) {
mdb.HashCreate(m, m.OptionSimple(TITLE), mdb.HashCreate(m, m.OptionSimple(TITLE),
@ -50,10 +55,8 @@ func init() {
} }
}}, }},
mdb.EXPORT: {Name: "export key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Hand: func(m *ice.Message, arg ...string) { mdb.EXPORT: {Name: "export key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, m.Option(mdb.HASH)).Table(func(value ice.Maps) { m.Cmd(nfs.SAVE, kit.HomePath(m.Option(KEY)), m.Option(PRIVATE))
m.Cmd(nfs.SAVE, kit.HomePath(m.Option(KEY)), value[PRIVATE]) m.Cmd(nfs.SAVE, kit.HomePath(m.Option(PUB)), m.Option(PUBLIC))
m.Cmd(nfs.SAVE, kit.HomePath(m.Option(PUB)), value[PUBLIC])
})
}}, }},
mdb.IMPORT: {Name: "import key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Hand: func(m *ice.Message, arg ...string) { mdb.IMPORT: {Name: "import key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Hand: func(m *ice.Message, arg ...string) {
mdb.Conf(m, "", kit.Keys(mdb.HASH, path.Base(m.Option(KEY))), kit.Data(mdb.TIME, m.Time(), mdb.Conf(m, "", kit.Keys(mdb.HASH, path.Base(m.Option(KEY))), kit.Data(mdb.TIME, m.Time(),
@ -62,6 +65,25 @@ func init() {
PUBLIC, m.Cmdx(nfs.CAT, kit.HomePath(m.Option(PUB))), PUBLIC, m.Cmdx(nfs.CAT, kit.HomePath(m.Option(PUB))),
)) ))
}}, }},
AUTHS: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.CAT, kit.HomePath(".ssh/authorized_keys"))
kit.For(strings.Split(strings.TrimSpace(m.Results()), lex.NL), func(text string) {
if ls := kit.Split(text, " ", " "); len(ls) > 2 {
m.Push(mdb.TYPE, ls[0])
m.Push(mdb.NAME, ls[2])
m.Push(mdb.TEXT, ls[1])
}
})
}},
PUSHS: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.PUSH, kit.HomePath(".ssh/authorized_keys"), arg[0])
}},
PUBLIC: {Hand: func(m *ice.Message, arg ...string) {
if !nfs.Exists(m, kit.HomePath(".ssh/id_rsa.pub")) {
m.Cmd("", mdb.CREATE).Options(m.Cmd("").AppendSimple()).Cmd("", mdb.EXPORT)
}
m.Cmdy(nfs.CAT, kit.HomePath(".ssh/id_rsa.pub"))
}},
}, mdb.HashAction(mdb.SHORT, PRIVATE, mdb.FIELD, "time,hash,title,public,private")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, PRIVATE, mdb.FIELD, "time,hash,title,public,private")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...).PushAction(mdb.EXPORT, mdb.REMOVE); len(arg) == 0 { if mdb.HashSelect(m, arg...).PushAction(mdb.EXPORT, mdb.REMOVE); len(arg) == 0 {
m.Action(mdb.CREATE, mdb.IMPORT) m.Action(mdb.CREATE, mdb.IMPORT)
@ -69,6 +91,9 @@ func init() {
}}, }},
}) })
} }
func PublicKey(m *ice.Message) string { func PublicKey(m *ice.Message, server string) string {
return m.Cmdx(nfs.CAT, kit.HomePath(".ssh/id_rsa.pub")) if m.IsWorker() {
server = kit.Keys(ice.OPS, server)
}
return m.Cmdx("space", server, RSA, PUBLIC)
} }