Commit 656921a2517be73d7cb8ad8797aaefc8e5769ec3

Authored by Imanol-Mikel Barba Sabariego
1 parent f2154f92

Plugin functional

CMakeLists.txt
... ... @@ -3,7 +3,7 @@ project(nagios_plugins)
3 3  
4 4 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -U__STRICT_ANSI__")
5 5  
6   -set(SOURCE_FILES_CSGO check_csgo/check_csgo.cpp check_memfree/auxiliar.cpp)
  6 +set(SOURCE_FILES_CSGO check_csgo/check_csgo.cpp check_csgo/auxiliar.cpp check_csgo/udp.cpp)
7 7 add_executable(check_csgo ${SOURCE_FILES_CSGO})
8 8  
9 9 set(SOURCE_FILES_MEMFREE check_memfree/check_memfree.cpp check_memfree/range.cpp check_memfree/auxiliar.cpp)
... ...
check_csgo/check_csgo.cpp
... ... @@ -14,7 +14,7 @@ void printHelp(bool longVersion)
14 14 if(longVersion)
15 15 {
16 16 printVersion();
17   - cout << "Check Source DS instance." << endl << endl;
  17 + cout << "Check CS:GO DS instance." << endl << endl;
18 18 printHelp(false);
19 19 cout << "Options:" << endl;
20 20 cout << " -h" << endl;
... ... @@ -30,8 +30,59 @@ void printHelp(bool longVersion)
30 30 cout << "Usage: " << endl << "check_csgo [-hV] -H HOSTADDRESS [-p PORT]" << endl << endl;
31 31 }
32 32  
  33 +SOURCEDS_PACKET* getSourceDSResponse(int s, sockaddr_in *server)
  34 +{
  35 + char *data = new char[DATAGRAM_LENGTH];
  36 + int dataLength = recvMsg(s, data, DATAGRAM_LENGTH, server);
  37 + if(dataLength == -1)
  38 + {
  39 + return NULL;
  40 + }
  41 + char *header = (char*) "\xFF\xFF\xFF\xFF";
  42 + if(memcmp(data,header,HDR_SIZE))
  43 + {
  44 + //Invalid response, or non-supported multi-packet response format
  45 + return NULL;
  46 + }
  47 + SOURCEDS_PACKET *response = new SOURCEDS_PACKET;
  48 + response->data = data+HDR_SIZE;
  49 + response->length = dataLength;
  50 + return response;
  51 +}
  52 +
33 53 int check_csgo(char *hostname, uint16_t port, SERVERINFO *server_info)
34 54 {
  55 + struct sockaddr_in si;
  56 + struct hostent *host = NULL;
  57 + int s;
  58 + int timeout = 10;
  59 + setupSocket(port,hostname,host,timeout,&si,&s);
  60 + string discard;
  61 +
  62 + char *info_query = (char*) "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00";
  63 +
  64 + sendMsg(s,info_query, strlen(info_query)+1,&si);
  65 + SOURCEDS_PACKET *response = getSourceDSResponse(s,&si);
  66 + if(response == NULL)
  67 + {
  68 + return 2;
  69 + }
  70 +
  71 + ssize_t offset = 2;
  72 + server_info->name = string(response->data+offset,strlen(response->data+offset));
  73 + offset += server_info->name.size()+1;
  74 + server_info->map = string(response->data+offset,strlen(response->data+offset));
  75 + offset += server_info->map.size()+1;
  76 + discard = string(response->data+offset,strlen(response->data+offset));
  77 + offset += discard.size() + 1;
  78 + server_info->game = string(response->data+offset,strlen(response->data+offset));
  79 + offset += server_info->game.size()+1;
  80 + offset += 2;
  81 + server_info->players = (uint8_t) *((response->data)+offset);
  82 +
  83 + delete[] (response->data-HDR_SIZE);
  84 + delete response;
  85 +
35 86 return 0;
36 87 }
37 88  
... ... @@ -61,7 +112,7 @@ int main(int argc, char **argv)
61 112 hostname = optarg;
62 113 break;
63 114 case 'p':
64   - port = str2int(optarg);
  115 + port = (uint16_t) str2int(optarg);
65 116 break;
66 117 case 'V':
67 118 printVersion();
... ... @@ -89,17 +140,14 @@ int main(int argc, char **argv)
89 140 {
90 141 case 0:
91 142 cout << " OK";
92   - break;
93   -
94   - case 1:
95   - cout << " WARNING";
  143 + cout << " - " << hostname << " " << server_info.name << " " << server_info.game << " " << server_info.map << " " << server_info.players << endl;
96 144 break;
97 145  
98 146 case 2:
99   - cout << " CRITICAL";
  147 + cout << " CRITICAL - No response";
100 148 break;
101 149 }
102 150  
103   - cout << " - " << server_info.name << " " << server_info.ip << " " << server_info.name << " " << server_info.map << " " << server_info.players << " " << server_info.latency << endl;
  151 +
104 152 return returnCode;
105 153 }
... ...
check_csgo/check_csgo.h
... ... @@ -14,21 +14,27 @@
14 14 #include <sys/time.h>
15 15  
16 16 #include "auxiliar.h"
  17 +#include "udp.h"
17 18  
18 19 #define VERSION "1.0"
  20 +#define DATAGRAM_LENGTH 1400
  21 +#define HDR_SIZE 4
19 22  
  23 +struct sourcedspacket_struct {
  24 + ssize_t length;
  25 + char* data;
  26 +};
  27 +typedef struct sourcedspacket_struct SOURCEDS_PACKET;
20 28  
21 29 struct serverinfo_struct {
22   - char *name;
23   - char *ip;
24   - char *game;
25   - char *map;
26   - unsigned int players;
27   - unsigned int latency;
  30 + string name;
  31 + string game;
  32 + string map;
  33 + uint8_t players;
28 34 };
29   -
30 35 typedef struct serverinfo_struct SERVERINFO;
31 36  
  37 +SOURCEDS_PACKET* getSourceDSResponse(int s, sockaddr_in *server);
32 38 int check_csgo(char *hostname, uint16_t port, SERVERINFO *server_info);
33 39 void printVersion();
34 40 void printHelp(bool longVersion);
... ...
check_csgo/udp.cpp 0 → 100644
  1 +#include "udp.h"
  2 +
  3 +void setupSocket(uint16_t port, char *hostname, struct hostent *host, int timeout, struct sockaddr_in *si, int *s)
  4 +{
  5 + if((*s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
  6 + {
  7 + cout << "Couldn't create socket" << endl;
  8 + exit(3);
  9 + }
  10 + struct timeval tv;
  11 + tv.tv_sec = timeout;
  12 + tv.tv_usec = 0;
  13 + if(setsockopt(*s, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0)
  14 + {
  15 + cout << "Error setting socket timeout" << endl;
  16 + exit(3);
  17 + }
  18 + if(!(host = gethostbyname(hostname)))
  19 + {
  20 + cout << "Client could not get host address information" << endl;
  21 + exit(3);
  22 + }
  23 +
  24 + memset((char *) si, 0, sizeof(*si));
  25 + si->sin_family = AF_INET;
  26 + memcpy (&(si->sin_addr), host->h_addr, host->h_length);
  27 + si->sin_port = htons(port);
  28 +}
  29 +
  30 +int sendMsg(int s, char *msg, size_t msgLength, struct sockaddr_in *si)
  31 +{
  32 + return sendto(s, msg, msgLength, 0,(struct sockaddr*) si, sizeof(*si));
  33 +}
  34 +
  35 +int recvMsg(int s, char *msg, size_t msgLength, struct sockaddr_in *si)
  36 +{
  37 + size_t slen = sizeof(*si);
  38 + return recvfrom(s, msg, msgLength, 0, (struct sockaddr *) si, (socklen_t*)&slen);
  39 +}
... ...
check_csgo/udp.h 0 → 100644
  1 +#ifndef UDP_H
  2 +#define UDP_H
  3 +
  4 +#include <iostream>
  5 +
  6 +#include <string.h>
  7 +#include <cstdlib>
  8 +
  9 +#include <arpa/inet.h>
  10 +#include <sys/socket.h>
  11 +#include <netdb.h>
  12 +#include <netinet/in.h>
  13 +
  14 +using namespace std;
  15 +
  16 +void setupSocket(uint16_t port, char *hostname, struct hostent *host, int timeout, struct sockaddr_in *si, int *s);
  17 +int sendMsg(int s, char *msg, size_t msgLength, struct sockaddr_in *si);
  18 +int recvMsg(int s, char *msg, size_t msgLength, struct sockaddr_in *si);
  19 +
  20 +#endif
... ...