Blame apps/snmpvacm.c

Packit fcad23
/*
Packit fcad23
 * snmpvacm.c - send snmp SET requests to a network entity to change the
Packit fcad23
 *             vacm database
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_NETINET_IN_H
Packit fcad23
#include <netinet/in.h>
Packit fcad23
#endif
Packit fcad23
#include <stdio.h>
Packit fcad23
#include <ctype.h>
Packit fcad23
#if TIME_WITH_SYS_TIME
Packit fcad23
# include <sys/time.h>
Packit fcad23
# include <time.h>
Packit fcad23
#else
Packit fcad23
# if HAVE_SYS_TIME_H
Packit fcad23
#  include <sys/time.h>
Packit fcad23
# else
Packit fcad23
#  include <time.h>
Packit fcad23
# endif
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_SELECT_H
Packit fcad23
#include <sys/select.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_NETDB_H
Packit fcad23
#include <netdb.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_ARPA_INET_H
Packit fcad23
#include <arpa/inet.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
Packit fcad23
#define CMD_CREATESEC2GROUP_NAME    "createSec2Group"
Packit fcad23
#define CMD_CREATESEC2GROUP         1
Packit fcad23
#define CMD_DELETESEC2GROUP_NAME    "deleteSec2Group"
Packit fcad23
#define CMD_DELETESEC2GROUP         2
Packit fcad23
#define CMD_CREATEACCESS_NAME    	"createAccess"
Packit fcad23
#define CMD_CREATEACCESS         	3
Packit fcad23
#define CMD_DELETEACCESS_NAME 		"deleteAccess"
Packit fcad23
#define CMD_DELETEACCESS      		4
Packit fcad23
#define CMD_CREATEVIEW_NAME 		"createView"
Packit fcad23
#define CMD_CREATEVIEW      		5
Packit fcad23
#define CMD_DELETEVIEW_NAME 		"deleteView"
Packit fcad23
#define CMD_DELETEVIEW      		6
Packit fcad23
#define CMD_CREATEAUTH_NAME     	"createAuth"
Packit fcad23
#define CMD_CREATEAUTH          	7
Packit fcad23
#define CMD_DELETEAUTH_NAME 		"deleteAuth"
Packit fcad23
#define CMD_DELETEAUTH      		8
Packit fcad23
Packit fcad23
#define CMD_NUM    8
Packit fcad23
Packit fcad23
static const char *successNotes[CMD_NUM] = {
Packit fcad23
    "Sec2group successfully created.",
Packit fcad23
    "Sec2group successfully deleted.",
Packit fcad23
    "Access successfully created.",
Packit fcad23
    "Access successfully deleted.",
Packit fcad23
    "View successfully created.",
Packit fcad23
    "View successfully deleted.",
Packit fcad23
    "AuthAccess successfully created.",
Packit fcad23
    "AuthAccess successfully deleted."
Packit fcad23
};
Packit fcad23
Packit fcad23
#define                   SEC2GROUP_OID_LEN	11
Packit fcad23
#define                   ACCESS_OID_LEN   	11
Packit fcad23
#define                   VIEW_OID_LEN    	12
Packit fcad23
#define                   AUTH_OID_LEN   	12
Packit fcad23
Packit fcad23
static oid      vacmGroupName[MAX_OID_LEN] =
Packit fcad23
    { 1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 3 },
Packit fcad23
    vacmSec2GroupStatus[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 5}, vacmAccessContextMatch[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 4}, vacmAccessReadViewName[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 5}, vacmAccessWriteViewName[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 6}, vacmAccessNotifyViewName[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 7}, vacmAccessStatus[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 9}, vacmViewTreeFamilyMask[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 3}, vacmViewTreeFamilyType[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 4},
Packit fcad23
    vacmViewTreeFamilyStatus[MAX_OID_LEN] = {
Packit fcad23
1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 6}
Packit fcad23
Packit fcad23
;
Packit fcad23
Packit fcad23
#define NSVACMACCESSTABLE    1, 3, 6, 1, 4, 1, 8072, 1, 9, 1
Packit fcad23
static oid nsVacmContextPfx[MAX_OID_LEN]  = { NSVACMACCESSTABLE, 1, 2 };
Packit fcad23
static oid nsVacmViewName[MAX_OID_LEN]    = { NSVACMACCESSTABLE, 1, 3 };
Packit fcad23
static oid nsVacmRowStatus[MAX_OID_LEN]   = { NSVACMACCESSTABLE, 1, 5 };
Packit fcad23
Packit fcad23
int             viewTreeFamilyType = 1;
Packit fcad23
Packit fcad23
void
Packit fcad23
usage(void)
Packit fcad23
{
Packit fcad23
    fprintf(stderr, "Usage: snmpvacm ");
Packit fcad23
    snmp_parse_args_usage(stderr);
Packit fcad23
    fprintf(stderr, " COMMAND\n\n");
Packit fcad23
    snmp_parse_args_descriptions(stderr);
Packit fcad23
    fprintf(stderr, "\nsnmpvacm commands:\n");
Packit fcad23
    fprintf(stderr, "        createAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAME\n");
Packit fcad23
    fprintf(stderr, "        deleteAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL\n");
Packit fcad23
    fprintf(stderr, "        createSec2Group  MODEL SECURITYNAME  GROUPNAME\n");
Packit fcad23
    fprintf(stderr, "        deleteSec2Group  MODEL SECURITYNAME\n");
Packit fcad23
    fprintf(stderr, "  [-Ce] createView       NAME SUBTREE [MASK]\n");
Packit fcad23
    fprintf(stderr, "        deleteView       NAME SUBTREE\n");
Packit fcad23
    fprintf(stderr, "        createAuth       GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE CONTEXTMATCH VIEWNAME\n");
Packit fcad23
    fprintf(stderr, "        deleteAuth       GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE\n");
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
void
Packit fcad23
auth_oid(oid * it, size_t * len, const char *groupName,
Packit fcad23
           const char *prefix, int model, int level, const char *authtype)
Packit fcad23
{
Packit fcad23
    int             i;
Packit fcad23
    int             itIndex = AUTH_OID_LEN;
Packit fcad23
Packit fcad23
    it[itIndex++] = strlen(groupName);
Packit fcad23
    for (i = 0; i < (int) strlen(groupName); i++)
Packit fcad23
        it[itIndex++] = groupName[i];
Packit fcad23
Packit fcad23
    if (prefix) {
Packit fcad23
        *len += strlen(prefix);
Packit fcad23
        it[itIndex++] = strlen(prefix);
Packit fcad23
        for (i = 0; i < (int) strlen(prefix); i++)
Packit fcad23
            it[itIndex++] = prefix[i];
Packit fcad23
    } else
Packit fcad23
        it[itIndex++] = 0;
Packit fcad23
Packit fcad23
    it[itIndex++] = model;
Packit fcad23
    it[itIndex++] = level;
Packit fcad23
Packit fcad23
    it[itIndex++] = strlen(authtype);
Packit fcad23
    for (i = 0; i < (int) strlen(authtype); i++)
Packit fcad23
        it[itIndex++] = authtype[i];
Packit fcad23
Packit fcad23
    *len = itIndex;
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
access_oid(oid * it, size_t * len, const char *groupName,
Packit fcad23
           const char *prefix, int model, int level)
Packit fcad23
{
Packit fcad23
    int             i;
Packit fcad23
Packit fcad23
    int             itIndex = ACCESS_OID_LEN;
Packit fcad23
Packit fcad23
    *len = itIndex + 4 + +strlen(groupName);
Packit fcad23
Packit fcad23
    it[itIndex++] = strlen(groupName);
Packit fcad23
    for (i = 0; i < (int) strlen(groupName); i++)
Packit fcad23
        it[itIndex++] = groupName[i];
Packit fcad23
Packit fcad23
    if (prefix) {
Packit fcad23
        *len += strlen(prefix);
Packit fcad23
        it[itIndex++] = strlen(prefix);
Packit fcad23
        for (i = 0; i < (int) strlen(prefix); i++)
Packit fcad23
            it[itIndex++] = prefix[i];
Packit fcad23
    } else
Packit fcad23
        it[itIndex++] = 0;
Packit fcad23
Packit fcad23
    it[itIndex++] = model;
Packit fcad23
    it[itIndex++] = level;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
void
Packit fcad23
sec2group_oid(oid * it, size_t * len, int model, const char *name)
Packit fcad23
{
Packit fcad23
    int             i;
Packit fcad23
Packit fcad23
    int             itIndex = SEC2GROUP_OID_LEN;
Packit fcad23
Packit fcad23
    *len = itIndex + 2 + strlen(name);
Packit fcad23
Packit fcad23
    it[itIndex++] = model;
Packit fcad23
Packit fcad23
    it[itIndex++] = strlen(name);
Packit fcad23
    for (i = 0; i < (int) strlen(name); i++)
Packit fcad23
        it[itIndex++] = name[i];
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
view_oid(oid * it, size_t * len, const char *viewName, char *viewSubtree)
Packit fcad23
{
Packit fcad23
    int             i;
Packit fcad23
    oid             c_oid[SPRINT_MAX_LEN];
Packit fcad23
    size_t          c_oid_length = SPRINT_MAX_LEN;
Packit fcad23
Packit fcad23
    int             itIndex = VIEW_OID_LEN;
Packit fcad23
Packit fcad23
    if (!snmp_parse_oid(viewSubtree, c_oid, &c_oid_length)) {
Packit fcad23
        printf("Error parsing subtree (%s)\n", viewSubtree);
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    *len = itIndex + 2 + strlen(viewName) + c_oid_length;
Packit fcad23
Packit fcad23
    it[itIndex++] = strlen(viewName);
Packit fcad23
    for (i = 0; i < (int) strlen(viewName); i++)
Packit fcad23
        it[itIndex++] = viewName[i];
Packit fcad23
Packit fcad23
    
Packit fcad23
    it[itIndex++] = c_oid_length;
Packit fcad23
    for (i = 0; i < (int) c_oid_length; i++)
Packit fcad23
        it[itIndex++] = c_oid[i];
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * sprint_objid(c_oid, it, *len); 
Packit fcad23
     */
Packit fcad23
}
Packit fcad23
Packit fcad23
static void
Packit fcad23
optProc(int argc, char *const *argv, int opt)
Packit fcad23
{
Packit fcad23
    switch (opt) {
Packit fcad23
    case 'C':
Packit fcad23
        while (*optarg) {
Packit fcad23
            switch (*optarg++) {
Packit fcad23
            case 'e':
Packit fcad23
                viewTreeFamilyType = 2;
Packit fcad23
                break;
Packit fcad23
Packit fcad23
            default:
Packit fcad23
                fprintf(stderr,
Packit fcad23
                        "Unknown flag passed to -C: %c\n", optarg[-1]);
Packit fcad23
                exit(1);
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int
Packit fcad23
main(int argc, char *argv[])
Packit fcad23
{
Packit fcad23
    netsnmp_session session, *ss;
Packit fcad23
    netsnmp_pdu    *pdu = NULL, *response = NULL;
Packit fcad23
#ifdef notused
Packit fcad23
    netsnmp_variable_list *vars;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    int             arg;
Packit fcad23
#ifdef notused
Packit fcad23
    int             count;
Packit fcad23
    int             current_name = 0;
Packit fcad23
    int             current_type = 0;
Packit fcad23
    int             current_value = 0;
Packit fcad23
    char           *names[128];
Packit fcad23
    char            types[128];
Packit fcad23
    char           *values[128];
Packit fcad23
    oid             name[MAX_OID_LEN];
Packit fcad23
#endif
Packit fcad23
    size_t          name_length;
Packit fcad23
    int             status;
Packit fcad23
    int             exitval = 1;
Packit fcad23
    int             command = 0;
Packit fcad23
    long            longvar;
Packit fcad23
    int             secModel, secLevel, contextMatch;
Packit fcad23
    unsigned int    val, i = 0;
Packit fcad23
    char           *mask, *groupName, *prefix, *authtype;
Packit fcad23
    u_char          viewMask[VACMSTRINGLEN];
Packit fcad23
    char           *st;
Packit fcad23
Packit fcad23
    SOCK_STARTUP;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * get the common command line arguments 
Packit fcad23
     */
Packit fcad23
    switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR:
Packit fcad23
        goto out;
Packit fcad23
    case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
Packit fcad23
        exitval = 0;
Packit fcad23
        goto out;
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR_USAGE:
Packit fcad23
        usage();
Packit fcad23
        goto out;
Packit fcad23
    default:
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * open an SNMP session 
Packit fcad23
     */
Packit fcad23
    /*
Packit fcad23
     * Note:  this wil obtain the engineID needed below 
Packit fcad23
     */
Packit fcad23
    ss = snmp_open(&session);
Packit fcad23
    if (ss == NULL) {
Packit fcad23
        /*
Packit fcad23
         * diagnose snmp_open errors with the input netsnmp_session pointer 
Packit fcad23
         */
Packit fcad23
        snmp_sess_perror("snmpvacm", &session);
Packit fcad23
        goto out;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * create PDU for SET request and add object names and values to request 
Packit fcad23
     */
Packit fcad23
    pdu = snmp_pdu_create(SNMP_MSG_SET);
Packit fcad23
Packit fcad23
    if (arg >= argc) {
Packit fcad23
        fprintf(stderr, "Please specify a operation to perform.\n");
Packit fcad23
        usage();
Packit fcad23
        goto close_session;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (strcmp(argv[arg], CMD_DELETEVIEW_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * deleteView: delete a view
Packit fcad23
         *
Packit fcad23
         * deleteView NAME SUBTREE
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 2 != argc) {
Packit fcad23
            fprintf(stderr, "You must specify the view to delete\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_DELETEVIEW;
Packit fcad23
        name_length = VIEW_OID_LEN;
Packit fcad23
        view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
Packit fcad23
                 argv[arg + 1]);
Packit fcad23
        longvar = RS_DESTROY;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_CREATEVIEW_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * createView: create a view
Packit fcad23
         *
Packit fcad23
         * createView NAME SUBTREE MASK
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 2 > argc) {
Packit fcad23
            fprintf(stderr, "You must specify name, subtree and mask\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        command = CMD_CREATEVIEW;
Packit fcad23
        name_length = VIEW_OID_LEN;
Packit fcad23
        view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
Packit fcad23
                 argv[arg + 1]);
Packit fcad23
        longvar = RS_CREATEANDGO;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
        /*
Packit fcad23
         * Mask
Packit fcad23
         */
Packit fcad23
        if (arg + 3 == argc) {
Packit fcad23
            mask = argv[arg + 2];
Packit fcad23
            for (mask = strtok_r(mask, ".:", &st); mask; mask = strtok_r(NULL, ".:", &st)) {
Packit fcad23
                if (i >= sizeof(viewMask)) {
Packit fcad23
                    printf("MASK too long\n");
Packit fcad23
                    goto close_session;
Packit fcad23
                }
Packit fcad23
                if (sscanf(mask, "%x", &val) == 0) {
Packit fcad23
                    printf("invalid MASK\n");
Packit fcad23
                    goto close_session;
Packit fcad23
                }
Packit fcad23
                viewMask[i] = val;
Packit fcad23
                i++;
Packit fcad23
            }
Packit fcad23
	} else {
Packit fcad23
            for (i=0 ; i < (name_length+7)/8; i++)
Packit fcad23
                viewMask[i] = (u_char)0xff;
Packit fcad23
        }
Packit fcad23
        view_oid(vacmViewTreeFamilyMask, &name_length, argv[arg],
Packit fcad23
                 argv[arg + 1]);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyMask, name_length,
Packit fcad23
                              ASN_OCTET_STR, viewMask, i);
Packit fcad23
Packit fcad23
        view_oid(vacmViewTreeFamilyType, &name_length, argv[arg],
Packit fcad23
                 argv[arg + 1]);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmViewTreeFamilyType, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & viewTreeFamilyType,
Packit fcad23
                              sizeof(viewTreeFamilyType));
Packit fcad23
Packit fcad23
    } else if (strcmp(argv[arg], CMD_DELETESEC2GROUP_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * deleteSec2Group: delete security2group
Packit fcad23
         *
Packit fcad23
         * deleteSec2Group  MODEL SECURITYNAME
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 2 != argc) {
Packit fcad23
            fprintf(stderr, "You must specify the sec2group to delete\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_DELETESEC2GROUP;
Packit fcad23
        name_length = SEC2GROUP_OID_LEN;
Packit fcad23
        if (sscanf(argv[arg], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
Packit fcad23
                      argv[arg + 1]);
Packit fcad23
        longvar = RS_DESTROY;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_CREATESEC2GROUP_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * createSec2Group: create a security2group
Packit fcad23
         *
Packit fcad23
         * createSec2Group  MODEL SECURITYNAME GROUPNAME
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 3 != argc) {
Packit fcad23
            fprintf(stderr,
Packit fcad23
                    "You must specify model, security name and group name\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_CREATESEC2GROUP;
Packit fcad23
        name_length = SEC2GROUP_OID_LEN;
Packit fcad23
        if (sscanf(argv[arg], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
Packit fcad23
                      argv[arg + 1]);
Packit fcad23
        longvar = RS_CREATEANDGO;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
        sec2group_oid(vacmGroupName, &name_length, secModel,
Packit fcad23
                      argv[arg + 1]);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmGroupName, name_length,
Packit fcad23
                              ASN_OCTET_STR, (u_char *) argv[arg + 2],
Packit fcad23
                              strlen(argv[arg + 2]));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_DELETEACCESS_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * deleteAccess: delete access entry
Packit fcad23
         *
Packit fcad23
         * deleteAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 3 > argc) {
Packit fcad23
            fprintf(stderr,
Packit fcad23
                    "You must specify the access entry to delete\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_DELETEACCESS;
Packit fcad23
        name_length = ACCESS_OID_LEN;
Packit fcad23
        groupName = argv[arg];
Packit fcad23
        if (arg + 4 == argc)
Packit fcad23
            prefix = argv[++arg];
Packit fcad23
        else
Packit fcad23
            prefix = NULL;
Packit fcad23
Packit fcad23
        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
Packit fcad23
            printf("invalid security level\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        access_oid(vacmAccessStatus, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel);
Packit fcad23
        longvar = RS_DESTROY;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_CREATEACCESS_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * createAccess: create access entry
Packit fcad23
         *
Packit fcad23
         * createAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAME
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 7 > argc) {
Packit fcad23
            fprintf(stderr,
Packit fcad23
                    "You must specify the access entry to create\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_CREATEACCESS;
Packit fcad23
        name_length = ACCESS_OID_LEN;
Packit fcad23
        groupName = argv[arg];
Packit fcad23
        if (arg + 8 == argc)
Packit fcad23
            prefix = argv[++arg];
Packit fcad23
        else
Packit fcad23
            prefix = NULL;
Packit fcad23
Packit fcad23
        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
Packit fcad23
            printf("invalid security level\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        access_oid(vacmAccessStatus, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel);
Packit fcad23
        longvar = RS_CREATEANDGO;
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
Packit fcad23
        access_oid(vacmAccessContextMatch, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel);
Packit fcad23
        if (sscanf(argv[arg + 3], "%d", &contextMatch) == 0) {
Packit fcad23
            printf("invalid contextMatch\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessContextMatch, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & contextMatch,
Packit fcad23
                              sizeof(contextMatch));
Packit fcad23
Packit fcad23
        access_oid(vacmAccessReadViewName, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessReadViewName, name_length,
Packit fcad23
                              ASN_OCTET_STR, (u_char *) argv[arg + 4],
Packit fcad23
                              strlen(argv[arg + 4]));
Packit fcad23
Packit fcad23
        access_oid(vacmAccessWriteViewName, &name_length, groupName,
Packit fcad23
                   prefix, secModel, secLevel);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessWriteViewName, name_length,
Packit fcad23
                              ASN_OCTET_STR, (u_char *) argv[arg + 5],
Packit fcad23
                              strlen(argv[arg + 5]));
Packit fcad23
Packit fcad23
        access_oid(vacmAccessNotifyViewName, &name_length, groupName,
Packit fcad23
                   prefix, secModel, secLevel);
Packit fcad23
        snmp_pdu_add_variable(pdu, vacmAccessNotifyViewName, name_length,
Packit fcad23
                              ASN_OCTET_STR, (u_char *) argv[arg + 6],
Packit fcad23
                              strlen(argv[arg + 6]));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_DELETEAUTH_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * deleteAuth: delete authAccess entry
Packit fcad23
         *
Packit fcad23
         * deleteAuth  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 4 > argc) {
Packit fcad23
            fprintf(stderr,
Packit fcad23
                    "You must specify the authAccess entry to delete\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_DELETEAUTH;
Packit fcad23
        name_length = AUTH_OID_LEN;
Packit fcad23
        groupName = argv[arg];
Packit fcad23
        if (arg + 5 == argc)
Packit fcad23
            prefix = argv[++arg];
Packit fcad23
        else
Packit fcad23
            prefix = NULL;
Packit fcad23
Packit fcad23
        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
Packit fcad23
            printf("invalid security level\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        authtype = argv[arg+3];
Packit fcad23
        auth_oid(nsVacmRowStatus, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel, authtype);
Packit fcad23
        longvar = RS_DESTROY;
Packit fcad23
        snmp_pdu_add_variable(pdu, nsVacmRowStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
    } else if (strcmp(argv[arg], CMD_CREATEAUTH_NAME) == 0)
Packit fcad23
        /*
Packit fcad23
         * createAuth: create authAccess entry
Packit fcad23
         *
Packit fcad23
         * createAuth  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL AUTHTYPE CONTEXTMATCH VIEWNAME
Packit fcad23
         *
Packit fcad23
         */
Packit fcad23
    {
Packit fcad23
        if (++arg + 6 > argc) {
Packit fcad23
            fprintf(stderr,
Packit fcad23
                    "You must specify the authAccess entry to create\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        command = CMD_CREATEAUTH;
Packit fcad23
        name_length = AUTH_OID_LEN;
Packit fcad23
        groupName = argv[arg];
Packit fcad23
        if (arg + 7 == argc)
Packit fcad23
            prefix = argv[++arg];
Packit fcad23
        else
Packit fcad23
            prefix = NULL;
Packit fcad23
Packit fcad23
        if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
Packit fcad23
            printf("invalid security model\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
Packit fcad23
            printf("invalid security level\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        authtype = argv[arg+3];
Packit fcad23
        auth_oid(nsVacmRowStatus, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel, authtype);
Packit fcad23
        longvar = RS_CREATEANDGO;
Packit fcad23
        snmp_pdu_add_variable(pdu, nsVacmRowStatus, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & longvar,
Packit fcad23
                              sizeof(longvar));
Packit fcad23
Packit fcad23
        auth_oid(nsVacmContextPfx, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel, authtype);
Packit fcad23
        if (sscanf(argv[arg + 4], "%d", &contextMatch) == 0) {
Packit fcad23
            printf("invalid contextMatch\n");
Packit fcad23
            usage();
Packit fcad23
            goto close_session;
Packit fcad23
        }
Packit fcad23
        snmp_pdu_add_variable(pdu, nsVacmContextPfx, name_length,
Packit fcad23
                              ASN_INTEGER, (u_char *) & contextMatch,
Packit fcad23
                              sizeof(contextMatch));
Packit fcad23
Packit fcad23
        auth_oid(nsVacmViewName, &name_length, groupName, prefix,
Packit fcad23
                   secModel, secLevel, authtype);
Packit fcad23
        snmp_pdu_add_variable(pdu, nsVacmViewName, name_length,
Packit fcad23
                              ASN_OCTET_STR, (u_char *) argv[arg + 5],
Packit fcad23
                              strlen(argv[arg + 5]));
Packit fcad23
    } else {
Packit fcad23
        printf("Unknown command\n");
Packit fcad23
        usage();
Packit fcad23
        goto close_session;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    exitval = 0;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * do the request 
Packit fcad23
     */
Packit fcad23
    status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
    if (status == STAT_SUCCESS) {
Packit fcad23
        if (response) {
Packit fcad23
            if (response->errstat == SNMP_ERR_NOERROR) {
Packit fcad23
                fprintf(stderr, "%s\n", successNotes[command - 1]);
Packit fcad23
            } else {
Packit fcad23
                fprintf(stderr, "Error in packet.\nReason: %s\n",
Packit fcad23
                        snmp_errstring(response->errstat));
Packit fcad23
		if (response->errindex != 0){
Packit fcad23
		    int count;
Packit fcad23
		    struct variable_list *vars = response->variables;
Packit fcad23
		    fprintf(stderr, "Failed object: ");
Packit fcad23
		    for(count = 1; vars && (count != response->errindex);
Packit fcad23
			    vars = vars->next_variable, count++)
Packit fcad23
			;
Packit fcad23
		    if (vars)
Packit fcad23
			fprint_objid(stderr, vars->name, vars->name_length);
Packit fcad23
		    fprintf(stderr, "\n");
Packit fcad23
		}
Packit fcad23
                exitval = 2;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
    } else if (status == STAT_TIMEOUT) {
Packit fcad23
        fprintf(stderr, "Timeout: No Response from %s\n",
Packit fcad23
                session.peername);
Packit fcad23
        exitval = 1;
Packit fcad23
    } else {
Packit fcad23
        snmp_sess_perror("snmpset", ss);
Packit fcad23
        exitval = 1;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (response)
Packit fcad23
        snmp_free_pdu(response);
Packit fcad23
Packit fcad23
close_session:
Packit fcad23
    snmp_close(ss);
Packit fcad23
Packit fcad23
out:
Packit fcad23
    SOCK_CLEANUP;
Packit fcad23
    return exitval;
Packit fcad23
}