4d5e35b1db3b9dcc963d5e7ca01358a367536c82

Author
Toby Padilla <toby@charm.sh>
Committer
Toby Padilla <toby@charm.sh>
Date

Message

Refactor into middleware and server packages

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)