@@ -16,7 +16,6 @@ package main
16
16
17
17
import (
18
18
"container/list"
19
- "context"
20
19
"flag"
21
20
"fmt"
22
21
"log/slog"
@@ -29,9 +28,9 @@ import (
29
28
"syscall"
30
29
"time"
31
30
32
- "github.com/Jigsaw-Code/outline-sdk/transport"
33
31
"github.com/Jigsaw-Code/outline-sdk/transport/shadowsocks"
34
32
"github.com/Jigsaw-Code/outline-ss-server/ipinfo"
33
+ outline_prometheus "github.com/Jigsaw-Code/outline-ss-server/prometheus"
35
34
"github.com/Jigsaw-Code/outline-ss-server/service"
36
35
"github.com/lmittmann/tint"
37
36
"github.com/prometheus/client_golang/prometheus"
@@ -58,15 +57,16 @@ func init() {
58
57
)
59
58
}
60
59
61
- type SSServer struct {
62
- stopConfig func () error
63
- lnManager service.ListenerManager
64
- natTimeout time.Duration
65
- m * outlineMetrics
66
- replayCache service.ReplayCache
60
+ type OutlineServer struct {
61
+ stopConfig func () error
62
+ lnManager service.ListenerManager
63
+ natTimeout time.Duration
64
+ serverMetrics * serverMetrics
65
+ serviceMetrics service.ServiceMetrics
66
+ replayCache service.ReplayCache
67
67
}
68
68
69
- func (s * SSServer ) loadConfig (filename string ) error {
69
+ func (s * OutlineServer ) loadConfig (filename string ) error {
70
70
configData , err := os .ReadFile (filename )
71
71
if err != nil {
72
72
return fmt .Errorf ("failed to read config file %s: %w" , filename , err )
@@ -120,32 +120,6 @@ func newCipherListFromConfig(config ServiceConfig) (service.CipherList, error) {
120
120
return ciphers , nil
121
121
}
122
122
123
- func (s * SSServer ) NewShadowsocksStreamHandler (ciphers service.CipherList ) service.StreamHandler {
124
- authFunc := service .NewShadowsocksStreamAuthenticator (ciphers , & s .replayCache , s .m .tcpServiceMetrics )
125
- // TODO: Register initial data metrics at zero.
126
- return service .NewStreamHandler (authFunc , tcpReadTimeout )
127
- }
128
-
129
- func (s * SSServer ) NewShadowsocksPacketHandler (ciphers service.CipherList ) service.PacketHandler {
130
- return service .NewPacketHandler (s .natTimeout , ciphers , s .m , s .m .udpServiceMetrics )
131
- }
132
-
133
- func (s * SSServer ) NewShadowsocksStreamHandlerFromConfig (config ServiceConfig ) (service.StreamHandler , error ) {
134
- ciphers , err := newCipherListFromConfig (config )
135
- if err != nil {
136
- return nil , err
137
- }
138
- return s .NewShadowsocksStreamHandler (ciphers ), nil
139
- }
140
-
141
- func (s * SSServer ) NewShadowsocksPacketHandlerFromConfig (config ServiceConfig ) (service.PacketHandler , error ) {
142
- ciphers , err := newCipherListFromConfig (config )
143
- if err != nil {
144
- return nil , err
145
- }
146
- return s .NewShadowsocksPacketHandler (ciphers ), nil
147
- }
148
-
149
123
type listenerSet struct {
150
124
manager service.ListenerManager
151
125
listenerCloseFuncs map [string ]func () error
@@ -207,7 +181,7 @@ func (ls *listenerSet) Len() int {
207
181
return len (ls .listenerCloseFuncs )
208
182
}
209
183
210
- func (s * SSServer ) runConfig (config Config ) (func () error , error ) {
184
+ func (s * OutlineServer ) runConfig (config Config ) (func () error , error ) {
211
185
startErrCh := make (chan error )
212
186
stopErrCh := make (chan error )
213
187
stopCh := make (chan struct {})
@@ -243,31 +217,41 @@ func (s *SSServer) runConfig(config Config) (func() error, error) {
243
217
ciphers := service .NewCipherList ()
244
218
ciphers .Update (cipherList )
245
219
246
- sh := s .NewShadowsocksStreamHandler (ciphers )
220
+ ssService , err := service .NewShadowsocksService (
221
+ service .WithCiphers (ciphers ),
222
+ service .WithNatTimeout (s .natTimeout ),
223
+ service .WithMetrics (s .serviceMetrics ),
224
+ service .WithReplayCache (& s .replayCache ),
225
+ )
247
226
ln , err := lnSet .ListenStream (addr )
248
227
if err != nil {
249
228
return err
250
229
}
251
230
slog .Info ("TCP service started." , "address" , ln .Addr ().String ())
252
- go service .StreamServe (ln .AcceptStream , func (ctx context.Context , conn transport.StreamConn ) {
253
- connMetrics := s .m .AddOpenTCPConnection (conn )
254
- sh .Handle (ctx , conn , connMetrics )
255
- })
231
+ go service .StreamServe (ln .AcceptStream , ssService .HandleStream )
256
232
257
233
pc , err := lnSet .ListenPacket (addr )
258
234
if err != nil {
259
235
return err
260
236
}
261
237
slog .Info ("UDP service started." , "address" , pc .LocalAddr ().String ())
262
- ph := s .NewShadowsocksPacketHandler (ciphers )
263
- go ph .Handle (pc )
238
+ go ssService .HandlePacket (pc )
264
239
}
265
240
266
241
for _ , serviceConfig := range config .Services {
267
- var (
268
- sh service.StreamHandler
269
- ph service.PacketHandler
242
+ ciphers , err := newCipherListFromConfig (serviceConfig )
243
+ if err != nil {
244
+ return fmt .Errorf ("failed to create cipher list from config: %v" , err )
245
+ }
246
+ ssService , err := service .NewShadowsocksService (
247
+ service .WithCiphers (ciphers ),
248
+ service .WithNatTimeout (s .natTimeout ),
249
+ service .WithMetrics (s .serviceMetrics ),
250
+ service .WithReplayCache (& s .replayCache ),
270
251
)
252
+ if err != nil {
253
+ return err
254
+ }
271
255
for _ , lnConfig := range serviceConfig .Listeners {
272
256
switch lnConfig .Type {
273
257
case listenerTypeTCP :
@@ -276,36 +260,21 @@ func (s *SSServer) runConfig(config Config) (func() error, error) {
276
260
return err
277
261
}
278
262
slog .Info ("TCP service started." , "address" , ln .Addr ().String ())
279
- if sh == nil {
280
- sh , err = s .NewShadowsocksStreamHandlerFromConfig (serviceConfig )
281
- if err != nil {
282
- return err
283
- }
284
- }
285
- go service .StreamServe (ln .AcceptStream , func (ctx context.Context , conn transport.StreamConn ) {
286
- connMetrics := s .m .AddOpenTCPConnection (conn )
287
- sh .Handle (ctx , conn , connMetrics )
288
- })
263
+ go service .StreamServe (ln .AcceptStream , ssService .HandleStream )
289
264
case listenerTypeUDP :
290
265
pc , err := lnSet .ListenPacket (lnConfig .Address )
291
266
if err != nil {
292
267
return err
293
268
}
294
269
slog .Info ("UDP service started." , "address" , pc .LocalAddr ().String ())
295
- if ph == nil {
296
- ph , err = s .NewShadowsocksPacketHandlerFromConfig (serviceConfig )
297
- if err != nil {
298
- return err
299
- }
300
- }
301
- go ph .Handle (pc )
270
+ go ssService .HandlePacket (pc )
302
271
}
303
272
}
304
273
totalCipherCount += len (serviceConfig .Keys )
305
274
}
306
275
307
276
slog .Info ("Loaded config." , "access_keys" , totalCipherCount , "listeners" , lnSet .Len ())
308
- s .m .SetNumAccessKeys (totalCipherCount , lnSet .Len ())
277
+ s .serverMetrics .SetNumAccessKeys (totalCipherCount , lnSet .Len ())
309
278
return nil
310
279
}()
311
280
@@ -327,7 +296,7 @@ func (s *SSServer) runConfig(config Config) (func() error, error) {
327
296
}
328
297
329
298
// Stop stops serving the current config.
330
- func (s * SSServer ) Stop () error {
299
+ func (s * OutlineServer ) Stop () error {
331
300
stopFunc := s .stopConfig
332
301
if stopFunc == nil {
333
302
return nil
@@ -340,13 +309,14 @@ func (s *SSServer) Stop() error {
340
309
return nil
341
310
}
342
311
343
- // RunSSServer starts a shadowsocks server running, and returns the server or an error.
344
- func RunSSServer (filename string , natTimeout time.Duration , sm * outlineMetrics , replayHistory int ) (* SSServer , error ) {
345
- server := & SSServer {
346
- lnManager : service .NewListenerManager (),
347
- natTimeout : natTimeout ,
348
- m : sm ,
349
- replayCache : service .NewReplayCache (replayHistory ),
312
+ // RunOutlineServer starts an Outline server running, and returns the server or an error.
313
+ func RunOutlineServer (filename string , natTimeout time.Duration , serverMetrics * serverMetrics , serviceMetrics service.ServiceMetrics , replayHistory int ) (* OutlineServer , error ) {
314
+ server := & OutlineServer {
315
+ lnManager : service .NewListenerManager (),
316
+ natTimeout : natTimeout ,
317
+ serverMetrics : serverMetrics ,
318
+ serviceMetrics : serviceMetrics ,
319
+ replayCache : service .NewReplayCache (replayHistory ),
350
320
}
351
321
err := server .loadConfig (filename )
352
322
if err != nil {
@@ -424,14 +394,16 @@ func main() {
424
394
}
425
395
defer ip2info .Close ()
426
396
427
- metrics , err := newPrometheusOutlineMetrics (ip2info )
397
+ serverMetrics := newPrometheusServerMetrics ()
398
+ serverMetrics .SetVersion (version )
399
+ serviceMetrics , err := outline_prometheus .NewServiceMetrics (ip2info )
428
400
if err != nil {
429
- slog .Error ("Failed to create Outline Prometheus metrics. Aborting." , "err" , err )
401
+ slog .Error ("Failed to create Outline Prometheus service metrics. Aborting." , "err" , err )
430
402
}
431
- metrics .SetBuildInfo (version )
432
403
r := prometheus .WrapRegistererWithPrefix ("shadowsocks_" , prometheus .DefaultRegisterer )
433
- r .MustRegister (metrics )
434
- _ , err = RunSSServer (flags .ConfigFile , flags .natTimeout , metrics , flags .replayHistory )
404
+ r .MustRegister (serverMetrics , serviceMetrics )
405
+
406
+ _ , err = RunOutlineServer (flags .ConfigFile , flags .natTimeout , serverMetrics , serviceMetrics , flags .replayHistory )
435
407
if err != nil {
436
408
slog .Error ("Server failed to start. Aborting." , "err" , err )
437
409
}
0 commit comments