static void transport_running(void) { snmp_event_init(); snmp_event_add(agentx_entry.sock, SNMP_EV_READ, agentx_read_handler, NULL); snmp_event_add(agentx_entry.sigfd, SNMP_EV_READ, agentx_signal_handler, NULL); snmp_event_run(); }
static int transport_step(long timeout) { static int inited = 0; if (inited == 0) { snmp_event_init(); snmp_event_add(agentx_entry.sock, SNMP_EV_READ, agentx_read_handler, NULL); snmp_event_add(agentx_entry.sigfd, SNMP_EV_READ, agentx_signal_handler, NULL); inited = 1; } return snmp_event_step(timeout); }
void snmp_hosttrap(struct relayd *env, struct table *table, struct host *host) { struct agentx_pdu *pdu; if (snmp_agentx == NULL || env->sc_snmp == -1) return; /* * OPENBSD-RELAYD-MIB host status trap * XXX The trap format needs some tweaks and other OIDs */ if ((pdu = snmp_agentx_notify_pdu(&hosttrapoid)) == NULL) return; SNMP_ELEMENT(".1.0", SNMP_NULL, NULL, 0, pdu); SNMP_ELEMENT(".1.1.0", SNMP_OCTETSTRING, host->conf.name, 0, pdu); SNMP_ELEMENT(".1.2.0", SNMP_INTEGER32, NULL, host->up, pdu); SNMP_ELEMENT(".1.3.0", SNMP_INTEGER32, NULL, host->last_up, pdu); SNMP_ELEMENT(".1.4.0", SNMP_INTEGER32, NULL, host->up_cnt, pdu); SNMP_ELEMENT(".1.5.0", SNMP_INTEGER32, NULL, host->check_cnt, pdu); SNMP_ELEMENT(".1.6.0", SNMP_OCTETSTRING, table->conf.name, 0, pdu); SNMP_ELEMENT(".1.7.0", SNMP_INTEGER32, NULL, table->up, pdu); if (!host->conf.retry) goto done; SNMP_ELEMENT(".1.8.0", SNMP_INTEGER32, NULL, host->conf.retry, pdu); SNMP_ELEMENT(".1.9.0", SNMP_INTEGER32, NULL, host->retry_cnt, pdu); done: snmp_agentx_send(snmp_agentx, pdu); snmp_event_add(env, EV_WRITE); }
int snmp_getsock(struct relayd *env, struct imsg *imsg) { struct timeval tv = SNMP_RECONNECT_TIMEOUT; struct agentx_pdu *pdu; if (imsg->fd == -1) goto retry; env->sc_snmp = imsg->fd; log_debug("%s: got new snmp socket %d", __func__, imsg->fd); if ((snmp_agentx = snmp_agentx_alloc(env->sc_snmp)) == NULL) fatal("snmp_getsock: agentx alloc"); if ((pdu = snmp_agentx_open_pdu(snmp_agentx, "relayd", NULL)) == NULL) fatal("snmp_getsock: agentx pdu"); (void)snmp_agentx_send(snmp_agentx, pdu); snmp_agentx_set_callback(snmp_agentx, snmp_agentx_process, env); snmp_event_add(env, EV_WRITE); return (0); retry: evtimer_set(&env->sc_snmpto, snmp_sock, env); evtimer_add(&env->sc_snmpto, &tv); return (0); }
/* Send angentX PDU to the remote */ static void transport_send(uint8_t *buf, int len) { agentx_entry.buf = buf; agentx_entry.len = len; snmp_event_add(agentx_entry.sock, SNMP_EV_WRITE, agentx_write_handler, &agentx_entry); }
void snmp_sock(int fd, short event, void *arg) { struct relayd *env = arg; int evflags = 0; if (event & EV_TIMEOUT) { goto reopen; } if (event & EV_WRITE) { if (snmp_agentx_send(snmp_agentx, NULL) == -1) { if (errno != EAGAIN) goto close; /* short write */ evflags |= EV_WRITE; } } if (event & EV_READ) { if (snmp_agentx_recv(snmp_agentx) == NULL) { if (snmp_agentx->error) { log_warnx("agentx protocol error '%i'", snmp_agentx->error); goto close; } if (errno != EAGAIN) { log_warn("agentx socket error"); goto close; } /* short read */ } /* PDU handled in the registered callback */ } snmp_event_add(env, evflags); return; close: log_debug("%s: snmp socket closed %d", __func__, env->sc_snmp); snmp_agentx_free(snmp_agentx); env->sc_snmp = -1; snmp_agentx = NULL; reopen: proc_compose_imsg(env->sc_ps, snmp_procid, -1, IMSG_SNMPSOCK, -1, NULL, 0); return; }