]> Cypherpunks.ru repositories - govpn.git/blobdiff - src/cypherpunks.ru/govpn/stats.go
Refactor govpn common package
[govpn.git] / src / cypherpunks.ru / govpn / stats.go
index d80c581b4d22766e300dc96c8b86f8f26ee44828..01e321d48e415eb470159491c449d1739ade9785 100644 (file)
@@ -1,6 +1,6 @@
 /*
 GoVPN -- simple secure free software virtual private network daemon
-Copyright (C) 2014-2017 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -20,15 +20,14 @@ 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
 
@@ -38,29 +37,46 @@ 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("Couldn'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("Couldn't set deadline")
+               } else if _, err = conn.Read(buf); err != nil {
+                       logger.WithFields(fields).WithError(err).Error("Couldn'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("Couldn'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("Couldn'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("Couldn't close connection")
                }
-               conn.Write(data)
-               conn.Close()
        }
 }