summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/check_tcp.c46
-rw-r--r--plugins/check_tcp.d/config.h9
2 files changed, 38 insertions, 17 deletions
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c
index f93152e5..793cfe7e 100644
--- a/plugins/check_tcp.c
+++ b/plugins/check_tcp.c
@@ -28,7 +28,6 @@
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30/* progname "check_tcp" changes depending on symlink called */ 30/* progname "check_tcp" changes depending on symlink called */
31#include "states.h"
32char *progname; 31char *progname;
33const char *copyright = "1999-2025"; 32const char *copyright = "1999-2025";
34const char *email = "devel@monitoring-plugins.org"; 33const char *email = "devel@monitoring-plugins.org";
@@ -37,6 +36,7 @@ const char *email = "devel@monitoring-plugins.org";
37#include "./netutils.h" 36#include "./netutils.h"
38#include "./utils.h" 37#include "./utils.h"
39#include "./check_tcp.d/config.h" 38#include "./check_tcp.d/config.h"
39#include "states.h"
40 40
41#include <sys/types.h> 41#include <sys/types.h>
42#include <ctype.h> 42#include <ctype.h>
@@ -61,10 +61,10 @@ ssize_t my_send(char *buf, size_t len) {
61typedef struct process_arguments_wrapper { 61typedef struct process_arguments_wrapper {
62 int errorcode; 62 int errorcode;
63 check_tcp_config config; 63 check_tcp_config config;
64} process_arguments_wrapper; 64} check_tcp_config_wrapper;
65 65
66/* int my_recv(char *, size_t); */ 66/* int my_recv(char *, size_t); */
67static process_arguments_wrapper process_arguments(int /*argc*/, char ** /*argv*/, check_tcp_config /*config*/); 67static check_tcp_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/, check_tcp_config /*config*/);
68void print_help(const char *service); 68void print_help(const char *service);
69void print_usage(void); 69void print_usage(void);
70 70
@@ -207,7 +207,7 @@ int main(int argc, char **argv) {
207 /* Parse extra opts if any */ 207 /* Parse extra opts if any */
208 argv = np_extra_opts(&argc, argv, progname); 208 argv = np_extra_opts(&argc, argv, progname);
209 209
210 process_arguments_wrapper paw = process_arguments(argc, argv, config); 210 check_tcp_config_wrapper paw = process_arguments(argc, argv, config);
211 if (paw.errorcode == ERROR) { 211 if (paw.errorcode == ERROR) {
212 usage4(_("Could not parse arguments")); 212 usage4(_("Could not parse arguments"));
213 } 213 }
@@ -229,6 +229,9 @@ int main(int argc, char **argv) {
229 229
230 // Initialize check stuff before setting timers 230 // Initialize check stuff before setting timers
231 mp_check overall = mp_check_init(); 231 mp_check overall = mp_check_init();
232 if (config.output_format_set) {
233 overall.format = config.output_format;
234 }
232 235
233 /* set up the timer */ 236 /* set up the timer */
234 signal(SIGALRM, socket_timeout_alarm_handler); 237 signal(SIGALRM, socket_timeout_alarm_handler);
@@ -452,12 +455,12 @@ int main(int argc, char **argv) {
452} 455}
453 456
454/* process command-line arguments */ 457/* process command-line arguments */
455static process_arguments_wrapper process_arguments(int argc, char **argv, check_tcp_config config) { 458static check_tcp_config_wrapper process_arguments(int argc, char **argv, check_tcp_config config) {
456 enum { 459 enum {
457 SNI_OPTION = CHAR_MAX + 1 460 SNI_OPTION = CHAR_MAX + 1,
461 output_format_index,
458 }; 462 };
459 463
460 int option = 0;
461 static struct option longopts[] = {{"hostname", required_argument, 0, 'H'}, 464 static struct option longopts[] = {{"hostname", required_argument, 0, 'H'},
462 {"critical", required_argument, 0, 'c'}, 465 {"critical", required_argument, 0, 'c'},
463 {"warning", required_argument, 0, 'w'}, 466 {"warning", required_argument, 0, 'w'},
@@ -484,6 +487,7 @@ static process_arguments_wrapper process_arguments(int argc, char **argv, check_
484 {"ssl", no_argument, 0, 'S'}, 487 {"ssl", no_argument, 0, 'S'},
485 {"sni", required_argument, 0, SNI_OPTION}, 488 {"sni", required_argument, 0, SNI_OPTION},
486 {"certificate", required_argument, 0, 'D'}, 489 {"certificate", required_argument, 0, 'D'},
490 {"output-format", required_argument, 0, output_format_index},
487 {0, 0, 0, 0}}; 491 {0, 0, 0, 0}};
488 492
489 if (argc < 2) { 493 if (argc < 2) {
@@ -497,17 +501,17 @@ static process_arguments_wrapper process_arguments(int argc, char **argv, check_
497 argc--; 501 argc--;
498 } 502 }
499 503
500 int c;
501 bool escape = false; 504 bool escape = false;
502 505
503 while (true) { 506 while (true) {
504 c = getopt_long(argc, argv, "+hVv46EAH:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:", longopts, &option); 507 int option = 0;
508 int option_index = getopt_long(argc, argv, "+hVv46EAH:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:", longopts, &option);
505 509
506 if (c == -1 || c == EOF || c == 1) { 510 if (option_index == -1 || option_index == EOF || option_index == 1) {
507 break; 511 break;
508 } 512 }
509 513
510 switch (c) { 514 switch (option_index) {
511 case '?': /* print short usage statement if args not parsable */ 515 case '?': /* print short usage statement if args not parsable */
512 usage5(); 516 usage5();
513 case 'h': /* help */ 517 case 'h': /* help */
@@ -674,12 +678,24 @@ static process_arguments_wrapper process_arguments(int argc, char **argv, check_
674 case 'A': 678 case 'A':
675 config.match_flags |= NP_MATCH_ALL; 679 config.match_flags |= NP_MATCH_ALL;
676 break; 680 break;
681 case output_format_index: {
682 parsed_output_format parser = mp_parse_output_format(optarg);
683 if (!parser.parsing_success) {
684 // TODO List all available formats here, maybe add anothoer usage function
685 printf("Invalid output format: %s\n", optarg);
686 exit(STATE_UNKNOWN);
687 }
688
689 config.output_format_set = true;
690 config.output_format = parser.output_format;
691 break;
692 }
677 } 693 }
678 } 694 }
679 695
680 c = optind; 696 int index = optind;
681 if (!config.host_specified && c < argc) { 697 if (!config.host_specified && index < argc) {
682 config.server_address = strdup(argv[c++]); 698 config.server_address = strdup(argv[index++]);
683 } 699 }
684 700
685 if (config.server_address == NULL) { 701 if (config.server_address == NULL) {
@@ -689,7 +705,7 @@ static process_arguments_wrapper process_arguments(int argc, char **argv, check_
689 config.server_address); 705 config.server_address);
690 } 706 }
691 707
692 process_arguments_wrapper result = { 708 check_tcp_config_wrapper result = {
693 .config = config, 709 .config = config,
694 .errorcode = OK, 710 .errorcode = OK,
695 }; 711 };
diff --git a/plugins/check_tcp.d/config.h b/plugins/check_tcp.d/config.h
index 7ecf51a6..41db7224 100644
--- a/plugins/check_tcp.d/config.h
+++ b/plugins/check_tcp.d/config.h
@@ -1,10 +1,10 @@
1#pragma once 1#pragma once
2 2
3#include "../common.h"
4#include "../../lib/utils_tcp.h" 3#include "../../lib/utils_tcp.h"
4#include "output.h"
5#include <netinet/in.h> 5#include <netinet/in.h>
6 6
7typedef struct check_tcp_config { 7typedef struct {
8 char *server_address; 8 char *server_address;
9 bool host_specified; 9 bool host_specified;
10 int server_port; // TODO can this be a uint16? 10 int server_port; // TODO can this be a uint16?
@@ -37,6 +37,9 @@ typedef struct check_tcp_config {
37 ssize_t maxbytes; 37 ssize_t maxbytes;
38 38
39 bool hide_output; 39 bool hide_output;
40
41 bool output_format_set;
42 mp_output_format output_format;
40} check_tcp_config; 43} check_tcp_config;
41 44
42check_tcp_config check_tcp_config_init() { 45check_tcp_config check_tcp_config_init() {
@@ -73,6 +76,8 @@ check_tcp_config check_tcp_config_init() {
73 .maxbytes = 0, 76 .maxbytes = 0,
74 77
75 .hide_output = false, 78 .hide_output = false,
79
80 .output_format_set = false,
76 }; 81 };
77 return result; 82 return result;
78} 83}