4
4
"bufio"
5
5
"context"
6
6
"fmt"
7
- "log"
8
7
"log/slog"
9
8
"net"
10
9
"os"
@@ -16,9 +15,8 @@ import (
16
15
17
16
"github.com/creack/pty"
18
17
"github.com/function61/function22/pkg/linuxuser"
19
- "github.com/function61/gokit/app/dynversion "
18
+ "github.com/function61/gokit/app/cli "
20
19
"github.com/function61/gokit/io/bidipipe"
21
- "github.com/function61/gokit/log/logex"
22
20
"github.com/function61/gokit/os/osutil"
23
21
gliderssh "github.com/gliderlabs/ssh"
24
22
"github.com/spf13/cobra"
@@ -31,27 +29,22 @@ const (
31
29
32
30
func main () {
33
31
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
+ }),
46
37
}
47
38
39
+ cli .AddLogLevelControls (app .Flags ())
40
+
48
41
app .AddCommand (generateHostKeyEntrypoint ())
49
42
app .AddCommand (installEntrypoint ())
50
43
51
- osutil . ExitIfError ( app . Execute () )
44
+ cli . Execute (app )
52
45
}
53
46
54
- func logic (ctx context.Context , verbose bool , logger * log. Logger ) error {
47
+ func logic (ctx context.Context ) error {
55
48
listenInterface := os .Getenv ("SSH_LISTEN_INTERFACE" )
56
49
57
50
allowedUsersSerialized , err := osutil .GetenvRequired ("SSH_ALLOWED_USERS" ) // "user1,user2"
@@ -89,8 +82,8 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
89
82
90
83
if err := gliderssh .Serve (sshPortListener , func (s gliderssh.Session ) {
91
84
// 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 )
94
87
}
95
88
},
96
89
gliderssh .HostKeyFile (defaultHostKeyFile ),
@@ -99,7 +92,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
99
92
100
93
account , found := knownUsers [username ]
101
94
if ! found {
102
- logger . Printf ("login attempt for unknown user: %s " , username )
95
+ slog . Warn ("login attempt for unknown user" , "username " , username )
103
96
return false
104
97
}
105
98
@@ -111,7 +104,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
111
104
}),
112
105
gliderssh .PublicKeyAuth (func (ctx gliderssh.Context , userKey gliderssh.PublicKey ) bool {
113
106
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 ())
115
108
return false
116
109
}
117
110
@@ -121,7 +114,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
121
114
if os .IsNotExist (err ) { // user simply doesn't have them
122
115
return false
123
116
} else {
124
- logger . Printf ("error reading authorized_keys: %v " , err )
117
+ slog . Error ("error reading authorized_keys" , "err " , err )
125
118
return false
126
119
}
127
120
}
@@ -131,7 +124,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
131
124
for authorizedKeys .Scan () {
132
125
authorizedKey , _ , _ , _ , err := gliderssh .ParseAuthorizedKey (authorizedKeys .Bytes ())
133
126
if err != nil {
134
- logger . Printf ("ParseAuthorizedKey: %v " , err )
127
+ slog . Error ("ParseAuthorizedKey" , "err " , err )
135
128
return false
136
129
}
137
130
@@ -140,7 +133,7 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
140
133
}
141
134
}
142
135
if err := authorizedKeys .Err (); err != nil {
143
- logger . Printf ( "error scanning: %v " , err )
136
+ slog . Error ( " scanning" , "err " , err )
144
137
return false
145
138
}
146
139
@@ -158,18 +151,16 @@ func logic(ctx context.Context, verbose bool, logger *log.Logger) error {
158
151
return nil
159
152
}
160
153
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 ()
164
156
165
- tcpAddress := s .RemoteAddr ().(* net.TCPAddr )
157
+ tcpAddress := s .RemoteAddr ().(* net.TCPAddr )
166
158
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 )
170
161
171
162
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 )
173
164
fmt .Fprint (s , "unsupported subsystem specified\n " )
174
165
return 1
175
166
}
@@ -256,7 +247,7 @@ func handleSSHConnection(s gliderssh.Session, account linuxuser.Account, verbose
256
247
if isPty {
257
248
terminal , err := pty .Start (cmd )
258
249
if err != nil {
259
- logger . Printf ( "running shell: %v " , err )
250
+ slog . Error ( "starting shell" , "err " , err )
260
251
return 1
261
252
}
262
253
defer terminal .Close ()
0 commit comments