Diff
1diff --git a/main.go b/main.go
2index f83e46676cd5b683f5a38955705b0ec1c3d187f8..c36ff2a90ee21008d65c8f55d22e1b214b59d918 100644
3--- a/main.go
4+++ b/main.go
5@@ -2,6 +2,10 @@ package main
6
7 import (
8 "log"
9+ "smoothie/server"
10+ bm "smoothie/server/middleware/bubbletea"
11+ gm "smoothie/server/middleware/git"
12+ lm "smoothie/server/middleware/logging"
13 "smoothie/tui"
14
15 tea "github.com/charmbracelet/bubbletea"
16@@ -20,9 +24,13 @@ func main() {
17 if err != nil {
18 log.Fatalln(err)
19 }
20- btm := BubbleTeaMiddleware(tui.SessionHandler, tea.WithAltScreen())
21- gm := GitMiddleware(cfg.RepoPath)
22- s, err := NewServer(cfg.Port, cfg.KeyPath, btm, gm, LoggingMiddleware())
23+ s, err := server.NewServer(
24+ cfg.Port,
25+ cfg.KeyPath,
26+ bm.Middleware(tui.SessionHandler, tea.WithAltScreen()),
27+ gm.Middleware(cfg.RepoPath),
28+ lm.Middleware(),
29+ )
30 if err != nil {
31 log.Fatalln(err)
32 }
33diff --git a/server/middleware/bubbletea/tea.go b/server/middleware/bubbletea/tea.go
34new file mode 100644
35index 0000000000000000000000000000000000000000..cd80e8841d2867125f1e751583ee2c79ce2c3ef8
36--- /dev/null
37+++ b/server/middleware/bubbletea/tea.go
38@@ -0,0 +1,22 @@
39+package bubbletea
40+
41+import (
42+ "smoothie/server/middleware"
43+
44+ tea "github.com/charmbracelet/bubbletea"
45+ "github.com/gliderlabs/ssh"
46+)
47+
48+func Middleware(bth func(ssh.Session) tea.Model, opts ...tea.ProgramOption) middleware.Middleware {
49+ return func(sh ssh.Handler) ssh.Handler {
50+ return func(s ssh.Session) {
51+ m := bth(s)
52+ if m != nil {
53+ opts = append(opts, tea.WithInput(s), tea.WithOutput(s))
54+ p := tea.NewProgram(m, opts...)
55+ _ = p.Start()
56+ }
57+ sh(s)
58+ }
59+ }
60+}
61diff --git a/git.go b/server/middleware/git/git.go
62rename from git.go
63rename to server/middleware/git/git.go
64index 6073742dc30c33a4bc62cef79305901ec5015eea..33ef2f0c32a2c626ce117b179ce91f86ae7173a8 100644
65--- a/git.go
66+++ b/server/middleware/git/git.go
67@@ -1,15 +1,16 @@
68-package main
69+package git
70
71 import (
72 "context"
73 "fmt"
74 "os"
75 "os/exec"
76+ "smoothie/server/middleware"
77
78 "github.com/gliderlabs/ssh"
79 )
80
81-func GitMiddleware(repoDir string) Middleware {
82+func Middleware(repoDir string) middleware.Middleware {
83 return func(sh ssh.Handler) ssh.Handler {
84 return func(s ssh.Session) {
85 cmd := s.Command()
86@@ -53,13 +54,9 @@ func fileExists(path string) (bool, error) {
87
88 func fatalGit(s ssh.Session, err error) {
89 // hex length includes 4 byte length prefix and ending newline
90- logError(s, err)
91 msg := err.Error()
92 pktLine := fmt.Sprintf("%04x%s\n", len(msg)+5, msg)
93- _, err = s.Write([]byte(pktLine))
94- if err != nil {
95- logError(s, err)
96- }
97+ _, _ = s.Write([]byte(pktLine))
98 s.Exit(1)
99 }
100
101diff --git a/server/middleware/logging/logging.go b/server/middleware/logging/logging.go
102new file mode 100644
103index 0000000000000000000000000000000000000000..b2515044770438971c1e08f0bfb5b104348d3ed4
104--- /dev/null
105+++ b/server/middleware/logging/logging.go
106@@ -0,0 +1,19 @@
107+package logging
108+
109+import (
110+ "log"
111+ "smoothie/server/middleware"
112+
113+ "github.com/gliderlabs/ssh"
114+)
115+
116+func Middleware() middleware.Middleware {
117+ return func(sh ssh.Handler) ssh.Handler {
118+ return func(s ssh.Session) {
119+ hpk := s.PublicKey() != nil
120+ log.Printf("%s connect %v %v\n", s.RemoteAddr().String(), hpk, s.Command())
121+ sh(s)
122+ log.Printf("%s disconnect %v %v\n", s.RemoteAddr().String(), hpk, s.Command())
123+ }
124+ }
125+}
126diff --git a/server/middleware/middleware.go b/server/middleware/middleware.go
127new file mode 100644
128index 0000000000000000000000000000000000000000..af34d6e2b49e2cf87811a692b649fadf938b2a0b
129--- /dev/null
130+++ b/server/middleware/middleware.go
131@@ -0,0 +1,5 @@
132+package middleware
133+
134+import "github.com/gliderlabs/ssh"
135+
136+type Middleware func(ssh.Handler) ssh.Handler
137diff --git a/server.go b/server/server.go
138rename from server.go
139rename to server/server.go
140index 8289b767ca316d035ef82bf617de073ab56dfc50..9fd69da380679bfdcc7c68458122f1944d617a78 100644
141--- a/server.go
142+++ b/server/server.go
143@@ -1,57 +1,27 @@
144-package main
145+package server
146
147 import (
148 "fmt"
149 "log"
150 "path/filepath"
151+ "smoothie/server/middleware"
152 "strings"
153
154- tea "github.com/charmbracelet/bubbletea"
155 "github.com/charmbracelet/charm/keygen"
156 "github.com/gliderlabs/ssh"
157 gossh "golang.org/x/crypto/ssh"
158 )
159
160-type Middleware func(ssh.Handler) ssh.Handler
161-
162-func LoggingMiddleware() Middleware {
163- return func(sh ssh.Handler) ssh.Handler {
164- return func(s ssh.Session) {
165- hpk := s.PublicKey() != nil
166- log.Printf("%s connect %v %v\n", s.RemoteAddr().String(), hpk, s.Command())
167- sh(s)
168- log.Printf("%s disconnect %v %v\n", s.RemoteAddr().String(), hpk, s.Command())
169- }
170- }
171-}
172-
173 func logError(s ssh.Session, err error) {
174 log.Printf("%s error %v: %s\n", s.RemoteAddr().String(), s.Command(), err)
175 }
176
177-func BubbleTeaMiddleware(bth func(ssh.Session) tea.Model, opts ...tea.ProgramOption) Middleware {
178- return func(sh ssh.Handler) ssh.Handler {
179- return func(s ssh.Session) {
180- m := bth(s)
181- if m != nil {
182- opts = append(opts, tea.WithInput(s), tea.WithOutput(s))
183- p := tea.NewProgram(m, opts...)
184- err := p.Start()
185- if err != nil {
186- logError(s, err)
187- }
188- }
189- sh(s)
190- }
191- }
192-}
193-
194 type Server struct {
195 server *ssh.Server
196 key gossh.PublicKey
197 }
198
199-func NewServer(port int, keyPath string, mw ...Middleware) (*Server, error) {
200+func NewServer(port int, keyPath string, mw ...middleware.Middleware) (*Server, error) {
201 s := &Server{server: &ssh.Server{}}
202 s.server.Version = "OpenSSH_7.6p1"
203 s.server.Addr = fmt.Sprintf(":%d", port)