snmpvacm.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:17k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * snmpvacm.c - send snmp SET requests to a network entity to change the
  3.  *             vacm database
  4.  *
  5.  */
  6. #include <net-snmp/net-snmp-config.h>
  7. #if HAVE_STDLIB_H
  8. #include <stdlib.h>
  9. #endif
  10. #if HAVE_UNISTD_H
  11. #include <unistd.h>
  12. #endif
  13. #if HAVE_STRING_H
  14. #include <string.h>
  15. #else
  16. #include <strings.h>
  17. #endif
  18. #include <sys/types.h>
  19. #if HAVE_NETINET_IN_H
  20. #include <netinet/in.h>
  21. #endif
  22. #include <stdio.h>
  23. #include <ctype.h>
  24. #if TIME_WITH_SYS_TIME
  25. # ifdef WIN32
  26. #  include <sys/timeb.h>
  27. # else
  28. #  include <sys/time.h>
  29. # endif
  30. # include <time.h>
  31. #else
  32. # if HAVE_SYS_TIME_H
  33. #  include <sys/time.h>
  34. # else
  35. #  include <time.h>
  36. # endif
  37. #endif
  38. #if HAVE_SYS_SELECT_H
  39. #include <sys/select.h>
  40. #endif
  41. #if HAVE_WINSOCK_H
  42. #include <winsock.h>
  43. #endif
  44. #if HAVE_NETDB_H
  45. #include <netdb.h>
  46. #endif
  47. #if HAVE_ARPA_INET_H
  48. #include <arpa/inet.h>
  49. #endif
  50. #include <net-snmp/net-snmp-includes.h>
  51. int             main(int, char **);
  52. #define CMD_CREATESEC2GROUP_NAME    "createSec2Group"
  53. #define CMD_CREATESEC2GROUP         1
  54. #define CMD_DELETESEC2GROUP_NAME    "deleteSec2Group"
  55. #define CMD_DELETESEC2GROUP         2
  56. #define CMD_CREATEACCESS_NAME     "createAccess"
  57. #define CMD_CREATEACCESS          3
  58. #define CMD_DELETEACCESS_NAME  "deleteAccess"
  59. #define CMD_DELETEACCESS       4
  60. #define CMD_CREATEVIEW_NAME  "createView"
  61. #define CMD_CREATEVIEW       5
  62. #define CMD_DELETEVIEW_NAME  "deleteView"
  63. #define CMD_DELETEVIEW       6
  64. #define CMD_NUM    6
  65. static const char *successNotes[CMD_NUM] = {
  66.     "Sec2group successfully created.",
  67.     "Sec2group successfully deleted.",
  68.     "Access successfully created.",
  69.     "Access successfully deleted.",
  70.     "View successfully created.",
  71.     "View successfully deleted."
  72. };
  73. #define                   SEC2GROUP_OID_LEN 11
  74. #define                   ACCESS_OID_LEN    11
  75. #define                   VIEW_OID_LEN     12
  76. static oid      vacmGroupName[MAX_OID_LEN] =
  77.     { 1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 3 },
  78.     vacmSec2GroupStorageType[MAX_OID_LEN] = {
  79. 1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 4}, vacmSec2GroupStatus[MAX_OID_LEN] = {
  80. 1, 3, 6, 1, 6, 3, 16, 1, 2, 1, 5}, vacmAccessContextMatch[MAX_OID_LEN] = {
  81. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 4}, vacmAccessReadViewName[MAX_OID_LEN] = {
  82. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 5}, vacmAccessWriteViewName[MAX_OID_LEN] = {
  83. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 6}, vacmAccessNotifyViewName[MAX_OID_LEN] = {
  84. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 7}, vacmAccessStorageType[MAX_OID_LEN] = {
  85. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 8}, vacmAccessStatus[MAX_OID_LEN] = {
  86. 1, 3, 6, 1, 6, 3, 16, 1, 4, 1, 9}, vacmViewTreeFamilyMask[MAX_OID_LEN] = {
  87. 1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 3}, vacmViewTreeFamilyType[MAX_OID_LEN] = {
  88. 1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 4},
  89.     vacmViewTreeFamilyStorageType[MAX_OID_LEN] = {
  90. 1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 5},
  91.     vacmViewTreeFamilyStatus[MAX_OID_LEN] = {
  92. 1, 3, 6, 1, 6, 3, 16, 1, 5, 2, 1, 6}
  93. ;
  94. int             viewTreeFamilyType = 1;
  95. void
  96. usage(void)
  97. {
  98.     fprintf(stderr, "Usage: snmpvacm ");
  99.     snmp_parse_args_usage(stderr);
  100.     fprintf(stderr, " COMMANDnn");
  101.     snmp_parse_args_descriptions(stderr);
  102.     fprintf(stderr, "nsnmpvacm commands:n");
  103.     fprintf(stderr, "        createAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAMEn");
  104.     fprintf(stderr, "        deleteAccess     GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVELn");
  105.     fprintf(stderr, "        createSec2Group  MODEL SECURITYNAME  GROUPNAMEn");
  106.     fprintf(stderr, "        deleteSec2Group  MODEL SECURITYNAMEn");
  107.     fprintf(stderr, "  [-Ce] createView       NAME SUBTREE [MASK]n");
  108.     fprintf(stderr, "        deleteView       NAME SUBTREEn");
  109. }
  110. void
  111. access_oid(oid * it, size_t * len, const char *groupName,
  112.            const char *prefix, int model, int level)
  113. {
  114.     int             i;
  115.     int             itIndex = ACCESS_OID_LEN;
  116.     *len = itIndex + 4 + +strlen(groupName);
  117.     it[itIndex++] = strlen(groupName);
  118.     for (i = 0; i < (int) strlen(groupName); i++)
  119.         it[itIndex++] = groupName[i];
  120.     if (prefix) {
  121.         *len += strlen(prefix);
  122.         it[itIndex++] = strlen(prefix);
  123.         for (i = 0; i < (int) strlen(prefix); i++)
  124.             it[itIndex++] = prefix[i];
  125.     } else
  126.         it[itIndex++] = 0;
  127.     it[itIndex++] = model;
  128.     it[itIndex++] = level;
  129. }
  130. void
  131. sec2group_oid(oid * it, size_t * len, int model, const char *name)
  132. {
  133.     int             i;
  134.     int             itIndex = SEC2GROUP_OID_LEN;
  135.     *len = itIndex + 2 + strlen(name);
  136.     it[itIndex++] = model;
  137.     it[itIndex++] = strlen(name);
  138.     for (i = 0; i < (int) strlen(name); i++)
  139.         it[itIndex++] = name[i];
  140. }
  141. void
  142. view_oid(oid * it, size_t * len, const char *viewName, char *viewSubtree)
  143. {
  144.     int             i;
  145.     oid             c_oid[SPRINT_MAX_LEN];
  146.     size_t          c_oid_length = SPRINT_MAX_LEN;
  147.     int             itIndex = VIEW_OID_LEN;
  148.     if (!snmp_parse_oid(viewSubtree, c_oid, &c_oid_length)) {
  149.         printf("Error parsing subtree (%s)n", viewSubtree);
  150.         exit(1);
  151.     }
  152.     *len = itIndex + 2 + strlen(viewName) + c_oid_length;
  153.     it[itIndex++] = strlen(viewName);
  154.     for (i = 0; i < (int) strlen(viewName); i++)
  155.         it[itIndex++] = viewName[i];
  156.     
  157.     it[itIndex++] = c_oid_length;
  158.     for (i = 0; i < (int) c_oid_length; i++)
  159.         it[itIndex++] = c_oid[i];
  160.     /*
  161.      * sprint_objid(c_oid, it, *len); 
  162.      */
  163. }
  164. static void
  165. optProc(int argc, char *const *argv, int opt)
  166. {
  167.     switch (opt) {
  168.     case 'C':
  169.         while (*optarg) {
  170.             switch (*optarg++) {
  171.             case 'e':
  172.                 viewTreeFamilyType = 2;
  173.                 break;
  174.             default:
  175.                 fprintf(stderr,
  176.                         "Unknown flag passed to -C: %cn", optarg[-1]);
  177.                 exit(1);
  178.             }
  179.         }
  180.         break;
  181.     }
  182. }
  183. int
  184. main(int argc, char *argv[])
  185. {
  186.     netsnmp_session session, *ss;
  187.     netsnmp_pdu    *pdu = NULL, *response = NULL;
  188. #ifdef notused
  189.     netsnmp_variable_list *vars;
  190. #endif
  191.     int             arg;
  192. #ifdef notused
  193.     int             count;
  194.     int             current_name = 0;
  195.     int             current_type = 0;
  196.     int             current_value = 0;
  197.     char           *names[128];
  198.     char            types[128];
  199.     char           *values[128];
  200.     oid             name[MAX_OID_LEN];
  201. #endif
  202.     size_t          name_length;
  203.     int             status;
  204.     int             exitval = 0;
  205.     int             command = 0;
  206.     long            longvar;
  207.     int             secModel, secLevel, contextMatch, val, i = 0;
  208.     char           *mask, *groupName, *prefix;
  209.     u_char          viewMask[VACMSTRINGLEN];
  210.     char           *st;
  211.     /*
  212.      * get the common command line arguments 
  213.      */
  214.     switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
  215.     case -2:
  216.         exit(0);
  217.     case -1:
  218.         usage();
  219.         exit(1);
  220.     default:
  221.         break;
  222.     }
  223.     SOCK_STARTUP;
  224.     /*
  225.      * open an SNMP session 
  226.      */
  227.     /*
  228.      * Note:  this wil obtain the engineID needed below 
  229.      */
  230.     ss = snmp_open(&session);
  231.     if (ss == NULL) {
  232.         /*
  233.          * diagnose snmp_open errors with the input netsnmp_session pointer 
  234.          */
  235.         snmp_sess_perror("snmpvacm", &session);
  236.         exit(1);
  237.     }
  238.     /*
  239.      * create PDU for SET request and add object names and values to request 
  240.      */
  241.     pdu = snmp_pdu_create(SNMP_MSG_SET);
  242.     if (arg >= argc) {
  243.         fprintf(stderr, "Please specify a operation to perform.n");
  244.         usage();
  245.         exit(1);
  246.     }
  247.     if (strcmp(argv[arg], CMD_DELETEVIEW_NAME) == 0)
  248.         /*
  249.          * deleteView: delete a view
  250.          *
  251.          * deleteView NAME SUBTREE
  252.          *
  253.          */
  254.     {
  255.         if (++arg + 2 != argc) {
  256.             fprintf(stderr, "You must specify the view to deleten");
  257.             usage();
  258.             exit(1);
  259.         }
  260.         command = CMD_DELETEVIEW;
  261.         name_length = VIEW_OID_LEN;
  262.         view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
  263.                  argv[arg + 1]);
  264.         longvar = RS_DESTROY;
  265.         snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
  266.                               ASN_INTEGER, (u_char *) & longvar,
  267.                               sizeof(longvar));
  268.     } else if (strcmp(argv[arg], CMD_CREATEVIEW_NAME) == 0)
  269.         /*
  270.          * createView: create a view
  271.          *
  272.          * createView NAME SUBTREE MASK
  273.          *
  274.          */
  275.     {
  276.         if (++arg + 2 > argc) {
  277.             fprintf(stderr, "You must specify name, subtree and maskn");
  278.             usage();
  279.             exit(1);
  280.         }
  281.         command = CMD_CREATEVIEW;
  282.         name_length = VIEW_OID_LEN;
  283.         view_oid(vacmViewTreeFamilyStatus, &name_length, argv[arg],
  284.                  argv[arg + 1]);
  285.         longvar = RS_CREATEANDGO;
  286.         snmp_pdu_add_variable(pdu, vacmViewTreeFamilyStatus, name_length,
  287.                               ASN_INTEGER, (u_char *) & longvar,
  288.                               sizeof(longvar));
  289.         /*
  290.          * Mask
  291.          */
  292.         if (arg + 3 == argc) {
  293.             mask = argv[arg + 2];
  294.             for (mask = strtok_r(mask, ".:", &st); mask; mask = strtok_r(NULL, ".:", &st)) {
  295.                 if (i >= sizeof(viewMask)) {
  296.                     printf("MASK too longn");
  297.                     exit(1);
  298.                 }
  299.                 if (sscanf(mask, "%x", &val) == 0) {
  300.                     printf("invalid MASKn");
  301.                     exit(1);
  302.                 }
  303.                 viewMask[i] = val;
  304.                 i++;
  305.             }
  306. } else {
  307.             for (i=0 ; i < ((int)name_length+7)/8; i++)
  308.                 viewMask[i] = (u_char)0xff;
  309.         }
  310.         view_oid(vacmViewTreeFamilyMask, &name_length, argv[arg],
  311.                  argv[arg + 1]);
  312.         snmp_pdu_add_variable(pdu, vacmViewTreeFamilyMask, name_length,
  313.                               ASN_OCTET_STR, viewMask, i);
  314.         view_oid(vacmViewTreeFamilyType, &name_length, argv[arg],
  315.                  argv[arg + 1]);
  316.         snmp_pdu_add_variable(pdu, vacmViewTreeFamilyType, name_length,
  317.                               ASN_INTEGER, (u_char *) & viewTreeFamilyType,
  318.                               sizeof(viewTreeFamilyType));
  319.     } else if (strcmp(argv[arg], CMD_DELETESEC2GROUP_NAME) == 0)
  320.         /*
  321.          * deleteSec2Group: delete security2group
  322.          *
  323.          * deleteSec2Group  MODEL SECURITYNAME
  324.          *
  325.          */
  326.     {
  327.         if (++arg + 2 != argc) {
  328.             fprintf(stderr, "You must specify the sec2group to deleten");
  329.             usage();
  330.             exit(1);
  331.         }
  332.         command = CMD_DELETESEC2GROUP;
  333.         name_length = SEC2GROUP_OID_LEN;
  334.         if (sscanf(argv[arg], "%d", &secModel) == 0) {
  335.             printf("invalid security modeln");
  336.             usage();
  337.             exit(1);
  338.         }
  339.         sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
  340.                       argv[arg + 1]);
  341.         longvar = RS_DESTROY;
  342.         snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
  343.                               ASN_INTEGER, (u_char *) & longvar,
  344.                               sizeof(longvar));
  345.     } else if (strcmp(argv[arg], CMD_CREATESEC2GROUP_NAME) == 0)
  346.         /*
  347.          * createSec2Group: create a security2group
  348.          *
  349.          * createSec2Group  MODEL SECURITYNAME GROUPNAME
  350.          *
  351.          */
  352.     {
  353.         if (++arg + 3 != argc) {
  354.             fprintf(stderr,
  355.                     "You must specify model, security name and group namen");
  356.             usage();
  357.             exit(1);
  358.         }
  359.         command = CMD_CREATESEC2GROUP;
  360.         name_length = SEC2GROUP_OID_LEN;
  361.         if (sscanf(argv[arg], "%d", &secModel) == 0) {
  362.             printf("invalid security modeln");
  363.             usage();
  364.             exit(1);
  365.         }
  366.         sec2group_oid(vacmSec2GroupStatus, &name_length, secModel,
  367.                       argv[arg + 1]);
  368.         longvar = RS_CREATEANDGO;
  369.         snmp_pdu_add_variable(pdu, vacmSec2GroupStatus, name_length,
  370.                               ASN_INTEGER, (u_char *) & longvar,
  371.                               sizeof(longvar));
  372.         sec2group_oid(vacmGroupName, &name_length, secModel,
  373.                       argv[arg + 1]);
  374.         snmp_pdu_add_variable(pdu, vacmGroupName, name_length,
  375.                               ASN_OCTET_STR, (u_char *) argv[arg + 2],
  376.                               strlen(argv[arg + 2]));
  377.     } else if (strcmp(argv[arg], CMD_DELETEACCESS_NAME) == 0)
  378.         /*
  379.          * deleteAccess: delete access entry
  380.          *
  381.          * deleteAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL
  382.          *
  383.          */
  384.     {
  385.         if (++arg + 3 > argc) {
  386.             fprintf(stderr,
  387.                     "You must specify the access entry to deleten");
  388.             usage();
  389.             exit(1);
  390.         }
  391.         command = CMD_DELETEACCESS;
  392.         name_length = ACCESS_OID_LEN;
  393.         groupName = argv[arg];
  394.         if (arg + 4 == argc)
  395.             prefix = argv[++arg];
  396.         else
  397.             prefix = NULL;
  398.         if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
  399.             printf("invalid security modeln");
  400.             usage();
  401.             exit(1);
  402.         }
  403.         if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
  404.             printf("invalid security leveln");
  405.             usage();
  406.             exit(1);
  407.         }
  408.         access_oid(vacmAccessStatus, &name_length, groupName, prefix,
  409.                    secModel, secLevel);
  410.         longvar = RS_DESTROY;
  411.         snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
  412.                               ASN_INTEGER, (u_char *) & longvar,
  413.                               sizeof(longvar));
  414.     } else if (strcmp(argv[arg], CMD_CREATEACCESS_NAME) == 0)
  415.         /*
  416.          * createAccess: create access entry
  417.          *
  418.          * createAccess  GROUPNAME [CONTEXTPREFIX] SECURITYMODEL SECURITYLEVEL CONTEXTMATCH READVIEWNAME WRITEVIEWNAME NOTIFYVIEWNAME
  419.          *
  420.          */
  421.     {
  422.         if (++arg + 7 > argc) {
  423.             fprintf(stderr,
  424.                     "You must specify the access entry to createn");
  425.             usage();
  426.             exit(1);
  427.         }
  428.         command = CMD_CREATEACCESS;
  429.         name_length = ACCESS_OID_LEN;
  430.         groupName = argv[arg];
  431.         if (arg + 8 == argc)
  432.             prefix = argv[++arg];
  433.         else
  434.             prefix = NULL;
  435.         if (sscanf(argv[arg + 1], "%d", &secModel) == 0) {
  436.             printf("invalid security modeln");
  437.             usage();
  438.             exit(1);
  439.         }
  440.         if (sscanf(argv[arg + 2], "%d", &secLevel) == 0) {
  441.             printf("invalid security leveln");
  442.             usage();
  443.             exit(1);
  444.         }
  445.         access_oid(vacmAccessStatus, &name_length, groupName, prefix,
  446.                    secModel, secLevel);
  447.         longvar = RS_CREATEANDGO;
  448.         snmp_pdu_add_variable(pdu, vacmAccessStatus, name_length,
  449.                               ASN_INTEGER, (u_char *) & longvar,
  450.                               sizeof(longvar));
  451.         access_oid(vacmAccessContextMatch, &name_length, groupName, prefix,
  452.                    secModel, secLevel);
  453.         if (sscanf(argv[arg + 3], "%d", &contextMatch) == 0) {
  454.             printf("invalid contextMatchn");
  455.             usage();
  456.             exit(1);
  457.         }
  458.         snmp_pdu_add_variable(pdu, vacmAccessContextMatch, name_length,
  459.                               ASN_INTEGER, (u_char *) & contextMatch,
  460.                               sizeof(contextMatch));
  461.         access_oid(vacmAccessReadViewName, &name_length, groupName, prefix,
  462.                    secModel, secLevel);
  463.         snmp_pdu_add_variable(pdu, vacmAccessReadViewName, name_length,
  464.                               ASN_OCTET_STR, (u_char *) argv[arg + 4],
  465.                               strlen(argv[arg + 4]));
  466.         access_oid(vacmAccessWriteViewName, &name_length, groupName,
  467.                    prefix, secModel, secLevel);
  468.         snmp_pdu_add_variable(pdu, vacmAccessWriteViewName, name_length,
  469.                               ASN_OCTET_STR, (u_char *) argv[arg + 5],
  470.                               strlen(argv[arg + 5]));
  471.         access_oid(vacmAccessNotifyViewName, &name_length, groupName,
  472.                    prefix, secModel, secLevel);
  473.         snmp_pdu_add_variable(pdu, vacmAccessNotifyViewName, name_length,
  474.                               ASN_OCTET_STR, (u_char *) argv[arg + 6],
  475.                               strlen(argv[arg + 6]));
  476.     } else {
  477.         printf("Unknown commandn");
  478.         usage();
  479.         exit(1);
  480.     }
  481.     /*
  482.      * do the request 
  483.      */
  484.     status = snmp_synch_response(ss, pdu, &response);
  485.     if (status == STAT_SUCCESS) {
  486.         if (response) {
  487.             if (response->errstat == SNMP_ERR_NOERROR) {
  488.                 fprintf(stderr, "%sn", successNotes[command - 1]);
  489.             } else {
  490.                 fprintf(stderr, "Error in packet.nReason: %sn",
  491.                         snmp_errstring(response->errstat));
  492. if (response->errindex != 0){
  493.     int count;
  494.     struct variable_list *vars = response->variables;
  495.     fprintf(stderr, "Failed object: ");
  496.     for(count = 1; vars && (count != response->errindex);
  497.     vars = vars->next_variable, count++)
  498. ;
  499.     if (vars)
  500. fprint_objid(stderr, vars->name, vars->name_length);
  501.     fprintf(stderr, "n");
  502. }
  503.                 exitval = 2;
  504.             }
  505.         }
  506.     } else if (status == STAT_TIMEOUT) {
  507.         fprintf(stderr, "Timeout: No Response from %sn",
  508.                 session.peername);
  509.         exitval = 1;
  510.     } else {
  511.         snmp_sess_perror("snmpset", ss);
  512.         exitval = 1;
  513.     }
  514.     if (response)
  515.         snmp_free_pdu(response);
  516.     snmp_close(ss);
  517.     SOCK_CLEANUP;
  518.     return exitval;
  519. }