📄 master_admin.c
字号:
default: return AGENTX_ERR_REQUEST_DENIED; }}intallocate_idx_list(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; netsnmp_variable_list *vp, *vp2, *next, *res; int flags = 0; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; if (pdu->flags & AGENTX_MSG_FLAG_ANY_INSTANCE) flags |= ALLOCATE_ANY_INDEX; if (pdu->flags & AGENTX_MSG_FLAG_NEW_INSTANCE) flags |= ALLOCATE_NEW_INDEX; /* * XXX - what about errors? * * If any allocations fail, then we need to * *fully* release the earlier ones. * (i.e. remove them completely from the index registry, * not simply mark them as available for re-use) * * For now - assume they all succeed. */ for (vp = pdu->variables; vp != NULL; vp = next) { next = vp->next_variable; res = register_index(vp, flags, session); if (res == NULL) { /* * If any allocations fail, we need to *fully* release * all previous ones (i.e. remove them completely * from the index registry) */ for (vp2 = pdu->variables; vp2 != vp; vp2 = vp2->next_variable) { remove_index(vp2, session); } return AGENTX_ERR_INDEX_NONE_AVAILABLE; /* XXX */ } else { (void) snmp_clone_var(res, vp); free(res); } vp->next_variable = next; } return AGENTX_ERR_NOERROR;}intrelease_idx_list(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; netsnmp_variable_list *vp, *vp2, *rv = NULL; int res; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; for (vp = pdu->variables; vp != NULL; vp = vp->next_variable) { res = unregister_index(vp, TRUE, session); /* * If any releases fail, * we need to reinstate all previous ones. */ if (res != SNMP_ERR_NOERROR) { for (vp2 = pdu->variables; vp2 != vp; vp2 = vp2->next_variable) { rv = register_index(vp2, ALLOCATE_THIS_INDEX, session); free(rv); } return AGENTX_ERR_INDEX_NOT_ALLOCATED; /* Probably */ } } return AGENTX_ERR_NOERROR;}intadd_agent_caps_list(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; register_sysORTable_sess(pdu->variables->name, pdu->variables->name_length, (char *) pdu->variables->val.string, sp); return AGENTX_ERR_NOERROR;}intremove_agent_caps_list(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; if (unregister_sysORTable_sess(pdu->variables->name, pdu->variables->name_length, sp) < 0) return AGENTX_ERR_UNKNOWN_AGENTCAPS; else return AGENTX_ERR_NOERROR;}intagentx_notify(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; netsnmp_variable_list *var; int got_sysuptime = 0; extern oid sysuptime_oid[], snmptrap_oid[]; extern size_t sysuptime_oid_len, snmptrap_oid_len; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; var = pdu->variables; if (!var) return AGENTX_ERR_PROCESSING_ERROR; if (snmp_oid_compare(var->name, var->name_length, sysuptime_oid, sysuptime_oid_len) == 0) { got_sysuptime = 1; var = var->next_variable; } if (!var || snmp_oid_compare(var->name, var->name_length, snmptrap_oid, snmptrap_oid_len) != 0) return AGENTX_ERR_PROCESSING_ERROR; /* * If sysUptime isn't the first varbind, don't worry. * send_trap_vars() will add it if necessary. * * Note that if this behaviour is altered, it will * be necessary to add sysUptime here, * as this is valid AgentX syntax. */ send_trap_vars(-1, -1, pdu->variables); return AGENTX_ERR_NOERROR;}intagentx_ping_response(netsnmp_session * session, netsnmp_pdu *pdu){ netsnmp_session *sp; sp = find_agentx_session(session, pdu->sessid); if (sp == NULL) return AGENTX_ERR_NOT_OPEN; else return AGENTX_ERR_NOERROR;}inthandle_master_agentx_packet(int operation, netsnmp_session * session, int reqid, netsnmp_pdu *pdu, void *magic){ netsnmp_agent_session *asp; struct timeval now; if (operation == NETSNMP_CALLBACK_OP_DISCONNECT) { DEBUGMSGTL(("agentx/master", "transport disconnect on session %08p\n", session)); /* * Shut this session down gracefully. */ close_agentx_session(session, -1); return 1; } else if (operation != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) { DEBUGMSGTL(("agentx/master", "unexpected callback op %d\n", operation)); return 1; } /* * Okay, it's a NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE op. */ if (magic) { asp = (netsnmp_agent_session *) magic; } else { asp = init_agent_snmp_session(session, pdu); } DEBUGMSGTL(("agentx/master", "handle pdu (req=0x%x,trans=0x%x,sess=0x%x)\n", pdu->reqid,pdu->transid, pdu->sessid)); switch (pdu->command) { case AGENTX_MSG_OPEN: asp->pdu->sessid = open_agentx_session(session, pdu); if (asp->pdu->sessid == -1) asp->status = session->s_snmp_errno; break; case AGENTX_MSG_CLOSE: asp->status = close_agentx_session(session, pdu->sessid); break; case AGENTX_MSG_REGISTER: asp->status = register_agentx_list(session, pdu); break; case AGENTX_MSG_UNREGISTER: asp->status = unregister_agentx_list(session, pdu); break; case AGENTX_MSG_INDEX_ALLOCATE: asp->status = allocate_idx_list(session, asp->pdu); if (asp->status != AGENTX_ERR_NOERROR) { snmp_free_pdu(asp->pdu); asp->pdu = snmp_clone_pdu(pdu); } break; case AGENTX_MSG_INDEX_DEALLOCATE: asp->status = release_idx_list(session, pdu); break; case AGENTX_MSG_ADD_AGENT_CAPS: asp->status = add_agent_caps_list(session, pdu); break; case AGENTX_MSG_REMOVE_AGENT_CAPS: asp->status = remove_agent_caps_list(session, pdu); break; case AGENTX_MSG_NOTIFY: asp->status = agentx_notify(session, pdu); break; case AGENTX_MSG_PING: asp->status = agentx_ping_response(session, pdu); break; /* * TODO: Other admin packets */ case AGENTX_MSG_GET: case AGENTX_MSG_GETNEXT: case AGENTX_MSG_GETBULK: case AGENTX_MSG_TESTSET: case AGENTX_MSG_COMMITSET: case AGENTX_MSG_UNDOSET: case AGENTX_MSG_CLEANUPSET: case AGENTX_MSG_RESPONSE: /* * Shouldn't be handled here */ break; default: asp->status = AGENTX_ERR_PARSE_FAILED; break; } gettimeofday(&now, NULL); asp->pdu->time = calculate_time_diff(&now, &starttime); asp->pdu->command = AGENTX_MSG_RESPONSE; asp->pdu->errstat = asp->status; DEBUGMSGTL(("agentx/master", "send response, stat %d (req=0x%x,trans=" "0x%x,sess=0x%x)\n", asp->status, pdu->reqid,pdu->transid, pdu->sessid)); if (!snmp_send(asp->session, asp->pdu)) { char *eb = NULL; int pe, pse; snmp_error(asp->session, &pe, &pse, &eb); snmp_free_pdu(asp->pdu); DEBUGMSGTL(("agentx/master", "FAILED %d %d %s\n", pe, pse, eb)); free(eb); } asp->pdu = NULL; free_agent_snmp_session(asp); return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -