/* * DisMan Expression MIB: * Implementation of the expression table configuration handling. */ #include #include #include #include #include #include "utilities/iquery.h" #include "disman/expr/expExpression.h" #include "disman/expr/expObject.h" #include "disman/expr/expExpressionConf.h" netsnmp_feature_require(iquery); /* Initializes the expExpressionConf module */ void init_expExpressionConf(void) { init_expr_table_data(); /* * Register config handler for user-level (fixed) expressions... * XXX - TODO */ snmpd_register_config_handler("expression", parse_expression, NULL, NULL); /* * ... and persistent storage of dynamically configured entries. */ snmpd_register_config_handler("_expETable", parse_expETable, NULL, NULL); /* * Register to save (non-fixed) entries when the agent shuts down */ snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA, store_expETable, NULL); } /* ================================================ * * Handlers for loading/storing persistent expression entries * * ================================================ */ char * _parse_expECols( char *line, struct expExpression *entry ) { void *vp; size_t tmp; size_t len; len = EXP_STR3_LEN; vp = entry->expExpression; line = read_config_read_data(ASN_OCTET_STR, line, &vp, &len); line = read_config_read_data(ASN_UNSIGNED, line, &tmp, NULL); entry->expValueType = tmp; len = EXP_STR2_LEN; vp = entry->expComment; line = read_config_read_data(ASN_OCTET_STR, line, &vp, &len); line = read_config_read_data(ASN_UNSIGNED, line, &tmp, NULL); entry->expDeltaInterval = tmp; vp = entry->expPrefix; entry->expPrefix_len = MAX_OID_LEN; line = read_config_read_data(ASN_OBJECT_ID, line, &vp, &entry->expPrefix_len); line = read_config_read_data(ASN_UNSIGNED, line, &tmp, NULL); entry->flags |= (tmp & EXP_FLAG_ACTIVE); return line; } void parse_expression(const char *token, char *line) { char buf[ SPRINT_MAX_LEN]; char ename[EXP_STR1_LEN+1]; oid name_buf[MAX_OID_LEN]; size_t name_len; char *cp, *cp2; struct expExpression *entry; struct expObject *object; netsnmp_session *sess = NULL; int type=EXPVALTYPE_COUNTER; int i=1; DEBUGMSGTL(("disman:expr:conf", "Parsing expression config... ")); memset(buf, 0, sizeof(buf)); memset(ename, 0, sizeof(ename)); for (cp = copy_nword(line, buf, SPRINT_MAX_LEN); ; cp = copy_nword(cp, buf, SPRINT_MAX_LEN)) { if (buf[0] == '-' ) { switch (buf[1]) { case 't': /* type */ switch (buf[2]) { case 'c': type = EXPVALTYPE_COUNTER; break; case 'u': type = EXPVALTYPE_UNSIGNED; break; case 't': type = EXPVALTYPE_TIMETICKS; break; case 'i': type = EXPVALTYPE_INTEGER; break; case 'a': type = EXPVALTYPE_IPADDRESS; break; case 's': type = EXPVALTYPE_STRING; break; case 'o': type = EXPVALTYPE_OID; break; case 'C': type = EXPVALTYPE_COUNTER64; break; } break; case 'u': /* user */ cp = copy_nword(cp, buf, SPRINT_MAX_LEN); sess = netsnmp_iquery_user_session(buf); break; } } else { break; } } memcpy(ename, buf, sizeof(ename)); /* cp = copy_nword(line, ename, sizeof(ename)); */ entry = expExpression_createEntry( "snmpd.conf", ename, 1 ); if (!entry) return; cp2 = entry->expExpression; while (cp && *cp) { /* * Copy everything that can't possibly be a MIB * object name into the expression field... */ /* XXX - TODO - Handle string literals */ if (!isalpha(*cp & 0xFF)) { *cp2++ = *cp++; continue; } /* * ... and copy the defined functions across as well * XXX - TODO */ /* * Anything else is presumably a MIB object (or instance). * Create an entry in the expObjectTable, and insert a * corresponding parameter in the expression itself. */ name_len = MAX_OID_LEN; cp = copy_nword(cp, buf, SPRINT_MAX_LEN); snmp_parse_oid( buf, name_buf, &name_len ); object = expObject_createEntry( "snmpd.conf", ename, i, 1 ); memcpy( object->expObjectID, name_buf, name_len*sizeof(oid)); object->expObjectID_len = name_len; object->flags |= EXP_OBJ_FLAG_VALID | EXP_OBJ_FLAG_ACTIVE | EXP_OBJ_FLAG_OWILD; /* * The first such object can also be used as the * expExpressionPrefix */ if ( i == 1 ) { memcpy( entry->expPrefix, name_buf, name_len*sizeof(oid)); entry->expPrefix_len = name_len; object->flags |= EXP_OBJ_FLAG_PREFIX; } sprintf(cp2, "$%d", i++); while (*cp2) cp2++; /* Skip over this parameter */ } if (sess) entry->session = sess; else entry->session = netsnmp_query_get_default_session(); entry->expDeltaInterval = 10; entry->expValueType = type; entry->flags |= EXP_FLAG_VALID | EXP_FLAG_ACTIVE; expExpression_enable( entry ); DEBUGMSG(("disman:expr:conf", "(%s, %s)\n", ename, entry->expExpression)); } void parse_expETable(const char *token, char *line) { char owner[EXP_STR1_LEN+1]; char ename[EXP_STR1_LEN+1]; void *vp; size_t len; struct expExpression *entry; DEBUGMSGTL(("disman:expr:conf", "Parsing mteExpressionTable config... ")); /* * Read in the index information for this entry * and create a (non-fixed) data structure for it. */ memset( owner, 0, sizeof(owner)); memset( ename, 0, sizeof(ename)); len = EXP_STR1_LEN; vp = owner; line = read_config_read_data(ASN_OCTET_STR, line, &vp, &len); len = EXP_STR1_LEN; vp = ename; line = read_config_read_data(ASN_OCTET_STR, line, &vp, &len); entry = expExpression_createEntry( owner, ename, 0 ); DEBUGMSG(("disman:expr:conf", "(%s, %s) ", owner, ename)); /* * Read in the accessible column values. */ line = _parse_expECols( line, entry ); /* * XXX - Will need to read in the 'iquery' access information */ entry->flags |= EXP_FLAG_VALID; DEBUGMSG(("disman:expr:conf", "\n")); } int store_expETable(int majorID, int minorID, void *serverarg, void *clientarg) { char line[SNMP_MAXBUF]; char *cptr, *cp; void *vp; size_t tint; netsnmp_tdata_row *row; struct expExpression *entry; DEBUGMSGTL(("disman:expr:conf", "Storing expExpressionTable config:\n")); for (row = netsnmp_tdata_row_first( expr_table_data ); row; row = netsnmp_tdata_row_next( expr_table_data, row )) { /* * Skip entries that were set up via static config directives */ entry = (struct expExpression *)netsnmp_tdata_row_entry( row ); if ( entry->flags & EXP_FLAG_FIXED ) continue; DEBUGMSGTL(("disman:expr:conf", " Storing (%s %s)\n", entry->expOwner, entry->expName)); /* * Save the basic expExpression entry */ memset(line, 0, sizeof(line)); strcat(line, "_expETable "); cptr = line + strlen(line); cp = entry->expOwner; tint = strlen( cp ); cptr = read_config_store_data( ASN_OCTET_STR, cptr, &cp, &tint ); cp = entry->expName; tint = strlen( cp ); cptr = read_config_store_data( ASN_OCTET_STR, cptr, &cp, &tint ); cp = entry->expExpression; tint = strlen( cp ); cptr = read_config_store_data( ASN_OCTET_STR, cptr, &cp, &tint ); tint = entry->expValueType; cptr = read_config_store_data( ASN_UNSIGNED, cptr, &tint, NULL ); cp = entry->expComment; tint = strlen( cp ); cptr = read_config_store_data( ASN_OCTET_STR, cptr, &cp, &tint ); tint = entry->expDeltaInterval; cptr = read_config_store_data( ASN_UNSIGNED, cptr, &tint, NULL ); vp = entry->expPrefix; tint = entry->expPrefix_len; cptr = read_config_store_data( ASN_OBJECT_ID, cptr, &vp, &tint ); tint = entry->flags; cptr = read_config_store_data( ASN_UNSIGNED, cptr, &tint, NULL ); /* XXX - Need to store the 'iquery' access information */ snmpd_store_config(line); } DEBUGMSGTL(("disman:expr:conf", " done.\n")); return SNMPERR_SUCCESS; }