From: Sergey Matveev Date: Thu, 30 Apr 2015 14:17:02 +0000 (+0300) Subject: Optional HTTP-server providing with known peers information in JSON X-Git-Tag: 2.4^2~4 X-Git-Url: http://www.git.cypherpunks.ru/?p=govpn.git;a=commitdiff_plain;h=1cb8e82cc912433845d3f561484545847638b327 Optional HTTP-server providing with known peers information in JSON Signed-off-by: Sergey Matveev --- diff --git a/README b/README index e9b104e..a47dd94 100644 --- a/README +++ b/README @@ -3,8 +3,8 @@ written on Go programming language. It uses Diffie-Hellman Encrypted Key Exchange (DH-EKE) for mutual zero-knowledge peers authentication and authenticated encrypted data transport. Other features include: IPv4/IPv6, rehandshake, heartbeat, pre-shared authentication keys (PSK), -perfect forward secrecy (PFS), replay attack protection. -GNU/Linux and FreeBSD support. +perfect forward secrecy (PFS), replay attack protection, JSON real-time +statistics. GNU/Linux and FreeBSD support. Home page: http://www.cypherpunks.ru/govpn/ also available as Tor hidden service: http://vabu56j2ep2rwv3b.onion/govpn/ diff --git a/cmd/govpn-client/main.go b/cmd/govpn-client/main.go index 774edd3..b5f86f9 100644 --- a/cmd/govpn-client/main.go +++ b/cmd/govpn-client/main.go @@ -36,6 +36,7 @@ var ( keyPath = flag.String("key", "", "Path to authentication key file") upPath = flag.String("up", "", "Path to up-script") downPath = flag.String("down", "", "Path to down-script") + stats = flag.String("stats", "", "Enable stats retrieving on host:port") mtu = flag.Int("mtu", 1500, "MTU") nonceDiff = flag.Int("noncediff", 1, "Allow nonce difference") timeoutP = flag.Int("timeout", 60, "Timeout seconds") @@ -83,11 +84,21 @@ func main() { var ethPkt []byte var udpPkt *govpn.UDPPkt var udpPktData []byte + knownPeers := govpn.KnownPeers(map[string]**govpn.Peer{remote.String(): &peer}) + + log.Println(govpn.VersionGet()) + if *stats != "" { + log.Println("Stats are going to listen on", *stats) + statsPort, err := net.Listen("tcp", *stats) + if err != nil { + panic(err) + } + go govpn.StatsProcessor(statsPort, &knownPeers) + } termSignal := make(chan os.Signal, 1) signal.Notify(termSignal, os.Interrupt, os.Kill) - log.Println(govpn.VersionGet()) log.Println("Starting handshake") handshake := govpn.HandshakeStart(conn, remote, id, key) diff --git a/cmd/govpn-server/main.go b/cmd/govpn-server/main.go index 3d952ea..2761d34 100644 --- a/cmd/govpn-server/main.go +++ b/cmd/govpn-server/main.go @@ -35,6 +35,7 @@ import ( var ( bindAddr = flag.String("bind", "[::]:1194", "Bind to address") peersPath = flag.String("peers", "peers", "Path to peers keys directory") + stats = flag.String("stats", "", "Enable stats retrieving on host:port") mtu = flag.Int("mtu", 1500, "MTU") nonceDiff = flag.Int("noncediff", 1, "Allow nonce difference") timeoutP = flag.Int("timeout", 60, "Timeout seconds") @@ -110,6 +111,7 @@ func main() { states := make(map[string]*govpn.Handshake) peers := make(map[string]*PeerState) peerReadySink := make(chan PeerReadyEvent) + knownPeers := govpn.KnownPeers(make(map[string]**govpn.Peer)) var peerReady PeerReadyEvent var udpPkt *govpn.UDPPkt var udpPktData []byte @@ -119,6 +121,14 @@ func main() { ethSink := make(chan EthEvent) log.Println(govpn.VersionGet()) + if *stats != "" { + log.Println("Stats are going to listen on", *stats) + statsPort, err := net.Listen("tcp", *stats) + if err != nil { + panic(err) + } + go govpn.StatsProcessor(statsPort, &knownPeers) + } log.Println("Server started") MainCycle: @@ -139,6 +149,7 @@ MainCycle: if state.peer.LastPing.Add(timeout).Before(now) { log.Println("Deleting peer", state.peer) delete(peers, addr) + delete(knownPeers, addr) downPath := path.Join( govpn.PeersPath, state.peer.Id.String(), @@ -155,6 +166,7 @@ MainCycle: continue } delete(peers, addr) + delete(knownPeers, addr) state.terminate <- struct{}{} state.peer.Zero() break @@ -165,6 +177,7 @@ MainCycle: continue } peers[addr] = state + knownPeers[addr] = &peerReady.peer states[addr].Zero() delete(states, addr) log.Println("Registered interface", peerReady.iface, "with peer", peer) diff --git a/doc/overview.texi b/doc/overview.texi index 0330d4c..a96d653 100644 --- a/doc/overview.texi +++ b/doc/overview.texi @@ -62,4 +62,6 @@ authentication (pre-shared key is not transmitted in any form between the peers, not even it's hash value) @item Built-in rehandshake and heartbeat features @item Several simultaneous clients support +@item Optional built-in HTTP-server for retrieving information about +known connected peers in @url{http://json.org/, JSON} format @end itemize diff --git a/doc/user.texi b/doc/user.texi index b177e75..193e945 100644 --- a/doc/user.texi +++ b/doc/user.texi @@ -39,6 +39,10 @@ script that has to print interface's name on the first output line. Optionally there can be @code{down.sh} that will be executed when client disconnects, and @code{name} file containing human readable client's name. +Each of them have ability to show statistics about known connected +peers. If you specify @emph{host:port} in @code{-stats} argument, then +it will run HTTP server on it, responding with JSON documents. + @menu * Example usage:: @end menu @@ -99,7 +103,8 @@ client% while :; do done @end example -FreeBSD IPv6 client-server example: +FreeBSD IPv6 client-server example, with stats enabled on the server +(localhost's 5678 port): @example server% cat > peers/CLIENTID/up.sh <