mirror of
https://github.com/veops/oneterm.git
synced 2025-10-08 00:30:12 +08:00
79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package sshsrv
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
"github.com/fatih/color"
|
|
"github.com/getwe/figlet4go"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gliderlabs/ssh"
|
|
"go.uber.org/zap"
|
|
gossh "golang.org/x/crypto/ssh"
|
|
|
|
"github.com/veops/oneterm/logger"
|
|
)
|
|
|
|
func handler(sess ssh.Session) {
|
|
pty, _, isPty := sess.Pty()
|
|
if !isPty {
|
|
logger.L().Error("not a pty request")
|
|
return
|
|
}
|
|
|
|
ctx := &gin.Context{
|
|
Request: &http.Request{
|
|
RemoteAddr: sess.RemoteAddr().Network(),
|
|
URL: &url.URL{
|
|
RawQuery: fmt.Sprintf("w=%d&h=%d", pty.Window.Width, pty.Window.Height),
|
|
},
|
|
},
|
|
}
|
|
ctx.Set("session", sess.Context().Value("session"))
|
|
|
|
p := tea.NewProgram(initialView(ctx, sess), tea.WithInput(sess), tea.WithOutput(sess))
|
|
|
|
if _, err := p.Run(); err != nil {
|
|
fmt.Printf("Alas, there's been an error: %v", err)
|
|
}
|
|
}
|
|
|
|
func signer() ssh.Signer {
|
|
str := `-----BEGIN OPENSSH PRIVATE KEY-----
|
|
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
|
|
QyNTUxOQAAACBg490b4zqumtizCyM4RWtzJnPEsPIInBFugk8+UCb8XgAAAKCc1yKrnNci
|
|
qwAAAAtzc2gtZWQyNTUxOQAAACBg490b4zqumtizCyM4RWtzJnPEsPIInBFugk8+UCb8Xg
|
|
AAAECvd1Yj+bQxyxJtU3PirLK68CD3MWqBv0/shlFKS6wmbWDj3RvjOq6a2LMLIzhFa3Mm
|
|
c8Sw8gicEW6CTz5QJvxeAAAAGnJvb3RAbG9jYWxob3N0LmxvY2FsZG9tYWluAQID
|
|
-----END OPENSSH PRIVATE KEY-----
|
|
`
|
|
s, err := gossh.ParsePrivateKey([]byte(str))
|
|
if err != nil {
|
|
logger.L().Fatal("failed parse signer", zap.Error(err))
|
|
}
|
|
return s
|
|
}
|
|
|
|
func banner() string {
|
|
str := "ONETERM"
|
|
ascii := figlet4go.NewAsciiRender()
|
|
colors := [...]color.Attribute{
|
|
color.FgMagenta,
|
|
color.FgYellow,
|
|
color.FgBlue,
|
|
color.FgCyan,
|
|
color.FgRed,
|
|
color.FgWhite,
|
|
color.FgGreen,
|
|
}
|
|
options := figlet4go.NewRenderOptions()
|
|
options.FontColor = make([]color.Attribute, len(str))
|
|
for i := range options.FontColor {
|
|
options.FontColor[i] = colors[i%len(colors)]
|
|
}
|
|
renderStr, _ := ascii.RenderOpts(str, options)
|
|
return renderStr
|
|
}
|