From: <st...@us...> - 2012-04-29 10:23:05
|
Revision: 6950 http://xymon.svn.sourceforge.net/xymon/?rev=6950&view=rev Author: storner Date: 2012-04-29 10:22:58 +0000 (Sun, 29 Apr 2012) Log Message: ----------- xymonnet: After a test, free the malloc'ed net-dialog entries (for http - others are static). Add a simple LDAP connection test prior to running ldaptalk. Modified Paths: -------------- trunk/xymonnet/netdialog.c trunk/xymonnet/netdialog.h trunk/xymonnet/setuptests.c trunk/xymonnet/tcptalk.c trunk/xymonnet/tcptalk.h Modified: trunk/xymonnet/netdialog.c =================================================================== --- trunk/xymonnet/netdialog.c 2012-04-29 10:20:02 UTC (rev 6949) +++ trunk/xymonnet/netdialog.c 2012-04-29 10:22:58 UTC (rev 6950) @@ -32,6 +32,7 @@ } netdialog_t; static void *netdialogs = NULL; +static char *silentdialog[] = { "CLOSE", NULL }; void load_protocols(char *fn) { @@ -124,7 +125,7 @@ (strncasecmp(STRBUF(l), "starttls", 8) == 0) ) { dialogsz++; rec->dialog = (char **)realloc(rec->dialog, (dialogsz+1)*sizeof(char *)); - getescapestring(STRBUF(l), &(rec->dialog[dialogsz-1]), NULL); + getescapestring(STRBUF(l), (unsigned char **)&(rec->dialog[dialogsz-1]), NULL); rec->dialog[dialogsz] = NULL; if (strncasecmp(STRBUF(l), "starttls", 8) == 0) rec->option_starttls = 1; @@ -348,8 +349,8 @@ /* All done, build the dialog for simply sending the request and reading back the response */ dialog = (char **)calloc(4, sizeof(char *)); dialog[0] = grabstrbuffer(httprequest); - dialog[1] = "READALL"; - dialog[2] = "CLOSE"; + dialog[1] = strdup("READALL"); + dialog[2] = strdup("CLOSE"); dialog[3] = NULL; freeweburl_data(&weburl); @@ -357,25 +358,41 @@ return dialog; } -char **net_dialog(char *testspec, myconn_netparams_t *netparams, net_test_options_t *options, void *hostinfo) + +static char **build_ldap_dialog(char *testspec, myconn_netparams_t *netparams, void *hostinfo) { - int dialuptest = 0, reversetest = 0, alwaystruetest = 0, silenttest = 0; + char *decodedurl; + weburl_t weburl; + char **dialog = NULL; - options->testtype = NET_TEST_STANDARD; + /* If there is a parse error in the URL, dont run the test */ + decodedurl = decode_url(testspec, &weburl); + if (!decodedurl || weburl.desturl->parseerror) { + freeweburl_data(&weburl); + return NULL; + } + netparams->socktype = CONN_SOCKTYPE_STREAM; + if (netparams->destinationip) xfree(netparams->destinationip); + netparams->destinationip = strdup(weburl.desturl->ip ? weburl.desturl->ip : weburl.desturl->host); + netparams->destinationport = weburl.desturl->port; + netparams->sslhandling = CONN_SSL_NO; /* No SSL handling, since this is just the pre-check that we can connect to the service */ + + freeweburl_data(&weburl); + return silentdialog; +} + +char **net_dialog(char *testspec, myconn_netparams_t *netparams, net_test_options_t *options, void *hostinfo, int *dtoken) +{ + options->testtype = *dtoken = NET_TEST_STANDARD; + /* Skip old-style modifiers */ - if (*testspec == '?') { dialuptest=1; testspec++; } - if (*testspec == '!') { reversetest=1; testspec++; } - if (*testspec == '~') { alwaystruetest=1; testspec++; } + testspec += strspn(testspec, "?!~"); - if ((strcmp(testspec, "http") == 0) || (strcmp(testspec, "https") == 0)) { - errprintf("Host %s: http/https tests requires a full URL\n", xmh_item(hostinfo, XMH_HOSTNAME)); - return NULL; + if ((argnmatch(testspec, "ldap://")) || (argnmatch(testspec, "ldaps://"))) { + options->testtype = NET_TEST_LDAP; + return build_ldap_dialog(testspec, netparams, hostinfo); } - else if ((argnmatch(testspec, "ldap://")) || (argnmatch(testspec, "ldaps://"))) { - /* LDAP test - handled in another module */ - return NULL; - } else if ( argnmatch(testspec, "http") || argnmatch(testspec, "content=http") || argnmatch(testspec, "cont;http") || @@ -393,32 +410,36 @@ argnmatch(testspec, "type;http") || argnmatch(testspec, "type=") ) { - options->testtype = NET_TEST_HTTP; - return build_http_dialog(testspec, netparams, hostinfo); + options->testtype = *dtoken = NET_TEST_HTTP; + return build_http_dialog(testspec, netparams, hostinfo); } else { xtreePos_t handle; - char *opt, *port = NULL; + char *opt; + int port = 0, silenttest = 0; opt = strrchr(testspec, ':'); - if (opt && ((strcasecmp(opt, ":s") == 0) || (strcasecmp(opt, ":q") == 0))) { - silenttest = 1; - *opt = '\0'; - port = strrchr(testspec, ':'); - *opt = ':'; + if (opt) { + /* Cut off the "silent" modifier */ + if ((strcasecmp(opt, ":s") == 0) || (strcasecmp(opt, ":q") == 0)) { + silenttest = 1; + *opt = '\0'; + opt = strrchr(testspec, ':'); + } + + if (opt) { + port = atoi(opt); + *opt = '\0'; + } } - else if (opt) - port = opt; - if (port) *port = '\0'; handle = xtreeFind(netdialogs, testspec); - if (port) *port = ':'; if (handle != xtreeEnd(netdialogs)) { netdialog_t *rec = xtreeData(netdialogs, handle); if (port) - netparams->destinationport = atoi(port+1); + netparams->destinationport = port; else netparams->destinationport = rec->portnumber; @@ -433,10 +454,30 @@ if (rec->option_ntp) options->testtype = NET_TEST_NTP; else options->testtype = NET_TEST_STANDARD; - return rec->dialog; + *dtoken = options->testtype; + + return (silenttest ? silentdialog : rec->dialog); } } return NULL; } + +void free_net_dialog(char **dialog, int dtoken) +{ + int i; + + if (!dialog) return; + + switch (dtoken) { + case NET_TEST_HTTP: + for (i=0; (dialog[i]); i++) xfree(dialog[i]); + xfree(dialog); + break; + + default: + break; + } +} + Modified: trunk/xymonnet/netdialog.h =================================================================== --- trunk/xymonnet/netdialog.h 2012-04-29 10:20:02 UTC (rev 6949) +++ trunk/xymonnet/netdialog.h 2012-04-29 10:22:58 UTC (rev 6950) @@ -12,7 +12,8 @@ #define __NETDIALOG_H__ extern void load_protocols(char *fn); -extern char **net_dialog(char *testspec, myconn_netparams_t *netparams, net_test_options_t *options, void *hostinfo); +extern char **net_dialog(char *testspec, myconn_netparams_t *netparams, net_test_options_t *options, void *hostinfo, int *dtoken); +extern void free_net_dialog(char **dialog, int dtoken); #endif Modified: trunk/xymonnet/setuptests.c =================================================================== --- trunk/xymonnet/setuptests.c 2012-04-29 10:20:02 UTC (rev 6949) +++ trunk/xymonnet/setuptests.c 2012-04-29 10:22:58 UTC (rev 6950) @@ -100,7 +100,6 @@ char *destination, *testspec; myconn_netparams_t netparams; net_test_options_t options; - char **dialog; if (!wanted_host(hwalk, location)) continue; @@ -117,21 +116,23 @@ options.testtype = NET_TEST_PING; options.timeout = defaulttimeout; /* update nettest set valid=1 where hostname=xmh_item(hwalk, XMH_HOSTNAME) and testspec="ping" */ - add_net_test("ping", NULL, &options, &netparams, hwalk); + add_net_test("ping", NULL, 0, &options, &netparams, hwalk); } testspec = xmh_item_walk(hwalk); while (testspec) { + char **dialog; + int dtoken; net_test_options_t options = { NET_TEST_STANDARD, defaulttimeout }; memset(&netparams, 0, sizeof(netparams)); - dialog = net_dialog(testspec, &netparams, &options, hwalk); + dialog = net_dialog(testspec, &netparams, &options, hwalk, &dtoken); if (dialog || (options.testtype != NET_TEST_STANDARD)) { /* insert into nettests / update nettest set valid=1 where hostname=xmh_item(hwalk, XMH_HOSTNAME) and testspec=testspec */ /* destinationip may have been filled by net_dialog (e.g. http) */ if (!netparams.destinationip) netparams.destinationip = strdup(destination); - add_net_test(testspec, dialog, &options, &netparams, hwalk); + add_net_test(testspec, dialog, dtoken, &options, &netparams, hwalk); } testspec = xmh_item_walk(NULL); Modified: trunk/xymonnet/tcptalk.c =================================================================== --- trunk/xymonnet/tcptalk.c 2012-04-29 10:20:02 UTC (rev 6949) +++ trunk/xymonnet/tcptalk.c 2012-04-29 10:22:58 UTC (rev 6950) @@ -21,6 +21,7 @@ #include "tcptalk.h" #include "ntptalk.h" #include "dnstalk.h" +#include "netdialog.h" static listhead_t *pendingtests = NULL; static listhead_t *activetests = NULL; @@ -521,7 +522,7 @@ } -void *add_net_test(char *testspec, char **dialog, net_test_options_t *options, myconn_netparams_t *netparams, void *hostinfo) +void *add_net_test(char *testspec, char **dialog, int dialogtoken, net_test_options_t *options, myconn_netparams_t *netparams, void *hostinfo) { myconn_t *newtest; @@ -531,6 +532,7 @@ newtest->netparams.callback = tcp_standard_callback; newtest->hostinfo = hostinfo; newtest->dialog = dialog; + newtest->dialogtoken = dialogtoken; newtest->timeout = options->timeout; switch (options->testtype) { @@ -715,6 +717,7 @@ void test_is_done(myconn_t *rec) { list_item_move(donetests, rec->listitem, rec->testspec); + free_net_dialog(rec->dialog, rec->dialogtoken); } @@ -729,199 +732,3 @@ donetests = list_create("done"); } - -#ifdef STANDALONE -static void showtext(char *s) -{ - char *bol, *eoln; - - if (!s) return; - - bol = s; - while (bol) { - eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; - printf("\t%s\n", bol); - bol = (eoln ? eoln+1 : NULL); - } - -} - -void dump_net_tests(listhead_t *head) -{ - listitem_t *walk; - - if (!head) head = donetests; - - for (walk = head->head; (walk); walk = walk->next) { - myconn_t *rec = (myconn_t *)walk->data; - if (rec->talkprotocol == TALK_PROTO_PING) continue; - - printf("Test %s\n", rec->testspec); - printf("\tTarget : %s:%d\n", rec->netparams.destinationip, rec->netparams.destinationport); - printf("\tStatus : "); - switch (rec->talkresult) { - case TALK_CANNOT_RESOLVE: printf("Cannot resolve hostname"); break; - case TALK_CONN_FAILED: printf("Connection failed"); break; - case TALK_CONN_TIMEOUT: printf("Connection timeout"); break; - case TALK_OK: printf("OK"); break; - case TALK_BADDATA: printf("Bad dialog"); break; - case TALK_BADSSLHANDSHAKE: printf("SSL handshake failure"); break; - case TALK_INTERRUPTED: printf("Peer disconnect"); break; - } - printf("\t(sslhandling=%d, af_idx=%d, lookupstatus=%d)\n", - rec->netparams.sslhandling, rec->netparams.af_index, rec->netparams.lookupstatus); - if (rec->peercertificate) { - printf("\tCert. : %s\n", rec->peercertificate); - } - printf("\tLookup : %d.%03d ms\n", (rec->dnselapsedus / 1000), (rec->dnselapsedus % 1000)); - printf("\tTime : %d.%03d ms\n", (rec->elapsedus / 1000), (rec->elapsedus % 1000)); - printf("\tRead : %d\n", rec->bytesread); - printf("\tWritten : %d\n", rec->byteswritten); - printf("\t------------------------\n"); - switch (rec->talkprotocol) { - case TALK_PROTO_PLAIN: - if (rec->textlog) showtext(STRBUF(rec->textlog)); - break; - - case TALK_PROTO_HTTP: - showtext(rec->dialog[0] + 5); - showtext(STRBUF(rec->httpheaders)); - showtext(STRBUF(rec->httpbody)); - break; - - case TALK_PROTO_NTP: - printf("\tNTP server is stratum %d, offset %9.6f secs\n", rec->ntpstratum, rec->ntpoffset); - break; - - case TALK_PROTO_DNSQUERY: - if (rec->textlog) { - printf("\tDNS query:\n"); - showtext(STRBUF(rec->textlog)); - } - break; - - default: - break; - } - } -} - -static char *silent_dialog[] = { - "READ", "CLOSE", NULL -}; - -static char *smtp_dialog[] = { - "EXPECT:220", - "SEND:STARTTLS\r\n", - "EXPECT:220", - "STARTTLS", - "SEND:EHLO hswn.dk\r\n", - "EXPECT:250", - "SEND:MAIL FROM:<xymon>\r\n", - "EXPECT:250", - "SEND:RSET\r\n", - "EXPECT:250", - "SEND:QUIT\r\n", - "EXPECT:221", - "CLOSE", - NULL -}; - -static char *xymonping_dialog[] = { - "SEND:starttls\n", - "EXPECT:OK", - "STARTTLS", - "SEND:size:4\nping\n", - "EXPECT:xymon", - "CLOSE", - NULL -}; - -static char *bbd_dialog[] = { - "SEND:size:4\nping\n", - "EXPECT:xymon", - "CLOSE", - NULL -}; - -static char *pop_dialog[] = { - "EXPECT:+OK", - "CLOSE", - NULL -}; - -static char *telnet_dialog[] = { - "READ", "CLOSE", NULL -}; - -static char *http_dialog[] = { NULL }; -static char *ntp_dialog[] = { NULL }; -static char *dns_dialog[] = { NULL }; -static char *null_dialog[] = { NULL }; - -static void *add_tcp_test(char *destinationip, int destinationport, char *sourceip, char *testspec, char **dialog, - enum sslhandling_t sslhandling, char *sslcertfn, char *sslkeyfn) -{ - myconn_netparams_t netparams; - net_test_options_t options = { NET_TEST_STANDARD, 10 }; - - memset(&netparams, 0, sizeof(netparams)); - netparams.destinationip = strdup(destinationip); - netparams.destinationport = destinationport; - netparams.sourceip = (sourceip ? strdup(sourceip) : NULL); - netparams.sslhandling = sslhandling; - netparams.sslcertfn = sslcertfn; - netparams.sslkeyfn = sslkeyfn; - - if (dialog == http_dialog) options.testtype = NET_TEST_HTTP; - else if (dialog == ntp_dialog) options.testtype = NET_TEST_NTP; - else if (dialog == dns_dialog) options.testtype = NET_TEST_DNS; - else if (dialog == telnet_dialog) options.testtype = NET_TEST_TELNET; - else if (dialog == null_dialog) options.testtype = NET_TEST_PING; - - return add_net_test(testspec, dialog, &options, &netparams, NULL); -} - -int main(int argc, char **argv) -{ - listitem_t *walk; - - debug = 1; - conn_register_infohandler(NULL, 7); - - init_tcp_testmodule(); - - add_tcp_test("jorn", 995, NULL, "pop3s", pop_dialog, CONN_SSL_YES, NULL, NULL); - add_tcp_test("jorn.hswn.dk", 1984, NULL, "bbd", bbd_dialog, CONN_SSL_STARTTLS_CLIENT, NULL, NULL); - -#if 0 - add_tcp_test("jorn.hswn.dk", 25, NULL, "smtp", smtp_dialog, CONN_SSL_STARTTLS_CLIENT, NULL, NULL); - // add_tcp_test("2a00:1450:4001:c01::6a", 80, NULL, "http://ipv6.google.com/", http_dialog, CONN_SSL_NO, NULL, NULL); - // add_tcp_test("173.194.69.105", 80, NULL, "http://www.google.com/", http_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("jorn.hswn.dk", 123, NULL, "ntp", ntp_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("ns.hswn.dk", 53, NULL, "www.xymon.com", dns_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("ns1.fullrate.dk", 53, NULL, "www.sslug.dk", dns_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("ns1.fullrate.dk", 53, NULL, "www.csc.dk", dns_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("ipv6.google.com", 80, NULL, "http://ipv6.google.com/", http_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("ns1.fullrate.dk", 53, NULL, "www.fullrate.dk", dns_dialog, CONN_SSL_NO, NULL, NULL); - add_tcp_test("www.dba.dk", 0, NULL, NULL, null_dialog, CONN_SSL_NO, NULL, NULL); - - // add_tcp_test("172.16.10.7", 53, NULL, "www.sslug.dk", dns_dialog, CONN_SSL_NO, NULL, NULL); -#endif - -#if 0 - { - xymonping_dialog[3] = (char *)malloc(30 + strlen(argv[1])); - sprintf(xymonping_dialog[3], "SEND:size:%d\n%s\n", (int)strlen(argv[1]), argv[1]); - - add_tcp_test("127.0.0.1", 1984, NULL, "xymon", xymonping_dialog, CONN_SSL_STARTTLS_CLIENT, NULL, NULL); - } -#endif - - run_net_tests(10); - dump_net_tests(donetests); - - return 0; -} -#endif - Modified: trunk/xymonnet/tcptalk.h =================================================================== --- trunk/xymonnet/tcptalk.h 2012-04-29 10:20:02 UTC (rev 6949) +++ trunk/xymonnet/tcptalk.h 2012-04-29 10:22:58 UTC (rev 6950) @@ -40,6 +40,7 @@ myconn_netparams_t netparams; enum { TALK_PROTO_PLAIN, TALK_PROTO_NTP, TALK_PROTO_HTTP, TALK_PROTO_DNSQUERY, TALK_PROTO_PING, TALK_PROTO_LDAP, TALK_PROTO_RPC } talkprotocol; char **dialog; /* SEND/EXPECT/READ/CLOSE steps */ + int dialogtoken; listitem_t *listitem; void *hostinfo; int timeout; @@ -94,7 +95,7 @@ } net_test_options_t; extern void test_is_done(myconn_t *rec); -extern void *add_net_test(char *testspec, char **dialog, net_test_options_t *options, +extern void *add_net_test(char *testspec, char **dialog, int dtoken, net_test_options_t *options, myconn_netparams_t *netparams, void *hostinfo); extern listhead_t *run_net_tests(int concurrency); extern void init_tcp_testmodule(void); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |