summaryrefslogtreecommitdiffstats
path: root/plugins-root/check_icmp.d
diff options
context:
space:
mode:
authorLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2025-05-18 18:10:25 +0200
committerLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2025-05-18 18:10:25 +0200
commitb5de682309589ddb230e04beaaa54d74f2fe70d5 (patch)
tree70c2557e7ad1605ef216a7cb6e1a5e8eb843a016 /plugins-root/check_icmp.d
parent8f08e7ab3ecc03ea38062fe4442668fbea30bb73 (diff)
downloadmonitoring-plugins-b5de682309589ddb230e04beaaa54d74f2fe70d5.tar.gz
WIP - check_icmp refactor 8
Diffstat (limited to 'plugins-root/check_icmp.d')
-rw-r--r--plugins-root/check_icmp.d/check_icmp_helpers.c64
-rw-r--r--plugins-root/check_icmp.d/check_icmp_helpers.h15
-rw-r--r--plugins-root/check_icmp.d/config.h3
3 files changed, 28 insertions, 54 deletions
diff --git a/plugins-root/check_icmp.d/check_icmp_helpers.c b/plugins-root/check_icmp.d/check_icmp_helpers.c
index a2b54c6a..47604952 100644
--- a/plugins-root/check_icmp.d/check_icmp_helpers.c
+++ b/plugins-root/check_icmp.d/check_icmp_helpers.c
@@ -1,7 +1,7 @@
1#include "./config.h" 1#include "./config.h"
2#include "states.h"
3#include <math.h> 2#include <math.h>
4#include <netinet/in.h> 3#include <netinet/in.h>
4#include <sys/socket.h>
5#include "./check_icmp_helpers.h" 5#include "./check_icmp_helpers.h"
6#include "../../plugins/netutils.h" 6#include "../../plugins/netutils.h"
7 7
@@ -38,7 +38,10 @@ check_icmp_config check_icmp_config_init() {
38 .pkt_interval = DEFAULT_PKT_INTERVAL, 38 .pkt_interval = DEFAULT_PKT_INTERVAL,
39 .target_interval = 0, 39 .target_interval = 0,
40 .number_of_packets = DEFAULT_NUMBER_OF_PACKETS, 40 .number_of_packets = DEFAULT_NUMBER_OF_PACKETS,
41
41 .source_ip = NULL, 42 .source_ip = NULL,
43 .need_v4 = false,
44 .need_v6 = false,
42 45
43 .sender_id = {}, 46 .sender_id = {},
44 47
@@ -71,68 +74,31 @@ check_icmp_state check_icmp_state_init() {
71 return tmp; 74 return tmp;
72} 75}
73 76
74ping_target_create_wrapper ping_target_create(char *name, struct sockaddr_storage *address) { 77ping_target_create_wrapper ping_target_create(struct sockaddr_storage address) {
75 struct sockaddr_in *sin;
76 struct sockaddr_in6 *sin6;
77 if (address_family == AF_INET) {
78 sin = (struct sockaddr_in *)address;
79 } else {
80 sin6 = (struct sockaddr_in6 *)address;
81 }
82
83 ping_target_create_wrapper result = { 78 ping_target_create_wrapper result = {
84 .errorcode = OK, 79 .errorcode = OK,
85 }; 80 };
86 81
82 struct sockaddr_storage *tmp_addr = &address;
83
87 /* disregard obviously stupid addresses 84 /* disregard obviously stupid addresses
88 * (I didn't find an ipv6 equivalent to INADDR_NONE) */ 85 * (I didn't find an ipv6 equivalent to INADDR_NONE) */
89 if (((address_family == AF_INET && 86 if (((tmp_addr->ss_family == AF_INET &&
90 (sin->sin_addr.s_addr == INADDR_NONE || sin->sin_addr.s_addr == INADDR_ANY))) || 87 (((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_NONE ||
91 (address_family == AF_INET6 && (sin6->sin6_addr.s6_addr == in6addr_any.s6_addr))) { 88 ((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_ANY))) ||
89 (tmp_addr->ss_family == AF_INET6 &&
90 (((struct sockaddr_in6 *)tmp_addr)->sin6_addr.s6_addr == in6addr_any.s6_addr))) {
92 result.errorcode = ERROR; 91 result.errorcode = ERROR;
93 return result; 92 return result;
94 } 93 }
95 94
96 // TODO: Maybe add the following back in as a sanity check for the config
97 // /* no point in adding two identical IP's, so don't. ;) */
98 // struct sockaddr_in *host_sin;
99 // struct sockaddr_in6 *host_sin6;
100 // struct rta_host *host = host_list;
101
102 // while (host) {
103 // host_sin = (struct sockaddr_in *)&host->saddr_in;
104 // host_sin6 = (struct sockaddr_in6 *)&host->saddr_in;
105
106 // if ((address_family == AF_INET && host_sin->sin_addr.s_addr == sin->sin_addr.s_addr) ||
107 // (address_family == AF_INET6 &&
108 // host_sin6->sin6_addr.s6_addr == sin6->sin6_addr.s6_addr)) {
109 // if (debug) {
110 // printf("Identical IP already exists. Not adding %s\n", name);
111 // }
112 // return -1;
113 // }
114 // host = host->next;
115 // }
116
117 /* add the fresh ip */ 95 /* add the fresh ip */
118 ping_target host = ping_target_init(); 96 ping_target target = ping_target_init();
119
120 /* set the values. use calling name for output */
121 host.name = strdup(name);
122 97
123 /* fill out the sockaddr_storage struct */ 98 /* fill out the sockaddr_storage struct */
124 if (address_family == AF_INET) { 99 target.address = address;
125 struct sockaddr_in *host_sin = (struct sockaddr_in *)&host.saddr_in;
126 host_sin->sin_family = AF_INET;
127 host_sin->sin_addr.s_addr = sin->sin_addr.s_addr;
128 } else {
129 struct sockaddr_in6 *host_sin6 = (struct sockaddr_in6 *)&host.saddr_in;
130 host_sin6->sin6_family = AF_INET6;
131 memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr,
132 sizeof host_sin6->sin6_addr.s6_addr);
133 }
134 100
135 result.host = host; 101 result.host = target;
136 102
137 return result; 103 return result;
138} 104}
diff --git a/plugins-root/check_icmp.d/check_icmp_helpers.h b/plugins-root/check_icmp.d/check_icmp_helpers.h
index 5f771635..713dd8ce 100644
--- a/plugins-root/check_icmp.d/check_icmp_helpers.h
+++ b/plugins-root/check_icmp.d/check_icmp_helpers.h
@@ -10,10 +10,10 @@
10#include <arpa/inet.h> 10#include <arpa/inet.h>
11 11
12typedef struct rta_host { 12typedef struct rta_host {
13 unsigned short id; /* id in **table, and icmp pkts */ 13 unsigned short id; /* id in **table, and icmp pkts */
14 char *name; /* arg used for adding this host */ 14 char *msg; /* icmp error message, if any */
15 char *msg; /* icmp error message, if any */ 15
16 struct sockaddr_storage saddr_in; /* the address of this host */ 16 struct sockaddr_storage address; /* the address of this host */
17 struct sockaddr_storage error_addr; /* stores address of error replies */ 17 struct sockaddr_storage error_addr; /* stores address of error replies */
18 time_t time_waited; /* total time waited, in usecs */ 18 time_t time_waited; /* total time waited, in usecs */
19 unsigned int icmp_sent, icmp_recv, icmp_lost; /* counters */ 19 unsigned int icmp_sent, icmp_recv, icmp_lost; /* counters */
@@ -59,7 +59,12 @@ typedef struct {
59 ping_target host; 59 ping_target host;
60} ping_target_create_wrapper; 60} ping_target_create_wrapper;
61 61
62ping_target_create_wrapper ping_target_create(char *name, struct sockaddr_storage *address); 62typedef struct {
63 int socket4;
64 int socket6;
65} check_icmp_socket_set;
66
67ping_target_create_wrapper ping_target_create(struct sockaddr_storage address);
63unsigned int ping_target_list_append(ping_target *list, ping_target *elem); 68unsigned int ping_target_list_append(ping_target *list, ping_target *elem);
64 69
65void check_icmp_timeout_handler(int, siginfo_t *, void *); 70void check_icmp_timeout_handler(int, siginfo_t *, void *);
diff --git a/plugins-root/check_icmp.d/config.h b/plugins-root/check_icmp.d/config.h
index aa33c991..8e9c96b2 100644
--- a/plugins-root/check_icmp.d/config.h
+++ b/plugins-root/check_icmp.d/config.h
@@ -63,7 +63,10 @@ typedef struct {
63 unsigned int pkt_interval; 63 unsigned int pkt_interval;
64 unsigned int target_interval; 64 unsigned int target_interval;
65 unsigned short number_of_packets; 65 unsigned short number_of_packets;
66
66 char *source_ip; 67 char *source_ip;
68 bool need_v4;
69 bool need_v6;
67 70
68 uint16_t sender_id; // PID of the main process, which is used as an ID in packets 71 uint16_t sender_id; // PID of the main process, which is used as an ID in packets
69 72