本文整理汇总了C++中snmp_pdu_create函数的典型用法代码示例。如果您正苦于以下问题:C++ snmp_pdu_create函数的具体用法?C++ snmp_pdu_create怎么用?C++ snmp_pdu_create使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了snmp_pdu_create函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: my_snmp_get
/**
* Get snmp value to the structure my_oid_result array.
* Author : lining 15810423651 [email protected]
* @param peername : the remote host ip address.
* @param oid_argvs : the oids pointer array.
* @param my_oid_result oid_result : the return values.
* @return 0 on success, or others on failure.
* @return 1 on failure, the argument value error.
* @return 2 on failure, snmp_open return error.
* @return 3 on failure, snmp_parse_oid return error.
* @return 4 on failure, snmp_synch_response return status time out.
* @return 5 on failure, snmp_synch_response return status others.
*/
int my_snmp_get(const char *peername,
const char *community,
const char *oid_argv,
my_oid_result *oid_result) {
netsnmp_session session;
netsnmp_session *sess_handle;
netsnmp_pdu *pdu;
netsnmp_pdu *response;
netsnmp_variable_list *vars;
oid oids[MAX_OID_LEN];
size_t oids_length;
int status;
int failures = 0;
oids_length = 0;
if (peername == NULL) {
printf("[ERROR] my_snmp_get: the peername pointer is null\n");
return 1;
}
if (community == NULL) {
printf("[ERROR] my_snmp_get: the community pointer is null\n");
return 1;
}
if (oid_argv == NULL) {
printf("[ERROR] my_snmp_get: the oid_argv pointer is null\n");
return 1;
}
init_snmp("snmpget");
snmp_sess_init(&session);
session.version = SNMP_VERSION_2c;
session.community = (char*)community;
session.community_len = strlen(session.community);
session.peername = (char*)peername;
session.timeout = 3000000;
session.retries = 1;
SOCK_STARTUP;
sess_handle = snmp_open(&session);
if (sess_handle == NULL) {
SOCK_CLEANUP;
printf("[ERROR] my_snmp_get: call snmp_open function failed, return sess_handle is null\n");
return 2;
}
pdu = snmp_pdu_create(SNMP_MSG_GET);
oids_length = MAX_OID_LEN;
if (!snmp_parse_oid(oid_argv, oids, &oids_length)) {
snmp_perror(oid_argv);
failures++;
} else {
snmp_add_null_var(pdu, oids, oids_length);
}
if (failures) {
SOCK_CLEANUP;
printf("[ERROR] my_snmp_get: call snmp_parse_oid function failed\n");
return 3;
}
status = snmp_synch_response(sess_handle, pdu, &response);
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
for (vars = response->variables; vars; vars = vars->next_variable) {
get_oid_value(vars, &oid_result);
}
} else if (status == STAT_TIMEOUT) {
printf("[ERROR] my_snmp_get: call snmp_synch_response function failed, return status time out\n");
return 4;
} else {
printf("[ERROR] my_snmp_get: call snmp_synch_response function failed, return status others\n");
return 5;
}
if (response) {
snmp_free_pdu(response);
}
snmp_close(sess_handle);
SOCK_CLEANUP;
//.........这里部分代码省略.........
示例2: printf
void *poller(void *thread_args)
{
worker_t *worker = (worker_t *) thread_args;
crew_t *crew = worker->crew;
target_t *entry = NULL;
void *sessp = NULL;
struct snmp_session session;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *response = NULL;
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
struct variable_list *vars = NULL;
unsigned long long result = 0;
unsigned long long last_value = 0;
unsigned long long insert_val = 0;
int status = 0, bits = 0, init = 0;
char query[BUFSIZE];
char storedoid[BUFSIZE];
char result_string[BUFSIZE];
if (set.verbose >= HIGH)
printf("Thread [%d] starting.\n", worker->index);
if (MYSQL_VERSION_ID > 40000)
mysql_thread_init();
else
my_thread_init();
while (1) {
if (set.verbose >= DEVELOP)
printf("Thread [%d] locking (wait on work)\n", worker->index);
PT_MUTEX_LOCK(&crew->mutex);
while (current == NULL) {
PT_COND_WAIT(&crew->go, &crew->mutex);
}
if (set.verbose >= DEVELOP)
printf("Thread [%d] done waiting, received go (work cnt: %d)\n", worker->index, crew->work_count);
if (current != NULL) {
if (set.verbose >= HIGH)
printf("Thread [%d] processing %s %s (%d work units remain in queue)\n", worker->index, current->host, current->objoid, crew->work_count);
snmp_sess_init(&session);
if (set.snmp_ver == 2)
session.version = SNMP_VERSION_2c;
else
session.version = SNMP_VERSION_1;
session.peername = current->host;
session.remote_port = set.snmp_port;
session.community = current->community;
session.community_len = strlen(session.community);
sessp = snmp_sess_open(&session);
anOID_len = MAX_OID_LEN;
pdu = snmp_pdu_create(SNMP_MSG_GET);
read_objid(current->objoid, anOID, &anOID_len);
entry = current;
last_value = current->last_value;
init = current->init;
insert_val = 0;
bits = current->bits;
strncpy(storedoid, current->objoid, sizeof(storedoid));
current = getNext();
}
if (set.verbose >= DEVELOP)
printf("Thread [%d] unlocking (done grabbing current)\n", worker->index);
PT_MUTEX_UNLOCK(&crew->mutex);
snmp_add_null_var(pdu, anOID, anOID_len);
if (sessp != NULL)
status = snmp_sess_synch_response(sessp, pdu, &response);
else
status = STAT_DESCRIP_ERROR;
/* Collect response and process stats */
PT_MUTEX_LOCK(&stats.mutex);
if (status == STAT_DESCRIP_ERROR) {
stats.errors++;
printf("*** SNMP Error: (%s) Bad descriptor.\n", session.peername);
} else if (status == STAT_TIMEOUT) {
stats.no_resp++;
printf("*** SNMP No response: (%[email protected]%s).\n", session.peername,
storedoid);
} else if (status != STAT_SUCCESS) {
stats.errors++;
printf("*** SNMP Error: (%[email protected]%s) Unsuccessuful (%d).\n", session.peername,
storedoid, status);
} else if (status == STAT_SUCCESS && response->errstat != SNMP_ERR_NOERROR) {
stats.errors++;
printf("*** SNMP Error: (%[email protected]%s) %s\n", session.peername,
storedoid, snmp_errstring(response->errstat));
} else if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
stats.polls++;
}
PT_MUTEX_UNLOCK(&stats.mutex);
/* Liftoff, successful poll, process it */
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
vars = response->variables;
#ifdef OLD_UCD_SNMP
sprint_value(result_string, anOID, anOID_len, vars);
//.........这里部分代码省略.........
示例3: asynch_response
/*
* response handler
*/
int asynch_response(int operation, struct snmp_session *sp, int reqid, struct snmp_pdu *pdu, void *magic)
{
struct req_t *req = (struct req_t *)magic;
if (operation == NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
struct snmp_pdu *snmpreq = NULL;
int okoid = 1;
if (dataoperation == GET_KEYS) {
/*
* We're doing GETNEXT's when retrieving keys, so we will get a response
* which has nothing really to do with the data we're looking for. In that
* case, we should NOT process data from this response.
*/
struct variable_list *vp = pdu->variables;
okoid = ((vp->name_length >= req->currentkey->indexmethod->rootoidlen) &&
(memcmp(req->currentkey->indexmethod->rootoid, vp->name, req->currentkey->indexmethod->rootoidlen * sizeof(oid)) == 0));
}
switch (pdu->errstat) {
case SNMP_ERR_NOERROR:
/* Pick up the results, but only if the OID is valid */
if (okoid) print_result(STAT_SUCCESS, req, pdu);
break;
case SNMP_ERR_NOSUCHNAME:
dbgprintf("Host %s item %s: No such name\n", req->hostname, req->curr_oid->devname);
if (req->hostip[req->hostipidx+1]) {
req->hostipidx++;
startonehost(req, 1);
}
break;
case SNMP_ERR_TOOBIG:
toobigcount++;
errprintf("Host %s item %s: Response too big\n", req->hostname, req->curr_oid->devname);
break;
default:
errorcount++;
errprintf("Host %s item %s: SNMP error %d\n", req->hostname, req->curr_oid->devname, pdu->errstat);
break;
}
/* Now see if we should send another request */
switch (dataoperation) {
case GET_KEYS:
/*
* While fetching keys, walk the current key-table until we reach the end of the table.
* When we reach the end of one key-table, start with the next.
* FIXME: Could optimize so we dont fetch the whole table, but only those rows we need.
*/
if (pdu->errstat == SNMP_ERR_NOERROR) {
struct variable_list *vp = pdu->variables;
if ( (vp->name_length >= req->currentkey->indexmethod->rootoidlen) &&
(memcmp(req->currentkey->indexmethod->rootoid, vp->name, req->currentkey->indexmethod->rootoidlen * sizeof(oid)) == 0) ) {
/* Still more data in the current key table, get the next row */
snmpreq = snmp_pdu_create(SNMP_MSG_GETNEXT);
pducount++;
/* Probably only one variable to fetch, but never mind ... */
while (vp) {
varcount++;
snmp_add_null_var(snmpreq, vp->name, vp->name_length);
vp = vp->next_variable;
}
}
else {
/* End of current key table. If more keys to be found, start the next table. */
do {
req->currentkey = req->currentkey->next;
} while (req->currentkey && req->currentkey->indexoid);
if (req->currentkey) {
snmpreq = snmp_pdu_create(SNMP_MSG_GETNEXT);
pducount++;
snmp_add_null_var(snmpreq,
req->currentkey->indexmethod->rootoid,
req->currentkey->indexmethod->rootoidlen);
}
}
}
break;
case GET_DATA:
/* Generate a request for the next dataset, if any */
if (req->next_oid) {
snmpreq = generate_datarequest(req);
}
else {
dbgprintf("No more oids left\n");
}
break;
}
/* Send the request we just made */
//.........这里部分代码省略.........
示例4: main
//.........这里部分代码省略.........
case 'U':
case 'F':
case 'D':
#endif /* OPAQUE_SPECIAL_TYPES */
types[current_type++] = *argv[arg++];
break;
default:
fprintf(stderr, "%s: Bad object type: %c\n", argv[arg - 1],
*argv[arg]);
exit(1);
}
} else {
fprintf(stderr, "%s: Needs type and value\n", argv[arg - 1]);
exit(1);
}
if (arg < argc)
values[current_value++] = argv[arg];
else {
fprintf(stderr, "%s: Needs value\n", argv[arg - 2]);
exit(1);
}
}
SOCK_STARTUP;
/*
* open an SNMP session
*/
ss = snmp_open(&session);
if (ss == NULL) {
/*
* diagnose snmp_open errors with the input netsnmp_session pointer
*/
snmp_sess_perror("snmpset", &session);
SOCK_CLEANUP;
exit(1);
}
/*
* create PDU for SET request and add object names and values to request
*/
pdu = snmp_pdu_create(SNMP_MSG_SET);
for (count = 0; count < current_name; count++) {
name_length = MAX_OID_LEN;
if (snmp_parse_oid(names[count], name, &name_length) == NULL) {
snmp_perror(names[count]);
failures++;
} else
if (snmp_add_var
(pdu, name, name_length, types[count], values[count])) {
snmp_perror(names[count]);
failures++;
}
}
if (failures) {
SOCK_CLEANUP;
exit(1);
}
/*
* do the request
*/
status = snmp_synch_response(ss, pdu, &response);
if (status == STAT_SUCCESS) {
if (response->errstat == SNMP_ERR_NOERROR) {
if (!quiet) {
for (vars = response->variables; vars;
vars = vars->next_variable)
print_variable(vars->name, vars->name_length, vars);
}
} else {
fprintf(stderr, "Error in packet.\nReason: %s\n",
snmp_errstring(response->errstat));
if (response->errindex != 0) {
fprintf(stderr, "Failed object: ");
for (count = 1, vars = response->variables;
vars && (count != response->errindex);
vars = vars->next_variable, count++);
if (vars)
fprint_objid(stderr, vars->name, vars->name_length);
fprintf(stderr, "\n");
}
exitval = 2;
}
} else if (status == STAT_TIMEOUT) {
fprintf(stderr, "Timeout: No Response from %s\n",
session.peername);
exitval = 1;
} else { /* status == STAT_ERROR */
snmp_sess_perror("snmpset", ss);
exitval = 1;
}
if (response)
snmp_free_pdu(response);
snmp_close(ss);
SOCK_CLEANUP;
return exitval;
}
示例5: main
int main(int argc, char ** argv)
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu;
netsnmp_pdu *response;
oid anOID[MAX_OID_LEN];
size_t anOID_len;
netsnmp_variable_list *vars;
int status;
int count=1;
/*
* Initialize the SNMP library
*/
init_snmp("snmpdemoapp");
/*
* Initialize a "session" that defines who we're going to talk to
*/
snmp_sess_init( &session ); /* set up defaults */
session.peername = strdup("test.net-snmp.org");
/* set up the authentication parameters for talking to the server */
#ifdef DEMO_USE_SNMP_VERSION_3
/* Use SNMPv3 to talk to the experimental server */
/* set the SNMP version number */
session.version=SNMP_VERSION_3;
/* set the SNMPv3 user name */
session.securityName = strdup("MD5User");
session.securityNameLen = strlen(session.securityName);
/* set the security level to authenticated, but not encrypted */
session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
/* set the authentication method to MD5 */
session.securityAuthProto = usmHMACMD5AuthProtocol;
session.securityAuthProtoLen = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid);
session.securityAuthKeyLen = USM_AUTH_KU_LEN;
/* set the authentication key to a MD5 hashed version of our
passphrase "The Net-SNMP Demo Password" (which must be at least 8
characters long) */
if (generate_Ku(session.securityAuthProto,
session.securityAuthProtoLen,
(u_char *) our_v3_passphrase, strlen(our_v3_passphrase),
session.securityAuthKey,
&session.securityAuthKeyLen) != SNMPERR_SUCCESS) {
snmp_perror(argv[0]);
snmp_log(LOG_ERR,
"Error generating Ku from authentication pass phrase. \n");
exit(1);
}
#else /* we'll use the insecure (but simplier) SNMPv1 */
/* set the SNMP version number */
session.version = SNMP_VERSION_1;
/* set the SNMPv1 community name used for authentication */
session.community = "demopublic";
session.community_len = strlen(session.community);
#endif /* SNMPv1 */
/*
* Open the session
*/
SOCK_STARTUP;
ss = snmp_open(&session); /* establish the session */
if (!ss) {
snmp_sess_perror("ack", &session);
SOCK_CLEANUP;
exit(1);
}
/*
* Create the PDU for the data for our request.
* 1) We're going to GET the system.sysDescr.0 node.
*/
pdu = snmp_pdu_create(SNMP_MSG_GET);
anOID_len = MAX_OID_LEN;
if (!snmp_parse_oid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len)) {
snmp_perror(".1.3.6.1.2.1.1.1.0");
SOCK_CLEANUP;
exit(1);
}
#if OTHER_METHODS
/*
* These are alternatives to the 'snmp_parse_oid' call above,
* e.g. specifying the OID by name rather than numerically.
*/
read_objid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len);
get_node("sysDescr.0", anOID, &anOID_len);
//.........这里部分代码省略.........
示例6: main
//.........这里部分代码省略.........
/*
* set boots and time, which will cause problems if this
* machine ever reboots and a remote trap receiver has cached our
* boots and time... I'll cause a not-in-time-window report to
* be sent back to this machine.
*/
if (session.engineBoots == 0)
session.engineBoots = 1;
if (session.engineTime == 0) /* not really correct, */
session.engineTime = get_uptime (); /* but it'll work. Sort of. */
}
ss = snmp_add (&session, netsnmp_transport_open_client ("snmptrap", session.peername), NULL, NULL);
if (ss == NULL)
{
/*
* diagnose netsnmp_transport_open_client and snmp_add errors with
* the input netsnmp_session pointer
*/
snmp_sess_perror ("snmptrap", &session);
SOCK_CLEANUP;
exit (1);
}
#ifndef NETSNMP_DISABLE_SNMPV1
if (session.version == SNMP_VERSION_1)
{
if (inform)
{
fprintf (stderr, "Cannot send INFORM as SNMPv1 PDU\n");
SOCK_CLEANUP;
exit (1);
}
pdu = snmp_pdu_create (SNMP_MSG_TRAP);
if (!pdu)
{
fprintf (stderr, "Failed to create trap PDU\n");
SOCK_CLEANUP;
exit (1);
}
pdu_in_addr_t = (in_addr_t *) pdu->agent_addr;
if (arg == argc)
{
fprintf (stderr, "No enterprise oid\n");
usage ();
SOCK_CLEANUP;
exit (1);
}
if (argv[arg][0] == 0)
{
pdu->enterprise = (oid *) malloc (sizeof (objid_enterprise));
memcpy (pdu->enterprise, objid_enterprise, sizeof (objid_enterprise));
pdu->enterprise_length = sizeof (objid_enterprise) / sizeof (oid);
}
else
{
name_length = MAX_OID_LEN;
if (!snmp_parse_oid (argv[arg], name, &name_length))
{
snmp_perror (argv[arg]);
usage ();
SOCK_CLEANUP;
exit (1);
}
pdu->enterprise = (oid *) malloc (name_length * sizeof (oid));
memcpy (pdu->enterprise, name, name_length * sizeof (oid));
示例7: main
int main(int argc, char **argv) {
if ( argc < 2) {
ip = fgets(cm,sizeof cm,stdin);
// remove \n
cm[strlen(cm)-1] = '\0';
//fprintf(stdout, "IP length: %li\n", strlen(cm) );
if(strlen(cm)< 2) {
printf("Missing CM IP\nUSAGE: %s <CM_IP>\n", argv[0]);
exit(1);
} else {
printf("Using %s IP\n",ip);
}
} else {
strncpy(cm,argv[1],sizeof cm);
}
init_snmp("snmpapp");
snmp_sess_init( &session );
session.peername = cm;
session.version=SNMP_VERSION_2c;
session.community=(unsigned char *) "public";
session.community_len = strlen((const char *) session.community);
ss = snmp_open(&session);
if (!ss) {
snmp_perror("ack");
snmp_log(LOG_ERR, "Unable to open snmp session!!\n");
exit(2);
}
pdu = snmp_pdu_create(SNMP_MSG_GET);
read_objid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
status = snmp_synch_response(ss, pdu, &response);
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
/*
* SUCCESS: Print the result variables
*/
//for(vars = response->variables; vars; vars = vars->next_variable)
// print_variable(vars->name,vars->name_length, vars);
/* manipulate the information ourselves */
for(vars = response->variables; vars; vars = vars->next_variable) {
int count=1;
if (vars->type == ASN_OCTET_STR) {
char *sp = malloc(1 + vars->val_len);
memcpy(sp, vars->val.string, vars->val_len);
sp[vars->val_len] = '\0';
//printf("%d: %s\n", count++, sp);
printf("%s\n", sp);
free(sp);
}
else
printf("value #%d is NOT a string! Ack!\n", count++);
}
} else {
/*
* FAILURE: print what went wrong!
*/
if (status == STAT_SUCCESS)
fprintf(stderr, "Error in packet\nReason: %s\n",
snmp_errstring(response->errstat));
else
snmp_sess_perror("snmpget", ss);
}
if (response)
snmp_free_pdu(response);
snmp_close(ss);
/* windows32 specific cleanup (is a noop on unix) */
SOCK_CLEANUP;
return EXIT_SUCCESS;
}
示例8: main
int
main(int argc, char *argv[])
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu;
netsnmp_pdu *response;
int arg;
oid base[MAX_OID_LEN];
size_t base_length;
int status;
netsnmp_variable_list *saved = NULL, *vlp = saved, *vlp2;
int count = 0;
/*
* get the common command line arguments
*/
switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
case NETSNMP_PARSE_ARGS_ERROR:
exit(1);
case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
exit(0);
case NETSNMP_PARSE_ARGS_ERROR_USAGE:
usage();
exit(1);
default:
break;
}
if (arg != argc) {
fprintf(stderr, "snmpdf: extra argument: %s\n", argv[arg]);
exit(1);
}
SOCK_STARTUP;
/*
* Open an SNMP session.
*/
ss = snmp_open(&session);
if (ss == NULL) {
/*
* diagnose snmp_open errors with the input netsnmp_session pointer
*/
snmp_sess_perror("snmpdf", &session);
SOCK_CLEANUP;
exit(1);
}
printf("%-18s %15s %15s %15s %5s\n", "Description", "size (kB)",
"Used", "Available", "Used%");
if (ucd_mib == 0) {
/*
* * Begin by finding all the storage pieces that are of
* * type hrStorageFixedDisk, which is a standard disk.
*/
pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
base_length =
add(pdu, "HOST-RESOURCES-MIB:hrStorageIndex", NULL, 0);
memcpy(base, pdu->variables->name, base_length * sizeof(oid));
vlp = collect(ss, pdu, base, base_length);
while (vlp) {
size_t units;
unsigned long hssize, hsused;
char descr[SPRINT_MAX_LEN];
int len;
pdu = snmp_pdu_create(SNMP_MSG_GET);
add(pdu, "HOST-RESOURCES-MIB:hrStorageDescr",
&(vlp->name[base_length]), vlp->name_length - base_length);
add(pdu, "HOST-RESOURCES-MIB:hrStorageAllocationUnits",
&(vlp->name[base_length]), vlp->name_length - base_length);
add(pdu, "HOST-RESOURCES-MIB:hrStorageSize",
&(vlp->name[base_length]), vlp->name_length - base_length);
add(pdu, "HOST-RESOURCES-MIB:hrStorageUsed",
&(vlp->name[base_length]), vlp->name_length - base_length);
status = snmp_synch_response(ss, pdu, &response);
if (status != STAT_SUCCESS || !response) {
snmp_sess_perror("snmpdf", ss);
exit(1);
}
vlp2 = response->variables;
len = vlp2->val_len;
if (len >= SPRINT_MAX_LEN) len = SPRINT_MAX_LEN-1;
memcpy(descr, vlp2->val.string, len);
descr[len] = '\0';
vlp2 = vlp2->next_variable;
units = vlp2->val.integer ? *(vlp2->val.integer) : 0;
vlp2 = vlp2->next_variable;
hssize = vlp2->val.integer ? *(vlp2->val.integer) : 0;
vlp2 = vlp2->next_variable;
hsused = vlp2->val.integer ? *(vlp2->val.integer) : 0;
//.........这里部分代码省略.........
示例9: throw
QtNetSNMP::SNMPPDU *QtNetSNMP::QSNMPCore::createPDU(SNMPPDUType type, QVector<QSNMPObject *>& objs, unsigned short nrepeaters, unsigned short mrepetitions) throw(QSNMPException)
{
SNMPPDU *pdu;
if(type != SNMPPDUGet && type != SNMPPDUGetNext && type != SNMPPDUGetBulk && type != SNMPPDUSet)
throw QSNMPException("QSNMPCore :: Create PDU :: Unknown PDU type");
if(objs.empty())
throw QSNMPException("QSNMPCore :: Create PDU :: SNMP objects vector is empty");
pdu = snmp_pdu_create(type);
foreach (QSNMPObject *object, objs) {
if(type == SNMPPDUSet) {
if(object -> data() -> type() == SNMPDataUnknown)
throw QSNMPException("QSNMPCore :: Create PDU :: Unknown SNMP data type");
char dataType;
switch(object -> data() -> type()) {
case SNMPDataInteger:
dataType = 'i';
break;
case SNMPDataUnsigned:
dataType = 'u';
break;
case SNMPDataBits:
dataType = 'b';
break;
case SNMPDataCounter:
dataType = 'c';
break;
case SNMPDataTimeTicks:
dataType = 't';
break;
case SNMPDataCounter64:
dataType = 'C';
break;
case SNMPDataBitString:
dataType = 'b';
break;
case SNMPDataOctetString:
dataType = 's';
break;
case SNMPDataIPAddress:
dataType = 'a';
break;
case SNMPDataObjectId:
dataType = 'o';
break;
default:
dataType = '=';
}
snmp_add_var(pdu, object -> objID() -> numOID() -> data(), static_cast<size_t>(object -> objID() -> numOID() -> size()), dataType, static_cast<const char *>(object -> data() -> value()));
} else
snmp_add_null_var(pdu, object -> objID() -> numOID() -> data(), static_cast<size_t>(object -> objID() -> numOID() -> size()));
}
if(type == SNMPPDUGetBulk) {
pdu -> errstat = nrepeaters;
pdu -> errindex = mrepetitions;
}
return pdu;
}
示例10: netsnmp_send_traps
/**
* This function allows you to make a distinction between generic
* traps from different classes of equipment. For example, you may want
* to handle a SNMP_TRAP_LINKDOWN trap for a particular device in a
* different manner to a generic system SNMP_TRAP_LINKDOWN trap.
*
*
* @param trap is the generic trap type. The trap types are:
* - SNMP_TRAP_COLDSTART:
* cold start
* - SNMP_TRAP_WARMSTART:
* warm start
* - SNMP_TRAP_LINKDOWN:
* link down
* - SNMP_TRAP_LINKUP:
* link up
* - SNMP_TRAP_AUTHFAIL:
* authentication failure
* - SNMP_TRAP_EGPNEIGHBORLOSS:
* egp neighbor loss
* - SNMP_TRAP_ENTERPRISESPECIFIC:
* enterprise specific
*
* @param specific is the specific trap value.
*
* @param enterprise is an enterprise oid in which you want to send specifc
* traps from.
*
* @param enterprise_length is the length of the enterprise oid, use macro,
* OID_LENGTH, to compute length.
*
* @param vars is used to supply list of variable bindings to form an SNMPv2
* trap.
*
* @param context currently unused
*
* @param flags currently unused
*
* @return void
*
* @see send_easy_trap
* @see send_v2trap
*/
int
netsnmp_send_traps(int trap, int specific,
oid * enterprise, int enterprise_length,
netsnmp_variable_list * vars,
char * context, int flags)
{
netsnmp_pdu *template_v1pdu;
netsnmp_pdu *template_v2pdu;
netsnmp_variable_list *vblist = NULL;
netsnmp_variable_list *trap_vb;
netsnmp_variable_list *var;
in_addr_t *pdu_in_addr_t;
u_long uptime;
struct trap_sink *sink;
DEBUGMSGTL(( "trap", "send_trap %d %d ", trap, specific));
DEBUGMSGOID(("trap", enterprise, enterprise_length));
DEBUGMSG(( "trap", "\n"));
if (vars) {
vblist = snmp_clone_varbind( vars );
if (!vblist) {
snmp_log(LOG_WARNING,
"send_trap: failed to clone varbind list\n");
return -1;
}
}
if ( trap == -1 ) {
/*
* Construct the SNMPv2-style notification PDU
*/
if (!vblist) {
snmp_log(LOG_WARNING,
"send_trap: called with NULL v2 information\n");
return -1;
}
template_v2pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
if (!template_v2pdu) {
snmp_log(LOG_WARNING,
"send_trap: failed to construct v2 template PDU\n");
snmp_free_varbind(vblist);
return -1;
}
/*
* Check the varbind list we've been given.
* If it starts with a 'sysUptime.0' varbind, then use that.
* Otherwise, prepend a suitable 'sysUptime.0' varbind.
*/
if (!snmp_oid_compare( vblist->name, vblist->name_length,
sysuptime_oid, sysuptime_oid_len )) {
template_v2pdu->variables = vblist;
trap_vb = vblist->next_variable;
} else {
uptime = netsnmp_get_agent_uptime();
var = NULL;
//.........这里部分代码省略.........
示例11: proxy_fill_in_session
//.........这里部分代码省略.........
{
snmpd_register_config_handler("proxy", proxy_parse_config,
proxy_free_config,
"[snmpcmd args] host oid [remoteoid]");
}
void
shutdown_proxy(void)
{
proxy_free_config();
}
int
proxy_handler(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
netsnmp_pdu *pdu;
struct simple_proxy *sp;
oid *ourname;
size_t ourlength;
netsnmp_request_info *request = requests;
u_char *configured = NULL;
DEBUGMSGTL(("proxy", "proxy handler starting, mode = %d\n",
reqinfo->mode));
switch (reqinfo->mode) {
case MODE_GET:
case MODE_GETNEXT:
case MODE_GETBULK: /* WWWXXX */
pdu = snmp_pdu_create(reqinfo->mode);
break;
case MODE_SET_ACTION:
pdu = snmp_pdu_create(SNMP_MSG_SET);
break;
case MODE_SET_UNDO:
/*
* If we set successfully (status == NOERROR),
* we can't back out again, so need to report the fact.
* If we failed to set successfully, then we're fine.
*/
for (request = requests; request; request=request->next) {
if (request->status == SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, requests,
SNMP_ERR_UNDOFAILED);
return SNMP_ERR_UNDOFAILED;
}
}
return SNMP_ERR_NOERROR;
case MODE_SET_RESERVE1:
case MODE_SET_RESERVE2:
case MODE_SET_FREE:
case MODE_SET_COMMIT:
/*
* Nothing to do in this pass
*/
return SNMP_ERR_NOERROR;
default:
snmp_log(LOG_WARNING, "unsupported mode for proxy called (%d)\n",
示例12: main
int
main(int argc, char *argv[])
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu = NULL, *response = NULL;
int arg;
size_t name_length = USM_OID_LEN;
size_t name_length2 = USM_OID_LEN;
int status;
int exitval = 1;
int rval;
int command = 0;
long longvar;
size_t oldKu_len = SNMP_MAXBUF_SMALL,
newKu_len = SNMP_MAXBUF_SMALL,
oldkul_len = SNMP_MAXBUF_SMALL,
oldkulpriv_len = SNMP_MAXBUF_SMALL,
newkulpriv_len = SNMP_MAXBUF_SMALL,
newkul_len = SNMP_MAXBUF_SMALL,
keychange_len = SNMP_MAXBUF_SMALL,
keychangepriv_len = SNMP_MAXBUF_SMALL;
char *newpass = NULL, *oldpass = NULL;
u_char oldKu[SNMP_MAXBUF_SMALL],
newKu[SNMP_MAXBUF_SMALL],
oldkul[SNMP_MAXBUF_SMALL],
oldkulpriv[SNMP_MAXBUF_SMALL],
newkulpriv[SNMP_MAXBUF_SMALL],
newkul[SNMP_MAXBUF_SMALL], keychange[SNMP_MAXBUF_SMALL],
keychangepriv[SNMP_MAXBUF_SMALL];
SOCK_STARTUP;
authKeyChange = authKeyOid;
privKeyChange = privKeyOid;
/*
* get the common command line arguments
*/
switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
case NETSNMP_PARSE_ARGS_ERROR:
goto out;
case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
exitval = 0;
goto out;
case NETSNMP_PARSE_ARGS_ERROR_USAGE:
usage();
goto out;
default:
break;
}
if (arg >= argc) {
fprintf(stderr, "Please specify an operation to perform.\n");
usage();
goto out;
}
/*
* open an SNMP session
*/
/*
* Note: this needs to obtain the engineID used below
*/
session.flags &= ~SNMP_FLAGS_DONT_PROBE;
ss = snmp_open(&session);
if (ss == NULL) {
/*
* diagnose snmp_open errors with the input netsnmp_session pointer
*/
snmp_sess_perror("snmpusm", &session);
goto out;
}
/*
* set usmUserEngineID from ss->contextEngineID
* if not already set (via -CE)
*/
if (usmUserEngineID == NULL) {
usmUserEngineID = ss->contextEngineID;
usmUserEngineIDLen = ss->contextEngineIDLen;
}
/*
* create PDU for SET request and add object names and values to request
*/
pdu = snmp_pdu_create(SNMP_MSG_SET);
if (!pdu) {
fprintf(stderr, "Failed to create request\n");
goto close_session;
}
if (strcmp(argv[arg], CMD_PASSWD_NAME) == 0) {
/*
* passwd: change a users password.
*
//.........这里部分代码省略.........
示例13: build_valuetable
//.........这里部分代码省略.........
taggetOID_len = objfound->expObjectIDLen;
int status;
struct snmp_session *ss;
/*
* Initialize the SNMP library
*/
/*
* set the SNMP version number
*/
session.version = expstorage->pdu_version;
/*
* set the SNMPv1 community name used for authentication
*/
session.community = expstorage->pdu_community;
session.community_len = expstorage->pdu_community_len;
/*
* Open the session
*/
SOCK_STARTUP;
ss = snmp_open(&session); /* establish the session */
if (!ss) {
snmp_perror("ack");
snmp_log(LOG_ERR, "something horrible happened!!!\n");
exit(2);
}
next_OID = targetOID;
next_OID_len = taggetOID_len;
do {
index = calloc(1, MAX_OID_LEN);
pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
snmp_add_null_var(pdu, next_OID, next_OID_len);
/*
* Send the Request out.
*/
status = snmp_synch_response(ss, pdu, &response);
/*
* Process the response.
*/
if (status == STAT_SUCCESS
&& response->errstat == SNMP_ERR_NOERROR) {
/*
* SUCCESS: Print the result variables
*/
if (((response->variables->type >= SNMP_NOSUCHOBJECT &&
response->variables->type <= SNMP_ENDOFMIBVIEW)
|| snmp_oid_compare(targetOID, taggetOID_len,
response->variables->name,
taggetOID_len) != 0)) {
break;
}
/* add to expValueTable */
*index = 0;
*(index + 1) = 0;
memcpy(index + 2,
response->variables->name + taggetOID_len,
(response->variables->name_length -
taggetOID_len) * sizeof(oid));
expValueTable_add(expstorage,
objfound->expExpressionOwner,
objfound->expExpressionOwnerLen,
objfound->expExpressionName,
objfound->expExpressionNameLen,
index,
response->variables->name_length -
taggetOID_len + 2);
next_OID = response->variables->name;
next_OID_len = response->variables->name_length;
} else {
/*
* FAILURE: print what went wrong!
*/
if (status == STAT_SUCCESS)
fprintf(stderr, "Error in packet\nReason: %s\n",
snmp_errstring(response->errstat));
else
snmp_sess_perror("snmpget", ss);
}
} while (TRUE);
}
}
}
示例14: get_ilo_oid_list
int
get_ilo_oid_list (struct snmp_session *session, oid *target_oid,
size_t target_oid_len, char **error_ptr)
{
int status;
int running = TRUE;
oid cur_oid[MAX_OID_LEN];
size_t cur_oid_len;
struct snmp_pdu *pdu_ptr, *response_ptr;
netsnmp_variable_list *var_list,*var_list_prev=NULL;
struct ilo_oid_list *oid_list;
struct ilo_snmp_priv *priv_ptr = container_of(error_ptr,
struct ilo_snmp_priv, err_str);
if (priv_ptr == NULL)
{
ILO_ERR_DEBUG(error_ptr, "priv_ptr is NULL!\n");
return NAGIOS_ILO_FAIL_STATUS;
}
oid_copy(cur_oid, &cur_oid_len, target_oid, target_oid_len);
while (running)
{
pdu_ptr = snmp_pdu_create(SNMP_MSG_GETBULK);
/* Max-repetitions: Tell get-bulk to attemp up to 'errindex'
get-next operations to get the remaining objects. */
pdu_ptr->errindex = SNMP_GETBULK_ERRINDEX;
/* Non-repeater. */
pdu_ptr->errstat = 0;
snmp_add_null_var(pdu_ptr, cur_oid, cur_oid_len);
status = snmp_synch_response(session, pdu_ptr, &response_ptr);
if (status == STAT_SUCCESS && response_ptr->errstat == SNMP_ERR_NOERROR)
{
var_list = var_list_prev =response_ptr->variables;
/* Add each element of the netsnmp variable list to
struct ilo_oid_list. */
while (var_list)
{
if (netsnmp_oid_is_subtree(target_oid,
target_oid_len,
var_list->name,
var_list->name_length) != 0)
{
running = FALSE;
break;
}
oid_list = alloc_oid_list(var_list, error_ptr);
if (oid_list == NULL)
{
ILO_ERR_DEBUG(error_ptr, "oid_list is NULL!\n");
return NAGIOS_ILO_FAIL_STATUS;
}
oid_list_add(&priv_ptr->oid_list, oid_list);
var_list_prev = var_list;
var_list = var_list->next_variable;
}
var_list=var_list_prev;
if ((var_list->type == SNMP_ENDOFMIBVIEW) ||
(var_list->type == SNMP_NOSUCHOBJECT) ||
(var_list->type == SNMP_NOSUCHINSTANCE))
{
running = FALSE;
}
else
{
oid_copy(cur_oid, &cur_oid_len, var_list->name,var_list->name_length);
}
}
else
{ /* Cannot get the response */
if (status == STAT_SUCCESS)
{
ILO_ERR_DEBUG(error_ptr, "Cannot get the response: %s\n",
snmp_errstring(response_ptr->errstat));
}
else
{
snmp_error(session, &session->s_errno, &session->s_snmp_errno,
error_ptr);
}
return NAGIOS_ILO_FAIL_STATUS;
}
if (response_ptr)
//.........这里部分代码省略.........
示例15: main
int
main(int argc, char *argv[])
{
netsnmp_session session, *ss;
netsnmp_pdu *pdu;
netsnmp_pdu *response;
netsnmp_variable_list *vars;
int arg;
int count;
int running;
int status;
int exitval = 0;
/*
* get the common command line arguments
*/
switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
case NETSNMP_PARSE_ARGS_ERROR:
exit(1);
case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
exit(0);
case NETSNMP_PARSE_ARGS_ERROR_USAGE:
usage();
exit(1);
default:
break;
}
names = argc - arg;
if (names < non_repeaters) {
fprintf(stderr, "snmpbulkget: need more objects than <nonrep>\n");
exit(1);
}
namep = name = (struct nameStruct *) calloc(names, sizeof(*name));
while (arg < argc) {
namep->name_len = MAX_OID_LEN;
if (snmp_parse_oid(argv[arg], namep->name, &namep->name_len) ==
NULL) {
snmp_perror(argv[arg]);
exit(1);
}
arg++;
namep++;
}
SOCK_STARTUP;
/*
* open an SNMP session
*/
ss = snmp_open(&session);
if (ss == NULL) {
/*
* diagnose snmp_open errors with the input netsnmp_session pointer
*/
snmp_sess_perror("snmpbulkget", &session);
SOCK_CLEANUP;
exit(1);
}
/*
* create PDU for GETBULK request and add object name to request
*/
pdu = snmp_pdu_create(SNMP_MSG_GETBULK);
pdu->non_repeaters = non_repeaters;
pdu->max_repetitions = max_repetitions; /* fill the packet */
for (arg = 0; arg < names; arg++)
snmp_add_null_var(pdu, name[arg].name, name[arg].name_len);
/*
* do the request
*/
status = snmp_synch_response(ss, pdu, &response);
if (status == STAT_SUCCESS) {
if (response->errstat == SNMP_ERR_NOERROR) {
/*
* check resulting variables
*/
for (vars = response->variables; vars;
vars = vars->next_variable)
print_variable(vars->name, vars->name_length, vars);
} else {
/*
* error in response, print it
*/
running = 0;
if (response->errstat == SNMP_ERR_NOSUCHNAME) {
printf("End of MIB.\n");
} else {
fprintf(stderr, "Error in packet.\nReason: %s\n",
snmp_errstring(response->errstat));
if (response->errindex != 0) {
fprintf(stderr, "Failed object: ");
for (count = 1, vars = response->variables;
vars && (count != response->errindex);
vars = vars->next_variable, count++)
/*EMPTY*/;
if (vars)
fprint_objid(stderr, vars->name,
//.........这里部分代码省略.........