diff options
Diffstat (limited to 'server/src/queryhandlerpentominos.cc')
-rw-r--r-- | server/src/queryhandlerpentominos.cc | 240 |
1 files changed, 45 insertions, 195 deletions
diff --git a/server/src/queryhandlerpentominos.cc b/server/src/queryhandlerpentominos.cc index 62a742f..33609cc 100644 --- a/server/src/queryhandlerpentominos.cc +++ b/server/src/queryhandlerpentominos.cc @@ -28,232 +28,82 @@ #include "debug.h" -#include <config.h> +#include "configuration.h" -// For time -#include <time.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -// For getpid -#include <unistd.h> -#include <sys/types.h> - -// For time -#include <time.h> - -// For strerror and errno -#include <errno.h> - -// For socket and friends -#include <sys/socket.h> -#include <arpa/inet.h> -#include <net/if.h> -#include <netinet/in.h> - -// For ioctl -#include <sys/ioctl.h> - -#include "queryparser.h" - -typedef struct { - in_addr_t ip; - time_t time; - pid_t pid; - unsigned short int count; -} UID; - -#define SIOCGIFCONF 0x8912 // get iface list - -static in_addr_t getIP(const char *interface) +QueryHandlerPentominos::QueryHandlerPentominos(std::string cpr) + : QueryHandler() { - in_addr_t ret = 0; - int numreqs = 30, sd, n; - struct ifconf ifc; - struct ifreq *ifr; - struct in_addr *ia; - - sd = socket(AF_INET, SOCK_STREAM, 0); - if(sd == -1) { - // throw Pentominos::UIDCouldNotConnectException(strerror(errno)); - } - - ifc.ifc_buf = NULL; - ifc.ifc_len = sizeof(struct ifreq) * numreqs; - - ifc.ifc_buf = (char*)malloc(ifc.ifc_len); - if(ifc.ifc_buf == NULL) { - // throw Pentominos::UIDOutOfMemoryException(); - } + this->cpr = cpr; - if (ioctl(sd, SIOCGIFCONF, &ifc) < 0) { - // throw Pentominos::UIDInterfaceListException(strerror(errno)); - } + atfh = atf_init(); - ifr = ifc.ifc_req; - for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) { - ia = (struct in_addr *)((ifr->ifr_ifru.ifru_addr.sa_data)+2); - if(!strcmp(ifr->ifr_ifrn.ifrn_name, interface)) { - ret = *(in_addr_t*)ia; - } - ifr++; - } + bool use_https = false; + atfc = atf_connect(atfh, Conf::pentominos_addr.c_str(), + Conf::pentominos_port, use_https); - if(!ret) { // Still no interface... We're fucked! - // throw Pentominos::UIDInterfaceException(interface); - } - - free(ifc.ifc_buf); - return ret; } - -static unsigned short counter = 0; -static unsigned short getCounter() +QueryHandlerPentominos::~QueryHandlerPentominos() { - return counter++; + atf_disconnect(atfc); + atf_close(atfh); } -static UID uid = {0,0,0,0}; -static std::string getUID(const char *interface) +static QueryResult node2result(atf_result_node_t *node, time_t timestamp) { - if(!uid.ip) uid.ip = getIP(interface); - - time_t t = time(NULL); - if(uid.time != t) counter = 0; // If time differes, reset the counter - uid.time = t; // We need this value every time. - - if(!uid.pid) uid.pid = getpid(); - - uid.count = getCounter(); + QueryResult rnode; + rnode.timestamp = timestamp; + rnode.source = "pentominos"; + + if(!node) return rnode; + + struct _atf_result_node_t *child = node->child; + while(child) { + if(child->value == NULL) { + rnode.groups[child->name] = node2result(child, timestamp); + } else { + rnode.values[child->name] = child->value; + } + child = child->next; + } - char buf[32]; - sprintf(buf, "%08x%08x%04x%04x", uid.ip, (unsigned int)uid.time, uid.pid, uid.count); - return std::string(buf); -} - - -QueryHandlerPentominos::QueryHandlerPentominos(TCPSocket &_socket, std::string cpr) - : QueryHandler(), socket(_socket) -{ - this->cpr = cpr; + return rnode; } QueryResult QueryHandlerPentominos::exec(Query &query) { - time_t timestamp = time(NULL); - std::string uid = getUID("eth0"); - - char buf[512]; - char header[] = - "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - "<artefact xmlns=\"http://www.aasimon.org/pentominos\"\n" - " xmlns:pentominos=\"http://www.aasimon.org/pentominos\"\n" - " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" - " xsi:schemaLocation=\"http://www.aasimon.org/pentominos schema.xsd\">\n"; -#ifndef WITHOUT_PENTOMINOS - socket.write(header, strlen(header)); -#endif/*WITHOUT_PENTOMINOS*/ - - PRACRO_DEBUG(queryhandler, "%s", header); - - sprintf(buf, " <pentominos:entry replyformat=\"xml\"\n" - " cpr=\"%s\"\n" - " operator=\"%s\"\n" - " src_addr=\"%s\"\n" - " dst_addr=\"%s\"\n" - " timestamp=\"%d\"\n" - " uid=\"%s\"/>\n", - cpr.c_str(), - "pracro", -#ifndef WITHOUT_PENTOMINOS - socket.srcaddr().c_str(), - socket.dstaddr().c_str(), -#else - "127.0.0.1", - "127.0.0.1", -#endif/*WITHOUT_PENTOMINOS*/ - (unsigned int)timestamp, - uid.c_str()); -#ifndef WITHOUT_PENTOMINOS - socket.write(buf, strlen(buf)); -#endif/*WITHOUT_PENTOMINOS*/ + atf_transaction_t* atft = atf_new_transaction(atfc, cpr.c_str()); - PRACRO_DEBUG(queryhandler, "%s", buf); + atf_id id = atf_add_query(atft, query.attributes["class"].c_str(), 0, "xml"); - sprintf(buf, " <pentominos:query device_id=\"%s\"\n" - " device_type=\"%s\"\n" - " filter=\"latest\"\n" - " location=\"all\"/>\n", - query.attributes["class"].c_str(), - query.attributes["class"].c_str()); - -#ifndef WITHOUT_PENTOMINOS - socket.write(buf, strlen(buf)); -#endif/*WITHOUT_PENTOMINOS*/ + atf_reply_t *reply = atf_commit(atft); - PRACRO_DEBUG(queryhandler, "%s", buf); + atf_status_t status = atf_get_reply_status(reply, id); + if(status != ATF_STATUS_OK) { return QueryResult(); } + + time_t timestamp = atf_get_reply_timestamp(reply, id); - sprintf(buf, "</artefact>"); + atf_result_node_t *root = atf_get_result_node(reply, id); -#ifndef WITHOUT_PENTOMINOS - socket.write(buf, strlen(buf)); -#endif/*WITHOUT_PENTOMINOS*/ + QueryResult rroot; + rroot.timestamp = timestamp; + rroot.source = "pentominos"; - PRACRO_DEBUG(queryhandler, "%s", buf); + QueryResult result = node2result(root, timestamp); + if(root) rroot.groups[query.attributes["class"]] = result; - QueryResult result; - -#ifndef WITHOUT_PENTOMINOS - QueryParser parser; + atf_free_result_node(root); + atf_free_reply(reply); + atf_free_transaction(atft); - ssize_t size; - - // Read until we've got the entire result. - while((size = socket.read(buf, sizeof(buf))) > 0) { - // fwrite(buf, size, 1, stdout); fflush(stdout); - if(parser.parse(buf, size)) break; - } - - result = parser.result; -#endif/*WITHOUT_PENTOMINOS*/ - - PRACRO_INFO(queryhandler, "Done handling query\n"); - - result.print(); - - return result; + return rroot; } #ifdef TEST_QUERYHANDLERPENTOMINOS int main() { -#ifdef WITHOUT_PENTOMINOS - printf("The project need to be configured for use of Pentominos in order to run this test.\n"); return 1; -#endif/*WITHOUT_PENTOMINOS*/ - - TCPSocket s; - try { - s.connect("localhost", 11108); - } catch(Exception &e) { - printf("ERROR: %s\n", e.what()); - printf("A running instance of the artefact server in needed on localhost, port 11108 in order for this test to run.\n"); - return 1; - } - - QueryHandlerPentominos qh(s, "2003791613"); - - Query q1; - q1.attributes["device_id"] = "lensmeter"; - q1.attributes["device_type"] = "lensmeter"; - QueryResult res = qh.exec(q1); - res.print(); - - return 0; } #endif/*TEST_QUERYHANDLERPENTOMINOS*/ |