snmptranslate.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:12k
- /*
- * snmptranslate.c - report or translate info about oid from mibs
- *
- * Update: 1998-07-17 <jhy@gsu.edu>
- * Added support for dumping alternate oid reports (-t and -T options).
- * Added more detailed (useful?) usage info.
- */
- /************************************************************************
- Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
- All Rights Reserved
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted,
- provided that the above copyright notice appear in all copies and that
- both that copyright notice and this permission notice appear in
- supporting documentation, and that the name of CMU not be
- used in advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
- CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- SOFTWARE.
- ******************************************************************/
- #include <net-snmp/net-snmp-config.h>
- #if HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- #if HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- #if HAVE_STRING_H
- #include <string.h>
- #else
- #include <strings.h>
- #endif
- #include <sys/types.h>
- #if HAVE_SYS_SELECT_H
- #include <sys/select.h>
- #endif
- #if HAVE_NETINET_IN_H
- #include <netinet/in.h>
- #endif
- #include <stdio.h>
- #include <ctype.h>
- #include <net-snmp/utilities.h>
- #if HAVE_WINSOCK_H
- #include <winsock.h>
- #endif
- #include <net-snmp/config_api.h>
- #include <net-snmp/output_api.h>
- #include <net-snmp/mib_api.h>
- int show_all_matched_objects(FILE *, const char *, oid *,
- size_t *, int, int);
- void
- usage(void)
- {
- fprintf(stderr, "USAGE: snmptranslate [OPTIONS] OID [OID]...nn");
- fprintf(stderr, " Version: %sn", netsnmp_get_version());
- fprintf(stderr, " Web: http://www.net-snmp.org/n");
- fprintf(stderr,
- " Email: net-snmp-coders@lists.sourceforge.netnnOPTIONS:n");
- fprintf(stderr, " -htttdisplay this help messagen");
- fprintf(stderr, " -Vtttdisplay package version numbern");
- fprintf(stderr,
- " -m MIB[:...]ttload given list of MIBs (ALL loads everything)n");
- fprintf(stderr,
- " -M DIR[:...]ttlook in given list of directories for MIBsn");
- fprintf(stderr,
- " -D TOKEN[,...]tturn on debugging output for the specified TOKENsnttt (ALL gives extremely verbose debugging output)n");
- fprintf(stderr, " -w WIDTHttset width of tree and detail outputn");
- fprintf(stderr,
- " -T TRANSOPTSttSet various options controlling report produced:n");
- fprintf(stderr,
- "ttt B: print all matching objects for a regex searchn");
- fprintf(stderr, "ttt d: print full details of the given OIDn");
- fprintf(stderr, "ttt p: print tree format symbol tablen");
- fprintf(stderr, "ttt a: print ASCII format symbol tablen");
- fprintf(stderr, "ttt l: enable labeled OID reportn");
- fprintf(stderr, "ttt o: enable OID reportn");
- fprintf(stderr, "ttt s: enable dotted symbolic reportn");
- fprintf(stderr,
- "ttt t: enable alternate format symbolic suffix reportn");
- #ifndef DISABLE_MIB_LOADING
- fprintf(stderr,
- " -P MIBOPTSttToggle various defaults controlling mib parsing:n");
- snmp_mib_toggle_options_usage("ttt ", stderr);
- #endif /* DISABLE_MIB_LOADING */
- fprintf(stderr,
- " -O OUTOPTSttToggle various defaults controlling output display:n");
- snmp_out_toggle_options_usage("ttt ", stderr);
- fprintf(stderr,
- " -I INOPTSttToggle various defaults controlling input parsing:n");
- snmp_in_toggle_options_usage("ttt ", stderr);
- fprintf(stderr,
- " -L LOGOPTSttToggle various defaults controlling logging:n");
- snmp_log_options_usage("ttt ", stderr);
- exit(1);
- }
- int
- main(int argc, char *argv[])
- {
- int arg;
- char *current_name = NULL, *cp = NULL;
- oid name[MAX_OID_LEN];
- size_t name_length;
- int description = 0;
- int print = 0;
- int find_all = 0;
- int width = 1000000;
- /*
- * usage: snmptranslate name
- */
- while ((arg = getopt(argc, argv, "Vhm:M:w:D:P:T:O:I:L:")) != EOF) {
- switch (arg) {
- case 'h':
- usage();
- exit(1);
- case 'm':
- setenv("MIBS", optarg, 1);
- break;
- case 'M':
- setenv("MIBDIRS", optarg, 1);
- break;
- case 'D':
- debug_register_tokens(optarg);
- snmp_set_do_debugging(1);
- break;
- case 'V':
- fprintf(stderr, "NET-SNMP version: %sn",
- netsnmp_get_version());
- exit(0);
- break;
- case 'w':
- width = atoi(optarg);
- if (width <= 0) {
- fprintf(stderr, "Invalid width specification: %sn", optarg);
- exit (1);
- }
- break;
- #ifndef DISABLE_MIB_LOADING
- case 'P':
- cp = snmp_mib_toggle_options(optarg);
- if (cp != NULL) {
- fprintf(stderr, "Unknown parser option to -P: %c.n", *cp);
- usage();
- exit(1);
- }
- break;
- #endif /* DISABLE_MIB_LOADING */
- case 'O':
- cp = snmp_out_toggle_options(optarg);
- if (cp != NULL) {
- fprintf(stderr, "Unknown OID option to -O: %c.n", *cp);
- usage();
- exit(1);
- }
- break;
- case 'I':
- cp = snmp_in_toggle_options(optarg);
- if (cp != NULL) {
- fprintf(stderr, "Unknown OID option to -I: %c.n", *cp);
- usage();
- exit(1);
- }
- break;
- case 'T':
- for (cp = optarg; *cp; cp++) {
- switch (*cp) {
- #ifndef DISABLE_MIB_LOADING
- case 'l':
- print = 3;
- print_oid_report_enable_labeledoid();
- break;
- case 'o':
- print = 3;
- print_oid_report_enable_oid();
- break;
- case 's':
- print = 3;
- print_oid_report_enable_symbolic();
- break;
- case 't':
- print = 3;
- print_oid_report_enable_suffix();
- break;
- #endif /* DISABLE_MIB_LOADING */
- case 'd':
- description = 1;
- snmp_set_save_descriptions(1);
- break;
- case 'B':
- find_all = 1;
- break;
- case 'p':
- print = 1;
- break;
- case 'a':
- print = 2;
- break;
- default:
- fprintf(stderr, "Invalid -T<lostpad> character: %cn",
- *cp);
- usage();
- exit(1);
- break;
- }
- }
- break;
- case 'L':
- if (snmp_log_options(optarg, argc, argv) < 0) {
- return (-1);
- }
- break;
- default:
- fprintf(stderr, "invalid option: -%cn", arg);
- usage();
- exit(1);
- break;
- }
- }
- init_snmp("snmpapp");
- if (optind < argc)
- current_name = argv[optind];
- if (current_name == NULL) {
- switch (print) {
- default:
- usage();
- exit(1);
- #ifndef DISABLE_MIB_LOADING
- case 1:
- print_mib_tree(stdout, get_tree_head(), width);
- break;
- case 2:
- print_ascii_dump(stdout);
- break;
- case 3:
- print_oid_report(stdout);
- break;
- #endif /* DISABLE_MIB_LOADING */
- }
- exit(0);
- }
- do {
- name_length = MAX_OID_LEN;
- if (snmp_get_random_access()) {
- #ifndef DISABLE_MIB_LOADING
- if (!get_node(current_name, name, &name_length)) {
- #endif /* DISABLE_MIB_LOADING */
- fprintf(stderr, "Unknown object identifier: %sn",
- current_name);
- exit(2);
- #ifndef DISABLE_MIB_LOADING
- }
- #endif /* DISABLE_MIB_LOADING */
- } else if (find_all) {
- if (0 == show_all_matched_objects(stdout, current_name,
- name, &name_length,
- description, width)) {
- fprintf(stderr,
- "Unable to find a matching object identifier for "%s"n",
- current_name);
- exit(1);
- }
- exit(0);
- } else if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID,
- NETSNMP_DS_LIB_REGEX_ACCESS)) {
- #ifndef DISABLE_MIB_LOADING
- if (0 == get_wild_node(current_name, name, &name_length)) {
- #endif /* DISABLE_MIB_LOADING */
- fprintf(stderr,
- "Unable to find a matching object identifier for "%s"n",
- current_name);
- exit(1);
- #ifndef DISABLE_MIB_LOADING
- }
- #endif /* DISABLE_MIB_LOADING */
- } else {
- if (!read_objid(current_name, name, &name_length)) {
- snmp_perror(current_name);
- exit(2);
- }
- }
- if (print == 1) {
- #ifndef DISABLE_MIB_LOADING
- struct tree *tp;
- tp = get_tree(name, name_length, get_tree_head());
- if (tp == NULL) {
- #endif /* DISABLE_MIB_LOADING */
- snmp_log(LOG_ERR,
- "Unable to find a matching object identifier for "%s"n",
- current_name);
- exit(1);
- #ifndef DISABLE_MIB_LOADING
- }
- print_mib_tree(stdout, tp, width);
- #endif /* DISABLE_MIB_LOADING */
- } else {
- print_objid(name, name_length);
- if (description) {
- #ifndef DISABLE_MIB_LOADING
- print_description(name, name_length, width);
- #endif /* DISABLE_MIB_LOADING */
- }
- }
- current_name = argv[++optind];
- if (current_name != NULL)
- printf("n");
- } while (optind < argc);
- return (0);
- }
- /*
- * Show all object identifiers that match the pattern.
- */
- int
- show_all_matched_objects(FILE * fp, const char *patmatch, oid * name, size_t * name_length, int f_desc, /* non-zero if descriptions should be shown */
- int width)
- {
- int result = 0, count = 0;
- size_t savlen = *name_length;
- #ifndef DISABLE_MIB_LOADING
- clear_tree_flags(get_tree_head());
- #endif /* DISABLE_MIB_LOADING */
- while (1) {
- *name_length = savlen;
- #ifndef DISABLE_MIB_LOADING
- result = get_wild_node(patmatch, name, name_length);
- #endif /* DISABLE_MIB_LOADING */
- if (!result)
- break;
- count++;
- fprint_objid(fp, name, *name_length);
- #ifndef DISABLE_MIB_LOADING
- if (f_desc)
- fprint_description(fp, name, *name_length, width);
- #endif /* DISABLE_MIB_LOADING */
- }
- return (count);
- }