Blame apps/snmptranslate.c

Packit fcad23
/*
Packit fcad23
 * snmptranslate.c - report or translate info about oid from mibs
Packit fcad23
 *
Packit fcad23
 * Update: 1998-07-17 <jhy@gsu.edu>
Packit fcad23
 * Added support for dumping alternate oid reports (-t and -T options).
Packit fcad23
 * Added more detailed (useful?) usage info.
Packit fcad23
 */
Packit fcad23
/************************************************************************
Packit fcad23
	Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
Packit fcad23
Packit fcad23
                      All Rights Reserved
Packit fcad23
Packit fcad23
Permission to use, copy, modify, and distribute this software and its 
Packit fcad23
documentation for any purpose and without fee is hereby granted, 
Packit fcad23
provided that the above copyright notice appear in all copies and that
Packit fcad23
both that copyright notice and this permission notice appear in 
Packit fcad23
supporting documentation, and that the name of CMU not be
Packit fcad23
used in advertising or publicity pertaining to distribution of the
Packit fcad23
software without specific, written prior permission.  
Packit fcad23
Packit fcad23
CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit fcad23
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit fcad23
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit fcad23
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit fcad23
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit fcad23
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit fcad23
SOFTWARE.
Packit fcad23
******************************************************************/
Packit fcad23
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
Packit fcad23
#if HAVE_STDLIB_H
Packit fcad23
#include <stdlib.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_UNISTD_H
Packit fcad23
#include <unistd.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_STRING_H
Packit fcad23
#include <string.h>
Packit fcad23
#else
Packit fcad23
#include <strings.h>
Packit fcad23
#endif
Packit fcad23
#include <sys/types.h>
Packit fcad23
#if HAVE_SYS_SELECT_H
Packit fcad23
#include <sys/select.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_NETINET_IN_H
Packit fcad23
#include <netinet/in.h>
Packit fcad23
#endif
Packit fcad23
#include <stdio.h>
Packit fcad23
#include <ctype.h>
Packit fcad23
#include <net-snmp/utilities.h>
Packit fcad23
#include <net-snmp/config_api.h>
Packit fcad23
#include <net-snmp/output_api.h>
Packit fcad23
#include <net-snmp/mib_api.h>
Packit fcad23
Packit fcad23
int             show_all_matched_objects(FILE *, const char *, oid *,
Packit fcad23
                                         size_t *, int, int);
Packit fcad23
Packit fcad23
void
Packit fcad23
usage(void)
Packit fcad23
{
Packit fcad23
    fprintf(stderr, "USAGE: snmptranslate [OPTIONS] OID [OID]...\n\n");
Packit fcad23
    fprintf(stderr, "  Version:  %s\n", netsnmp_get_version());
Packit fcad23
    fprintf(stderr, "  Web:      http://www.net-snmp.org/\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  Email:    net-snmp-coders@lists.sourceforge.net\n\nOPTIONS:\n");
Packit fcad23
Packit fcad23
    fprintf(stderr, "  -h\t\t\tdisplay this help message\n");
Packit fcad23
    fprintf(stderr, "  -V\t\t\tdisplay package version number\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -m MIB[" ENV_SEPARATOR "...]\t\tload given list of MIBs (ALL loads everything)\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -M DIR[" ENV_SEPARATOR "...]\t\tlook in given list of directories for MIBs\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -D[TOKEN[,...]]\tturn on debugging output for the specified TOKENs\n\t\t\t   (ALL gives extremely verbose debugging output)\n");
Packit fcad23
    fprintf(stderr, "  -w WIDTH\t\tset width of tree and detail output\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -T TRANSOPTS\t\tSet various options controlling report produced:\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t\t\t  B:  print all matching objects for a regex search\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  d:  print full details of the given OID\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  p:  print tree format symbol table\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  a:  print ASCII format symbol table\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  l:  enable labeled OID report\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  o:  enable OID report\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  s:  enable dotted symbolic report\n");
Packit fcad23
    fprintf(stderr, "\t\t\t  z:  enable MIB child OID report\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t\t\t  t:  enable alternate format symbolic suffix report\n");
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -P MIBOPTS\t\tToggle various defaults controlling mib parsing:\n");
Packit fcad23
    snmp_mib_toggle_options_usage("\t\t\t  ", stderr);
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -O OUTOPTS\t\tToggle various defaults controlling output display:\n");
Packit fcad23
    snmp_out_toggle_options_usage("\t\t\t  ", stderr);
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -I INOPTS\t\tToggle various defaults controlling input parsing:\n");
Packit fcad23
    snmp_in_toggle_options_usage("\t\t\t  ", stderr);
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "  -L LOGOPTS\t\tToggle various defaults controlling logging:\n");
Packit fcad23
    snmp_log_options_usage("\t\t\t  ", stderr);
Packit fcad23
}
Packit fcad23
Packit fcad23
/**
Packit fcad23
 * For every line on stdin, assume that it is either a plain OID
Packit fcad23
 * or snmpwalk/snmpget output:
Packit fcad23
 * mib-2.1.2.3.4
Packit fcad23
 * -or-
Packit fcad23
 * mib-2.1.2.3.4 = INTEGER: 5
Packit fcad23
 *
Packit fcad23
 * Replace the OID with its translation.
Packit fcad23
 * If translation fails, just output the original string.
Packit fcad23
 */
Packit fcad23
#define MAX_LINE_TEMP   10240
Packit fcad23
void
Packit fcad23
process_stdin(void)
Packit fcad23
{
Packit fcad23
    char        buf[MAX_LINE_TEMP];
Packit fcad23
    oid         name[MAX_OID_LEN];
Packit fcad23
    size_t      name_length;
Packit fcad23
Packit fcad23
    while ( NULL != fgets( buf, sizeof( buf ), stdin ) ) {
Packit fcad23
        char delim = ' ';
Packit fcad23
        char *nl = strchr(buf, '\n');
Packit fcad23
        char *rest = strchr(buf, delim);
Packit fcad23
Packit fcad23
        if (nl != NULL) {
Packit fcad23
            *nl = '\0';
Packit fcad23
        } /* else too-long line: output will look weird.  Too bad. */
Packit fcad23
        if (rest == NULL) {
Packit fcad23
            delim = '\t';
Packit fcad23
            rest = strchr(buf, delim);
Packit fcad23
        }
Packit fcad23
        if (rest != NULL) {
Packit fcad23
            *rest++ = '\0';
Packit fcad23
        }
Packit fcad23
        name_length = MAX_OID_LEN;
Packit fcad23
        /*
Packit fcad23
         * If it's not the whole line, only try to process buffer
Packit fcad23
         * longer than 5 characters.
Packit fcad23
         * The idea is to avoid false positives including, e.g.,
Packit fcad23
         * a hex dump.
Packit fcad23
         */
Packit fcad23
        if ( !(rest && strlen( buf ) <= 5) &&
Packit fcad23
              read_objid( buf, name, &name_length )) {
Packit fcad23
            char objbuf[MAX_LINE_TEMP];
Packit fcad23
            snprint_objid( objbuf, MAX_LINE_TEMP, name, name_length );
Packit fcad23
            fputs( objbuf, stdout );
Packit fcad23
        } else {
Packit fcad23
            fputs( buf, stdout );
Packit fcad23
        }
Packit fcad23
        /*
Packit fcad23
         * For future improvement: if delim == ' ' && rest && *rest == '='
Packit fcad23
         * see if rest looks like snmpget/snmpwalk output
Packit fcad23
         * and handle it in the context of the given node
Packit fcad23
         */
Packit fcad23
        if (rest) {
Packit fcad23
            fputc( delim, stdout );
Packit fcad23
            fputs( rest, stdout );
Packit fcad23
        }
Packit fcad23
        fputc( '\n', stdout );
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
main(int argc, char *argv[])
Packit fcad23
{
Packit fcad23
    int             arg;
Packit fcad23
    char           *current_name = NULL, *cp = NULL;
Packit fcad23
    oid             name[MAX_OID_LEN];
Packit fcad23
    size_t          name_length;
Packit fcad23
    int             description = 0;
Packit fcad23
    int             print = 0;
Packit fcad23
    int             find_all = 0;
Packit fcad23
    int             width = 1000000;
Packit fcad23
    int             exit_code = 1;
Packit fcad23
    netsnmp_session dummy;
Packit fcad23
Packit fcad23
    SOCK_STARTUP;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * usage: snmptranslate name
Packit fcad23
     */
Packit fcad23
    snmp_sess_init(&dummy);
Packit fcad23
    while ((arg = getopt(argc, argv, "Vhm:M:w:D:P:T:O:I:L:")) != EOF) {
Packit fcad23
        switch (arg) {
Packit fcad23
        case 'h':
Packit fcad23
            usage();
Packit fcad23
            goto out;
Packit fcad23
Packit fcad23
        case 'm':
Packit fcad23
            setenv("MIBS", optarg, 1);
Packit fcad23
            break;
Packit fcad23
        case 'M':
Packit fcad23
            setenv("MIBDIRS", optarg, 1);
Packit fcad23
            break;
Packit fcad23
        case 'D':
Packit fcad23
            debug_register_tokens(optarg);
Packit fcad23
            snmp_set_do_debugging(1);
Packit fcad23
            break;
Packit fcad23
        case 'V':
Packit fcad23
            fprintf(stderr, "NET-SNMP version: %s\n",
Packit fcad23
                    netsnmp_get_version());
Packit fcad23
            exit_code = 0;
Packit fcad23
            goto out;
Packit fcad23
            break;
Packit fcad23
        case 'w':
Packit fcad23
	    width = atoi(optarg);
Packit fcad23
	    if (width <= 0) {
Packit fcad23
		fprintf(stderr, "Invalid width specification: %s\n", optarg);
Packit fcad23
		goto out;
Packit fcad23
	    }
Packit fcad23
	    break;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
        case 'P':
Packit fcad23
            cp = snmp_mib_toggle_options(optarg);
Packit fcad23
            if (cp != NULL) {
Packit fcad23
                fprintf(stderr, "Unknown parser option to -P: %c.\n", *cp);
Packit fcad23
                usage();
Packit fcad23
                goto out;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        case 'O':
Packit fcad23
            cp = snmp_out_toggle_options(optarg);
Packit fcad23
            if (cp != NULL) {
Packit fcad23
                fprintf(stderr, "Unknown OID option to -O: %c.\n", *cp);
Packit fcad23
                usage();
Packit fcad23
                goto out;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        case 'I':
Packit fcad23
            cp = snmp_in_toggle_options(optarg);
Packit fcad23
            if (cp != NULL) {
Packit fcad23
                fprintf(stderr, "Unknown OID option to -I: %c.\n", *cp);
Packit fcad23
                usage();
Packit fcad23
                goto out;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        case 'T':
Packit fcad23
            for (cp = optarg; *cp; cp++) {
Packit fcad23
                switch (*cp) {
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
                case 'l':
Packit fcad23
                    print = 3;
Packit fcad23
                    print_oid_report_enable_labeledoid();
Packit fcad23
                    break;
Packit fcad23
                case 'o':
Packit fcad23
                    print = 3;
Packit fcad23
                    print_oid_report_enable_oid();
Packit fcad23
                    break;
Packit fcad23
                case 's':
Packit fcad23
                    print = 3;
Packit fcad23
                    print_oid_report_enable_symbolic();
Packit fcad23
                    break;
Packit fcad23
                case 't':
Packit fcad23
                    print = 3;
Packit fcad23
                    print_oid_report_enable_suffix();
Packit fcad23
                    break;
Packit fcad23
                case 'z':
Packit fcad23
                    print = 3;
Packit fcad23
                    print_oid_report_enable_mibchildoid();
Packit fcad23
                    break;
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
                case 'd':
Packit fcad23
                    description = 1;
Packit fcad23
                    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                           NETSNMP_DS_LIB_SAVE_MIB_DESCRS, 1);
Packit fcad23
                    break;
Packit fcad23
                case 'B':
Packit fcad23
                    find_all = 1;
Packit fcad23
                    break;
Packit fcad23
                case 'p':
Packit fcad23
                    print = 1;
Packit fcad23
                    break;
Packit fcad23
                case 'a':
Packit fcad23
                    print = 2;
Packit fcad23
                    break;
Packit fcad23
                default:
Packit fcad23
                    fprintf(stderr, "Invalid -T<lostpad> character: %c\n",
Packit fcad23
                            *cp);
Packit fcad23
                    usage();
Packit fcad23
                    goto out;
Packit fcad23
                }
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        case 'L':
Packit fcad23
            if (snmp_log_options(optarg, argc, argv) < 0)
Packit fcad23
                goto out;
Packit fcad23
            break;
Packit fcad23
        default:
Packit fcad23
            fprintf(stderr, "invalid option: -%c\n", arg);
Packit fcad23
            usage();
Packit fcad23
            goto out;
Packit fcad23
        }
Packit fcad23
    }
Packit fcad23
Packit fcad23
    init_snmp(NETSNMP_APPLICATION_CONFIG_TYPE);
Packit fcad23
Packit fcad23
    if (optind < argc)
Packit fcad23
        current_name = argv[optind];
Packit fcad23
Packit fcad23
    if (current_name == NULL) {
Packit fcad23
        switch (print) {
Packit fcad23
        default:
Packit fcad23
            usage();
Packit fcad23
            goto out;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
        case 1:
Packit fcad23
            print_mib_tree(stdout, get_tree_head(), width);
Packit fcad23
            break;
Packit fcad23
        case 2:
Packit fcad23
            print_ascii_dump(stdout);
Packit fcad23
            break;
Packit fcad23
        case 3:
Packit fcad23
            print_oid_report(stdout);
Packit fcad23
            break;
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        }
Packit fcad23
        exit_code = 0;
Packit fcad23
        goto out;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    do {
Packit fcad23
        if ( strcmp( current_name, "-" ) == 0  && ( print == 0 ) ) {
Packit fcad23
            process_stdin();
Packit fcad23
            current_name = argv[++optind];
Packit fcad23
            continue;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        name_length = MAX_OID_LEN;
Packit fcad23
        if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
				  NETSNMP_DS_LIB_RANDOM_ACCESS)) {
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            if (!get_node(current_name, name, &name_length)) {
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
                fprintf(stderr, "Unknown object identifier: %s\n",
Packit fcad23
                        current_name);
Packit fcad23
                exit_code = 2;
Packit fcad23
                goto out;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            }
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        } else if (find_all) {
Packit fcad23
            if (0 == show_all_matched_objects(stdout, current_name,
Packit fcad23
                                              name, &name_length,
Packit fcad23
                                              description, width)) {
Packit fcad23
                fprintf(stderr,
Packit fcad23
                        "Unable to find a matching object identifier for \"%s\"\n",
Packit fcad23
                        current_name);
Packit fcad23
                goto out;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        } else if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
					  NETSNMP_DS_LIB_REGEX_ACCESS)) {
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            if (0 == get_wild_node(current_name, name, &name_length)) {
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
                fprintf(stderr,
Packit fcad23
                        "Unable to find a matching object identifier for \"%s\"\n",
Packit fcad23
                        current_name);
Packit fcad23
                goto out;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            }
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        } else {
Packit fcad23
            if (!read_objid(current_name, name, &name_length)) {
Packit fcad23
                snmp_perror(current_name);
Packit fcad23
                exit_code = 2;
Packit fcad23
                goto out;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
Packit fcad23
Packit fcad23
        if (print == 1) {
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            struct tree    *tp;
Packit fcad23
            tp = get_tree(name, name_length, get_tree_head());
Packit fcad23
            if (tp == NULL) {
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
                snmp_log(LOG_ERR,
Packit fcad23
                        "Unable to find a matching object identifier for \"%s\"\n",
Packit fcad23
                        current_name);
Packit fcad23
                goto out;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
            }
Packit fcad23
            print_mib_tree(stdout, tp, width);
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        } else {
Packit fcad23
            print_objid(name, name_length);
Packit fcad23
            if (description) {
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
                print_description(name, name_length, width);
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        current_name = argv[++optind];
Packit fcad23
        if (current_name != NULL)
Packit fcad23
            printf("\n");
Packit fcad23
    } while (optind < argc);
Packit fcad23
Packit fcad23
    exit_code = 0;
Packit fcad23
Packit fcad23
out:
Packit fcad23
    SOCK_CLEANUP;
Packit fcad23
    return exit_code;
Packit fcad23
}
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * Show all object identifiers that match the pattern.
Packit fcad23
 */
Packit fcad23
Packit fcad23
int
Packit fcad23
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 */
Packit fcad23
                         int width)
Packit fcad23
{
Packit fcad23
    int             result = 0, count = 0;
Packit fcad23
    size_t          savlen = *name_length;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
    clear_tree_flags(get_tree_head());
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
Packit fcad23
    while (1) {
Packit fcad23
        *name_length = savlen;
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
        result = get_wild_node(patmatch, name, name_length);
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
        if (!result)
Packit fcad23
            break;
Packit fcad23
        count++;
Packit fcad23
Packit fcad23
        fprint_objid(fp, name, *name_length);
Packit fcad23
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit fcad23
        if (f_desc)
Packit fcad23
            fprint_description(fp, name, *name_length, width);
Packit fcad23
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return (count);
Packit fcad23
}