|
@@ -136,18 +136,17 @@ type clientConn struct {
|
136
|
136
|
}
|
137
|
137
|
|
138
|
138
|
// NewServer returns a new Oragono server.
|
139
|
|
-func NewServer(configFilename string, config *Config) *Server {
|
|
139
|
+func NewServer(configFilename string, config *Config, logger *Logger) (*Server, error) {
|
140
|
140
|
casefoldedName, err := Casefold(config.Server.Name)
|
141
|
141
|
if err != nil {
|
142
|
|
- log.Println(fmt.Sprintf("Server name isn't valid: [%s]", config.Server.Name), err.Error())
|
143
|
|
- return nil
|
|
142
|
+ return nil, fmt.Errorf("Server name isn't valid [%s]: %s", config.Server.Name, err.Error())
|
144
|
143
|
}
|
145
|
144
|
|
146
|
145
|
// startup check that we have HELP entries for every command
|
147
|
146
|
for name := range Commands {
|
148
|
147
|
_, exists := Help[strings.ToLower(name)]
|
149
|
148
|
if !exists {
|
150
|
|
- log.Fatal("Help entry does not exist for ", name)
|
|
149
|
+ return nil, fmt.Errorf("Help entry does not exist for command %s", name)
|
151
|
150
|
}
|
152
|
151
|
}
|
153
|
152
|
|
|
@@ -162,20 +161,20 @@ func NewServer(configFilename string, config *Config) *Server {
|
162
|
161
|
|
163
|
162
|
operClasses, err := config.OperatorClasses()
|
164
|
163
|
if err != nil {
|
165
|
|
- log.Fatal("Error loading oper classes:", err.Error())
|
|
164
|
+ return nil, fmt.Errorf("Error loading oper classes: %s", err.Error())
|
166
|
165
|
}
|
167
|
166
|
opers, err := config.Operators(operClasses)
|
168
|
167
|
if err != nil {
|
169
|
|
- log.Fatal("Error loading operators:", err.Error())
|
|
168
|
+ return nil, fmt.Errorf("Error loading operators: %s", err.Error())
|
170
|
169
|
}
|
171
|
170
|
|
172
|
171
|
connectionLimits, err := NewConnectionLimits(config.Server.ConnectionLimits)
|
173
|
172
|
if err != nil {
|
174
|
|
- log.Fatal("Error loading connection limits:", err.Error())
|
|
173
|
+ return nil, fmt.Errorf("Error loading connection limits: %s", err.Error())
|
175
|
174
|
}
|
176
|
175
|
connectionThrottle, err := NewConnectionThrottle(config.Server.ConnectionThrottle)
|
177
|
176
|
if err != nil {
|
178
|
|
- log.Fatal("Error loading connection throttler:", err.Error())
|
|
177
|
+ return nil, fmt.Errorf("Error loading connection throttler: %s", err.Error())
|
179
|
178
|
}
|
180
|
179
|
|
181
|
180
|
server := &Server{
|
|
@@ -204,6 +203,7 @@ func NewServer(configFilename string, config *Config) *Server {
|
204
|
203
|
},
|
205
|
204
|
},
|
206
|
205
|
listeners: make(map[string]ListenerInterface),
|
|
206
|
+ logger: logger,
|
207
|
207
|
monitoring: make(map[string][]Client),
|
208
|
208
|
name: config.Server.Name,
|
209
|
209
|
nameCasefolded: casefoldedName,
|
|
@@ -221,7 +221,7 @@ func NewServer(configFilename string, config *Config) *Server {
|
221
|
221
|
// open data store
|
222
|
222
|
db, err := buntdb.Open(config.Datastore.Path)
|
223
|
223
|
if err != nil {
|
224
|
|
- log.Fatal(fmt.Sprintf("Failed to open datastore: %s", err.Error()))
|
|
224
|
+ return nil, fmt.Errorf("Failed to open datastore: %s", err.Error())
|
225
|
225
|
}
|
226
|
226
|
server.store = db
|
227
|
227
|
|
|
@@ -229,7 +229,7 @@ func NewServer(configFilename string, config *Config) *Server {
|
229
|
229
|
err = server.store.View(func(tx *buntdb.Tx) error {
|
230
|
230
|
version, _ := tx.Get(keySchemaVersion)
|
231
|
231
|
if version != latestDbSchema {
|
232
|
|
- log.Println(fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
|
|
232
|
+ logger.Log(LogError, "startup", "server", fmt.Sprintf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version))
|
233
|
233
|
return errDbOutOfDate
|
234
|
234
|
}
|
235
|
235
|
return nil
|
|
@@ -237,7 +237,7 @@ func NewServer(configFilename string, config *Config) *Server {
|
237
|
237
|
if err != nil {
|
238
|
238
|
// close the db
|
239
|
239
|
db.Close()
|
240
|
|
- return nil
|
|
240
|
+ return nil, errDbOutOfDate
|
241
|
241
|
}
|
242
|
242
|
|
243
|
243
|
// load *lines
|
|
@@ -261,7 +261,7 @@ func NewServer(configFilename string, config *Config) *Server {
|
261
|
261
|
return nil
|
262
|
262
|
})
|
263
|
263
|
if err != nil {
|
264
|
|
- log.Fatal(fmt.Sprintf("Could not load salt: %s", err.Error()))
|
|
264
|
+ return nil, fmt.Errorf("Could not load salt: %s", err.Error())
|
265
|
265
|
}
|
266
|
266
|
|
267
|
267
|
if config.Server.MOTD != "" {
|
|
@@ -309,11 +309,11 @@ func NewServer(configFilename string, config *Config) *Server {
|
309
|
309
|
|
310
|
310
|
// start API if enabled
|
311
|
311
|
if server.restAPI.Enabled {
|
312
|
|
- Log.info.Printf("%s rest API started on %s .", server.name, server.restAPI.Listen)
|
|
312
|
+ logger.Log(LogInfo, "startup", "server", fmt.Sprintf("%s rest API started on %s.", server.name, server.restAPI.Listen))
|
313
|
313
|
server.startRestAPI()
|
314
|
314
|
}
|
315
|
315
|
|
316
|
|
- return server
|
|
316
|
+ return server, nil
|
317
|
317
|
}
|
318
|
318
|
|
319
|
319
|
// setISupport sets up our RPL_ISUPPORT reply.
|
|
@@ -378,7 +378,7 @@ func (server *Server) Shutdown() {
|
378
|
378
|
server.clients.ByNickMutex.RUnlock()
|
379
|
379
|
|
380
|
380
|
if err := server.store.Close(); err != nil {
|
381
|
|
- Log.error.Println("Server.Shutdown store.Close: error:", err)
|
|
381
|
+ server.logger.Log(LogError, "shutdown", "db", fmt.Sprintln("Server.Shutdown store.Close: error:", err))
|
382
|
382
|
}
|
383
|
383
|
}
|
384
|
384
|
|
|
@@ -398,7 +398,7 @@ func (server *Server) Run() {
|
398
|
398
|
// eventually we expect to use HUP to reload config
|
399
|
399
|
err := server.rehash()
|
400
|
400
|
if err != nil {
|
401
|
|
- Log.error.Println("Failed to rehash:", err.Error())
|
|
401
|
+ server.logger.Log(LogError, "rehash", "server", fmt.Sprintln("Failed to rehash:", err.Error()))
|
402
|
402
|
}
|
403
|
403
|
|
404
|
404
|
case conn := <-server.newConns:
|
|
@@ -497,7 +497,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
|
497
|
497
|
server.listeners[addr] = li
|
498
|
498
|
|
499
|
499
|
// start listening
|
500
|
|
- Log.info.Printf("%s listening on %s using %s.", server.name, addr, tlsString)
|
|
500
|
+ server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("listening on %s using %s.", addr, tlsString))
|
501
|
501
|
|
502
|
502
|
// setup accept goroutine
|
503
|
503
|
go func() {
|
|
@@ -549,7 +549,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
|
549
|
549
|
server.listenerUpdateMutex.Unlock()
|
550
|
550
|
|
551
|
551
|
// print notice
|
552
|
|
- Log.info.Printf("%s updated listener %s using %s.", server.name, addr, tlsString)
|
|
552
|
+ server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("updated listener %s using %s.", addr, tlsString))
|
553
|
553
|
}
|
554
|
554
|
default:
|
555
|
555
|
// no events waiting for us, fall-through and continue
|
|
@@ -565,7 +565,7 @@ func (server *Server) createListener(addr string, tlsMap map[string]*tls.Config)
|
565
|
565
|
func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig) {
|
566
|
566
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
567
|
567
|
if r.Method != "GET" {
|
568
|
|
- Log.error.Printf("%s method not allowed", server.name)
|
|
568
|
+ server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s method not allowed", r.Method))
|
569
|
569
|
return
|
570
|
570
|
}
|
571
|
571
|
|
|
@@ -578,7 +578,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
|
578
|
578
|
|
579
|
579
|
ws, err := upgrader.Upgrade(w, r, nil)
|
580
|
580
|
if err != nil {
|
581
|
|
- Log.error.Printf("%s websocket upgrade error: %s", server.name, err)
|
|
581
|
+ server.logger.Log(LogError, "ws", addr, fmt.Sprintf("%s websocket upgrade error: %s", server.name, err))
|
582
|
582
|
return
|
583
|
583
|
}
|
584
|
584
|
|
|
@@ -596,7 +596,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
|
596
|
596
|
if listenTLS {
|
597
|
597
|
tlsString = "TLS"
|
598
|
598
|
}
|
599
|
|
- Log.info.Printf("%s websocket listening on %s using %s.", server.name, addr, tlsString)
|
|
599
|
+ server.logger.Log(LogInfo, "listeners", "listener", fmt.Sprintf("websocket listening on %s using %s.", addr, tlsString))
|
600
|
600
|
|
601
|
601
|
if listenTLS {
|
602
|
602
|
err = http.ListenAndServeTLS(addr, config.Cert, config.Key, nil)
|
|
@@ -604,7 +604,7 @@ func (server *Server) wslisten(addr string, tlsMap map[string]*TLSListenConfig)
|
604
|
604
|
err = http.ListenAndServe(addr, nil)
|
605
|
605
|
}
|
606
|
606
|
if err != nil {
|
607
|
|
- Log.error.Printf("%s listenAndServe (%s) error: %s", server.name, tlsString, err)
|
|
607
|
+ server.logger.Log(LogError, "listeners", "listener", fmt.Sprintf("listenAndServe error [%s]: %s", tlsString, err))
|
608
|
608
|
}
|
609
|
609
|
}()
|
610
|
610
|
}
|