hid: clean up/finalize logging
This commit is contained in:
parent
e2c34afbc6
commit
c285f3a266
53
xS/main.go
53
xS/main.go
|
@ -952,6 +952,12 @@ func ircNotifyRoommates(c *client, message string) {
|
||||||
|
|
||||||
// --- Clients (continued) -----------------------------------------------------
|
// --- Clients (continued) -----------------------------------------------------
|
||||||
|
|
||||||
|
func (c *client) printDebug(format string, args ...interface{}) {
|
||||||
|
if debugMode {
|
||||||
|
printDebug("(%s) %s", c.address, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func ircAppendClientModes(m uint, mode []byte) []byte {
|
func ircAppendClientModes(m uint, mode []byte) []byte {
|
||||||
if 0 != m&ircUserModeInvisible {
|
if 0 != m&ircUserModeInvisible {
|
||||||
mode = append(mode, 'i')
|
mode = append(mode, 'i')
|
||||||
|
@ -998,6 +1004,8 @@ func (c *client) send(line string) {
|
||||||
bytes = bytes[:ircMaxMessageLength]
|
bytes = bytes[:ircMaxMessageLength]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.printDebug("<- %s", bytes)
|
||||||
|
|
||||||
// TODO: Kill the connection above some "SendQ" threshold (careful!)
|
// TODO: Kill the connection above some "SendQ" threshold (careful!)
|
||||||
c.sendQ = append(c.sendQ, bytes...)
|
c.sendQ = append(c.sendQ, bytes...)
|
||||||
c.sendQ = append(c.sendQ, "\r\n"...)
|
c.sendQ = append(c.sendQ, "\r\n"...)
|
||||||
|
@ -1049,13 +1057,12 @@ func (c *client) unregister(reason string) {
|
||||||
// Close the connection and forget about the client.
|
// Close the connection and forget about the client.
|
||||||
func (c *client) kill(reason string) {
|
func (c *client) kill(reason string) {
|
||||||
if reason == "" {
|
if reason == "" {
|
||||||
reason = "Client exited"
|
c.unregister("Client exited")
|
||||||
|
} else {
|
||||||
|
c.unregister(reason)
|
||||||
}
|
}
|
||||||
c.unregister(reason)
|
|
||||||
|
|
||||||
// TODO: Log the address; seems like we always have c.address.
|
c.printDebug("client destroyed (%s)", reason)
|
||||||
// In fact, do it in most debug logs, could be a method of client.
|
|
||||||
printDebug("client destroyed")
|
|
||||||
|
|
||||||
// Try to send a "close notify" alert if the TLS object is ready,
|
// Try to send a "close notify" alert if the TLS object is ready,
|
||||||
// otherwise just tear down the transport.
|
// otherwise just tear down the transport.
|
||||||
|
@ -2948,14 +2955,14 @@ func ircProcessMessage(c *client, msg *message, raw string) {
|
||||||
|
|
||||||
// Handle the results from initializing the client's connection.
|
// Handle the results from initializing the client's connection.
|
||||||
func (c *client) onPrepared(host string, isTLS bool) {
|
func (c *client) onPrepared(host string, isTLS bool) {
|
||||||
|
c.printDebug("client resolved to %s, TLS %t", host, isTLS)
|
||||||
if !isTLS {
|
if !isTLS {
|
||||||
c.conn = c.transport.(connCloseWriter)
|
c.conn = c.transport.(connCloseWriter)
|
||||||
} else if tlsConf != nil {
|
} else if tlsConf != nil {
|
||||||
c.tls = tls.Server(c.transport, tlsConf)
|
c.tls = tls.Server(c.transport, tlsConf)
|
||||||
c.conn = c.tls
|
c.conn = c.tls
|
||||||
} else {
|
} else {
|
||||||
printDebug("could not initialize TLS for %s: TLS support disabled",
|
c.printDebug("could not initialize TLS: disabled")
|
||||||
c.address)
|
|
||||||
c.kill("TLS support disabled")
|
c.kill("TLS support disabled")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -2988,10 +2995,10 @@ func (c *client) onRead(data []byte, readErr error) {
|
||||||
// XXX: And since it accepts LF, we miscalculate receivedBytes within.
|
// XXX: And since it accepts LF, we miscalculate receivedBytes within.
|
||||||
c.recvQ = c.recvQ[advance:]
|
c.recvQ = c.recvQ[advance:]
|
||||||
line := string(token)
|
line := string(token)
|
||||||
printDebug("-> %s", line)
|
c.printDebug("-> %s", line)
|
||||||
|
|
||||||
if msg := ircParseMessage(line); msg == nil {
|
if msg := ircParseMessage(line); msg == nil {
|
||||||
printDebug("error: invalid line")
|
c.printDebug("error: invalid line")
|
||||||
} else {
|
} else {
|
||||||
ircProcessMessage(c, msg, line)
|
ircProcessMessage(c, msg, line)
|
||||||
}
|
}
|
||||||
|
@ -3001,18 +3008,17 @@ func (c *client) onRead(data []byte, readErr error) {
|
||||||
c.reading = false
|
c.reading = false
|
||||||
|
|
||||||
if readErr != io.EOF {
|
if readErr != io.EOF {
|
||||||
printDebug("%s", readErr)
|
c.printDebug("%s", readErr)
|
||||||
c.kill(readErr.Error())
|
c.kill(readErr.Error())
|
||||||
} else if c.closing {
|
} else if c.closing {
|
||||||
// Disregarding whether a clean shutdown has happened or not.
|
// Disregarding whether a clean shutdown has happened or not.
|
||||||
printDebug("client finished shutdown")
|
c.printDebug("client finished shutdown")
|
||||||
c.kill("")
|
c.kill("")
|
||||||
} else {
|
} else {
|
||||||
printDebug("client EOF")
|
c.printDebug("client EOF")
|
||||||
c.closeLink("")
|
c.closeLink("")
|
||||||
}
|
}
|
||||||
} else if len(c.recvQ) > 8192 {
|
} else if len(c.recvQ) > 8192 {
|
||||||
printDebug("client recvQ overrun")
|
|
||||||
c.closeLink("recvQ overrun")
|
c.closeLink("recvQ overrun")
|
||||||
|
|
||||||
// tls.Conn doesn't have the CloseRead method (and it needs to be able
|
// tls.Conn doesn't have the CloseRead method (and it needs to be able
|
||||||
|
@ -3037,7 +3043,7 @@ func (c *client) onWrite(written int, writeErr error) {
|
||||||
c.writing = false
|
c.writing = false
|
||||||
|
|
||||||
if writeErr != nil {
|
if writeErr != nil {
|
||||||
printDebug("%s", writeErr)
|
c.printDebug("%s", writeErr)
|
||||||
c.kill(writeErr.Error())
|
c.kill(writeErr.Error())
|
||||||
} else if len(c.sendQ) > 0 {
|
} else if len(c.sendQ) > 0 {
|
||||||
c.flushSendQ()
|
c.flushSendQ()
|
||||||
|
@ -3076,12 +3082,7 @@ func accept(ln net.Listener) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func prepare(client *client) {
|
func prepare(client *client) {
|
||||||
conn := client.transport
|
conn, host := client.transport, client.hostname
|
||||||
host, _, err := net.SplitHostPort(conn.RemoteAddr().String())
|
|
||||||
if err != nil {
|
|
||||||
// In effect, we require TCP/UDP, as they have port numbers.
|
|
||||||
exitFatal("%s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Cgo resolver doesn't pthread_cancel getnameinfo threads, so not
|
// The Cgo resolver doesn't pthread_cancel getnameinfo threads, so not
|
||||||
// bothering with pointless contexts.
|
// bothering with pointless contexts.
|
||||||
|
@ -3163,12 +3164,10 @@ func processOneEvent() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
printDebug("accepted client connection")
|
|
||||||
|
|
||||||
// In effect, we require TCP/UDP, as they have port numbers.
|
|
||||||
address := conn.RemoteAddr().String()
|
address := conn.RemoteAddr().String()
|
||||||
host, port, err := net.SplitHostPort(address)
|
host, port, err := net.SplitHostPort(address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// In effect, we require TCP/UDP, as they have port numbers.
|
||||||
exitFatal("%s", err)
|
exitFatal("%s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3183,26 +3182,25 @@ func processOneEvent() {
|
||||||
// TODO: Make this configurable and more fine-grained.
|
// TODO: Make this configurable and more fine-grained.
|
||||||
antiflood: newFloodDetector(10*time.Second, 20),
|
antiflood: newFloodDetector(10*time.Second, 20),
|
||||||
}
|
}
|
||||||
|
|
||||||
clients[c] = true
|
clients[c] = true
|
||||||
|
c.printDebug("new client")
|
||||||
go prepare(c)
|
go prepare(c)
|
||||||
|
|
||||||
// The TLS autodetection in prepare needs to have a timeout.
|
// The TLS autodetection in prepare needs to have a timeout.
|
||||||
c.setKillTimer()
|
c.setKillTimer()
|
||||||
|
|
||||||
case ev := <-prepared:
|
case ev := <-prepared:
|
||||||
printDebug("client is ready: %s", ev.host)
|
|
||||||
if _, ok := clients[ev.client]; ok {
|
if _, ok := clients[ev.client]; ok {
|
||||||
ev.client.onPrepared(ev.host, ev.isTLS)
|
ev.client.onPrepared(ev.host, ev.isTLS)
|
||||||
}
|
}
|
||||||
|
|
||||||
case ev := <-reads:
|
case ev := <-reads:
|
||||||
printDebug("received data from client")
|
|
||||||
if _, ok := clients[ev.client]; ok {
|
if _, ok := clients[ev.client]; ok {
|
||||||
ev.client.onRead(ev.data, ev.err)
|
ev.client.onRead(ev.data, ev.err)
|
||||||
}
|
}
|
||||||
|
|
||||||
case ev := <-writes:
|
case ev := <-writes:
|
||||||
printDebug("sent data to client")
|
|
||||||
if _, ok := clients[ev.client]; ok {
|
if _, ok := clients[ev.client]; ok {
|
||||||
ev.client.onWrite(ev.written, ev.err)
|
ev.client.onWrite(ev.written, ev.err)
|
||||||
}
|
}
|
||||||
|
@ -3392,6 +3390,7 @@ func ircSetupListenFDs() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
listeners = append(listeners, ln)
|
listeners = append(listeners, ln)
|
||||||
|
printStatus("listening on %s", address)
|
||||||
}
|
}
|
||||||
if len(listeners) == 0 {
|
if len(listeners) == 0 {
|
||||||
return errors.New("network setup failed: no ports to listen on")
|
return errors.New("network setup failed: no ports to listen on")
|
||||||
|
@ -3405,7 +3404,7 @@ func ircSetupListenFDs() error {
|
||||||
// --- Main --------------------------------------------------------------------
|
// --- Main --------------------------------------------------------------------
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.BoolVar(&debugMode, "debug", false, "run in debug mode")
|
flag.BoolVar(&debugMode, "debug", false, "run in verbose debug mode")
|
||||||
version := flag.Bool("version", false, "show version and exit")
|
version := flag.Bool("version", false, "show version and exit")
|
||||||
writeDefaultCfg := flag.Bool("writedefaultcfg", false,
|
writeDefaultCfg := flag.Bool("writedefaultcfg", false,
|
||||||
"write a default configuration file and exit")
|
"write a default configuration file and exit")
|
||||||
|
|
Loading…
Reference in New Issue