summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/check_snmp.c119
1 files changed, 113 insertions, 6 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
index 7e574c5..19306b5 100644
--- a/plugins/check_snmp.c
+++ b/plugins/check_snmp.c
@@ -52,6 +52,18 @@
52 Units label(s) for output data (e.g., 'sec.').\n\ 52 Units label(s) for output data (e.g., 'sec.').\n\
53 -p, --port=STRING\n\ 53 -p, --port=STRING\n\
54 UDP port number target is listening on. Default is \"%s\"\n\ 54 UDP port number target is listening on. Default is \"%s\"\n\
55 -P, --protocol=[1|3]\n\
56 SNMP protocol version\n\
57 -L, --seclevel=[noAuthNoPriv|authNoPriv|authPriv]\n\
58 SNMPv3 securityLevel\n\
59 -U, --secname=USERNAME\n\
60 SNMPv3 username\n\
61 -a, --authproto=[MD5|SHA]\n\
62 SNMPv3 auth proto\n\
63 -A, --authpassword=PASSWORD\n\
64 SNMPv3 authentication password\n\
65 -X, --privpasswd=PASSWORD\n\
66 SNMPv3 crypt passwd (DES)\n\
55 -d, --delimiter=STRING\n\ 67 -d, --delimiter=STRING\n\
56 Delimiter to use when parsing returned data. Default is \"%s\"\n\ 68 Delimiter to use when parsing returned data. Default is \"%s\"\n\
57 Any data on the right hand side of the delimiter is considered\n\ 69 Any data on the right hand side of the delimiter is considered\n\
@@ -100,6 +112,8 @@ This plugin gets system information on a remote server via snmp.\n"
100#define DEFAULT_PORT "161" 112#define DEFAULT_PORT "161"
101#define DEFAULT_TIMEOUT 10 113#define DEFAULT_TIMEOUT 10
102#define DEFAULT_MIBLIST "ALL" 114#define DEFAULT_MIBLIST "ALL"
115#define DEFAULT_PROTOCOL "1"
116#define DEFAULT_AUTH_PROTOCOL "MD5"
103 117
104#include "common.h" 118#include "common.h"
105#include "utils.h" 119#include "utils.h"
@@ -160,6 +174,13 @@ int errcode, excode;
160 174
161char *server_address = NULL; 175char *server_address = NULL;
162char *community = NULL; 176char *community = NULL;
177char *authpriv = NULL;
178char *proto = NULL;
179char *seclevel = NULL;
180char *secname = NULL;
181char *authproto = NULL;
182char *authpasswd = NULL;
183char *privpasswd = NULL;
163char *oid = ""; 184char *oid = "";
164char *label = NULL; 185char *label = NULL;
165char *units = NULL; 186char *units = NULL;
@@ -211,8 +232,8 @@ main (int argc, char **argv)
211 usage ("Incorrect arguments supplied\n"); 232 usage ("Incorrect arguments supplied\n");
212 233
213 /* create the command line to execute */ 234 /* create the command line to execute */
214 asprintf (&command_line, "%s -m %s -v 1 -c %s %s:%s %s", 235 asprintf (&command_line, "%s -m %s -v %s %s %s:%s %s",
215 PATH_TO_SNMPGET, miblist, community, server_address, port, oid); 236 PATH_TO_SNMPGET, miblist, proto, authpriv, server_address, port, oid);
216 if (verbose) 237 if (verbose)
217 printf ("%s\n", command_line); 238 printf ("%s\n", command_line);
218 239
@@ -404,6 +425,13 @@ process_arguments (int argc, char **argv)
404 {"label", required_argument, 0, 'l'}, 425 {"label", required_argument, 0, 'l'},
405 {"units", required_argument, 0, 'u'}, 426 {"units", required_argument, 0, 'u'},
406 {"port", required_argument, 0, 'p'}, 427 {"port", required_argument, 0, 'p'},
428 {"miblist", required_argument, 0, 'm'},
429 {"protocol", required_argument, 0, 'P'},
430 {"seclevel", required_argument, 0, 'L'},
431 {"secname", required_argument, 0, 'U'},
432 {"authproto", required_argument, 0, 'a'},
433 {"authpasswd", required_argument, 0, 'A'},
434 {"privpasswd", required_argument, 0, 'X'},
407 {0, 0, 0, 0} 435 {0, 0, 0, 0}
408 }; 436 };
409#endif 437#endif
@@ -424,10 +452,10 @@ process_arguments (int argc, char **argv)
424 while (1) { 452 while (1) {
425#ifdef HAVE_GETOPT_H 453#ifdef HAVE_GETOPT_H
426 c = 454 c =
427 getopt_long (argc, argv, "hvVt:c:w:H:C:o:e:E:d:D:s:R:r:l:u:p:m:", 455 getopt_long (argc, argv, "hvVt:c:w:H:C:o:e:E:d:D:s:R:r:l:u:p:m:P:L:U:a:A:X:",
428 long_options, &option_index); 456 long_options, &option_index);
429#else 457#else
430 c = getopt (argc, argv, "hvVt:c:w:H:C:o:e:E:d:D:s:R:r:l:u:p:m:"); 458 c = getopt (argc, argv, "hvVt:c:w:H:C:o:e:E:d:D:s:R:r:l:u:p:m:P:L:U:a:A:X:");
431#endif 459#endif
432 460
433 if (c == -1 || c == EOF) 461 if (c == -1 || c == EOF)
@@ -438,7 +466,7 @@ process_arguments (int argc, char **argv)
438 usage3 ("Unknown argument", optopt); 466 usage3 ("Unknown argument", optopt);
439 case 'h': /* help */ 467 case 'h': /* help */
440 print_help (); 468 print_help ();
441 exit (STATE_OK); 469 exit (STATE_OK);
442 case 'V': /* version */ 470 case 'V': /* version */
443 print_revision (PROGNAME, REVISION); 471 print_revision (PROGNAME, REVISION);
444 exit (STATE_OK); 472 exit (STATE_OK);
@@ -607,6 +635,24 @@ process_arguments (int argc, char **argv)
607 case 'm': /* List of MIBS */ 635 case 'm': /* List of MIBS */
608 miblist = strscpy(miblist, optarg); 636 miblist = strscpy(miblist, optarg);
609 break; 637 break;
638 case 'P': /* SNMP protocol version */
639 proto = strscpy(proto, optarg);
640 break;
641 case 'L': /* security level */
642 seclevel = strscpy(seclevel,optarg);
643 break;
644 case 'U': /* security username */
645 secname = strscpy(secname, optarg);
646 break;
647 case 'a': /* auth protocol */
648 authproto = strscpy(authproto, optarg);
649 break;
650 case 'A': /* auth passwd */
651 authpasswd = strscpy(authpasswd, optarg);
652 break;
653 case 'X': /* priv passwd */
654 privpasswd = strscpy(privpasswd, optarg);
655 break;
610 656
611 } 657 }
612 } 658 }
@@ -659,9 +705,70 @@ validate_arguments ()
659 if (units == NULL) 705 if (units == NULL)
660 asprintf (&units, ""); 706 asprintf (&units, "");
661 707
708 if ( strcmp(seclevel, "noAuthNoPriv") && strcmp(seclevel, "authNoPriv") && strcmp(seclevel, "authPriv") ) {
709 if (seclevel == NULL)
710 asprintf (&seclevel, "noAuthNoPriv");
711 else {
712 printf ("Invalid seclevel: %s! \n", seclevel);
713 print_usage ();
714 exit (STATE_UNKNOWN);
715 }
716 }
717
718
719 if ( strcmp (authproto, "SHA") && strcmp(authproto, "MD5") ) {
720 if (authproto == NULL )
721 asprintf(&authproto, DEFAULT_AUTH_PROTOCOL);
722 else{
723 printf ("Invalid authproto: %s! \n", authproto);
724 print_usage ();
725 exit (STATE_UNKNOWN);
726 }
727 }
728
729
730
731 if (proto == NULL || !strcmp(proto,DEFAULT_PROTOCOL) ) { /* default protocol version */
732 asprintf(&proto, DEFAULT_PROTOCOL);
733 asprintf(&authpriv, "%s%s", "-c ", community);
734 }
735 else if ( strcmp (proto, "3") == 0 ) { /* snmpv3 args */
736 asprintf(&proto, "%s", "3");
737
738 if ( (strcmp(seclevel, "noAuthNoPriv") == 0) || seclevel == NULL ) {
739 authpriv = ssprintf(authpriv, "%s", "-l noAuthNoPriv" );
740 }
741 else if ( strcmp(seclevel, "authNoPriv") == 0 ) {
742 if ( secname == NULL || authpasswd == NULL) {
743 printf ("Missing secname (%s) or authpassword (%s) ! \n",secname, authpasswd );
744 print_usage ();
745 exit (STATE_UNKNOWN);
746 }
747 authpriv = ssprintf(authpriv, "-l authNoPriv -a %s -u %s -A %s ", authproto, secname, authpasswd);
748 }
749 else if ( strcmp(seclevel, "authPriv") == 0 ) {
750 if ( secname == NULL || authpasswd == NULL || privpasswd == NULL ) {
751 printf ("Missing secname (%s), authpassword (%s), or privpasswd (%s)! \n",secname, authpasswd,privpasswd );
752 print_usage ();
753 exit (STATE_UNKNOWN);
754 }
755 authpriv = ssprintf(authpriv, "-l authPriv -a %s -u %s -A %s -X %s ", authproto, secname, authpasswd, privpasswd);
756 }
757
758
759 }
760 else {
761 printf ("Invalid SNMP version: %s\n", proto);
762 print_usage ();
763 exit (STATE_UNKNOWN);
764 }
765
766
767
768
662 return OK; 769 return OK;
663} 770}
664 771
665 772
666 773
667void 774void