u_char * var_system(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { static u_long ulret; if (header_generic(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; switch (vp->magic) { case VERSION_DESCR: *var_len = strlen(version_descr); return (u_char *) version_descr; case VERSIONID: *var_len = sysObjectIDLength * sizeof(sysObjectID[0]); return (u_char *)sysObjectID; case UPTIME: ulret = netsnmp_get_agent_uptime(); return ((u_char *) & ulret); case SYSCONTACT: *var_len = strlen(sysContact); *write_method = writeSystem; return (u_char *) sysContact; case SYSTEMNAME: *var_len = strlen(sysName); *write_method = writeSystem; return (u_char *) sysName; case SYSLOCATION: *var_len = strlen(sysLocation); *write_method = writeSystem; return (u_char *) sysLocation; case SYSSERVICES: #if NETSNMP_NO_DUMMY_VALUES if (!sysServicesConfiged) return NULL; #endif long_return = sysServices; return (u_char *) & long_return; #ifdef USING_MIBII_SYSORTABLE_MODULE case SYSORLASTCHANGE: ulret = netsnmp_timeval_uptime(&sysOR_lastchange); return ((u_char *) & ulret); #endif default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_system\n", vp->magic)); } return NULL; }
u_char * var_system(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { static u_long ulret; char model_name[16]; char DBdata[64]; struct sysinfo info; if (header_generic(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; switch (vp->magic) { case VERSION_DESCR: #ifdef CONFIG_MODEL_LRTXXX /* purpose : 0012731 author : Gavin.Lin date : 2010-06-23 */ /* description : Set VERSION_DESCR by Model */ kd_doCommand("VERSION MODEL", CMD_PRINT, ASH_DO_NOTHING, DBdata); if (!strcmp("LRT214", DBdata)) { sprintf(version_descr, "LRT214 Gigabit VPN Router"); } if (!strcmp("LRT224", DBdata)) { sprintf(version_descr, "LRT224 Dual WAN Gigabit VPN Router"); } #endif *var_len = strlen(version_descr); return (u_char *) version_descr; case VERSIONID: *var_len = sysObjectIDLength * sizeof(sysObjectID[0]); return (u_char *)sysObjectID; case UPTIME: /* purpose : 0013044 author : Gavin.Lin date : 2010-07-28 */ /* description : Get up time from sysinfo */ /* ulret = netsnmp_get_agent_uptime(); */ sysinfo(&info); ulret = info.uptime; ulret *= 100; return ((u_char *) & ulret); case SYSCONTACT: // Added by Gavin Lin, 2010/04/16 kd_doCommand("SNMP SCONTACT", CMD_PRINT, ASH_DO_NOTHING, sysContact); *var_len = strlen(sysContact); *write_method = writeSystem; return (u_char *) sysContact; case SYSTEMNAME: // Added by Gavin Lin, 2010/04/16 kd_doCommand("SNMP SNAME", CMD_PRINT, ASH_DO_NOTHING, sysName); *var_len = strlen(sysName); *write_method = writeSystem; return (u_char *) sysName; case SYSLOCATION: // Added by Gavin Lin, 2010/04/16 kd_doCommand("SNMP SLOCATION", CMD_PRINT, ASH_DO_NOTHING, sysLocation); *var_len = strlen(sysLocation); *write_method = writeSystem; return (u_char *) sysLocation; case SYSSERVICES: #if NETSNMP_NO_DUMMY_VALUES if (!sysServicesConfiged) return NULL; #endif long_return = sysServices; return (u_char *) & long_return; #ifdef USING_MIBII_SYSORTABLE_MODULE case SYSORLASTCHANGE: ulret = netsnmp_timeval_uptime(&sysOR_lastchange); return ((u_char *) & ulret); #endif default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_system\n", vp->magic)); } return NULL; }
void log_notification(struct hostent *host, netsnmp_pdu *pdu, netsnmp_transport *transport) { long tmpl; struct timeval now; netsnmp_table_row *row; static oid snmptrapoid[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; size_t snmptrapoid_len = OID_LENGTH(snmptrapoid); netsnmp_variable_list *vptr; u_char *logdate; size_t logdate_size; time_t timetnow; u_long vbcount = 0; u_long tmpul; int col; if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_APP_DONT_LOG)) { return; } DEBUGMSGTL(("log_notification", "logging something\n")); row = netsnmp_create_table_data_row(); default_num++; /* * indexes to the table */ netsnmp_table_row_add_index(row, ASN_OCTET_STR, "default", strlen("default")); netsnmp_table_row_add_index(row, ASN_UNSIGNED, &default_num, sizeof(default_num)); /* * add the data */ gettimeofday(&now, NULL); tmpl = netsnmp_timeval_uptime(&now); netsnmp_set_row_column(row, COLUMN_NLMLOGTIME, ASN_TIMETICKS, (u_char *) & tmpl, sizeof(tmpl)); time(&timetnow); logdate = date_n_time(&timetnow, &logdate_size); netsnmp_set_row_column(row, COLUMN_NLMLOGDATEANDTIME, ASN_OCTET_STR, logdate, logdate_size); netsnmp_set_row_column(row, COLUMN_NLMLOGENGINEID, ASN_OCTET_STR, pdu->securityEngineID, pdu->securityEngineIDLen); if (transport && transport->domain == netsnmpUDPDomain) { /* * lame way to check for the udp domain */ /* * no, it is the correct way to do it -- jbpn */ struct sockaddr_in *addr = (struct sockaddr_in *) pdu->transport_data; if (addr) { char buf[sizeof(in_addr_t) + sizeof(addr->sin_port)]; in_addr_t locaddr = htonl(addr->sin_addr.s_addr); u_short portnum = htons(addr->sin_port); memcpy(buf, &locaddr, sizeof(in_addr_t)); memcpy(buf + sizeof(in_addr_t), &portnum, sizeof(addr->sin_port)); netsnmp_set_row_column(row, COLUMN_NLMLOGENGINETADDRESS, ASN_OCTET_STR, buf, sizeof(in_addr_t) + sizeof(addr->sin_port)); } } netsnmp_set_row_column(row, COLUMN_NLMLOGENGINETDOMAIN, ASN_OBJECT_ID, (const u_char *) transport->domain, sizeof(oid) * transport->domain_length); netsnmp_set_row_column(row, COLUMN_NLMLOGCONTEXTENGINEID, ASN_OCTET_STR, pdu->contextEngineID, pdu->contextEngineIDLen); netsnmp_set_row_column(row, COLUMN_NLMLOGCONTEXTNAME, ASN_OCTET_STR, pdu->contextName, pdu->contextNameLen); for (vptr = pdu->variables; vptr; vptr = vptr->next_variable) { if (snmp_oid_compare(snmptrapoid, snmptrapoid_len, vptr->name, vptr->name_length) == 0) { netsnmp_set_row_column(row, COLUMN_NLMLOGNOTIFICATIONID, ASN_OBJECT_ID, vptr->val.string, vptr->val_len); } else { netsnmp_table_row *myrow; myrow = netsnmp_create_table_data_row(); /* * indexes to the table */ netsnmp_table_row_add_index(myrow, ASN_OCTET_STR, "default", strlen("default")); netsnmp_table_row_add_index(myrow, ASN_UNSIGNED, &default_num, sizeof(default_num)); vbcount++; netsnmp_table_row_add_index(myrow, ASN_UNSIGNED, &vbcount, sizeof(vbcount)); /* * OID */ netsnmp_set_row_column(myrow, COLUMN_NLMLOGVARIABLEID, ASN_OBJECT_ID, (u_char *) vptr->name, vptr->name_length * sizeof(oid)); /* * value */ switch (vptr->type) { case ASN_OBJECT_ID: tmpul = 7; col = COLUMN_NLMLOGVARIABLEOIDVAL; break; case ASN_INTEGER: tmpul = 4; col = COLUMN_NLMLOGVARIABLEINTEGER32VAL; break; case ASN_UNSIGNED: tmpul = 2; col = COLUMN_NLMLOGVARIABLEUNSIGNED32VAL; break; case ASN_COUNTER: tmpul = 1; col = COLUMN_NLMLOGVARIABLECOUNTER32VAL; break; case ASN_TIMETICKS: tmpul = 3; col = COLUMN_NLMLOGVARIABLETIMETICKSVAL; break; case ASN_OCTET_STR: tmpul = 6; col = COLUMN_NLMLOGVARIABLEOCTETSTRINGVAL; break; default: /* * unsupported */ DEBUGMSGTL(("log_notification", "skipping type %d\n", vptr->type)); continue; } netsnmp_set_row_column(myrow, COLUMN_NLMLOGVARIABLEVALUETYPE, ASN_INTEGER, (u_char *) & tmpul, sizeof(tmpul)); netsnmp_set_row_column(myrow, col, vptr->type, vptr->val.string, vptr->val_len); DEBUGMSGTL(("log_notification", "adding a row to the variables table\n")); netsnmp_table_dataset_add_row(nlmLogVarTable, myrow); } } /* * store the row */ netsnmp_table_dataset_add_row(nlmLogTable, row); check_log_size(0, NULL); DEBUGMSGTL(("log_notification", "done logging something\n")); }
void check_log_size(unsigned int clientreg, void *clientarg) { netsnmp_table_row *row, *deleterow, *tmprow, *deletevarrow; netsnmp_table_data_set_storage *data; u_long count = 0; struct timeval now; long tmpl; gettimeofday(&now, NULL); tmpl = netsnmp_timeval_uptime(&now); for (row = nlmLogTable->table->first_row; row; row = row->next) { /* * check max allowed count */ count++; if (max_logged && count == max_logged) break; /* * check max age */ data = (netsnmp_table_data_set_storage *) row->data; data = netsnmp_table_data_set_find_column(data, COLUMN_NLMLOGTIME); if (max_age && tmpl > (*(data->data.integer) + max_age * 100 * 60)) break; } if (!row) return; /* * we've reached the limit, so keep looping but start deleting * from the beginning */ for (deleterow = nlmLogTable->table->first_row, row = row->next; row; row = row->next) { DEBUGMSGTL(("notification_log", "deleting a log entry\n")); /* * delete contained varbinds */ for (deletevarrow = nlmLogVarTable->table->first_row; deletevarrow; deletevarrow = tmprow) { tmprow = deletevarrow->next; if (deleterow->index_oid_len == deletevarrow->index_oid_len - 1 && snmp_oid_compare(deleterow->index_oid, deleterow->index_oid_len, deletevarrow->index_oid, deleterow->index_oid_len) == 0) { netsnmp_table_dataset_remove_and_delete_row(nlmLogVarTable, deletevarrow); } } /* * delete the master row */ tmprow = deleterow->next; netsnmp_table_dataset_remove_and_delete_row(nlmLogTable, deleterow); deleterow = tmprow; num_deleted++; /* * XXX: delete vars from it's table */ } }