mirror of
https://github.com/monitoring-plugins/monitoring-plugins.git
synced 2026-04-22 22:56:58 -04:00
WIP - check_icmp refactor 8
This commit is contained in:
parent
8f08e7ab3e
commit
b5de682309
4 changed files with 331 additions and 254 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +1,7 @@
|
|||
#include "./config.h"
|
||||
#include "states.h"
|
||||
#include <math.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#include "./check_icmp_helpers.h"
|
||||
#include "../../plugins/netutils.h"
|
||||
|
||||
|
|
@ -38,7 +38,10 @@ check_icmp_config check_icmp_config_init() {
|
|||
.pkt_interval = DEFAULT_PKT_INTERVAL,
|
||||
.target_interval = 0,
|
||||
.number_of_packets = DEFAULT_NUMBER_OF_PACKETS,
|
||||
|
||||
.source_ip = NULL,
|
||||
.need_v4 = false,
|
||||
.need_v6 = false,
|
||||
|
||||
.sender_id = {},
|
||||
|
||||
|
|
@ -71,68 +74,31 @@ check_icmp_state check_icmp_state_init() {
|
|||
return tmp;
|
||||
}
|
||||
|
||||
ping_target_create_wrapper ping_target_create(char *name, struct sockaddr_storage *address) {
|
||||
struct sockaddr_in *sin;
|
||||
struct sockaddr_in6 *sin6;
|
||||
if (address_family == AF_INET) {
|
||||
sin = (struct sockaddr_in *)address;
|
||||
} else {
|
||||
sin6 = (struct sockaddr_in6 *)address;
|
||||
}
|
||||
|
||||
ping_target_create_wrapper ping_target_create(struct sockaddr_storage address) {
|
||||
ping_target_create_wrapper result = {
|
||||
.errorcode = OK,
|
||||
};
|
||||
|
||||
struct sockaddr_storage *tmp_addr = &address;
|
||||
|
||||
/* disregard obviously stupid addresses
|
||||
* (I didn't find an ipv6 equivalent to INADDR_NONE) */
|
||||
if (((address_family == AF_INET &&
|
||||
(sin->sin_addr.s_addr == INADDR_NONE || sin->sin_addr.s_addr == INADDR_ANY))) ||
|
||||
(address_family == AF_INET6 && (sin6->sin6_addr.s6_addr == in6addr_any.s6_addr))) {
|
||||
if (((tmp_addr->ss_family == AF_INET &&
|
||||
(((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_NONE ||
|
||||
((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_ANY))) ||
|
||||
(tmp_addr->ss_family == AF_INET6 &&
|
||||
(((struct sockaddr_in6 *)tmp_addr)->sin6_addr.s6_addr == in6addr_any.s6_addr))) {
|
||||
result.errorcode = ERROR;
|
||||
return result;
|
||||
}
|
||||
|
||||
// TODO: Maybe add the following back in as a sanity check for the config
|
||||
// /* no point in adding two identical IP's, so don't. ;) */
|
||||
// struct sockaddr_in *host_sin;
|
||||
// struct sockaddr_in6 *host_sin6;
|
||||
// struct rta_host *host = host_list;
|
||||
|
||||
// while (host) {
|
||||
// host_sin = (struct sockaddr_in *)&host->saddr_in;
|
||||
// host_sin6 = (struct sockaddr_in6 *)&host->saddr_in;
|
||||
|
||||
// if ((address_family == AF_INET && host_sin->sin_addr.s_addr == sin->sin_addr.s_addr) ||
|
||||
// (address_family == AF_INET6 &&
|
||||
// host_sin6->sin6_addr.s6_addr == sin6->sin6_addr.s6_addr)) {
|
||||
// if (debug) {
|
||||
// printf("Identical IP already exists. Not adding %s\n", name);
|
||||
// }
|
||||
// return -1;
|
||||
// }
|
||||
// host = host->next;
|
||||
// }
|
||||
|
||||
/* add the fresh ip */
|
||||
ping_target host = ping_target_init();
|
||||
|
||||
/* set the values. use calling name for output */
|
||||
host.name = strdup(name);
|
||||
ping_target target = ping_target_init();
|
||||
|
||||
/* fill out the sockaddr_storage struct */
|
||||
if (address_family == AF_INET) {
|
||||
struct sockaddr_in *host_sin = (struct sockaddr_in *)&host.saddr_in;
|
||||
host_sin->sin_family = AF_INET;
|
||||
host_sin->sin_addr.s_addr = sin->sin_addr.s_addr;
|
||||
} else {
|
||||
struct sockaddr_in6 *host_sin6 = (struct sockaddr_in6 *)&host.saddr_in;
|
||||
host_sin6->sin6_family = AF_INET6;
|
||||
memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr,
|
||||
sizeof host_sin6->sin6_addr.s6_addr);
|
||||
}
|
||||
target.address = address;
|
||||
|
||||
result.host = host;
|
||||
result.host = target;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@
|
|||
#include <arpa/inet.h>
|
||||
|
||||
typedef struct rta_host {
|
||||
unsigned short id; /* id in **table, and icmp pkts */
|
||||
char *name; /* arg used for adding this host */
|
||||
char *msg; /* icmp error message, if any */
|
||||
struct sockaddr_storage saddr_in; /* the address of this host */
|
||||
unsigned short id; /* id in **table, and icmp pkts */
|
||||
char *msg; /* icmp error message, if any */
|
||||
|
||||
struct sockaddr_storage address; /* the address of this host */
|
||||
struct sockaddr_storage error_addr; /* stores address of error replies */
|
||||
time_t time_waited; /* total time waited, in usecs */
|
||||
unsigned int icmp_sent, icmp_recv, icmp_lost; /* counters */
|
||||
|
|
@ -59,7 +59,12 @@ typedef struct {
|
|||
ping_target host;
|
||||
} ping_target_create_wrapper;
|
||||
|
||||
ping_target_create_wrapper ping_target_create(char *name, struct sockaddr_storage *address);
|
||||
typedef struct {
|
||||
int socket4;
|
||||
int socket6;
|
||||
} check_icmp_socket_set;
|
||||
|
||||
ping_target_create_wrapper ping_target_create(struct sockaddr_storage address);
|
||||
unsigned int ping_target_list_append(ping_target *list, ping_target *elem);
|
||||
|
||||
void check_icmp_timeout_handler(int, siginfo_t *, void *);
|
||||
|
|
|
|||
|
|
@ -63,7 +63,10 @@ typedef struct {
|
|||
unsigned int pkt_interval;
|
||||
unsigned int target_interval;
|
||||
unsigned short number_of_packets;
|
||||
|
||||
char *source_ip;
|
||||
bool need_v4;
|
||||
bool need_v6;
|
||||
|
||||
uint16_t sender_id; // PID of the main process, which is used as an ID in packets
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue