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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  AgentX Configuration
  3.  */
  4. #include <net-snmp/net-snmp-config.h>
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #ifdef HAVE_STDLIB_H
  8. #include <stdlib.h>
  9. #endif
  10. #if HAVE_STRING_H
  11. #include <string.h>
  12. #else
  13. #include <strings.h>
  14. #endif
  15. #if HAVE_PWD_H
  16. #include <pwd.h>
  17. #endif
  18. #if HAVE_GRP_H
  19. #include <grp.h>
  20. #endif
  21. #include <net-snmp/net-snmp-includes.h>
  22. #include <net-snmp/agent/net-snmp-agent-includes.h>
  23. #include "snmpd.h"
  24. #include "agentx/agentx_config.h"
  25. #ifdef USING_AGENTX_MASTER_MODULE
  26. void
  27. agentx_parse_master(const char *token, char *cptr)
  28. {
  29.     int             i = -1;
  30.     char            buf[BUFSIZ];
  31.     if (!strcmp(cptr, "agentx") ||
  32.         !strcmp(cptr, "all") ||
  33.         !strcmp(cptr, "yes") || !strcmp(cptr, "on")) {
  34.         i = 1;
  35.         snmp_log(LOG_INFO, "Turning on AgentX master support.n");
  36.     } else if (!strcmp(cptr, "no") || !strcmp(cptr, "off"))
  37.         i = 0;
  38.     else
  39.         i = atoi(cptr);
  40.     if (i < 0 || i > 1) {
  41.         sprintf(buf, "master '%s' unrecognised", cptr);
  42.         config_perror(buf);
  43.     } else
  44.         netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_MASTER, i);
  45. }
  46. #endif                          /* USING_AGENTX_MASTER_MODULE */
  47. void
  48. agentx_parse_agentx_socket(const char *token, char *cptr)
  49. {
  50.     DEBUGMSGTL(("agentx/config", "port spec: %sn", cptr));
  51.     netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCKET, cptr);
  52. }
  53. void
  54. agentx_parse_agentx_perms(const char *token, char *cptr)
  55. {
  56.     char *socket_perm, *dir_perm, *socket_user, *socket_group;
  57.     int uid = -1;
  58.     int gid = -1;
  59.     int s_perm = -1;
  60.     int d_perm = -1;
  61.     char *st;
  62. #if HAVE_GETPWNAM && HAVE_PWD_H
  63.     struct passwd *pwd;
  64. #endif
  65. #if HAVE_GETGRNAM && HAVE_GRP_H
  66.     struct group  *grp;
  67. #endif
  68.     DEBUGMSGTL(("agentx/config", "port permissions: %sn", cptr));
  69.     socket_perm = strtok_r(cptr, " t", &st);
  70.     dir_perm    = strtok_r(NULL, " t", &st);
  71.     socket_user = strtok_r(NULL, " t", &st);
  72.     socket_group = strtok_r(NULL, " t", &st);
  73.     if (socket_perm) {
  74.         s_perm = strtol(socket_perm, NULL, 8);
  75.         netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  76.                            NETSNMP_DS_AGENT_X_SOCK_PERM, s_perm);
  77.         DEBUGMSGTL(("agentx/config", "socket permissions: %o (%d)n",
  78.                     s_perm, s_perm));
  79.     }
  80.     if (dir_perm) {
  81.         d_perm = strtol(dir_perm, NULL, 8);
  82.         netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  83.                            NETSNMP_DS_AGENT_X_DIR_PERM, d_perm);
  84.         DEBUGMSGTL(("agentx/config", "directory permissions: %o (%d)n",
  85.                     d_perm, d_perm));
  86.     }
  87.     /*
  88.      * Try to handle numeric UIDs or user names for the socket owner
  89.      */
  90.     if (socket_user) {
  91.         uid = atoi(socket_user);
  92.         if ( uid == 0 ) {
  93. #if HAVE_GETPWNAM && HAVE_PWD_H
  94.             pwd = getpwnam( socket_user );
  95.             if (pwd)
  96.                 uid = pwd->pw_uid;
  97.             else
  98. #endif
  99.                 snmp_log(LOG_WARNING, "Can't identify AgentX socket user (%s).n", socket_user);
  100.         }
  101.         if ( uid != 0 )
  102.             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  103.                                NETSNMP_DS_AGENT_X_SOCK_USER, uid);
  104.         DEBUGMSGTL(("agentx/config", "socket owner: %s (%d)n",
  105.                     socket_user, uid));
  106.     }
  107.     /*
  108.      * and similarly for the socket group ownership
  109.      */
  110.     if (socket_group) {
  111.         gid = atoi(socket_group);
  112.         if ( gid == 0 ) {
  113. #if HAVE_GETGRNAM && HAVE_GRP_H
  114.             grp = getgrnam( socket_group );
  115.             if (grp)
  116.                 gid = grp->gr_gid;
  117.             else
  118. #endif
  119.                 snmp_log(LOG_WARNING, "Can't identify AgentX socket group (%s).n", socket_group);
  120.         }
  121.         if ( gid != 0 )
  122.             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  123.                                NETSNMP_DS_AGENT_X_SOCK_GROUP, gid);
  124.         DEBUGMSGTL(("agentx/config", "socket group: %s (%d)n",
  125.                     socket_group, gid));
  126.     }
  127. }
  128. void
  129. agentx_parse_agentx_timeout(const char *token, char *cptr)
  130. {
  131.     int x = atoi(cptr);
  132.     DEBUGMSGTL(("agentx/config/timeout", "%sn", cptr));
  133.     netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  134.                        NETSNMP_DS_AGENT_AGENTX_TIMEOUT, x * ONE_SEC);
  135. }
  136. void
  137. agentx_parse_agentx_retries(const char *token, char *cptr)
  138. {
  139.     int x = atoi(cptr);
  140.     DEBUGMSGTL(("agentx/config/retries", "%sn", cptr));
  141.     netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID,
  142.                        NETSNMP_DS_AGENT_AGENTX_RETRIES, x);
  143. }
  144. void
  145. agentx_register_config_handler(const char *token,
  146.                               void (*parser) (const char *, char *),
  147.                               void (*releaser) (void), const char *help)
  148. {
  149.     DEBUGMSGTL(("agentx_register_app_config_handler",
  150.                 "registering .conf token for "%s"n", token));
  151.     register_app_config_handler(token, parser, releaser, help);
  152.     register_config_handler("agentx", token, parser, releaser, help);
  153. }
  154. void
  155. agentx_unregister_config_handler(const char *token)
  156. {
  157.     unregister_app_config_handler(token);
  158.     unregister_config_handler("agentx", token);
  159. }
  160. void
  161. init_agentx_config(void)
  162. {
  163.     /*
  164.      * Don't set this up as part of the per-module initialisation.
  165.      * Delay this until the 'init_master_agent()' routine is called,
  166.      *   so that the config settings have been processed.
  167.      * This means that we can use a config directive to determine
  168.      *   whether or not to run as an AgentX master.
  169.      */
  170. #ifdef USING_AGENTX_MASTER_MODULE
  171.     if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE) == MASTER_AGENT)
  172.         snmpd_register_config_handler("master",
  173.                                       agentx_parse_master, NULL,
  174.                                       "specify 'agentx' for AgentX support");
  175. #endif                          /* USING_AGENTX_MASTER_MODULE */
  176.     agentx_register_config_handler("agentxsocket",
  177.                                   agentx_parse_agentx_socket, NULL,
  178.                                   "AgentX bind address");
  179.     agentx_register_config_handler("agentxperms",
  180.                                   agentx_parse_agentx_perms, NULL,
  181.                                   "AgentX socket permissions: socket_perms [directory_perms [username|userid [groupname|groupid]]]");
  182.     agentx_register_config_handler("agentxRetries",
  183.                                   agentx_parse_agentx_retries, NULL,
  184.                                   "AgentX Retries");
  185.     agentx_register_config_handler("agentxTimeout",
  186.                                   agentx_parse_agentx_timeout, NULL,
  187.                                   "AgentX Timeout (seconds)");
  188. }