]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/stats.go
Split long lines
[govpn.git] / src / cypherpunks.ru / govpn / stats.go
index c8ea6223e655912e60e6623344838174a7f6a718..2f6c5170f7654047c5011790d682c399f3457c37 100644 (file)
@@ -20,15 +20,15 @@ package govpn
 
 import (
        "encoding/json"
-       "log"
        "net"
        "time"
-)
 
-const (
-       RWTimeout = 10 * time.Second
+       "github.com/Sirupsen/logrus"
 )
 
+const rwTimeout = 10 * time.Second
+
+// KnownPeers map of all connected GoVPN peers
 type KnownPeers map[string]**Peer
 
 // StatsProcessor is assumed to be run in background. It accepts
@@ -37,29 +37,61 @@ type KnownPeers map[string]**Peer
 // argument is a reference to the map with references to the peers as
 // values. Map is used here because of ease of adding and removing
 // elements in it.
-func StatsProcessor(statsPort net.Listener, peers *KnownPeers) {
+func StatsProcessor(stats string, peers *KnownPeers) {
        var conn net.Conn
-       var err error
-       var data []byte
        buf := make([]byte, 2<<8)
+       fields := logrus.Fields{
+               "func":    logFuncPrefix + "StatsProcessor",
+               "bufsize": len(buf),
+               "port":    stats,
+       }
+
+       logger.WithFields(
+               fields,
+       ).WithField(
+               "port", stats,
+       ).Debug("Stats are going to listen")
+       statsPort, err := net.Listen("tcp", stats)
+       if err != nil {
+               logger.WithError(err).WithField(
+                       "stats", stats,
+               ).Error("Can't listen stats server")
+               return
+       }
+
        for {
                conn, err = statsPort.Accept()
                if err != nil {
-                       log.Println("Error during accepting connection", err.Error())
+                       logger.WithFields(fields).WithError(err).Error("Can't accept connection")
                        continue
                }
-               conn.SetDeadline(time.Now().Add(RWTimeout))
-               conn.Read(buf)
-               conn.Write([]byte("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n"))
-               var peersList []*Peer
-               for _, peer := range *peers {
-                       peersList = append(peersList, *peer)
+               deadLine := time.Now().Add(rwTimeout)
+               if err = conn.SetDeadline(deadLine); err != nil {
+                       logger.WithFields(
+                               fields,
+                       ).WithField(
+                               "deadline",
+                               deadLine.String(),
+                       ).WithError(err).Error("Can't set deadline")
+               } else if _, err = conn.Read(buf); err != nil {
+                       logger.WithFields(fields).WithError(err).Error("Can't read buffer")
+               } else if _, err = conn.Write([]byte("HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n")); err != nil {
+                       logger.WithFields(fields).WithError(err).Error("Can't write HTTP headers")
+               } else {
+                       var peersList []*Peer
+                       for _, peer := range *peers {
+                               peersList = append(peersList, *peer)
+                       }
+                       if err = json.NewEncoder(conn).Encode(peersList); err != nil {
+                               logger.WithFields(
+                                       fields,
+                               ).WithField(
+                                       "peers", len(peersList),
+                               ).WithError(err).Error("Can't encode to JSON")
+                       }
                }
-               data, err = json.Marshal(peersList)
-               if err != nil {
-                       panic(err)
+               if err = conn.Close(); err != nil {
+                       logger.WithFields(fields).WithError(err).Error("Can't close connection")
                }
-               conn.Write(data)
-               conn.Close()
        }
 }