📄 agent_trap.c
字号:
/* find end of provided varbind list,
ready to append the enterprise info if necessary */
last_var = vars;
while ( last_var && last_var->next_variable )
last_var = last_var->next_variable;
memset (&enterprise_var, 0, sizeof (struct variable_list));
snmp_set_var_objid( &enterprise_var,
snmptrapenterprise_oid, OID_LENGTH(snmptrapenterprise_oid));
snmp_set_var_value( &enterprise_var, (u_char *)enterprise, enterprise_length*sizeof(oid));
enterprise_var.type = ASN_OBJECT_ID;
enterprise_var.next_variable = NULL;
v2_vars = &uptime_var;
/*
* Create a template PDU, ready for sending
*/
template_pdu = snmp_pdu_create( SNMP_MSG_TRAP );
if ( template_pdu == NULL ) {
/* Free memory if value stored dynamically */
snmp_set_var_value( &enterprise_var, NULL, 0);
return;
}
template_pdu->trap_type = trap;
template_pdu->specific_type = specific;
if ( snmp_clone_mem((void **)&template_pdu->enterprise,
enterprise, enterprise_length*sizeof(oid))) {
snmp_free_pdu( template_pdu );
snmp_set_var_value( &enterprise_var, NULL, 0);
return;
}
template_pdu->enterprise_length = enterprise_length;
template_pdu->flags |= UCD_MSG_FLAG_FORCE_PDU_COPY;
pduIp = (struct sockaddr_in *)&template_pdu->agent_addr;
pduIp->sin_family = AF_INET;
pduIp->sin_len = sizeof(*pduIp);
pduIp->sin_addr.s_addr = get_myaddr();
template_pdu->time = uptime;
/*
* Now use the parameters to determine
* which v2 variables are needed,
* and what values they should take.
*/
switch ( trap ) {
case -1: /*
* SNMPv2 only
* Check to see whether the variables provided
* are sufficient for SNMPv2 notifications
*/
if (vars && snmp_oid_compare(vars->name, vars->name_length,
sysuptime_oid, OID_LENGTH(sysuptime_oid)) == 0 )
v2_vars = vars;
else
if (vars && snmp_oid_compare(vars->name, vars->name_length,
snmptrap_oid, OID_LENGTH(snmptrap_oid)) == 0 )
uptime_var.next_variable = vars;
else {
/* Hmmm... we don't seem to have a value - oops! */
snmptrap_var.next_variable = vars;
}
last_var = NULL; /* Don't need enterprise info */
break;
/* "Standard" SNMPv1 traps */
case SNMP_TRAP_COLDSTART:
snmp_set_var_value( &snmptrap_var,
(u_char *)cold_start_oid,
sizeof(cold_start_oid));
break;
case SNMP_TRAP_WARMSTART:
snmp_set_var_value( &snmptrap_var,
(u_char *)warm_start_oid,
sizeof(warm_start_oid));
break;
case SNMP_TRAP_LINKDOWN:
snmp_set_var_value( &snmptrap_var,
(u_char *)link_down_oid,
sizeof(link_down_oid));
break;
case SNMP_TRAP_LINKUP:
snmp_set_var_value( &snmptrap_var,
(u_char *)link_up_oid,
sizeof(link_up_oid));
break;
case SNMP_TRAP_AUTHFAIL:
if (snmp_enableauthentraps == SNMP_AUTHENTICATED_TRAPS_DISABLED) {
snmp_free_pdu( template_pdu );
snmp_set_var_value( &enterprise_var, NULL, 0);
return;
}
snmp_set_var_value( &snmptrap_var,
(u_char *)auth_fail_oid,
sizeof(auth_fail_oid));
break;
case SNMP_TRAP_EGPNEIGHBORLOSS:
snmp_set_var_value( &snmptrap_var,
(u_char *)egp_xxx_oid,
sizeof(egp_xxx_oid));
break;
case SNMP_TRAP_ENTERPRISESPECIFIC:
memcpy( &temp_oid,
(char *)enterprise,
(enterprise_length)*sizeof(oid));
temp_oid[ enterprise_length ] = 0;
temp_oid[ enterprise_length+1 ] = specific;
snmp_set_var_value( &snmptrap_var,
(u_char *)&temp_oid,
(enterprise_length+2)*sizeof(oid));
snmptrap_var.next_variable = vars;
last_var = NULL; /* Don't need version info */
break;
}
/*
* Now loop through the list of trap sinks,
* sending an appropriately formatted PDU to each
*/
for ( sink = sinks ; sink ; sink=sink->next ) {
if ( sink->version == SNMP_VERSION_1 && trap == -1 )
continue; /* Skip v1 sinks for v2 only traps */
template_pdu->version = sink->version;
template_pdu->command = sink->pdutype;
if ( sink->version != SNMP_VERSION_1 ) {
template_pdu->variables = v2_vars;
if ( last_var )
last_var->next_variable = &enterprise_var;
}
else
template_pdu->variables = vars;
pdu = snmp_clone_pdu( template_pdu );
pdu->sessid = sink->sesp->sessid; /* AgentX only ? */
if ( snmp_send( sink->sesp, pdu) == 0 ) {
snmp_sess_perror ("snmpd: send_trap", sink->sesp);
snmp_free_pdu( pdu );
}
else {
snmp_increment_statistic(STAT_SNMPOUTTRAPS);
snmp_increment_statistic(STAT_SNMPOUTPKTS);
}
if ( sink->version != SNMP_VERSION_1 && last_var )
last_var->next_variable = NULL;
}
/* Free memory if values stored dynamically */
snmp_set_var_value( &enterprise_var, NULL, 0);
snmp_set_var_value( &snmptrap_var, NULL, 0);
/* Ensure we don't free anything we shouldn't */
if ( last_var )
last_var->next_variable = NULL;
template_pdu->variables = NULL;
snmp_free_pdu( template_pdu );
}
void send_trap_vars (int trap,
int specific,
struct variable_list *vars)
{
if ( trap == SNMP_TRAP_ENTERPRISESPECIFIC )
send_enterprise_trap_vars( trap, specific, objid_enterprisetrap,
OID_LENGTH(objid_enterprisetrap), vars );
else
send_enterprise_trap_vars( trap, specific, version_id,
OID_LENGTH(version_id), vars );
}
void send_easy_trap (int trap,
int specific)
{
send_trap_vars( trap, specific, NULL );
}
void send_v2trap ( struct variable_list *vars)
{
send_trap_vars( -1, -1, vars );
}
void
send_trap_pdu(struct snmp_pdu *pdu)
{
send_trap_vars( -1, -1, pdu->variables );
}
/*******************
*
* Config file handling
*
*******************/
void snmpd_parse_config_authtrap(const char *token,
char *cptr)
{
int i;
i = atoi(cptr);
if ( i == 0 ) {
if ( !strcmp( cptr, "enable" ))
i = SNMP_AUTHENTICATED_TRAPS_ENABLED;
else if ( !strcmp( cptr, "disable" ))
i = SNMP_AUTHENTICATED_TRAPS_DISABLED;
}
if (i < 1 || i > 2)
config_perror("authtrapenable must be 1 or 2");
else
snmp_enableauthentraps = i;
}
void snmpd_parse_config_trapsink(const char *token,
char *cptr)
{
char tmpbuf[1024];
char *sp, *cp, *pp = NULL;
u_short sinkport;
if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public");
sp = strtok(cptr, " \t\n");
cp = strtok(NULL, " \t\n");
if (cp) pp = strtok(NULL, " \t\n");
if (cp && pp) {
sinkport = atoi(pp);
if ((sinkport < 1) || (sinkport > 0xffff)) {
config_perror("trapsink port out of range");
sinkport = SNMP_TRAP_PORT;
}
} else {
sinkport = SNMP_TRAP_PORT;
}
if (create_v1_trap_session(sp, sinkport,
cp ? cp : snmp_trapcommunity) == 0) {
sprintf(tmpbuf,"cannot create trapsink: %s", cptr);
config_perror(tmpbuf);
}
}
void
snmpd_parse_config_trap2sink(const char *word, char *cptr)
{
char tmpbuf[1024];
char *sp, *cp, *pp = NULL;
u_short sinkport;
if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public");
sp = strtok(cptr, " \t\n");
cp = strtok(NULL, " \t\n");
if (cp) pp = strtok(NULL, " \t\n");
if (cp && pp) {
sinkport = atoi(pp);
if ((sinkport < 1) || (sinkport > 0xffff)) {
config_perror("trapsink port out of range");
sinkport = SNMP_TRAP_PORT;
}
} else {
sinkport = SNMP_TRAP_PORT;
}
if (create_v2_trap_session(sp, sinkport,
cp ? cp : snmp_trapcommunity) == 0) {
sprintf(tmpbuf,"cannot create trap2sink: %s", cptr);
config_perror(tmpbuf);
}
}
void
snmpd_parse_config_informsink(const char *word, char *cptr)
{
char tmpbuf[1024];
char *sp, *cp, *pp = NULL;
u_short sinkport;
if (!snmp_trapcommunity) snmp_trapcommunity = strdup("public");
sp = strtok(cptr, " \t\n");
cp = strtok(NULL, " \t\n");
if (cp) pp = strtok(NULL, " \t\n");
if (cp && pp) {
sinkport = atoi(pp);
if ((sinkport < 1) || (sinkport > 0xffff)) {
config_perror("trapsink port out of range");
sinkport = SNMP_TRAP_PORT;
}
} else {
sinkport = SNMP_TRAP_PORT;
}
if (create_v2_inform_session(sp, sinkport,
cp ? cp : snmp_trapcommunity) == 0) {
sprintf(tmpbuf,"cannot create informsink: %s", cptr);
config_perror(tmpbuf);
}
}
void
snmpd_parse_config_trapcommunity(const char *word, char *cptr)
{
if (snmp_trapcommunity) free(snmp_trapcommunity);
snmp_trapcommunity = malloc (strlen(cptr)+1);
copy_word(cptr, snmp_trapcommunity);
}
void snmpd_free_trapcommunity (void)
{
if (snmp_trapcommunity) {
free(snmp_trapcommunity);
snmp_trapcommunity = NULL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -