Skip to content

Commit 7cad98b

Browse files
committed
Use log/slog for logging
1 parent ec668a7 commit 7cad98b

File tree

2 files changed

+38
-74
lines changed

2 files changed

+38
-74
lines changed

logging.go

-54
This file was deleted.

sshmux.go

+38-20
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"log"
7+
"log/slog"
78
"net"
89
"net/netip"
910
"os"
@@ -25,7 +26,7 @@ type Server struct {
2526
SSHConfig *ssh.ServerConfig
2627
ProxyUpstreams []netip.Prefix
2728
Authenticator Authenticator
28-
Logger Logger
29+
LogWriter *net.Conn
2930
UsernamePolicy UsernamePolicyConfig
3031
PasswordPolicy PasswordPolicyConfig
3132
}
@@ -54,13 +55,21 @@ func makeServer(config Config) (*Server, error) {
5455
}
5556
proxyUpstreams = append(proxyUpstreams, network)
5657
}
58+
var loggerEndpoint *net.Conn = nil
59+
if config.Logger != "" {
60+
conn, err := net.Dial("udp", config.Logger)
61+
if err != nil {
62+
log.Fatalf("Logger Dial failed: %s\n", err)
63+
}
64+
loggerEndpoint = &conn
65+
}
5766
sshmux := &Server{
5867
Address: config.Address,
5968
Banner: config.Banner,
6069
SSHConfig: sshConfig,
6170
ProxyUpstreams: proxyUpstreams,
6271
Authenticator: makeAuthenticator(config),
63-
Logger: makeLogger(config.Logger),
72+
LogWriter: loggerEndpoint,
6473
UsernamePolicy: UsernamePolicyConfig{
6574
InvalidUsername: config.InvalidUsername,
6675
InvalidUsernameMessage: config.InvalidUsernameMessage,
@@ -105,22 +114,28 @@ func (s *Server) handler(conn net.Conn) {
105114
}
106115
defer session.Close()
107116

108-
logMessage := LogMessage{
109-
ConnectTime: time.Now().Unix(),
110-
ClientIp: conn.RemoteAddr().String(),
111-
Username: "", // should be provided by API server
112-
ClientType: "SSH",
113-
Authenticated: true,
117+
var logger *slog.Logger = nil
118+
if s.LogWriter != nil {
119+
logger = slog.New(slog.NewJSONHandler(*s.LogWriter, nil))
114120
}
115-
defer s.Logger.SendLog(&logMessage)
121+
logger = logger.With(
122+
slog.Int64("connect_time", time.Now().Unix()),
123+
slog.String("remote_ip", conn.RemoteAddr().String()),
124+
slog.String("client_type", "SSH"),
125+
)
126+
defer logger.Info("SSH proxy session", slog.Int64("disconnect_time", time.Now().Unix()))
116127

117128
select {
118129
case <-s.ctx.Done():
119130
return
120131
default:
121-
if err := s.RunPipeSession(session, &logMessage); err != nil {
132+
attrs, err := s.RunPipeSession(session)
133+
if err != nil {
122134
log.Println("runPipeSession:", err)
123135
}
136+
for _, attr := range attrs {
137+
logger = logger.With(attr)
138+
}
124139
}
125140
}
126141

@@ -282,6 +297,19 @@ func (s *Server) Handshake(session *ssh.PipeSession) error {
282297
}
283298
}
284299

300+
func (s *Server) RunPipeSession(session *ssh.PipeSession) ([]slog.Attr, error) {
301+
err := s.Handshake(session)
302+
if err != nil {
303+
return make([]slog.Attr, 0), err
304+
}
305+
attrs := []slog.Attr{
306+
slog.String("username", session.Downstream.User()),
307+
slog.String("host_ip", session.Upstream.RemoteAddr().String()),
308+
slog.Bool("authenticated", true),
309+
}
310+
return attrs, session.RunPipe()
311+
}
312+
285313
func (s *Server) Start() error {
286314
// set up TCP listener
287315
listener, err := net.Listen("tcp", s.Address)
@@ -333,13 +361,3 @@ func (s *Server) Shutdown() {
333361
}
334362
s.wg.Wait()
335363
}
336-
337-
func (s *Server) RunPipeSession(session *ssh.PipeSession, logMessage *LogMessage) error {
338-
err := s.Handshake(session)
339-
if err != nil {
340-
return err
341-
}
342-
logMessage.Username = session.Downstream.User()
343-
logMessage.HostIp = session.Upstream.RemoteAddr().String()
344-
return session.RunPipe()
345-
}

0 commit comments

Comments
 (0)