Commit 81884b67fbead530e7dd9ef7df39fa5238cc9974
1 parent
fdd9c743
Updated cs2 server checks
Showing
1 changed file
with
147 additions
and
145 deletions
check_csgo/check_csgo.cpp
1 | 1 | #include "check_csgo.h" |
2 | +#include <vector> | |
2 | 3 | |
3 | 4 | using namespace std; |
4 | 5 | |
5 | 6 | char *servicename = (char*)"CS:GO"; |
6 | 7 | |
7 | -void printVersion() | |
8 | -{ | |
9 | - cout << "check_csgo v" << VERSION << endl << endl; | |
8 | +void printVersion() { | |
9 | + cout << "check_csgo v" << VERSION << endl << endl; | |
10 | 10 | } |
11 | 11 | |
12 | -void printHelp(bool longVersion) | |
13 | -{ | |
14 | - if(longVersion) | |
15 | - { | |
16 | - printVersion(); | |
17 | - cout << "Check CS:GO DS instance." << endl << endl; | |
18 | - printHelp(false); | |
19 | - cout << "Options:" << endl; | |
20 | - cout << " -h" << endl; | |
21 | - cout << " Print detailed help screen" << endl; | |
22 | - cout << " -V" << endl; | |
23 | - cout << " Print version information" << endl; | |
24 | - cout << " -H HOSTADDRESS" << endl; | |
25 | - cout << " Host where the Source DS is running" << endl; | |
26 | - cout << " -p" << endl; | |
27 | - cout << " Port where the Source DS is listening. Default is 27015." << endl << endl; | |
28 | - return; | |
29 | - } | |
30 | - cout << "Usage: " << endl << "check_csgo [-hV] -H HOSTADDRESS [-p PORT]" << endl << endl; | |
12 | +void printHelp(bool longVersion) { | |
13 | + if(longVersion) { | |
14 | + printVersion(); | |
15 | + cout << "Check CS:GO DS instance." << endl << endl; | |
16 | + printHelp(false); | |
17 | + cout << "Options:" << endl; | |
18 | + cout << " -h" << endl; | |
19 | + cout << " Print detailed help screen" << endl; | |
20 | + cout << " -V" << endl; | |
21 | + cout << " Print version information" << endl; | |
22 | + cout << " -H HOSTADDRESS" << endl; | |
23 | + cout << " Host where the Source DS is running" << endl; | |
24 | + cout << " -p" << endl; | |
25 | + cout << " Port where the Source DS is listening. Default is 27015." << endl << endl; | |
26 | + return; | |
27 | + } | |
28 | + cout << "Usage: " << endl << "check_csgo [-hV] -H HOSTADDRESS [-p PORT]" << endl << endl; | |
31 | 29 | } |
32 | 30 | |
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; | |
31 | +SOURCEDS_PACKET* getSourceDSResponse(int s, sockaddr_in *server) { | |
32 | + char *data = new char[DATAGRAM_LENGTH]; | |
33 | + int dataLength = recvMsg(s, data, DATAGRAM_LENGTH, server); | |
34 | + if(dataLength == -1) { | |
35 | + return NULL; | |
36 | + } | |
37 | + char *header = (char*) "\xFF\xFF\xFF\xFF"; | |
38 | + if(memcmp(data,header,HDR_SIZE)) { | |
39 | + //Invalid response, or non-supported multi-packet response format | |
40 | + return NULL; | |
41 | + } | |
42 | + SOURCEDS_PACKET *response = new SOURCEDS_PACKET; | |
43 | + response->data = data+HDR_SIZE; | |
44 | + response->length = dataLength; | |
45 | + return response; | |
51 | 46 | } |
52 | 47 | |
53 | -int check_csgo(char *hostname, uint16_t port, SERVERINFO *server_info) | |
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 | - server_info->max_players = (uint8_t) *((response->data)+(++offset)); | |
83 | - | |
48 | +int check_csgo(char *hostname, uint16_t port, SERVERINFO *server_info) { | |
49 | + struct sockaddr_in si; | |
50 | + struct hostent *host = NULL; | |
51 | + int s; | |
52 | + int timeout = 10; | |
53 | + setupSocket(port,hostname,host,timeout,&si,&s); | |
54 | + string discard; | |
55 | + | |
56 | + std::vector<uint8_t> info_query; | |
57 | + info_query.resize(25); | |
58 | + memcpy(info_query.data(), "\xFF\xFF\xFF\xFF\x54Source Engine Query\x00", 25); | |
59 | + | |
60 | + sendMsg(s, reinterpret_cast<char*>(info_query.data()), info_query.size(), &si); | |
61 | + SOURCEDS_PACKET *response = getSourceDSResponse(s,&si); | |
62 | + if(response == NULL) { | |
63 | + return 2; | |
64 | + } | |
65 | + | |
66 | + if(response->data[0] == 'A') { | |
67 | + // Challenge response mechanism | |
68 | + uint32_t challenge; | |
69 | + size_t current_pkt_size = info_query.size(); | |
70 | + info_query.resize(current_pkt_size + 4); | |
71 | + memcpy(info_query.data() + current_pkt_size, response->data+1, 4); | |
84 | 72 | delete[] (response->data-HDR_SIZE); |
85 | 73 | delete response; |
86 | 74 | |
87 | - if(server_info->players == server_info->max_players) | |
88 | - { | |
89 | - return 1; | |
75 | + sendMsg(s, reinterpret_cast<char*>(info_query.data()), info_query.size(), &si); | |
76 | + response = getSourceDSResponse(s, &si); | |
77 | + if(response == NULL) { | |
78 | + return 2; | |
90 | 79 | } |
91 | - | |
92 | - return 0; | |
80 | + } | |
81 | + | |
82 | + ssize_t offset = 2; | |
83 | + server_info->name = string(response->data+offset,strlen(response->data+offset)); | |
84 | + offset += server_info->name.size()+1; | |
85 | + server_info->map = string(response->data+offset,strlen(response->data+offset)); | |
86 | + offset += server_info->map.size()+1; | |
87 | + discard = string(response->data+offset,strlen(response->data+offset)); | |
88 | + offset += discard.size() + 1; | |
89 | + server_info->game = string(response->data+offset,strlen(response->data+offset)); | |
90 | + offset += server_info->game.size()+1; | |
91 | + offset += 2; | |
92 | + server_info->players = (uint8_t) *((response->data)+offset); | |
93 | + server_info->max_players = (uint8_t) *((response->data)+(++offset)); | |
94 | + | |
95 | + delete[] (response->data-HDR_SIZE); | |
96 | + delete response; | |
97 | + | |
98 | + if(server_info->players == server_info->max_players) { | |
99 | + return 1; | |
100 | + } | |
101 | + | |
102 | + return 0; | |
93 | 103 | } |
94 | 104 | |
95 | -int main(int argc, char **argv) | |
96 | -{ | |
97 | - struct itimerval timer; | |
98 | - timer.it_value.tv_sec = 10; | |
99 | - timer.it_value.tv_usec = 0; | |
100 | - timer.it_interval.tv_sec = 0; | |
101 | - timer.it_interval.tv_usec = 0; | |
102 | - setitimer (ITIMER_VIRTUAL, &timer, 0); | |
103 | - | |
104 | - struct sigaction sa; | |
105 | - memset (&sa, 0, sizeof (sa)); | |
106 | - sa.sa_handler = &timer_handler; | |
107 | - sigaction (SIGVTALRM, &sa, 0); | |
108 | - | |
109 | - uint16_t port = 27015; | |
110 | - char *hostname = NULL; | |
111 | - int c; | |
112 | - | |
113 | - while ((c = getopt (argc, argv, "H:p:Vh")) != -1) | |
114 | - { | |
115 | - switch(c) | |
116 | - { | |
117 | - case 'H': | |
118 | - hostname = optarg; | |
119 | - break; | |
120 | - case 'p': | |
121 | - port = (uint16_t) str2int(optarg); | |
122 | - break; | |
123 | - case 'V': | |
124 | - printVersion(); | |
125 | - return 0; | |
126 | - case 'h': | |
127 | - printHelp(true); | |
128 | - return 0; | |
129 | - case '?': | |
130 | - printHelp(false); | |
131 | - return 3; | |
132 | - } | |
133 | - } | |
134 | - | |
135 | - if(hostname == NULL) | |
136 | - { | |
137 | - cout << "No HOSTADDRESS specified. Exiting." << endl; | |
138 | - return 3; | |
139 | - } | |
140 | - | |
141 | - SERVERINFO server_info; | |
142 | - int returnCode = check_csgo(hostname,port,&server_info); | |
143 | - | |
144 | - cout << servicename; | |
145 | - switch(returnCode) | |
146 | - { | |
147 | - case 0: | |
148 | - cout << " OK"; | |
149 | - cout << " - " << hostname << " " << server_info.name << " " << server_info.game << " " << server_info.map | |
150 | - << " " << (int)server_info.players << "/" << (int)server_info.max_players << " players" << endl ; | |
151 | - break; | |
152 | - | |
153 | - case 1: | |
154 | - cout << " WARNING - Server is full"; | |
155 | - break; | |
156 | - | |
157 | - case 2: | |
158 | - cout << " CRITICAL - No response"; | |
159 | - break; | |
160 | - } | |
161 | - | |
162 | - | |
163 | - return returnCode; | |
105 | +int main(int argc, char **argv) { | |
106 | + struct itimerval timer; | |
107 | + timer.it_value.tv_sec = 10; | |
108 | + timer.it_value.tv_usec = 0; | |
109 | + timer.it_interval.tv_sec = 0; | |
110 | + timer.it_interval.tv_usec = 0; | |
111 | + setitimer (ITIMER_VIRTUAL, &timer, 0); | |
112 | + | |
113 | + struct sigaction sa; | |
114 | + memset (&sa, 0, sizeof (sa)); | |
115 | + sa.sa_handler = &timer_handler; | |
116 | + sigaction (SIGVTALRM, &sa, 0); | |
117 | + | |
118 | + uint16_t port = 27015; | |
119 | + char *hostname = NULL; | |
120 | + int c; | |
121 | + | |
122 | + while ((c = getopt (argc, argv, "H:p:Vh")) != -1) { | |
123 | + switch(c) { | |
124 | + case 'H': | |
125 | + hostname = optarg; | |
126 | + break; | |
127 | + case 'p': | |
128 | + port = (uint16_t) str2int(optarg); | |
129 | + break; | |
130 | + case 'V': | |
131 | + printVersion(); | |
132 | + return 0; | |
133 | + case 'h': | |
134 | + printHelp(true); | |
135 | + return 0; | |
136 | + case '?': | |
137 | + printHelp(false); | |
138 | + return 3; | |
139 | + } | |
140 | + } | |
141 | + | |
142 | + if(hostname == NULL) { | |
143 | + cout << "No HOSTADDRESS specified. Exiting." << endl; | |
144 | + return 3; | |
145 | + } | |
146 | + | |
147 | + SERVERINFO server_info; | |
148 | + int returnCode = check_csgo(hostname,port,&server_info); | |
149 | + | |
150 | + cout << servicename; | |
151 | + switch(returnCode) { | |
152 | + case 0: | |
153 | + cout << " OK"; | |
154 | + cout << " - " << hostname << " " << server_info.name << " " << server_info.game << " " << server_info.map | |
155 | + << " " << (int)server_info.players << "/" << (int)server_info.max_players << " players" << endl ; | |
156 | + break; | |
157 | + | |
158 | + case 1: | |
159 | + cout << " WARNING - Server is full"; | |
160 | + break; | |
161 | + case 2: | |
162 | + cout << " CRITICAL - No response"; | |
163 | + break; | |
164 | + } | |
165 | + return returnCode; | |
164 | 166 | } | ... | ... |