44 "bufio"
55 "context"
66 "fmt"
7- "log"
87 "log/slog"
98 "net"
109 "os"
@@ -16,9 +15,8 @@ import (
1615
1716 "github.com/creack/pty"
1817 "github.com/function61/function22/pkg/linuxuser"
19- "github.com/function61/gokit/app/dynversion "
18+ "github.com/function61/gokit/app/cli "
2019 "github.com/function61/gokit/io/bidipipe"
21- "github.com/function61/gokit/log/logex"
2220 "github.com/function61/gokit/os/osutil"
2321 gliderssh "github.com/gliderlabs/ssh"
2422 "github.com/spf13/cobra"
@@ -31,27 +29,22 @@ const (
3129
3230func main () {
3331 app := & cobra.Command {
34- Use : os .Args [0 ],
35- Short : tagline ,
36- Version : dynversion .Version ,
37- Args : cobra .NoArgs ,
38- Run : func (_ * cobra.Command , args []string ) {
39- rootLogger := logex .StandardLogger ()
40-
41- osutil .ExitIfError (logic (
42- osutil .CancelOnInterruptOrTerminate (rootLogger ),
43- true ,
44- rootLogger ))
45- },
32+ Short : tagline ,
33+ Args : cobra .NoArgs ,
34+ Run : cli .WrapRun (func (ctx context.Context , _ []string ) error {
35+ return logic (ctx )
36+ }),
4637 }
4738
39+ cli .AddLogLevelControls (app .Flags ())
40+
4841 app .AddCommand (generateHostKeyEntrypoint ())
4942 app .AddCommand (installEntrypoint ())
5043
51- osutil . ExitIfError ( app . Execute () )
44+ cli . Execute (app )
5245}
5346
54- func logic (ctx context.Context , verbose bool , logger * log. Logger ) error {
47+ func logic (ctx context.Context ) error {
5548 listenInterface := os .Getenv ("SSH_LISTEN_INTERFACE" )
5649
5750 allowedUsersSerialized , err := osutil .GetenvRequired ("SSH_ALLOWED_USERS" ) // "user1,user2"
@@ -89,8 +82,8 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
8982
9083 if err := gliderssh .Serve (sshPortListener , func (s gliderssh.Session ) {
9184 // user now definitely exists in *knownUsers*
92- if err := s .Exit (handleSSHConnection (s , * knownUsers [s .User ()], verbose , logger )); err != nil {
93- logger . Printf ("session.Exit(): %v " , err )
85+ if err := s .Exit (handleSSHConnection (s , * knownUsers [s .User ()])); err != nil {
86+ slog . Error ("session.Exit()" , "err " , err )
9487 }
9588 },
9689 gliderssh .HostKeyFile (defaultHostKeyFile ),
@@ -99,7 +92,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
9992
10093 account , found := knownUsers [username ]
10194 if ! found {
102- logger . Printf ("login attempt for unknown user: %s " , username )
95+ slog . Warn ("login attempt for unknown user" , "username " , username )
10396 return false
10497 }
10598
@@ -111,7 +104,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
111104 }),
112105 gliderssh .PublicKeyAuth (func (ctx gliderssh.Context , userKey gliderssh.PublicKey ) bool {
113106 if _ , allowed := knownUsers [ctx .User ()]; ! allowed {
114- logger . Printf ("login attempt for unknown user: %s " , ctx .User ())
107+ slog . Warn ("login attempt for unknown user" , "username " , ctx .User ())
115108 return false
116109 }
117110
@@ -121,7 +114,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
121114 if os .IsNotExist (err ) { // user simply doesn't have them
122115 return false
123116 } else {
124- logger . Printf ("error reading authorized_keys: %v " , err )
117+ slog . Error ("error reading authorized_keys" , "err " , err )
125118 return false
126119 }
127120 }
@@ -131,7 +124,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
131124 for authorizedKeys .Scan () {
132125 authorizedKey , _ , _ , _ , err := gliderssh .ParseAuthorizedKey (authorizedKeys .Bytes ())
133126 if err != nil {
134- logger . Printf ("ParseAuthorizedKey: %v " , err )
127+ slog . Error ("ParseAuthorizedKey" , "err " , err )
135128 return false
136129 }
137130
@@ -140,7 +133,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
140133 }
141134 }
142135 if err := authorizedKeys .Err (); err != nil {
143- logger . Printf ( "error scanning: %v " , err )
136+ slog . Error ( " scanning" , "err " , err )
144137 return false
145138 }
146139
@@ -158,18 +151,16 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
158151 return nil
159152}
160153
161- func handleSSHConnection (s gliderssh.Session , account linuxuser.Account , verbose bool , logger * log.Logger ) int {
162- if verbose {
163- user := s .User ()
154+ func handleSSHConnection (s gliderssh.Session , account linuxuser.Account ) int {
155+ user := s .User ()
164156
165- tcpAddress := s .RemoteAddr ().(* net.TCPAddr )
157+ tcpAddress := s .RemoteAddr ().(* net.TCPAddr )
166158
167- logger .Printf ("new session for %q from %v" , user , tcpAddress )
168- defer logger .Printf ("closing session for %q from %v" , user , tcpAddress )
169- }
159+ slog .Debug ("new session" , "user" , user , "tcpAddress" , tcpAddress )
160+ defer slog .Debug ("closing session" , "user" , user , "tcpAddress" , tcpAddress )
170161
171162 if subsys := s .Subsystem (); subsys != "" { // what does this do? AFAIK SCP is a subsystem but even it doesn't set it?
172- logger . Printf ("unsupported subsystem specified: %s " , subsys )
163+ slog . Error ("unsupported subsystem specified" , "subsys " , subsys )
173164 fmt .Fprint (s , "unsupported subsystem specified\n " )
174165 return 1
175166 }
@@ -256,7 +247,7 @@ func handleSSHConnection(s gliderssh.Session, account linuxuser.Account, verbose
256247 if isPty {
257248 terminal , err := pty .Start (cmd )
258249 if err != nil {
259- logger . Printf ( "running shell: %v " , err )
250+ slog . Error ( "starting shell" , "err " , err )
260251 return 1
261252 }
262253 defer terminal .Close ()
0 commit comments