mirror of
https://github.com/ntop/ntopng.git
synced 2026-07-10 00:14:24 +00:00
129 lines
3 KiB
C
129 lines
3 KiB
C
|
|
#include "snmp.h"
|
|
#include "asn1.h"
|
|
#include "net.h"
|
|
|
|
#include "snmp.c"
|
|
#include "asn1.c"
|
|
#include "net.c"
|
|
|
|
#include <time.h>
|
|
|
|
|
|
/* ************************************************* */
|
|
|
|
unsigned long int next_request_id = 1;
|
|
|
|
unsigned int send_request(int socket, char *agent_host, int agent_port, char *oid, int verbose)
|
|
{
|
|
SNMPMessage *message;
|
|
int len;
|
|
unsigned char *buf;
|
|
unsigned long int request_id = next_request_id++;
|
|
|
|
message = snmp_create_message();
|
|
snmp_set_version(message, 0);
|
|
snmp_set_community(message, "public");
|
|
snmp_set_pdu_type(message, SNMP_GET_REQUEST_TYPE);
|
|
snmp_set_request_id(message, request_id);
|
|
snmp_set_error(message, 0);
|
|
snmp_set_error_index(message, 0);
|
|
snmp_add_varbind_null(message, oid);
|
|
|
|
len = snmp_message_length(message);
|
|
buf = malloc(len);
|
|
snmp_render_message(message, buf);
|
|
|
|
if (verbose)
|
|
snmp_print_message(message, stderr);
|
|
|
|
snmp_destroy_message(message);
|
|
|
|
if (verbose)
|
|
fprintf(stderr, "Sending datagram to %s:%d\n", agent_host, agent_port);
|
|
|
|
send_udp_datagram(buf, len, socket, agent_host, agent_port);
|
|
|
|
free(buf);
|
|
|
|
return request_id;
|
|
}
|
|
|
|
/* ************************************************* */
|
|
|
|
void get_time_str(char *buf, int size)
|
|
{
|
|
time_t time_buf;
|
|
struct tm tm_buf;
|
|
|
|
time(&time_buf);
|
|
localtime_r(&time_buf, &tm_buf);
|
|
strftime(buf, size, "%Y-%m-%d %H:%M:%S", &tm_buf);
|
|
}
|
|
|
|
/* ************************************************* */
|
|
|
|
void log_message(SNMPMessage *message, char *sender_host)
|
|
{
|
|
char *host_str = sender_host;
|
|
char timestamp_str[20];
|
|
char *oid_str;
|
|
char *value_str;
|
|
int i = 0;
|
|
|
|
get_time_str(timestamp_str, sizeof(timestamp_str));
|
|
|
|
while (snmp_get_varbind_as_string(message, i, &oid_str, NULL, &value_str))
|
|
{
|
|
printf("%s\t%s\t%s\t%s\n", host_str, timestamp_str, oid_str, value_str);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
/* ************************************************* */
|
|
|
|
unsigned int get_response(int socket, u_int timeout, int verbose) {
|
|
char buf[BUFLEN];
|
|
SNMPMessage *message;
|
|
char *sender_host;
|
|
int sender_port;
|
|
int nr;
|
|
|
|
nr = input_timeout(socket, timeout);
|
|
if (nr == 0) return(0);
|
|
|
|
nr = receive_udp_datagram(buf, BUFLEN, socket, &sender_host, &sender_port);
|
|
|
|
if (nr == 0) return(0);
|
|
|
|
if (verbose)
|
|
fprintf(stderr, "Received packet from %s:%d\n",
|
|
sender_host, sender_port);
|
|
|
|
message = snmp_parse_message(buf, nr);
|
|
|
|
if (verbose)
|
|
snmp_print_message(message, stderr);
|
|
|
|
if (snmp_get_pdu_type(message) == SNMP_GET_RESPONSE_TYPE)
|
|
log_message(message, sender_host);
|
|
|
|
snmp_destroy_message(message);
|
|
return(1);
|
|
}
|
|
|
|
/* ************************************************* */
|
|
|
|
int main(int argc, char *argv[]) {
|
|
int sock;
|
|
|
|
// unsigned int send_request(int socket, char *agent_host, int agent_port, char *oid, int verbose)
|
|
|
|
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
|
send_request(sock, "192.168.1.252", 161, "1.3.6.1.2.1.1.5.0", 1 /* verbose */);
|
|
get_response(sock, 5, 1);
|
|
close(sock);
|
|
return(0);
|
|
}
|
|
|
|
|