aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Ton Voon <tonvoon@users.sourceforge.net> 2006-03-29 16:33:36 +0000
committerGravatar Ton Voon <tonvoon@users.sourceforge.net> 2006-03-29 16:33:36 +0000
commitf5c1cf6dd406be0b795f7388617d5469c6a358be (patch)
tree841b908d652b621846457a1e46f12c397a315286
parenta0f387467691292fe62c66e56fbc8476c7ecbb2d (diff)
downloadmonitoring-plugins-f5c1cf6dd406be0b795f7388617d5469c6a358be.tar.gz
New function to for escaped strings from command line for send/quit.
Adapted from Sebastian Wiesinger's patch (1292404) git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1365 f882894a-f735-0410-b71e-b25c423dba1c
-rw-r--r--THANKS.in1
-rw-r--r--plugins/check_tcp.c55
-rw-r--r--plugins/tests/test_utils.c31
-rw-r--r--plugins/utils.c30
-rw-r--r--plugins/utils.h2
5 files changed, 86 insertions, 33 deletions
diff --git a/THANKS.in b/THANKS.in
index 3b2405d2..3fb69c86 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -179,3 +179,4 @@ Steven Kreuzer
Johan Fischer
Sakari Lehtonen
John Rouillard
+Sebastian Wiesinger
diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c
index d8fc26e7..5fe024be 100644
--- a/plugins/check_tcp.c
+++ b/plugins/check_tcp.c
@@ -54,8 +54,6 @@ static int server_port = 0;
static char *server_address = NULL;
static char *server_send = NULL;
static char *server_quit = NULL;
-char *lineend = "";
-char *lineendquit = "\r\n";
static char **server_expect;
static size_t server_expect_count = 0;
static size_t maxbytes = 0;
@@ -246,6 +244,12 @@ main (int argc, char **argv)
}
if(flags & FLAG_VERBOSE) {
+ if (server_send) {
+ printf("Send string: %s\n", server_send);
+ }
+ if (server_quit) {
+ printf("Quit string: %s\n", server_quit);
+ }
printf("server_expect_count: %d\n", (int)server_expect_count);
for(i = 0; i < server_expect_count; i++)
printf("\t%d: %s\n", i, server_expect[i]);
@@ -364,6 +368,7 @@ static int
process_arguments (int argc, char **argv)
{
int c;
+ int escape = 0;
int option = 0;
static struct option longopts[] = {
@@ -375,7 +380,7 @@ process_arguments (int argc, char **argv)
{"timeout", required_argument, 0, 't'},
{"protocol", required_argument, 0, 'P'},
{"port", required_argument, 0, 'p'},
- {"lineend", required_argument, 0, 'l'},
+ {"escape", required_argument, 0, 'E'},
{"send", required_argument, 0, 's'},
{"expect", required_argument, 0, 'e'},
{"maxbytes", required_argument, 0, 'm'},
@@ -417,7 +422,7 @@ process_arguments (int argc, char **argv)
}
while (1) {
- c = getopt_long (argc, argv, "+hVv46H:l:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:",
+ c = getopt_long (argc, argv, "+hVv46EH:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:",
longopts, &option);
if (c == -1 || c == EOF || c == 1)
@@ -485,30 +490,14 @@ process_arguments (int argc, char **argv)
else
server_port = atoi (optarg);
break;
- case 'l':
- switch (*optarg) {
- case 'n':
- lineend = strdup("\n");
- lineendquit = lineend;
- break;
- case 'r':
- lineend = strdup("\r");
- lineendquit = lineend;
- break;
- case 'b':
- lineend = strdup("\r\n");
- lineendquit = lineend;
- break;
- case 'e':
- lineend = strdup("");
- lineendquit = lineend;
- break;
- default:
- usage4 (_("Unrecognized option to -l, must be r, n, b or e"));
- }
+ case 'E':
+ escape = 1;
break;
case 's':
- asprintf(&server_send, "%s%s", optarg, lineend);
+ if (escape)
+ server_send = np_escaped_string(optarg);
+ else
+ asprintf(&server_send, "%s", optarg);
break;
case 'e': /* expect string (may be repeated) */
EXPECT = NULL;
@@ -525,7 +514,10 @@ process_arguments (int argc, char **argv)
else
maxbytes = strtol (optarg, NULL, 0);
case 'q':
- asprintf(&server_quit, "%s%s", optarg, lineendquit);
+ if (escape)
+ server_quit = np_escaped_string(optarg);
+ else
+ asprintf(&server_quit, "%s\r\n", optarg);
break;
case 'r':
if (!strncmp(optarg,"ok",2))
@@ -604,10 +596,9 @@ print_help (void)
printf (_(UT_IPv46));
printf (_("\
- -l, --lineend=b|e|n|r\n\
- Ending on -s and -q strings. b - both: <cr><lf> style, e - empty no\n\
- end, n - newline: newline end, r - return: carriage return end\n\
- Default is \"-l e -s <send> -l b -q <quit>\".\n\
+ -E, --escape\n\
+ Can use \\n, \\r, \\t or \\ in send or quit string.\n\
+ Default: nothing added to send, \\r\\n added to end of quit\n\
-s, --send=STRING\n\
String to send to the server\n\
-e, --expect=STRING\n\
@@ -653,6 +644,6 @@ Usage: %s -H host -p port [-w <warning time>] [-c <critical time>]\n\
[-s <send string>] [-e <expect string>] [-q <quit string>]\n\
[-m <maximum bytes>] [-d <delay>] [-t <timeout seconds>]\n\
[-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]\n\
- [-D <days to cert expiry>] [-S <use SSL>] [-l <n|r|b|e>]\n", progname);
+ [-D <days to cert expiry>] [-S <use SSL>] [-E]\n", progname);
}
diff --git a/plugins/tests/test_utils.c b/plugins/tests/test_utils.c
index 27e28c75..5aa0028a 100644
--- a/plugins/tests/test_utils.c
+++ b/plugins/tests/test_utils.c
@@ -34,7 +34,7 @@ main (int argc, char **argv)
thresholds *thresholds = NULL;
int rc;
- plan_tests(66);
+ plan_tests(73);
range = parse_range_string("6");
ok( range != NULL, "'6' is valid range");
@@ -136,6 +136,35 @@ main (int argc, char **argv)
ok( get_status(30.0001, thresholds) == STATE_WARNING, "30.0001 - warning");
ok( get_status(69, thresholds) == STATE_CRITICAL, "69 - critical");
+ char *test;
+ test = np_escaped_string("bob\\n");
+ ok( strcmp(test, "bob\n") == 0, "bob\\n ok");
+ free(test);
+
+ test = np_escaped_string("rhuba\\rb");
+ ok( strcmp(test, "rhuba\rb") == 0, "rhuba\\rb okay");
+ free(test);
+
+ test = np_escaped_string("ba\\nge\\r");
+ ok( strcmp(test, "ba\nge\r") == 0, "ba\\nge\\r okay");
+ free(test);
+
+ test = np_escaped_string("\\rabbi\\t");
+ ok( strcmp(test, "\rabbi\t") == 0, "\\rabbi\\t okay");
+ free(test);
+
+ test = np_escaped_string("and\\\\or");
+ ok( strcmp(test, "and\\or") == 0, "and\\\\or okay");
+ free(test);
+
+ test = np_escaped_string("bo\\gus");
+ ok( strcmp(test, "bogus") == 0, "bo\\gus okay");
+ free(test);
+
+ test = np_escaped_string("everything");
+ ok( strcmp(test, "everything") == 0, "everything okay");
+ free(test);
+
return exit_status();
}
diff --git a/plugins/utils.c b/plugins/utils.c
index 685a638a..a5245c67 100644
--- a/plugins/utils.c
+++ b/plugins/utils.c
@@ -727,3 +727,33 @@ char *fperfdata (const char *label,
return data;
}
+
+char *np_escaped_string (const char *string) {
+ char *data;
+ int i, j=0;
+ data = strdup(string);
+ for (i=0; data[i]; i++) {
+ if (data[i] == '\\') {
+ switch(data[++i]) {
+ case 'n':
+ data[j++] = '\n';
+ break;
+ case 'r':
+ data[j++] = '\r';
+ break;
+ case 't':
+ data[j++] = '\t';
+ break;
+ case '\\':
+ data[j++] = '\\';
+ break;
+ default:
+ data[j++] = data[i];
+ }
+ } else {
+ data[j++] = data[i];
+ }
+ }
+ data[j] = '\0';
+ return data;
+}
diff --git a/plugins/utils.h b/plugins/utils.h
index 2345ed56..4bbe33d0 100644
--- a/plugins/utils.h
+++ b/plugins/utils.h
@@ -132,6 +132,8 @@ char *fperfdata (const char *,
int,
double);
+char *np_escaped_string (const char *);
+
/* The idea here is that, although not every plugin will use all of these,
most will or should. Therefore, for consistency, these very common
options should have only these meanings throughout the overall suite */