/* * AgentX Configuration */ #include #include #include #ifdef HAVE_STDLIB_H #include #endif #if HAVE_STRING_H #include #else #include #endif #if HAVE_PWD_H #include #endif #if HAVE_GRP_H #include #endif #include #include #include "snmpd.h" #include "agentx/agentx_config.h" #ifdef USING_AGENTX_MASTER_MODULE void agentx_parse_master(const char *token, char *cptr) { int i = -1; char buf[BUFSIZ]; if (!strcmp(cptr, "agentx") || !strcmp(cptr, "all") || !strcmp(cptr, "yes") || !strcmp(cptr, "on")) { i = 1; snmp_log(LOG_INFO, "Turning on AgentX master support.\n"); } else if (!strcmp(cptr, "no") || !strcmp(cptr, "off")) i = 0; else i = atoi(cptr); if (i < 0 || i > 1) { sprintf(buf, "master '%s' unrecognised", cptr); config_perror(buf); } else netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_MASTER, i); } #endif /* USING_AGENTX_MASTER_MODULE */ void agentx_parse_agentx_socket(const char *token, char *cptr) { DEBUGMSGTL(("agentx/config", "port spec: %s\n", cptr)); netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCKET, cptr); } void agentx_parse_agentx_perms(const char *token, char *cptr) { char *socket_perm, *dir_perm, *socket_user, *socket_group; int uid = -1; int gid = -1; int s_perm = -1; int d_perm = -1; char *st; #if HAVE_GETPWNAM && HAVE_PWD_H struct passwd *pwd; #endif #if HAVE_GETGRNAM && HAVE_GRP_H struct group *grp; #endif DEBUGMSGTL(("agentx/config", "port permissions: %s\n", cptr)); socket_perm = strtok_r(cptr, " \t", &st); dir_perm = strtok_r(NULL, " \t", &st); socket_user = strtok_r(NULL, " \t", &st); socket_group = strtok_r(NULL, " \t", &st); if (socket_perm) { s_perm = strtol(socket_perm, NULL, 8); netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCK_PERM, s_perm); DEBUGMSGTL(("agentx/config", "socket permissions: %o (%d)\n", s_perm, s_perm)); } if (dir_perm) { d_perm = strtol(dir_perm, NULL, 8); netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_DIR_PERM, d_perm); DEBUGMSGTL(("agentx/config", "directory permissions: %o (%d)\n", d_perm, d_perm)); } /* * Try to handle numeric UIDs or user names for the socket owner */ if (socket_user) { uid = atoi(socket_user); if ( uid == 0 ) { #if HAVE_GETPWNAM && HAVE_PWD_H pwd = getpwnam( socket_user ); if (pwd) uid = pwd->pw_uid; else #endif snmp_log(LOG_WARNING, "Can't identify AgentX socket user (%s).\n", socket_user); } if ( uid != 0 ) netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCK_USER, uid); DEBUGMSGTL(("agentx/config", "socket owner: %s (%d)\n", socket_user, uid)); } /* * and similarly for the socket group ownership */ if (socket_group) { gid = atoi(socket_group); if ( gid == 0 ) { #if HAVE_GETGRNAM && HAVE_GRP_H grp = getgrnam( socket_group ); if (grp) gid = grp->gr_gid; else #endif snmp_log(LOG_WARNING, "Can't identify AgentX socket group (%s).\n", socket_group); } if ( gid != 0 ) netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCK_GROUP, gid); DEBUGMSGTL(("agentx/config", "socket group: %s (%d)\n", socket_group, gid)); } } void agentx_parse_agentx_timeout(const char *token, char *cptr) { int x = atoi(cptr); DEBUGMSGTL(("agentx/config/timeout", "%s\n", cptr)); netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_TIMEOUT, x * ONE_SEC); } void agentx_parse_agentx_retries(const char *token, char *cptr) { int x = atoi(cptr); DEBUGMSGTL(("agentx/config/retries", "%s\n", cptr)); netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_RETRIES, x); } void agentx_register_config_handler(const char *token, void (*parser) (const char *, char *), void (*releaser) (void), const char *help) { DEBUGMSGTL(("agentx_register_app_config_handler", "registering .conf token for \"%s\"\n", token)); register_app_config_handler(token, parser, releaser, help); register_config_handler("agentx", token, parser, releaser, help); } void agentx_unregister_config_handler(const char *token) { unregister_app_config_handler(token); unregister_config_handler("agentx", token); } void init_agentx_config(void) { /* * Don't set this up as part of the per-module initialisation. * Delay this until the 'init_master_agent()' routine is called, * so that the config settings have been processed. * This means that we can use a config directive to determine * whether or not to run as an AgentX master. */ #ifdef USING_AGENTX_MASTER_MODULE if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE) == MASTER_AGENT) snmpd_register_config_handler("master", agentx_parse_master, NULL, "specify 'agentx' for AgentX support"); #endif /* USING_AGENTX_MASTER_MODULE */ agentx_register_config_handler("agentxsocket", agentx_parse_agentx_socket, NULL, "AgentX bind address"); agentx_register_config_handler("agentxperms", agentx_parse_agentx_perms, NULL, "AgentX socket permissions: socket_perms [directory_perms [username|userid [groupname|groupid]]]"); agentx_register_config_handler("agentxRetries", agentx_parse_agentx_retries, NULL, "AgentX Retries"); agentx_register_config_handler("agentxTimeout", agentx_parse_agentx_timeout, NULL, "AgentX Timeout (seconds)"); }