diff options
| author | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-03-10 09:58:27 +0100 |
|---|---|---|
| committer | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-03-10 09:58:27 +0100 |
| commit | 3cadfa2dbe440c4a07d785c72bb7994be0b0a313 (patch) | |
| tree | ba0e683fba6b61b28ae6b5170c9a616d39f2681c | |
| parent | c5f873aa7b74c26c985a81bc4ffeb8d5fd1ce8a9 (diff) | |
| parent | 0f0290a52f70d132e09e5b373e2c75b4524d393b (diff) | |
| download | monitoring-plugins-3cadfa2dbe440c4a07d785c72bb7994be0b0a313.tar.gz | |
Merge branch 'master' into refactor/check_smtp
| -rw-r--r-- | plugins/Makefile.am | 13 | ||||
| -rw-r--r-- | plugins/check_game.c | 229 | ||||
| -rw-r--r-- | plugins/check_game.d/config.h | 30 | ||||
| -rw-r--r-- | plugins/utils.c | 243 | ||||
| -rw-r--r-- | plugins/utils.h | 141 |
5 files changed, 376 insertions, 280 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 5e8f0650..116d45a8 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am | |||
| @@ -47,12 +47,13 @@ SUBDIRS = picohttpparser | |||
| 47 | np_test_scripts = tests/test_check_swap.t | 47 | np_test_scripts = tests/test_check_swap.t |
| 48 | 48 | ||
| 49 | EXTRA_DIST = t \ | 49 | EXTRA_DIST = t \ |
| 50 | tests \ | 50 | tests \ |
| 51 | $(np_test_scripts) \ | 51 | $(np_test_scripts) \ |
| 52 | check_swap.d \ | 52 | check_swap.d \ |
| 53 | check_dbi.d \ | 53 | check_game.d \ |
| 54 | check_ssh.d \ | 54 | check_dbi.d \ |
| 55 | check_dns.d \ | 55 | check_ssh.d \ |
| 56 | check_dns.d \ | ||
| 56 | check_smtp.d | 57 | check_smtp.d |
| 57 | 58 | ||
| 58 | PLUGINHDRS = common.h | 59 | PLUGINHDRS = common.h |
diff --git a/plugins/check_game.c b/plugins/check_game.c index 619277e7..c0193b03 100644 --- a/plugins/check_game.c +++ b/plugins/check_game.c | |||
| @@ -36,9 +36,15 @@ const char *email = "devel@monitoring-plugins.org"; | |||
| 36 | #include "common.h" | 36 | #include "common.h" |
| 37 | #include "utils.h" | 37 | #include "utils.h" |
| 38 | #include "runcmd.h" | 38 | #include "runcmd.h" |
| 39 | #include "check_game.d/config.h" | ||
| 40 | #include "../lib/monitoringplug.h" | ||
| 39 | 41 | ||
| 40 | static int process_arguments(int /*argc*/, char ** /*argv*/); | 42 | typedef struct { |
| 41 | static int validate_arguments(void); | 43 | int errorcode; |
| 44 | check_game_config config; | ||
| 45 | } check_game_config_wrapper; | ||
| 46 | |||
| 47 | static check_game_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/); | ||
| 42 | static void print_help(void); | 48 | static void print_help(void); |
| 43 | void print_usage(void); | 49 | void print_usage(void); |
| 44 | 50 | ||
| @@ -49,26 +55,9 @@ void print_usage(void); | |||
| 49 | #define QSTAT_HOST_TIMEOUT "TIMEOUT" | 55 | #define QSTAT_HOST_TIMEOUT "TIMEOUT" |
| 50 | #define QSTAT_MAX_RETURN_ARGS 12 | 56 | #define QSTAT_MAX_RETURN_ARGS 12 |
| 51 | 57 | ||
| 52 | static char *server_ip; | ||
| 53 | static char *game_type; | ||
| 54 | static int port = 0; | ||
| 55 | |||
| 56 | static bool verbose = false; | 58 | static bool verbose = false; |
| 57 | 59 | ||
| 58 | static int qstat_game_players_max = -1; | ||
| 59 | static int qstat_game_players = -1; | ||
| 60 | static int qstat_game_field = -1; | ||
| 61 | static int qstat_map_field = -1; | ||
| 62 | static int qstat_ping_field = -1; | ||
| 63 | |||
| 64 | int main(int argc, char **argv) { | 60 | int main(int argc, char **argv) { |
| 65 | char *command_line; | ||
| 66 | int result = STATE_UNKNOWN; | ||
| 67 | char *p; | ||
| 68 | char *ret[QSTAT_MAX_RETURN_ARGS]; | ||
| 69 | size_t i = 0; | ||
| 70 | output chld_out; | ||
| 71 | |||
| 72 | setlocale(LC_ALL, ""); | 61 | setlocale(LC_ALL, ""); |
| 73 | bindtextdomain(PACKAGE, LOCALEDIR); | 62 | bindtextdomain(PACKAGE, LOCALEDIR); |
| 74 | textdomain(PACKAGE); | 63 | textdomain(PACKAGE); |
| @@ -76,22 +65,31 @@ int main(int argc, char **argv) { | |||
| 76 | /* Parse extra opts if any */ | 65 | /* Parse extra opts if any */ |
| 77 | argv = np_extra_opts(&argc, argv, progname); | 66 | argv = np_extra_opts(&argc, argv, progname); |
| 78 | 67 | ||
| 79 | if (process_arguments(argc, argv) == ERROR) | 68 | check_game_config_wrapper tmp = process_arguments(argc, argv); |
| 69 | |||
| 70 | if (tmp.errorcode == ERROR) { | ||
| 80 | usage_va(_("Could not parse arguments")); | 71 | usage_va(_("Could not parse arguments")); |
| 72 | } | ||
| 73 | |||
| 74 | check_game_config config = tmp.config; | ||
| 81 | 75 | ||
| 82 | result = STATE_OK; | 76 | mp_state_enum result = STATE_OK; |
| 83 | 77 | ||
| 84 | /* create the command line to execute */ | 78 | /* create the command line to execute */ |
| 85 | xasprintf(&command_line, "%s -raw %s -%s %s", PATH_TO_QSTAT, QSTAT_DATA_DELIMITER, game_type, server_ip); | 79 | char *command_line = NULL; |
| 80 | xasprintf(&command_line, "%s -raw %s -%s %s", PATH_TO_QSTAT, QSTAT_DATA_DELIMITER, config.game_type, config.server_ip); | ||
| 86 | 81 | ||
| 87 | if (port) | 82 | if (config.port) { |
| 88 | xasprintf(&command_line, "%s:%-d", command_line, port); | 83 | xasprintf(&command_line, "%s:%-d", command_line, config.port); |
| 84 | } | ||
| 89 | 85 | ||
| 90 | if (verbose) | 86 | if (verbose) { |
| 91 | printf("%s\n", command_line); | 87 | printf("%s\n", command_line); |
| 88 | } | ||
| 92 | 89 | ||
| 93 | /* run the command. historically, this plugin ignores output on stderr, | 90 | /* run the command. historically, this plugin ignores output on stderr, |
| 94 | * as well as return status of the qstat program */ | 91 | * as well as return status of the qstat program */ |
| 92 | output chld_out = {}; | ||
| 95 | (void)np_runcmd(command_line, &chld_out, NULL, 0); | 93 | (void)np_runcmd(command_line, &chld_out, NULL, 0); |
| 96 | 94 | ||
| 97 | /* sanity check */ | 95 | /* sanity check */ |
| @@ -104,19 +102,22 @@ int main(int argc, char **argv) { | |||
| 104 | In the end, I figured I'd simply let an error occur & then trap it | 102 | In the end, I figured I'd simply let an error occur & then trap it |
| 105 | */ | 103 | */ |
| 106 | 104 | ||
| 107 | if (!strncmp(chld_out.line[0], "unknown option", 14)) { | 105 | if (!strncmp(chld_out.line[0], "unknown option", strlen("unknown option"))) { |
| 108 | printf(_("CRITICAL - Host type parameter incorrect!\n")); | 106 | printf(_("CRITICAL - Host type parameter incorrect!\n")); |
| 109 | result = STATE_CRITICAL; | 107 | result = STATE_CRITICAL; |
| 110 | return result; | 108 | exit(result); |
| 111 | } | 109 | } |
| 112 | 110 | ||
| 113 | p = (char *)strtok(chld_out.line[0], QSTAT_DATA_DELIMITER); | 111 | char *ret[QSTAT_MAX_RETURN_ARGS]; |
| 114 | while (p != NULL) { | 112 | size_t i = 0; |
| 115 | ret[i] = p; | 113 | char *sequence = strtok(chld_out.line[0], QSTAT_DATA_DELIMITER); |
| 116 | p = (char *)strtok(NULL, QSTAT_DATA_DELIMITER); | 114 | while (sequence != NULL) { |
| 115 | ret[i] = sequence; | ||
| 116 | sequence = strtok(NULL, QSTAT_DATA_DELIMITER); | ||
| 117 | i++; | 117 | i++; |
| 118 | if (i >= QSTAT_MAX_RETURN_ARGS) | 118 | if (i >= QSTAT_MAX_RETURN_ARGS) { |
| 119 | break; | 119 | break; |
| 120 | } | ||
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | if (strstr(ret[2], QSTAT_HOST_ERROR)) { | 123 | if (strstr(ret[2], QSTAT_HOST_ERROR)) { |
| @@ -129,19 +130,20 @@ int main(int argc, char **argv) { | |||
| 129 | printf(_("CRITICAL - Game server timeout\n")); | 130 | printf(_("CRITICAL - Game server timeout\n")); |
| 130 | result = STATE_CRITICAL; | 131 | result = STATE_CRITICAL; |
| 131 | } else { | 132 | } else { |
| 132 | printf("OK: %s/%s %s (%s), Ping: %s ms|%s %s\n", ret[qstat_game_players], ret[qstat_game_players_max], ret[qstat_game_field], | 133 | printf("OK: %s/%s %s (%s), Ping: %s ms|%s %s\n", ret[config.qstat_game_players], ret[config.qstat_game_players_max], |
| 133 | ret[qstat_map_field], ret[qstat_ping_field], | 134 | ret[config.qstat_game_field], ret[config.qstat_map_field], ret[config.qstat_ping_field], |
| 134 | perfdata("players", atol(ret[qstat_game_players]), "", false, 0, false, 0, true, 0, true, atol(ret[qstat_game_players_max])), | 135 | perfdata("players", atol(ret[config.qstat_game_players]), "", false, 0, false, 0, true, 0, true, |
| 135 | fperfdata("ping", strtod(ret[qstat_ping_field], NULL), "", false, 0, false, 0, true, 0, false, 0)); | 136 | atol(ret[config.qstat_game_players_max])), |
| 137 | fperfdata("ping", strtod(ret[config.qstat_ping_field], NULL), "", false, 0, false, 0, true, 0, false, 0)); | ||
| 136 | } | 138 | } |
| 137 | 139 | ||
| 138 | return result; | 140 | exit(result); |
| 139 | } | 141 | } |
| 140 | 142 | ||
| 141 | int process_arguments(int argc, char **argv) { | 143 | #define players_field_index 129 |
| 142 | int c; | 144 | #define max_players_field_index 130 |
| 143 | 145 | ||
| 144 | int opt_index = 0; | 146 | check_game_config_wrapper process_arguments(int argc, char **argv) { |
| 145 | static struct option long_opts[] = {{"help", no_argument, 0, 'h'}, | 147 | static struct option long_opts[] = {{"help", no_argument, 0, 'h'}, |
| 146 | {"version", no_argument, 0, 'V'}, | 148 | {"version", no_argument, 0, 'V'}, |
| 147 | {"verbose", no_argument, 0, 'v'}, | 149 | {"verbose", no_argument, 0, 'v'}, |
| @@ -152,29 +154,39 @@ int process_arguments(int argc, char **argv) { | |||
| 152 | {"map-field", required_argument, 0, 'm'}, | 154 | {"map-field", required_argument, 0, 'm'}, |
| 153 | {"ping-field", required_argument, 0, 'p'}, | 155 | {"ping-field", required_argument, 0, 'p'}, |
| 154 | {"game-field", required_argument, 0, 'g'}, | 156 | {"game-field", required_argument, 0, 'g'}, |
| 155 | {"players-field", required_argument, 0, 129}, | 157 | {"players-field", required_argument, 0, players_field_index}, |
| 156 | {"max-players-field", required_argument, 0, 130}, | 158 | {"max-players-field", required_argument, 0, max_players_field_index}, |
| 157 | {0, 0, 0, 0}}; | 159 | {0, 0, 0, 0}}; |
| 158 | 160 | ||
| 159 | if (argc < 2) | 161 | check_game_config_wrapper result = { |
| 160 | return ERROR; | 162 | .config = check_game_config_init(), |
| 163 | .errorcode = OK, | ||
| 164 | }; | ||
| 165 | |||
| 166 | if (argc < 2) { | ||
| 167 | result.errorcode = ERROR; | ||
| 168 | return result; | ||
| 169 | } | ||
| 161 | 170 | ||
| 162 | for (c = 1; c < argc; c++) { | 171 | for (int option_counter = 1; option_counter < argc; option_counter++) { |
| 163 | if (strcmp("-mf", argv[c]) == 0) | 172 | if (strcmp("-mf", argv[option_counter]) == 0) { |
| 164 | strcpy(argv[c], "-m"); | 173 | strcpy(argv[option_counter], "-m"); |
| 165 | else if (strcmp("-pf", argv[c]) == 0) | 174 | } else if (strcmp("-pf", argv[option_counter]) == 0) { |
| 166 | strcpy(argv[c], "-p"); | 175 | strcpy(argv[option_counter], "-p"); |
| 167 | else if (strcmp("-gf", argv[c]) == 0) | 176 | } else if (strcmp("-gf", argv[option_counter]) == 0) { |
| 168 | strcpy(argv[c], "-g"); | 177 | strcpy(argv[option_counter], "-g"); |
| 178 | } | ||
| 169 | } | 179 | } |
| 170 | 180 | ||
| 171 | while (1) { | 181 | int opt_index = 0; |
| 172 | c = getopt_long(argc, argv, "hVvt:H:P:G:g:p:m:", long_opts, &opt_index); | 182 | while (true) { |
| 183 | int option_index = getopt_long(argc, argv, "hVvt:H:P:G:g:p:m:", long_opts, &opt_index); | ||
| 173 | 184 | ||
| 174 | if (c == -1 || c == EOF) | 185 | if (option_index == -1 || option_index == EOF) { |
| 175 | break; | 186 | break; |
| 187 | } | ||
| 176 | 188 | ||
| 177 | switch (c) { | 189 | switch (option_index) { |
| 178 | case 'h': /* help */ | 190 | case 'h': /* help */ |
| 179 | print_help(); | 191 | print_help(); |
| 180 | exit(STATE_UNKNOWN); | 192 | exit(STATE_UNKNOWN); |
| @@ -188,79 +200,75 @@ int process_arguments(int argc, char **argv) { | |||
| 188 | timeout_interval = atoi(optarg); | 200 | timeout_interval = atoi(optarg); |
| 189 | break; | 201 | break; |
| 190 | case 'H': /* hostname */ | 202 | case 'H': /* hostname */ |
| 191 | if (strlen(optarg) >= MAX_HOST_ADDRESS_LENGTH) | 203 | if (strlen(optarg) >= MAX_HOST_ADDRESS_LENGTH) { |
| 192 | die(STATE_UNKNOWN, _("Input buffer overflow\n")); | 204 | die(STATE_UNKNOWN, _("Input buffer overflow\n")); |
| 193 | server_ip = optarg; | 205 | } |
| 206 | result.config.server_ip = optarg; | ||
| 194 | break; | 207 | break; |
| 195 | case 'P': /* port */ | 208 | case 'P': /* port */ |
| 196 | port = atoi(optarg); | 209 | result.config.port = atoi(optarg); |
| 197 | break; | 210 | break; |
| 198 | case 'G': /* hostname */ | 211 | case 'G': /* hostname */ |
| 199 | if (strlen(optarg) >= MAX_INPUT_BUFFER) | 212 | if (strlen(optarg) >= MAX_INPUT_BUFFER) { |
| 200 | die(STATE_UNKNOWN, _("Input buffer overflow\n")); | 213 | die(STATE_UNKNOWN, _("Input buffer overflow\n")); |
| 201 | game_type = optarg; | 214 | } |
| 215 | result.config.game_type = optarg; | ||
| 202 | break; | 216 | break; |
| 203 | case 'p': /* index of ping field */ | 217 | case 'p': /* index of ping field */ |
| 204 | qstat_ping_field = atoi(optarg); | 218 | result.config.qstat_ping_field = atoi(optarg); |
| 205 | if (qstat_ping_field < 0 || qstat_ping_field > QSTAT_MAX_RETURN_ARGS) | 219 | if (result.config.qstat_ping_field < 0 || result.config.qstat_ping_field > QSTAT_MAX_RETURN_ARGS) { |
| 206 | return ERROR; | 220 | result.errorcode = ERROR; |
| 221 | return result; | ||
| 222 | } | ||
| 207 | break; | 223 | break; |
| 208 | case 'm': /* index on map field */ | 224 | case 'm': /* index on map field */ |
| 209 | qstat_map_field = atoi(optarg); | 225 | result.config.qstat_map_field = atoi(optarg); |
| 210 | if (qstat_map_field < 0 || qstat_map_field > QSTAT_MAX_RETURN_ARGS) | 226 | if (result.config.qstat_map_field < 0 || result.config.qstat_map_field > QSTAT_MAX_RETURN_ARGS) { |
| 211 | return ERROR; | 227 | result.errorcode = ERROR; |
| 228 | return result; | ||
| 229 | } | ||
| 212 | break; | 230 | break; |
| 213 | case 'g': /* index of game field */ | 231 | case 'g': /* index of game field */ |
| 214 | qstat_game_field = atoi(optarg); | 232 | result.config.qstat_game_field = atoi(optarg); |
| 215 | if (qstat_game_field < 0 || qstat_game_field > QSTAT_MAX_RETURN_ARGS) | 233 | if (result.config.qstat_game_field < 0 || result.config.qstat_game_field > QSTAT_MAX_RETURN_ARGS) { |
| 216 | return ERROR; | 234 | result.errorcode = ERROR; |
| 235 | return result; | ||
| 236 | } | ||
| 217 | break; | 237 | break; |
| 218 | case 129: /* index of player count field */ | 238 | case players_field_index: /* index of player count field */ |
| 219 | qstat_game_players = atoi(optarg); | 239 | result.config.qstat_game_players = atoi(optarg); |
| 220 | if (qstat_game_players_max == 0) | 240 | if (result.config.qstat_game_players_max == 0) { |
| 221 | qstat_game_players_max = qstat_game_players - 1; | 241 | result.config.qstat_game_players_max = result.config.qstat_game_players - 1; |
| 222 | if (qstat_game_players < 0 || qstat_game_players > QSTAT_MAX_RETURN_ARGS) | 242 | } |
| 223 | return ERROR; | 243 | if (result.config.qstat_game_players < 0 || result.config.qstat_game_players > QSTAT_MAX_RETURN_ARGS) { |
| 244 | result.errorcode = ERROR; | ||
| 245 | return result; | ||
| 246 | } | ||
| 224 | break; | 247 | break; |
| 225 | case 130: /* index of max players field */ | 248 | case max_players_field_index: /* index of max players field */ |
| 226 | qstat_game_players_max = atoi(optarg); | 249 | result.config.qstat_game_players_max = atoi(optarg); |
| 227 | if (qstat_game_players_max < 0 || qstat_game_players_max > QSTAT_MAX_RETURN_ARGS) | 250 | if (result.config.qstat_game_players_max < 0 || result.config.qstat_game_players_max > QSTAT_MAX_RETURN_ARGS) { |
| 228 | return ERROR; | 251 | result.errorcode = ERROR; |
| 252 | return result; | ||
| 253 | } | ||
| 229 | break; | 254 | break; |
| 230 | default: /* args not parsable */ | 255 | default: /* args not parsable */ |
| 231 | usage5(); | 256 | usage5(); |
| 232 | } | 257 | } |
| 233 | } | 258 | } |
| 234 | 259 | ||
| 235 | c = optind; | 260 | int option_counter = optind; |
| 236 | /* first option is the game type */ | 261 | /* first option is the game type */ |
| 237 | if (!game_type && c < argc) | 262 | if (!result.config.game_type && option_counter < argc) { |
| 238 | game_type = strdup(argv[c++]); | 263 | result.config.game_type = strdup(argv[option_counter++]); |
| 264 | } | ||
| 239 | 265 | ||
| 240 | /* Second option is the server name */ | 266 | /* Second option is the server name */ |
| 241 | if (!server_ip && c < argc) | 267 | if (!result.config.server_ip && option_counter < argc) { |
| 242 | server_ip = strdup(argv[c++]); | 268 | result.config.server_ip = strdup(argv[option_counter++]); |
| 243 | 269 | } | |
| 244 | return validate_arguments(); | ||
| 245 | } | ||
| 246 | |||
| 247 | int validate_arguments(void) { | ||
| 248 | if (qstat_game_players_max < 0) | ||
| 249 | qstat_game_players_max = 4; | ||
| 250 | |||
| 251 | if (qstat_game_players < 0) | ||
| 252 | qstat_game_players = 5; | ||
| 253 | |||
| 254 | if (qstat_game_field < 0) | ||
| 255 | qstat_game_field = 2; | ||
| 256 | |||
| 257 | if (qstat_map_field < 0) | ||
| 258 | qstat_map_field = 3; | ||
| 259 | |||
| 260 | if (qstat_ping_field < 0) | ||
| 261 | qstat_ping_field = 5; | ||
| 262 | 270 | ||
| 263 | return OK; | 271 | return result; |
| 264 | } | 272 | } |
| 265 | 273 | ||
| 266 | void print_help(void) { | 274 | void print_help(void) { |
| @@ -277,14 +285,15 @@ void print_help(void) { | |||
| 277 | 285 | ||
| 278 | printf(UT_HELP_VRSN); | 286 | printf(UT_HELP_VRSN); |
| 279 | printf(UT_EXTRA_OPTS); | 287 | printf(UT_EXTRA_OPTS); |
| 280 | 288 | printf(" -H, --hostname=ADDRESS\n" | |
| 281 | printf(" %s\n", "-p"); | 289 | " Host name, IP Address, or unix socket (must be an absolute path)\n"); |
| 282 | printf(" %s\n", _("Optional port of which to connect")); | 290 | printf(" %s\n", "-P"); |
| 283 | printf(" %s\n", "gf"); | 291 | printf(" %s\n", _("Optional port to connect to")); |
| 292 | printf(" %s\n", "-g"); | ||
| 284 | printf(" %s\n", _("Field number in raw qstat output that contains game name")); | 293 | printf(" %s\n", _("Field number in raw qstat output that contains game name")); |
| 285 | printf(" %s\n", "-mf"); | 294 | printf(" %s\n", "-m"); |
| 286 | printf(" %s\n", _("Field number in raw qstat output that contains map name")); | 295 | printf(" %s\n", _("Field number in raw qstat output that contains map name")); |
| 287 | printf(" %s\n", "-pf"); | 296 | printf(" %s\n", "-p"); |
| 288 | printf(" %s\n", _("Field number in raw qstat output that contains ping time")); | 297 | printf(" %s\n", _("Field number in raw qstat output that contains ping time")); |
| 289 | 298 | ||
| 290 | printf(UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); | 299 | printf(UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT); |
diff --git a/plugins/check_game.d/config.h b/plugins/check_game.d/config.h new file mode 100644 index 00000000..c95a1ced --- /dev/null +++ b/plugins/check_game.d/config.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | #pragma once | ||
| 2 | #include "../../config.h" | ||
| 3 | #include <stddef.h> | ||
| 4 | |||
| 5 | typedef struct { | ||
| 6 | char *server_ip; | ||
| 7 | char *game_type; | ||
| 8 | int port; | ||
| 9 | |||
| 10 | int qstat_game_players_max; | ||
| 11 | int qstat_game_players; | ||
| 12 | int qstat_game_field; | ||
| 13 | int qstat_map_field; | ||
| 14 | int qstat_ping_field; | ||
| 15 | } check_game_config; | ||
| 16 | |||
| 17 | check_game_config check_game_config_init() { | ||
| 18 | check_game_config tmp = { | ||
| 19 | .server_ip = NULL, | ||
| 20 | .game_type = NULL, | ||
| 21 | .port = 0, | ||
| 22 | |||
| 23 | .qstat_game_players_max = 4, | ||
| 24 | .qstat_game_players = 5, | ||
| 25 | .qstat_map_field = 3, | ||
| 26 | .qstat_game_field = 2, | ||
| 27 | .qstat_ping_field = 5, | ||
| 28 | }; | ||
| 29 | return tmp; | ||
| 30 | } | ||
diff --git a/plugins/utils.c b/plugins/utils.c index 09649429..34335c89 100644 --- a/plugins/utils.c +++ b/plugins/utils.c | |||
| @@ -89,41 +89,46 @@ bool is_numeric(char *number) { | |||
| 89 | char tmp[1]; | 89 | char tmp[1]; |
| 90 | float x; | 90 | float x; |
| 91 | 91 | ||
| 92 | if (!number) | 92 | if (!number) { |
| 93 | return false; | 93 | return false; |
| 94 | else if (sscanf(number, "%f%c", &x, tmp) == 1) | 94 | } else if (sscanf(number, "%f%c", &x, tmp) == 1) { |
| 95 | return true; | 95 | return true; |
| 96 | else | 96 | } else { |
| 97 | return false; | 97 | return false; |
| 98 | } | ||
| 98 | } | 99 | } |
| 99 | 100 | ||
| 100 | bool is_positive(char *number) { | 101 | bool is_positive(char *number) { |
| 101 | if (is_numeric(number) && atof(number) > 0.0) | 102 | if (is_numeric(number) && atof(number) > 0.0) { |
| 102 | return true; | 103 | return true; |
| 103 | else | 104 | } else { |
| 104 | return false; | 105 | return false; |
| 106 | } | ||
| 105 | } | 107 | } |
| 106 | 108 | ||
| 107 | bool is_negative(char *number) { | 109 | bool is_negative(char *number) { |
| 108 | if (is_numeric(number) && atof(number) < 0.0) | 110 | if (is_numeric(number) && atof(number) < 0.0) { |
| 109 | return true; | 111 | return true; |
| 110 | else | 112 | } else { |
| 111 | return false; | 113 | return false; |
| 114 | } | ||
| 112 | } | 115 | } |
| 113 | 116 | ||
| 114 | bool is_nonnegative(char *number) { | 117 | bool is_nonnegative(char *number) { |
| 115 | if (is_numeric(number) && atof(number) >= 0.0) | 118 | if (is_numeric(number) && atof(number) >= 0.0) { |
| 116 | return true; | 119 | return true; |
| 117 | else | 120 | } else { |
| 118 | return false; | 121 | return false; |
| 122 | } | ||
| 119 | } | 123 | } |
| 120 | 124 | ||
| 121 | bool is_percentage(char *number) { | 125 | bool is_percentage(char *number) { |
| 122 | int x; | 126 | int x; |
| 123 | if (is_numeric(number) && (x = atof(number)) >= 0 && x <= 100) | 127 | if (is_numeric(number) && (x = atof(number)) >= 0 && x <= 100) { |
| 124 | return true; | 128 | return true; |
| 125 | else | 129 | } else { |
| 126 | return false; | 130 | return false; |
| 131 | } | ||
| 127 | } | 132 | } |
| 128 | 133 | ||
| 129 | bool is_percentage_expression(const char str[]) { | 134 | bool is_percentage_expression(const char str[]) { |
| @@ -156,36 +161,41 @@ bool is_percentage_expression(const char str[]) { | |||
| 156 | bool is_integer(char *number) { | 161 | bool is_integer(char *number) { |
| 157 | long int n; | 162 | long int n; |
| 158 | 163 | ||
| 159 | if (!number || (strspn(number, "-0123456789 ") != strlen(number))) | 164 | if (!number || (strspn(number, "-0123456789 ") != strlen(number))) { |
| 160 | return false; | 165 | return false; |
| 166 | } | ||
| 161 | 167 | ||
| 162 | n = strtol(number, NULL, 10); | 168 | n = strtol(number, NULL, 10); |
| 163 | 169 | ||
| 164 | if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX) | 170 | if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX) { |
| 165 | return true; | 171 | return true; |
| 166 | else | 172 | } else { |
| 167 | return false; | 173 | return false; |
| 174 | } | ||
| 168 | } | 175 | } |
| 169 | 176 | ||
| 170 | bool is_intpos(char *number) { | 177 | bool is_intpos(char *number) { |
| 171 | if (is_integer(number) && atoi(number) > 0) | 178 | if (is_integer(number) && atoi(number) > 0) { |
| 172 | return true; | 179 | return true; |
| 173 | else | 180 | } else { |
| 174 | return false; | 181 | return false; |
| 182 | } | ||
| 175 | } | 183 | } |
| 176 | 184 | ||
| 177 | bool is_intneg(char *number) { | 185 | bool is_intneg(char *number) { |
| 178 | if (is_integer(number) && atoi(number) < 0) | 186 | if (is_integer(number) && atoi(number) < 0) { |
| 179 | return true; | 187 | return true; |
| 180 | else | 188 | } else { |
| 181 | return false; | 189 | return false; |
| 190 | } | ||
| 182 | } | 191 | } |
| 183 | 192 | ||
| 184 | bool is_intnonneg(char *number) { | 193 | bool is_intnonneg(char *number) { |
| 185 | if (is_integer(number) && atoi(number) >= 0) | 194 | if (is_integer(number) && atoi(number) >= 0) { |
| 186 | return true; | 195 | return true; |
| 187 | else | 196 | } else { |
| 188 | return false; | 197 | return false; |
| 198 | } | ||
| 189 | } | 199 | } |
| 190 | 200 | ||
| 191 | /* | 201 | /* |
| @@ -247,19 +257,21 @@ bool is_uint64(char *number, uint64_t *target) { | |||
| 247 | 257 | ||
| 248 | bool is_intpercent(char *number) { | 258 | bool is_intpercent(char *number) { |
| 249 | int i; | 259 | int i; |
| 250 | if (is_integer(number) && (i = atoi(number)) >= 0 && i <= 100) | 260 | if (is_integer(number) && (i = atoi(number)) >= 0 && i <= 100) { |
| 251 | return true; | 261 | return true; |
| 252 | else | 262 | } else { |
| 253 | return false; | 263 | return false; |
| 264 | } | ||
| 254 | } | 265 | } |
| 255 | 266 | ||
| 256 | bool is_option(char *str) { | 267 | bool is_option(char *str) { |
| 257 | if (!str) | 268 | if (!str) { |
| 258 | return false; | 269 | return false; |
| 259 | else if (strspn(str, "-") == 1 || strspn(str, "-") == 2) | 270 | } else if (strspn(str, "-") == 1 || strspn(str, "-") == 2) { |
| 260 | return true; | 271 | return true; |
| 261 | else | 272 | } else { |
| 262 | return false; | 273 | return false; |
| 274 | } | ||
| 263 | } | 275 | } |
| 264 | 276 | ||
| 265 | #ifdef NEED_GETTIMEOFDAY | 277 | #ifdef NEED_GETTIMEOFDAY |
| @@ -288,10 +300,11 @@ void strip(char *buffer) { | |||
| 288 | 300 | ||
| 289 | for (x = strlen(buffer); x >= 1; x--) { | 301 | for (x = strlen(buffer); x >= 1; x--) { |
| 290 | i = x - 1; | 302 | i = x - 1; |
| 291 | if (buffer[i] == ' ' || buffer[i] == '\r' || buffer[i] == '\n' || buffer[i] == '\t') | 303 | if (buffer[i] == ' ' || buffer[i] == '\r' || buffer[i] == '\n' || buffer[i] == '\t') { |
| 292 | buffer[i] = '\0'; | 304 | buffer[i] = '\0'; |
| 293 | else | 305 | } else { |
| 294 | break; | 306 | break; |
| 307 | } | ||
| 295 | } | 308 | } |
| 296 | return; | 309 | return; |
| 297 | } | 310 | } |
| @@ -309,8 +322,9 @@ void strip(char *buffer) { | |||
| 309 | *****************************************************************************/ | 322 | *****************************************************************************/ |
| 310 | 323 | ||
| 311 | char *strscpy(char *dest, const char *src) { | 324 | char *strscpy(char *dest, const char *src) { |
| 312 | if (src == NULL) | 325 | if (src == NULL) { |
| 313 | return NULL; | 326 | return NULL; |
| 327 | } | ||
| 314 | 328 | ||
| 315 | xasprintf(&dest, "%s", src); | 329 | xasprintf(&dest, "%s", src); |
| 316 | 330 | ||
| @@ -369,17 +383,21 @@ char *strscpy(char *dest, const char *src) { | |||
| 369 | 383 | ||
| 370 | char *strnl(char *str) { | 384 | char *strnl(char *str) { |
| 371 | size_t len; | 385 | size_t len; |
| 372 | if (str == NULL) | 386 | if (str == NULL) { |
| 373 | return NULL; | 387 | return NULL; |
| 388 | } | ||
| 374 | str = strpbrk(str, "\r\n"); | 389 | str = strpbrk(str, "\r\n"); |
| 375 | if (str == NULL) | 390 | if (str == NULL) { |
| 376 | return NULL; | 391 | return NULL; |
| 392 | } | ||
| 377 | len = strspn(str, "\r\n"); | 393 | len = strspn(str, "\r\n"); |
| 378 | if (str[len] == '\0') | 394 | if (str[len] == '\0') { |
| 379 | return NULL; | 395 | return NULL; |
| 396 | } | ||
| 380 | str += len; | 397 | str += len; |
| 381 | if (strlen(str) == 0) | 398 | if (strlen(str) == 0) { |
| 382 | return NULL; | 399 | return NULL; |
| 400 | } | ||
| 383 | return str; | 401 | return str; |
| 384 | } | 402 | } |
| 385 | 403 | ||
| @@ -402,15 +420,18 @@ char *strnl(char *str) { | |||
| 402 | char *strpcpy(char *dest, const char *src, const char *str) { | 420 | char *strpcpy(char *dest, const char *src, const char *str) { |
| 403 | size_t len; | 421 | size_t len; |
| 404 | 422 | ||
| 405 | if (src) | 423 | if (src) { |
| 406 | len = strcspn(src, str); | 424 | len = strcspn(src, str); |
| 407 | else | 425 | } else { |
| 408 | return NULL; | 426 | return NULL; |
| 427 | } | ||
| 409 | 428 | ||
| 410 | if (dest == NULL || strlen(dest) < len) | 429 | if (dest == NULL || strlen(dest) < len) { |
| 411 | dest = realloc(dest, len + 1); | 430 | dest = realloc(dest, len + 1); |
| 412 | if (dest == NULL) | 431 | } |
| 432 | if (dest == NULL) { | ||
| 413 | die(STATE_UNKNOWN, _("failed realloc in strpcpy\n")); | 433 | die(STATE_UNKNOWN, _("failed realloc in strpcpy\n")); |
| 434 | } | ||
| 414 | 435 | ||
| 415 | strncpy(dest, src, len); | 436 | strncpy(dest, src, len); |
| 416 | dest[len] = '\0'; | 437 | dest[len] = '\0'; |
| @@ -434,10 +455,11 @@ char *strpcpy(char *dest, const char *src, const char *str) { | |||
| 434 | char *strpcat(char *dest, const char *src, const char *str) { | 455 | char *strpcat(char *dest, const char *src, const char *str) { |
| 435 | size_t len, l2; | 456 | size_t len, l2; |
| 436 | 457 | ||
| 437 | if (dest) | 458 | if (dest) { |
| 438 | len = strlen(dest); | 459 | len = strlen(dest); |
| 439 | else | 460 | } else { |
| 440 | len = 0; | 461 | len = 0; |
| 462 | } | ||
| 441 | 463 | ||
| 442 | if (src) { | 464 | if (src) { |
| 443 | l2 = strcspn(src, str); | 465 | l2 = strcspn(src, str); |
| @@ -446,8 +468,9 @@ char *strpcat(char *dest, const char *src, const char *str) { | |||
| 446 | } | 468 | } |
| 447 | 469 | ||
| 448 | dest = realloc(dest, len + l2 + 1); | 470 | dest = realloc(dest, len + l2 + 1); |
| 449 | if (dest == NULL) | 471 | if (dest == NULL) { |
| 450 | die(STATE_UNKNOWN, _("failed malloc in strscat\n")); | 472 | die(STATE_UNKNOWN, _("failed malloc in strscat\n")); |
| 473 | } | ||
| 451 | 474 | ||
| 452 | strncpy(dest + len, src, l2); | 475 | strncpy(dest + len, src, l2); |
| 453 | dest[len + l2] = '\0'; | 476 | dest[len + l2] = '\0'; |
| @@ -463,8 +486,9 @@ char *strpcat(char *dest, const char *src, const char *str) { | |||
| 463 | 486 | ||
| 464 | int xvasprintf(char **strp, const char *fmt, va_list ap) { | 487 | int xvasprintf(char **strp, const char *fmt, va_list ap) { |
| 465 | int result = vasprintf(strp, fmt, ap); | 488 | int result = vasprintf(strp, fmt, ap); |
| 466 | if (result == -1 || *strp == NULL) | 489 | if (result == -1 || *strp == NULL) { |
| 467 | die(STATE_UNKNOWN, _("failed malloc in xvasprintf\n")); | 490 | die(STATE_UNKNOWN, _("failed malloc in xvasprintf\n")); |
| 491 | } | ||
| 468 | return result; | 492 | return result; |
| 469 | } | 493 | } |
| 470 | 494 | ||
| @@ -483,126 +507,145 @@ int xasprintf(char **strp, const char *fmt, ...) { | |||
| 483 | * | 507 | * |
| 484 | ******************************************************************************/ | 508 | ******************************************************************************/ |
| 485 | 509 | ||
| 486 | char *perfdata(const char *label, long int val, const char *uom, int warnp, long int warn, int critp, long int crit, int minp, | 510 | char *perfdata(const char *label, long int val, const char *uom, bool warnp, long int warn, bool critp, long int crit, bool minp, |
| 487 | long int minv, int maxp, long int maxv) { | 511 | long int minv, bool maxp, long int maxv) { |
| 488 | char *data = NULL; | 512 | char *data = NULL; |
| 489 | 513 | ||
| 490 | if (strpbrk(label, "'= ")) | 514 | if (strpbrk(label, "'= ")) { |
| 491 | xasprintf(&data, "'%s'=%ld%s;", label, val, uom); | 515 | xasprintf(&data, "'%s'=%ld%s;", label, val, uom); |
| 492 | else | 516 | } else { |
| 493 | xasprintf(&data, "%s=%ld%s;", label, val, uom); | 517 | xasprintf(&data, "%s=%ld%s;", label, val, uom); |
| 518 | } | ||
| 494 | 519 | ||
| 495 | if (warnp) | 520 | if (warnp) { |
| 496 | xasprintf(&data, "%s%ld;", data, warn); | 521 | xasprintf(&data, "%s%ld;", data, warn); |
| 497 | else | 522 | } else { |
| 498 | xasprintf(&data, "%s;", data); | 523 | xasprintf(&data, "%s;", data); |
| 524 | } | ||
| 499 | 525 | ||
| 500 | if (critp) | 526 | if (critp) { |
| 501 | xasprintf(&data, "%s%ld;", data, crit); | 527 | xasprintf(&data, "%s%ld;", data, crit); |
| 502 | else | 528 | } else { |
| 503 | xasprintf(&data, "%s;", data); | 529 | xasprintf(&data, "%s;", data); |
| 530 | } | ||
| 504 | 531 | ||
| 505 | if (minp) | 532 | if (minp) { |
| 506 | xasprintf(&data, "%s%ld;", data, minv); | 533 | xasprintf(&data, "%s%ld;", data, minv); |
| 507 | else | 534 | } else { |
| 508 | xasprintf(&data, "%s;", data); | 535 | xasprintf(&data, "%s;", data); |
| 536 | } | ||
| 509 | 537 | ||
| 510 | if (maxp) | 538 | if (maxp) { |
| 511 | xasprintf(&data, "%s%ld", data, maxv); | 539 | xasprintf(&data, "%s%ld", data, maxv); |
| 540 | } | ||
| 512 | 541 | ||
| 513 | return data; | 542 | return data; |
| 514 | } | 543 | } |
| 515 | 544 | ||
| 516 | char *perfdata_uint64(const char *label, uint64_t val, const char *uom, int warnp, /* Warning present */ | 545 | char *perfdata_uint64(const char *label, uint64_t val, const char *uom, bool warnp, /* Warning present */ |
| 517 | uint64_t warn, int critp, /* Critical present */ | 546 | uint64_t warn, bool critp, /* Critical present */ |
| 518 | uint64_t crit, int minp, /* Minimum present */ | 547 | uint64_t crit, bool minp, /* Minimum present */ |
| 519 | uint64_t minv, int maxp, /* Maximum present */ | 548 | uint64_t minv, bool maxp, /* Maximum present */ |
| 520 | uint64_t maxv) { | 549 | uint64_t maxv) { |
| 521 | char *data = NULL; | 550 | char *data = NULL; |
| 522 | 551 | ||
| 523 | if (strpbrk(label, "'= ")) | 552 | if (strpbrk(label, "'= ")) { |
| 524 | xasprintf(&data, "'%s'=%" PRIu64 "%s;", label, val, uom); | 553 | xasprintf(&data, "'%s'=%" PRIu64 "%s;", label, val, uom); |
| 525 | else | 554 | } else { |
| 526 | xasprintf(&data, "%s=%" PRIu64 "%s;", label, val, uom); | 555 | xasprintf(&data, "%s=%" PRIu64 "%s;", label, val, uom); |
| 556 | } | ||
| 527 | 557 | ||
| 528 | if (warnp) | 558 | if (warnp) { |
| 529 | xasprintf(&data, "%s%" PRIu64 ";", data, warn); | 559 | xasprintf(&data, "%s%" PRIu64 ";", data, warn); |
| 530 | else | 560 | } else { |
| 531 | xasprintf(&data, "%s;", data); | 561 | xasprintf(&data, "%s;", data); |
| 562 | } | ||
| 532 | 563 | ||
| 533 | if (critp) | 564 | if (critp) { |
| 534 | xasprintf(&data, "%s%" PRIu64 ";", data, crit); | 565 | xasprintf(&data, "%s%" PRIu64 ";", data, crit); |
| 535 | else | 566 | } else { |
| 536 | xasprintf(&data, "%s;", data); | 567 | xasprintf(&data, "%s;", data); |
| 568 | } | ||
| 537 | 569 | ||
| 538 | if (minp) | 570 | if (minp) { |
| 539 | xasprintf(&data, "%s%" PRIu64 ";", data, minv); | 571 | xasprintf(&data, "%s%" PRIu64 ";", data, minv); |
| 540 | else | 572 | } else { |
| 541 | xasprintf(&data, "%s;", data); | 573 | xasprintf(&data, "%s;", data); |
| 574 | } | ||
| 542 | 575 | ||
| 543 | if (maxp) | 576 | if (maxp) { |
| 544 | xasprintf(&data, "%s%" PRIu64, data, maxv); | 577 | xasprintf(&data, "%s%" PRIu64, data, maxv); |
| 578 | } | ||
| 545 | 579 | ||
| 546 | return data; | 580 | return data; |
| 547 | } | 581 | } |
| 548 | 582 | ||
| 549 | char *perfdata_int64(const char *label, int64_t val, const char *uom, int warnp, /* Warning present */ | 583 | char *perfdata_int64(const char *label, int64_t val, const char *uom, bool warnp, /* Warning present */ |
| 550 | int64_t warn, int critp, /* Critical present */ | 584 | int64_t warn, bool critp, /* Critical present */ |
| 551 | int64_t crit, int minp, /* Minimum present */ | 585 | int64_t crit, bool minp, /* Minimum present */ |
| 552 | int64_t minv, int maxp, /* Maximum present */ | 586 | int64_t minv, bool maxp, /* Maximum present */ |
| 553 | int64_t maxv) { | 587 | int64_t maxv) { |
| 554 | char *data = NULL; | 588 | char *data = NULL; |
| 555 | 589 | ||
| 556 | if (strpbrk(label, "'= ")) | 590 | if (strpbrk(label, "'= ")) { |
| 557 | xasprintf(&data, "'%s'=%" PRId64 "%s;", label, val, uom); | 591 | xasprintf(&data, "'%s'=%" PRId64 "%s;", label, val, uom); |
| 558 | else | 592 | } else { |
| 559 | xasprintf(&data, "%s=%" PRId64 "%s;", label, val, uom); | 593 | xasprintf(&data, "%s=%" PRId64 "%s;", label, val, uom); |
| 594 | } | ||
| 560 | 595 | ||
| 561 | if (warnp) | 596 | if (warnp) { |
| 562 | xasprintf(&data, "%s%" PRId64 ";", data, warn); | 597 | xasprintf(&data, "%s%" PRId64 ";", data, warn); |
| 563 | else | 598 | } else { |
| 564 | xasprintf(&data, "%s;", data); | 599 | xasprintf(&data, "%s;", data); |
| 600 | } | ||
| 565 | 601 | ||
| 566 | if (critp) | 602 | if (critp) { |
| 567 | xasprintf(&data, "%s%" PRId64 ";", data, crit); | 603 | xasprintf(&data, "%s%" PRId64 ";", data, crit); |
| 568 | else | 604 | } else { |
| 569 | xasprintf(&data, "%s;", data); | 605 | xasprintf(&data, "%s;", data); |
| 606 | } | ||
| 570 | 607 | ||
| 571 | if (minp) | 608 | if (minp) { |
| 572 | xasprintf(&data, "%s%" PRId64 ";", data, minv); | 609 | xasprintf(&data, "%s%" PRId64 ";", data, minv); |
| 573 | else | 610 | } else { |
| 574 | xasprintf(&data, "%s;", data); | 611 | xasprintf(&data, "%s;", data); |
| 612 | } | ||
| 575 | 613 | ||
| 576 | if (maxp) | 614 | if (maxp) { |
| 577 | xasprintf(&data, "%s%" PRId64, data, maxv); | 615 | xasprintf(&data, "%s%" PRId64, data, maxv); |
| 616 | } | ||
| 578 | 617 | ||
| 579 | return data; | 618 | return data; |
| 580 | } | 619 | } |
| 581 | 620 | ||
| 582 | char *fperfdata(const char *label, double val, const char *uom, int warnp, double warn, int critp, double crit, int minp, double minv, | 621 | char *fperfdata(const char *label, double val, const char *uom, bool warnp, double warn, bool critp, double crit, bool minp, double minv, |
| 583 | int maxp, double maxv) { | 622 | bool maxp, double maxv) { |
| 584 | char *data = NULL; | 623 | char *data = NULL; |
| 585 | 624 | ||
| 586 | if (strpbrk(label, "'= ")) | 625 | if (strpbrk(label, "'= ")) { |
| 587 | xasprintf(&data, "'%s'=", label); | 626 | xasprintf(&data, "'%s'=", label); |
| 588 | else | 627 | } else { |
| 589 | xasprintf(&data, "%s=", label); | 628 | xasprintf(&data, "%s=", label); |
| 629 | } | ||
| 590 | 630 | ||
| 591 | xasprintf(&data, "%s%f", data, val); | 631 | xasprintf(&data, "%s%f", data, val); |
| 592 | xasprintf(&data, "%s%s;", data, uom); | 632 | xasprintf(&data, "%s%s;", data, uom); |
| 593 | 633 | ||
| 594 | if (warnp) | 634 | if (warnp) { |
| 595 | xasprintf(&data, "%s%f", data, warn); | 635 | xasprintf(&data, "%s%f", data, warn); |
| 636 | } | ||
| 596 | 637 | ||
| 597 | xasprintf(&data, "%s;", data); | 638 | xasprintf(&data, "%s;", data); |
| 598 | 639 | ||
| 599 | if (critp) | 640 | if (critp) { |
| 600 | xasprintf(&data, "%s%f", data, crit); | 641 | xasprintf(&data, "%s%f", data, crit); |
| 642 | } | ||
| 601 | 643 | ||
| 602 | xasprintf(&data, "%s;", data); | 644 | xasprintf(&data, "%s;", data); |
| 603 | 645 | ||
| 604 | if (minp) | 646 | if (minp) { |
| 605 | xasprintf(&data, "%s%f", data, minv); | 647 | xasprintf(&data, "%s%f", data, minv); |
| 648 | } | ||
| 606 | 649 | ||
| 607 | if (maxp) { | 650 | if (maxp) { |
| 608 | xasprintf(&data, "%s;", data); | 651 | xasprintf(&data, "%s;", data); |
| @@ -612,28 +655,32 @@ char *fperfdata(const char *label, double val, const char *uom, int warnp, doubl | |||
| 612 | return data; | 655 | return data; |
| 613 | } | 656 | } |
| 614 | 657 | ||
| 615 | char *sperfdata(const char *label, double val, const char *uom, char *warn, char *crit, int minp, double minv, int maxp, double maxv) { | 658 | char *sperfdata(const char *label, double val, const char *uom, char *warn, char *crit, bool minp, double minv, bool maxp, double maxv) { |
| 616 | char *data = NULL; | 659 | char *data = NULL; |
| 617 | if (strpbrk(label, "'= ")) | 660 | if (strpbrk(label, "'= ")) { |
| 618 | xasprintf(&data, "'%s'=", label); | 661 | xasprintf(&data, "'%s'=", label); |
| 619 | else | 662 | } else { |
| 620 | xasprintf(&data, "%s=", label); | 663 | xasprintf(&data, "%s=", label); |
| 664 | } | ||
| 621 | 665 | ||
| 622 | xasprintf(&data, "%s%f", data, val); | 666 | xasprintf(&data, "%s%f", data, val); |
| 623 | xasprintf(&data, "%s%s;", data, uom); | 667 | xasprintf(&data, "%s%s;", data, uom); |
| 624 | 668 | ||
| 625 | if (warn != NULL) | 669 | if (warn != NULL) { |
| 626 | xasprintf(&data, "%s%s", data, warn); | 670 | xasprintf(&data, "%s%s", data, warn); |
| 671 | } | ||
| 627 | 672 | ||
| 628 | xasprintf(&data, "%s;", data); | 673 | xasprintf(&data, "%s;", data); |
| 629 | 674 | ||
| 630 | if (crit != NULL) | 675 | if (crit != NULL) { |
| 631 | xasprintf(&data, "%s%s", data, crit); | 676 | xasprintf(&data, "%s%s", data, crit); |
| 677 | } | ||
| 632 | 678 | ||
| 633 | xasprintf(&data, "%s;", data); | 679 | xasprintf(&data, "%s;", data); |
| 634 | 680 | ||
| 635 | if (minp) | 681 | if (minp) { |
| 636 | xasprintf(&data, "%s%f", data, minv); | 682 | xasprintf(&data, "%s%f", data, minv); |
| 683 | } | ||
| 637 | 684 | ||
| 638 | if (maxp) { | 685 | if (maxp) { |
| 639 | xasprintf(&data, "%s;", data); | 686 | xasprintf(&data, "%s;", data); |
| @@ -643,28 +690,32 @@ char *sperfdata(const char *label, double val, const char *uom, char *warn, char | |||
| 643 | return data; | 690 | return data; |
| 644 | } | 691 | } |
| 645 | 692 | ||
| 646 | char *sperfdata_int(const char *label, int val, const char *uom, char *warn, char *crit, int minp, int minv, int maxp, int maxv) { | 693 | char *sperfdata_int(const char *label, int val, const char *uom, char *warn, char *crit, bool minp, int minv, bool maxp, int maxv) { |
| 647 | char *data = NULL; | 694 | char *data = NULL; |
| 648 | if (strpbrk(label, "'= ")) | 695 | if (strpbrk(label, "'= ")) { |
| 649 | xasprintf(&data, "'%s'=", label); | 696 | xasprintf(&data, "'%s'=", label); |
| 650 | else | 697 | } else { |
| 651 | xasprintf(&data, "%s=", label); | 698 | xasprintf(&data, "%s=", label); |
| 699 | } | ||
| 652 | 700 | ||
| 653 | xasprintf(&data, "%s%d", data, val); | 701 | xasprintf(&data, "%s%d", data, val); |
| 654 | xasprintf(&data, "%s%s;", data, uom); | 702 | xasprintf(&data, "%s%s;", data, uom); |
| 655 | 703 | ||
| 656 | if (warn != NULL) | 704 | if (warn != NULL) { |
| 657 | xasprintf(&data, "%s%s", data, warn); | 705 | xasprintf(&data, "%s%s", data, warn); |
| 706 | } | ||
| 658 | 707 | ||
| 659 | xasprintf(&data, "%s;", data); | 708 | xasprintf(&data, "%s;", data); |
| 660 | 709 | ||
| 661 | if (crit != NULL) | 710 | if (crit != NULL) { |
| 662 | xasprintf(&data, "%s%s", data, crit); | 711 | xasprintf(&data, "%s%s", data, crit); |
| 712 | } | ||
| 663 | 713 | ||
| 664 | xasprintf(&data, "%s;", data); | 714 | xasprintf(&data, "%s;", data); |
| 665 | 715 | ||
| 666 | if (minp) | 716 | if (minp) { |
| 667 | xasprintf(&data, "%s%d", data, minv); | 717 | xasprintf(&data, "%s%d", data, minv); |
| 718 | } | ||
| 668 | 719 | ||
| 669 | if (maxp) { | 720 | if (maxp) { |
| 670 | xasprintf(&data, "%s;", data); | 721 | xasprintf(&data, "%s;", data); |
diff --git a/plugins/utils.h b/plugins/utils.h index 029ae5a6..92a6c115 100644 --- a/plugins/utils.h +++ b/plugins/utils.h | |||
| @@ -21,43 +21,43 @@ suite of plugins. */ | |||
| 21 | 21 | ||
| 22 | #ifdef NP_EXTRA_OPTS | 22 | #ifdef NP_EXTRA_OPTS |
| 23 | /* Include extra-opts functions if compiled in */ | 23 | /* Include extra-opts functions if compiled in */ |
| 24 | #include "extra_opts.h" | 24 | # include "extra_opts.h" |
| 25 | #else | 25 | #else |
| 26 | /* else, fake np_extra_opts */ | 26 | /* else, fake np_extra_opts */ |
| 27 | #define np_extra_opts(acptr,av,pr) av | 27 | # define np_extra_opts(acptr, av, pr) av |
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | /* Standardize version information, termination */ | 30 | /* Standardize version information, termination */ |
| 31 | 31 | ||
| 32 | void support (void); | 32 | void support(void); |
| 33 | void print_revision (const char *, const char *); | 33 | void print_revision(const char *, const char *); |
| 34 | 34 | ||
| 35 | extern time_t start_time, end_time; | 35 | extern time_t start_time, end_time; |
| 36 | 36 | ||
| 37 | /* Test input types */ | 37 | /* Test input types */ |
| 38 | 38 | ||
| 39 | bool is_integer (char *); | 39 | bool is_integer(char *); |
| 40 | bool is_intpos (char *); | 40 | bool is_intpos(char *); |
| 41 | bool is_intneg (char *); | 41 | bool is_intneg(char *); |
| 42 | bool is_intnonneg (char *); | 42 | bool is_intnonneg(char *); |
| 43 | bool is_intpercent (char *); | 43 | bool is_intpercent(char *); |
| 44 | bool is_uint64(char *number, uint64_t *target); | 44 | bool is_uint64(char *number, uint64_t *target); |
| 45 | bool is_int64(char *number, int64_t *target); | 45 | bool is_int64(char *number, int64_t *target); |
| 46 | 46 | ||
| 47 | bool is_numeric (char *); | 47 | bool is_numeric(char *); |
| 48 | bool is_positive (char *); | 48 | bool is_positive(char *); |
| 49 | bool is_negative (char *); | 49 | bool is_negative(char *); |
| 50 | bool is_nonnegative (char *); | 50 | bool is_nonnegative(char *); |
| 51 | bool is_percentage (char *); | 51 | bool is_percentage(char *); |
| 52 | bool is_percentage_expression (const char[]); | 52 | bool is_percentage_expression(const char[]); |
| 53 | 53 | ||
| 54 | bool is_option (char *); | 54 | bool is_option(char *); |
| 55 | 55 | ||
| 56 | /* Generalized timer that will do milliseconds if available */ | 56 | /* Generalized timer that will do milliseconds if available */ |
| 57 | #ifndef HAVE_STRUCT_TIMEVAL | 57 | #ifndef HAVE_STRUCT_TIMEVAL |
| 58 | struct timeval { | 58 | struct timeval { |
| 59 | long tv_sec; /* seconds */ | 59 | long tv_sec; /* seconds */ |
| 60 | long tv_usec; /* microseconds */ | 60 | long tv_usec; /* microseconds */ |
| 61 | }; | 61 | }; |
| 62 | #endif | 62 | #endif |
| 63 | 63 | ||
| @@ -65,137 +65,142 @@ struct timeval { | |||
| 65 | int gettimeofday(struct timeval *, struct timezone *); | 65 | int gettimeofday(struct timeval *, struct timezone *); |
| 66 | #endif | 66 | #endif |
| 67 | 67 | ||
| 68 | double delta_time (struct timeval tv); | 68 | double delta_time(struct timeval tv); |
| 69 | long deltime (struct timeval tv); | 69 | long deltime(struct timeval tv); |
| 70 | 70 | ||
| 71 | /* Handle strings safely */ | 71 | /* Handle strings safely */ |
| 72 | 72 | ||
| 73 | void strip (char *); | 73 | void strip(char *); |
| 74 | char *strscpy (char *, const char *); | 74 | char *strscpy(char *, const char *); |
| 75 | char *strnl (char *); | 75 | char *strnl(char *); |
| 76 | char *strpcpy (char *, const char *, const char *); | 76 | char *strpcpy(char *, const char *, const char *); |
| 77 | char *strpcat (char *, const char *, const char *); | 77 | char *strpcat(char *, const char *, const char *); |
| 78 | int xvasprintf (char **strp, const char *fmt, va_list ap); | 78 | int xvasprintf(char **strp, const char *fmt, va_list ap); |
| 79 | int xasprintf (char **strp, const char *fmt, ...); | 79 | int xasprintf(char **strp, const char *fmt, ...); |
| 80 | 80 | ||
| 81 | void usage (const char *) __attribute__((noreturn)); | 81 | void usage(const char *) __attribute__((noreturn)); |
| 82 | void usage2(const char *, const char *) __attribute__((noreturn)); | 82 | void usage2(const char *, const char *) __attribute__((noreturn)); |
| 83 | void usage3(const char *, int) __attribute__((noreturn)); | 83 | void usage3(const char *, int) __attribute__((noreturn)); |
| 84 | void usage4(const char *) __attribute__((noreturn)); | 84 | void usage4(const char *) __attribute__((noreturn)); |
| 85 | void usage5(void) __attribute__((noreturn)); | 85 | void usage5(void) __attribute__((noreturn)); |
| 86 | void usage_va(const char *fmt, ...) __attribute__((noreturn)); | 86 | void usage_va(const char *fmt, ...) __attribute__((noreturn)); |
| 87 | 87 | ||
| 88 | #define max(a,b) (((a)>(b))?(a):(b)) | 88 | #define max(a, b) (((a) > (b)) ? (a) : (b)) |
| 89 | #define min(a,b) (((a)<(b))?(a):(b)) | 89 | #define min(a, b) (((a) < (b)) ? (a) : (b)) |
| 90 | 90 | ||
| 91 | char *perfdata (const char *, long int, const char *, int, long int, | 91 | char *perfdata(const char *, long int, const char *, bool, long int, bool, long int, bool, long int, bool, long int); |
| 92 | int, long int, int, long int, int, long int); | ||
| 93 | 92 | ||
| 94 | char *perfdata_uint64 (const char *, uint64_t , const char *, int, uint64_t, | 93 | char *perfdata_uint64(const char *, uint64_t, const char *, bool, uint64_t, bool, uint64_t, bool, uint64_t, bool, uint64_t); |
| 95 | int, uint64_t, int, uint64_t, int, uint64_t); | ||
| 96 | 94 | ||
| 97 | char *perfdata_int64 (const char *, int64_t, const char *, int, int64_t, | 95 | char *perfdata_int64(const char *, int64_t, const char *, bool, int64_t, bool, int64_t, bool, int64_t, bool, int64_t); |
| 98 | int, int64_t, int, int64_t, int, int64_t); | ||
| 99 | 96 | ||
| 100 | char *fperfdata (const char *, double, const char *, int, double, | 97 | char *fperfdata(const char *, double, const char *, bool, double, bool, double, bool, double, bool, double); |
| 101 | int, double, int, double, int, double); | ||
| 102 | 98 | ||
| 103 | char *sperfdata (const char *, double, const char *, char *, char *, | 99 | char *sperfdata(const char *, double, const char *, char *, char *, bool, double, bool, double); |
| 104 | int, double, int, double); | ||
| 105 | 100 | ||
| 106 | char *sperfdata_int (const char *, int, const char *, char *, char *, | 101 | char *sperfdata_int(const char *, int, const char *, char *, char *, bool, int, bool, int); |
| 107 | int, int, int, int); | ||
| 108 | 102 | ||
| 109 | /* The idea here is that, although not every plugin will use all of these, | 103 | /* The idea here is that, although not every plugin will use all of these, |
| 110 | most will or should. Therefore, for consistency, these very common | 104 | most will or should. Therefore, for consistency, these very common |
| 111 | options should have only these meanings throughout the overall suite */ | 105 | options should have only these meanings throughout the overall suite */ |
| 112 | 106 | ||
| 113 | #define STD_LONG_OPTS \ | 107 | #define STD_LONG_OPTS \ |
| 114 | {"version",no_argument,0,'V'},\ | 108 | {"version", no_argument, 0, 'V'}, {"verbose", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, \ |
| 115 | {"verbose",no_argument,0,'v'},\ | 109 | {"timeout", required_argument, 0, 't'}, {"critical", required_argument, 0, 'c'}, {"warning", required_argument, 0, 'w'}, \ |
| 116 | {"help",no_argument,0,'h'},\ | 110 | {"hostname", required_argument, 0, 'H'} |
| 117 | {"timeout",required_argument,0,'t'},\ | ||
| 118 | {"critical",required_argument,0,'c'},\ | ||
| 119 | {"warning",required_argument,0,'w'},\ | ||
| 120 | {"hostname",required_argument,0,'H'} | ||
| 121 | 111 | ||
| 122 | #define COPYRIGHT "Copyright (c) %s Monitoring Plugins Development Team\n\ | 112 | #define COPYRIGHT \ |
| 113 | "Copyright (c) %s Monitoring Plugins Development Team\n\ | ||
| 123 | \t<%s>\n\n" | 114 | \t<%s>\n\n" |
| 124 | 115 | ||
| 125 | #define UT_HLP_VRS _("\ | 116 | #define UT_HLP_VRS \ |
| 117 | _("\ | ||
| 126 | %s (-h | --help) for detailed help\n\ | 118 | %s (-h | --help) for detailed help\n\ |
| 127 | %s (-V | --version) for version information\n") | 119 | %s (-V | --version) for version information\n") |
| 128 | 120 | ||
| 129 | #define UT_HELP_VRSN _("\ | 121 | #define UT_HELP_VRSN \ |
| 122 | _("\ | ||
| 130 | \nOptions:\n\ | 123 | \nOptions:\n\ |
| 131 | -h, --help\n\ | 124 | -h, --help\n\ |
| 132 | Print detailed help screen\n\ | 125 | Print detailed help screen\n\ |
| 133 | -V, --version\n\ | 126 | -V, --version\n\ |
| 134 | Print version information\n") | 127 | Print version information\n") |
| 135 | 128 | ||
| 136 | #define UT_HOST_PORT _("\ | 129 | #define UT_HOST_PORT \ |
| 130 | _("\ | ||
| 137 | -H, --hostname=ADDRESS\n\ | 131 | -H, --hostname=ADDRESS\n\ |
| 138 | Host name, IP Address, or unix socket (must be an absolute path)\n\ | 132 | Host name, IP Address, or unix socket (must be an absolute path)\n\ |
| 139 | -%c, --port=INTEGER\n\ | 133 | -%c, --port=INTEGER\n\ |
| 140 | Port number (default: %s)\n") | 134 | Port number (default: %s)\n") |
| 141 | 135 | ||
| 142 | #define UT_IPv46 _("\ | 136 | #define UT_IPv46 \ |
| 137 | _("\ | ||
| 143 | -4, --use-ipv4\n\ | 138 | -4, --use-ipv4\n\ |
| 144 | Use IPv4 connection\n\ | 139 | Use IPv4 connection\n\ |
| 145 | -6, --use-ipv6\n\ | 140 | -6, --use-ipv6\n\ |
| 146 | Use IPv6 connection\n") | 141 | Use IPv6 connection\n") |
| 147 | 142 | ||
| 148 | #define UT_VERBOSE _("\ | 143 | #define UT_VERBOSE \ |
| 144 | _("\ | ||
| 149 | -v, --verbose\n\ | 145 | -v, --verbose\n\ |
| 150 | Show details for command-line debugging (output may be truncated by\n\ | 146 | Show details for command-line debugging (output may be truncated by\n\ |
| 151 | the monitoring system)\n") | 147 | the monitoring system)\n") |
| 152 | 148 | ||
| 153 | #define UT_WARN_CRIT _("\ | 149 | #define UT_WARN_CRIT \ |
| 150 | _("\ | ||
| 154 | -w, --warning=DOUBLE\n\ | 151 | -w, --warning=DOUBLE\n\ |
| 155 | Response time to result in warning status (seconds)\n\ | 152 | Response time to result in warning status (seconds)\n\ |
| 156 | -c, --critical=DOUBLE\n\ | 153 | -c, --critical=DOUBLE\n\ |
| 157 | Response time to result in critical status (seconds)\n") | 154 | Response time to result in critical status (seconds)\n") |
| 158 | 155 | ||
| 159 | #define UT_WARN_CRIT_RANGE _("\ | 156 | #define UT_WARN_CRIT_RANGE \ |
| 157 | _("\ | ||
| 160 | -w, --warning=RANGE\n\ | 158 | -w, --warning=RANGE\n\ |
| 161 | Warning range (format: start:end). Alert if outside this range\n\ | 159 | Warning range (format: start:end). Alert if outside this range\n\ |
| 162 | -c, --critical=RANGE\n\ | 160 | -c, --critical=RANGE\n\ |
| 163 | Critical range\n") | 161 | Critical range\n") |
| 164 | 162 | ||
| 165 | #define UT_CONN_TIMEOUT _("\ | 163 | #define UT_CONN_TIMEOUT \ |
| 164 | _("\ | ||
| 166 | -t, --timeout=INTEGER\n\ | 165 | -t, --timeout=INTEGER\n\ |
| 167 | Seconds before connection times out (default: %d)\n") | 166 | Seconds before connection times out (default: %d)\n") |
| 168 | 167 | ||
| 169 | #define UT_PLUG_TIMEOUT _("\ | 168 | #define UT_PLUG_TIMEOUT \ |
| 169 | _("\ | ||
| 170 | -t, --timeout=INTEGER\n\ | 170 | -t, --timeout=INTEGER\n\ |
| 171 | Seconds before plugin times out (default: %d)\n") | 171 | Seconds before plugin times out (default: %d)\n") |
| 172 | 172 | ||
| 173 | #ifdef NP_EXTRA_OPTS | 173 | #ifdef NP_EXTRA_OPTS |
| 174 | #define UT_EXTRA_OPTS _("\ | 174 | # define UT_EXTRA_OPTS \ |
| 175 | _("\ | ||
| 175 | --extra-opts=[section][@file]\n\ | 176 | --extra-opts=[section][@file]\n\ |
| 176 | Read options from an ini file. See\n\ | 177 | Read options from an ini file. See\n\ |
| 177 | https://www.monitoring-plugins.org/doc/extra-opts.html\n\ | 178 | https://www.monitoring-plugins.org/doc/extra-opts.html\n\ |
| 178 | for usage and examples.\n") | 179 | for usage and examples.\n") |
| 179 | #else | 180 | #else |
| 180 | #define UT_EXTRA_OPTS " \b" | 181 | # define UT_EXTRA_OPTS " \b" |
| 181 | #endif | 182 | #endif |
| 182 | 183 | ||
| 183 | #define UT_THRESHOLDS_NOTES _("\ | 184 | #define UT_THRESHOLDS_NOTES \ |
| 185 | _("\ | ||
| 184 | See:\n\ | 186 | See:\n\ |
| 185 | https://www.monitoring-plugins.org/doc/guidelines.html#THRESHOLDFORMAT\n\ | 187 | https://www.monitoring-plugins.org/doc/guidelines.html#THRESHOLDFORMAT\n\ |
| 186 | for THRESHOLD format and examples.\n") | 188 | for THRESHOLD format and examples.\n") |
| 187 | 189 | ||
| 188 | #define UT_SUPPORT _("\n\ | 190 | #define UT_SUPPORT \ |
| 191 | _("\n\ | ||
| 189 | Send email to help@monitoring-plugins.org if you have questions regarding\n\ | 192 | Send email to help@monitoring-plugins.org if you have questions regarding\n\ |
| 190 | use of this software. To submit patches or suggest improvements, send email\n\ | 193 | use of this software. To submit patches or suggest improvements, send email\n\ |
| 191 | to devel@monitoring-plugins.org\n\n") | 194 | to devel@monitoring-plugins.org\n\n") |
| 192 | 195 | ||
| 193 | #define UT_NOWARRANTY _("\n\ | 196 | #define UT_NOWARRANTY \ |
| 197 | _("\n\ | ||
| 194 | The Monitoring Plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\n\ | 198 | The Monitoring Plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\n\ |
| 195 | copies of the plugins under the terms of the GNU General Public License.\n\ | 199 | copies of the plugins under the terms of the GNU General Public License.\n\ |
| 196 | For more information about these matters, see the file named COPYING.\n") | 200 | For more information about these matters, see the file named COPYING.\n") |
| 197 | 201 | ||
| 198 | #define UT_OUTPUT_FORMAT _("\ | 202 | #define UT_OUTPUT_FORMAT \ |
| 203 | _("\ | ||
| 199 | --output-format=OUTPUT_FORMAT\n\ | 204 | --output-format=OUTPUT_FORMAT\n\ |
| 200 | Select output format. Valid values: \"multi-line\", \"mp-test-json\"\n") | 205 | Select output format. Valid values: \"multi-line\", \"mp-test-json\"\n") |
| 201 | 206 | ||
