From b2ffd3fb33ac5de19f02b035b60ed87444ae4068 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sun, 2 Sep 2018 20:59:14 +0200 Subject: [PATCH] IPAddress Info --- CppNet | 2 +- src/client.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/CppNet b/CppNet index 28bdd48..afd053e 160000 --- a/CppNet +++ b/CppNet @@ -1 +1 @@ -Subproject commit 28bdd489d036201e95cf40dd8593e6b40c0a9554 +Subproject commit afd053e35702e7b8c750297df2aea1450711cb31 diff --git a/src/client.cpp b/src/client.cpp index 29830bd..c40045c 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "../CppNet/src/network/Socket.h" #include "../CppNet/src/network/http/HttpRequest.h" @@ -21,6 +22,19 @@ #include "../CppNet/src/network/http/HttpStatusCode.h" #include "URI.h" #include "procopen.h" +#include "../CppNet/src/network/Address.h" + + +typedef struct { + const char* host; + const char* cc; + const char* country; + const char* prov; + const char* provname; + const char* city; + const char* timezone; + const char* localdate; +} IpAddressInfo; /** @@ -45,6 +59,32 @@ void php_error_handler(const char *prefix, FILE *stderr) { fclose(stderr); } +IpAddressInfo get_ip_address_info(Address* addr) { + FILE *name = popen(("/opt/ipinfo/ipinfo.py " + addr->toString()).c_str(), "r"); + char hostbuffer[1024]; + memset(hostbuffer, 0, 1024); + size_t size = fread(hostbuffer, 1, 1024, name); + istringstream buffer(hostbuffer); + string line; + + IpAddressInfo info; + int num = 0; + while (std::getline(buffer, line)) { + switch (num) { + case 0: info.host = line.c_str(); break; + case 1: info.cc = line.c_str(); break; + case 2: info.country = line.c_str(); break; + case 3: info.prov = line.c_str(); break; + case 4: info.provname = line.c_str(); break; + case 5: info.city = line.c_str(); break; + case 6: info.timezone = line.c_str(); break; + case 7: info.localdate = line.c_str(); break; + } + num++; + } + return info; +} + string getETag(string filename) { ifstream etags = ifstream("/var/necronda/ETags"); @@ -148,7 +188,7 @@ long getPosition(std::string str, char c, int occurence) { * @param num The Connection Number in the client * @return Should the server wait for another header? */ -bool connection_handler(const char *preprefix, const char *col1, const char *col2, Socket *socket, long id, long num) { +bool connection_handler(const char *preprefix, const char *col1, const char *col2, Socket *socket, long id, long num, IpAddressInfo info) { bool error = false; char buffer[1024]; char *prefix = (char *) preprefix; @@ -172,7 +212,7 @@ bool connection_handler(const char *preprefix, const char *col1, const char *col host.erase(pos, host.length() - pos); } - FILE *name = popen(("dig @8.8.8.8 +time=1 -x " + socket->getPeerAddress()->toString() + + /*FILE *name = popen(("dig @8.8.8.8 +time=1 -x " + socket->getPeerAddress()->toString() + " | grep -oP \"^[^;].*\\t\\K([^ ]*)\\w\"").c_str(), "r"); char hostbuffer[1024]; memset(hostbuffer, 0, 1024); @@ -180,10 +220,10 @@ bool connection_handler(const char *preprefix, const char *col1, const char *col hostbuffer[size - 1] = 0; // remove \n if (size <= 1) { sprintf(hostbuffer, "%s", socket->getPeerAddress()->toString().c_str()); - } + }*/ sprintf(buffer, "[\x1B[1m%s\x1B[0m][%i]%s[%s][%i]%s ", host.c_str(), socket->getSocketPort(), col1, - hostbuffer, socket->getPeerPort(), col2); + info.host, socket->getPeerPort(), col2); prefix = buffer; log(prefix, "\x1B[1m" + req.getMethod() + " " + req.getPath() + "\x1B[0m"); @@ -459,6 +499,7 @@ void client_handler(Socket *socket, long id, bool ssl) { const char *prefix; char const *col1; char const *col2 = "\x1B[0m"; + IpAddressInfo info = get_ip_address_info(socket->getPeerAddress()); { auto group = (int) (id % 6); if (group == 0) { @@ -474,14 +515,19 @@ void client_handler(Socket *socket, long id, bool ssl) { } else { col1 = "\x1B[0;36m"; // Cyan } + string *a = new string("[" + socket->getSocketAddress()->toString() + "][" + to_string(socket->getSocketPort()) + "]" + col1 + - "[" + socket->getPeerAddress()->toString() + "][" + to_string(socket->getPeerPort()) + + "[" + info.host + "][" + to_string(socket->getPeerPort()) + "]" + col2 + " "); prefix = a->c_str(); } log(prefix, "Connection established"); + log(prefix, string("Host: ") + info.host + " (" + socket->getPeerAddress() + ")"); + log(prefix, string("Location: ") + info.cc + "/" + info.country + ", " + info.prov + "/" + info.provname + ", " + info.city); + log(prefix, string("Local Date: ") + info.localdate + " (" + info.timezone + ")"); + bool err = false; try { @@ -506,7 +552,7 @@ void client_handler(Socket *socket, long id, bool ssl) { long reqnum = 0; if (!err) { - while (connection_handler(prefix, col1, col2, socket, id, ++reqnum)); + while (connection_handler(prefix, col1, col2, socket, id, ++reqnum, info)); reqnum--; }