Merge branch 'master' into check_dhcp_rogue_detection

This commit is contained in:
Lorenz Kästle 2023-10-13 19:09:29 +02:00
commit b6d3acf5e3
14 changed files with 827 additions and 143 deletions

View file

@ -21,7 +21,7 @@ jobs:
uses: codespell-project/actions-codespell@v2
with:
skip: "./.git,./.gitignore,./ABOUT-NLS,*.po,./gl,./po,./tools/squid.conf,./build-aux/ltmain.sh"
ignore_words_list: allright,gord,didi,hda,nd,alis,clen,scrit,ser,fot,te,parm,isnt,consol,oneliners,esponse
ignore_words_list: allright,gord,didi,hda,nd,alis,clen,scrit,ser,fot,te,parm,isnt,consol,oneliners,esponse,slac
check_filenames: true
check_hidden: true
# super-linter:

2
.gitignore vendored
View file

@ -94,7 +94,7 @@ NP-VERSION-FILE
/gl/limits.h
/gl/malloc/dynarray-skeleton.gl.h
/gl/malloc/dynarray.gl.h
/gl/stdckdint.
/gl/stdckdint.h
# /lib/
/lib/.deps

View file

@ -644,12 +644,16 @@ AC_TRY_COMPILE([#include <sys/time.h>],
[struct timeval *tv;
struct timezone *tz;],
AC_DEFINE(HAVE_STRUCT_TIMEVAL,1,[Define if we have a timeval structure])
AC_TRY_COMPILE([#include <sys/time.h>],
[struct timeval *tv;
struct timezone *tz;
gettimeofday(tv, tz);],
AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define if gettimeofday is found]),
AC_DEFINE(NEED_GETTIMEOFDAY,1,[Define if gettimeofday is needed])))
FOUND_STRUCT_TIMEVAL="yes")
if test x"$FOUND_STRUCT_TIMEVAL" = x"yes"; then
AC_TRY_COMPILE([#include <sys/time.h>],
[struct timeval *tv;
struct timezone *tz;
gettimeofday(tv, tz);],
AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define if gettimeofday is found]),
AC_DEFINE(NEED_GETTIMEOFDAY,1,[Define if gettimeofday is needed]))
fi
dnl Checks for library functions.
AC_CHECK_FUNCS(memmove select socket strdup strstr strtol strtoul floor)

View file

@ -29,6 +29,7 @@
#include "common.h"
#include "utils_disk.h"
#include "gl/fsusage.h"
#include <string.h>
void
np_add_name (struct name_list **list, const char *name)
@ -40,6 +41,42 @@ np_add_name (struct name_list **list, const char *name)
*list = new_entry;
}
/* @brief Initialises a new regex at the begin of list via regcomp(3)
*
* @details if the regex fails to compile the error code of regcomp(3) is returned
* and list is not modified, otherwise list is modified to point to the new
* element
* @param list Pointer to a linked list of regex_list elements
* @param regex the string containing the regex which should be inserted into the list
* @param clags the cflags parameter for regcomp(3)
*/
int
np_add_regex (struct regex_list **list, const char *regex, int cflags)
{
struct regex_list *new_entry = (struct regex_list *) malloc (sizeof *new_entry);
if (new_entry == NULL) {
die(STATE_UNKNOWN, _("Cannot allocate memory: %s"),
strerror(errno));
}
int regcomp_result = regcomp(&new_entry->regex, regex, cflags);
if (!regcomp_result) {
// regcomp succeeded
new_entry->next = *list;
*list = new_entry;
return 0;
} else {
// regcomp failed
free(new_entry);
return regcomp_result;
}
}
/* Initialises a new parameter at the end of list */
struct parameter_list *
np_add_parameter(struct parameter_list **list, const char *name)
@ -196,6 +233,30 @@ np_find_name (struct name_list *list, const char *name)
return FALSE;
}
/* Returns TRUE if name is in list */
bool
np_find_regmatch (struct regex_list *list, const char *name)
{
int len;
regmatch_t m;
if (name == NULL) {
return false;
}
len = strlen(name);
for (; list; list = list->next) {
/* Emulate a full match as if surrounded with ^( )$
by checking whether the match spans the whole name */
if (!regexec(&list->regex, name, 1, &m, 0) && m.rm_so == 0 && m.rm_eo == len) {
return true;
}
}
return false;
}
int
np_seen_name(struct name_list *list, const char *name)
{

View file

@ -10,6 +10,12 @@ struct name_list
struct name_list *next;
};
struct regex_list
{
regex_t regex;
struct regex_list *next;
};
struct parameter_list
{
char *name;
@ -35,6 +41,8 @@ struct parameter_list
void np_add_name (struct name_list **list, const char *name);
int np_find_name (struct name_list *list, const char *name);
int np_seen_name (struct name_list *list, const char *name);
int np_add_regex (struct regex_list **list, const char *regex, int cflags);
bool np_find_regmatch (struct regex_list *list, const char *name);
struct parameter_list *np_add_parameter(struct parameter_list **list, const char *name);
struct parameter_list *np_find_parameter(struct parameter_list *list, const char *name);
struct parameter_list *np_del_parameter(struct parameter_list *item, struct parameter_list *prev);

View file

@ -43,7 +43,7 @@ const char *copyright = "2005-2008";
const char *email = "devel@monitoring-plugins.org";
/** Monitoring Plugins basic includes */
#include "common.h"
#include "../plugins/common.h"
#include "netutils.h"
#include "utils.h"
@ -109,18 +109,35 @@ typedef struct rta_host {
unsigned char icmp_type, icmp_code; /* type and code from errors */
unsigned short flags; /* control/status flags */
double rta; /* measured RTA */
int rta_status; // check result for RTA checks
double rtmax; /* max rtt */
double rtmin; /* min rtt */
double jitter; /* measured jitter */
int jitter_status; // check result for Jitter checks
double jitter_max; /* jitter rtt maximum */
double jitter_min; /* jitter rtt minimum */
double EffectiveLatency;
double mos; /* Mean opnion score */
int mos_status; // check result for MOS checks
double score; /* score */
int score_status; // check result for score checks
u_int last_tdiff;
u_int last_icmp_seq; /* Last ICMP_SEQ to check out of order pkts */
unsigned char pl; /* measured packet loss */
int pl_status; // check result for packet loss checks
struct rta_host *next; /* linked list */
int order_status; // check result for packet order checks
} rta_host;
#define FLAG_LOST_CAUSE 0x01 /* decidedly dead target. */
/* threshold structure. all values are maximum allowed, exclusive */
typedef struct threshold {
unsigned char pl; /* max allowed packet loss in percent */
unsigned int rta; /* roundtrip time average, microseconds */
unsigned char pl; /* max allowed packet loss in percent */
unsigned int rta; /* roundtrip time average, microseconds */
double jitter; /* jitter time average, microseconds */
double mos; /* MOS */
double score; /* Score */
} threshold;
/* the data structure */
@ -159,6 +176,16 @@ typedef union icmp_packet {
#define MODE_ALL 2
#define MODE_ICMP 3
enum enum_threshold_mode {
const_rta_mode,
const_packet_loss_mode,
const_jitter_mode,
const_mos_mode,
const_score_mode
};
typedef enum enum_threshold_mode threshold_mode;
/* the different ping types we can do
* TODO: investigate ARP ping as well */
#define HAVE_ICMP 1
@ -188,6 +215,8 @@ static int wait_for_reply(int, u_int);
static int recvfrom_wto(int, void *, unsigned int, struct sockaddr *, u_int *, struct timeval*);
static int send_icmp_ping(int, struct rta_host *);
static int get_threshold(char *str, threshold *th);
static bool get_threshold2(char *str, size_t length, threshold *, threshold *, threshold_mode mode);
static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, threshold_mode mode);
static void run_checks(void);
static void set_source_ip(char *);
static int add_target(char *);
@ -199,13 +228,28 @@ static void finish(int);
static void crash(const char *, ...);
/** external **/
extern int optind, opterr, optopt;
extern int optind;
extern char *optarg;
extern char **environ;
/** global variables **/
static struct rta_host **table, *cursor, *list;
static threshold crit = {80, 500000}, warn = {40, 200000};
static threshold crit = {
.pl = 80,
.rta = 500000,
.jitter = 0.0,
.mos = 0.0,
.score = 0.0
};
static threshold warn = {
.pl = 40,
.rta = 200000,
.jitter = 0.0,
.mos = 0.0,
.score = 0.0
};
static int mode, protocols, sockets, debug = 0, timeout = 10;
static unsigned short icmp_data_size = DEFAULT_PING_DATA_SIZE;
static unsigned short icmp_pkt_size = DEFAULT_PING_DATA_SIZE + ICMP_MINLEN;
@ -224,6 +268,12 @@ static unsigned int warn_down = 1, crit_down = 1; /* host down threshold values
static int min_hosts_alive = -1;
float pkt_backoff_factor = 1.5;
float target_backoff_factor = 1.5;
bool rta_mode=false;
bool pl_mode=false;
bool jitter_mode=false;
bool score_mode=false;
bool mos_mode=false;
bool order_mode=false;
/** code start **/
static void
@ -393,12 +443,14 @@ main(int argc, char **argv)
int icmp_sockerrno, udp_sockerrno, tcp_sockerrno;
int result;
struct rta_host *host;
#ifdef HAVE_SIGACTION
struct sigaction sig_action;
#endif
#ifdef SO_TIMESTAMP
int on = 1;
#endif
char *source_ip = NULL;
char * opts_str = "vhVw:c:n:p:t:H:s:i:b:I:l:m:64";
char * opts_str = "vhVw:c:n:p:t:H:s:i:b:I:l:m:P:R:J:S:M:O64";
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
@ -407,7 +459,7 @@ main(int argc, char **argv)
* that before pointer magic (esp. on network data) */
icmp_sockerrno = udp_sockerrno = tcp_sockerrno = sockets = 0;
address_family = -1;
address_family = -1;
int icmp_proto = IPPROTO_ICMP;
/* get calling name the old-fashioned way for portability instead
@ -422,10 +474,19 @@ main(int argc, char **argv)
table = NULL;
mode = MODE_RTA;
/* Default critical thresholds */
crit.rta = 500000;
crit.pl = 80;
crit.jitter = 50;
crit.mos= 3;
crit.score=70;
/* Default warning thresholds */
warn.rta = 200000;
warn.pl = 40;
warn.jitter = 40;
warn.mos= 3.5;
warn.score=80;
protocols = HAVE_ICMP | HAVE_UDP | HAVE_TCP;
pkt_interval = 80000; /* 80 msec packet interval by default */
packets = 5;
@ -481,7 +542,8 @@ main(int argc, char **argv)
/* Reset argument scanning */
optind = 1;
unsigned short size;
unsigned long size;
bool err;
/* parse the arguments */
for(i = 1; i < argc; i++) {
while((arg = getopt(argc, argv, opts_str)) != EOF) {
@ -490,7 +552,7 @@ main(int argc, char **argv)
debug++;
break;
case 'b':
size = (unsigned short)strtol(optarg,NULL,0);
size = strtol(optarg,NULL,0);
if (size >= (sizeof(struct icmp) + sizeof(struct icmp_ping_data)) &&
size < MAX_PING_DATA) {
icmp_data_size = size;
@ -545,6 +607,49 @@ main(int argc, char **argv)
print_help ();
exit (STATE_UNKNOWN);
break;
case 'R': /* RTA mode */
err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_rta_mode);
if (!err) {
crash("Failed to parse RTA threshold");
}
rta_mode=true;
break;
case 'P': /* packet loss mode */
err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_packet_loss_mode);
if (!err) {
crash("Failed to parse packet loss threshold");
}
pl_mode=true;
break;
case 'J': /* jitter mode */
err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_jitter_mode);
if (!err) {
crash("Failed to parse jitter threshold");
}
jitter_mode=true;
break;
case 'M': /* MOS mode */
err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_mos_mode);
if (!err) {
crash("Failed to parse MOS threshold");
}
mos_mode=true;
break;
case 'S': /* score mode */
err = get_threshold2(optarg, strlen(optarg), &warn, &crit, const_score_mode);
if (!err) {
crash("Failed to parse score threshold");
}
score_mode=true;
break;
case 'O': /* out of order mode */
order_mode=true;
break;
}
}
}
@ -565,10 +670,10 @@ main(int argc, char **argv)
add_target(*argv);
argv++;
}
if(!targets) {
errno = 0;
crash("No hosts to check");
exit(3);
}
// add_target might change address_family
@ -631,11 +736,25 @@ main(int argc, char **argv)
if(warn.pl > crit.pl) warn.pl = crit.pl;
if(warn.rta > crit.rta) warn.rta = crit.rta;
if(warn_down > crit_down) crit_down = warn_down;
if(warn.jitter > crit.jitter) crit.jitter = warn.jitter;
if(warn.mos < crit.mos) warn.mos = crit.mos;
if(warn.score < crit.score) warn.score = crit.score;
#ifdef HAVE_SIGACTION
sig_action.sa_sigaction = NULL;
sig_action.sa_handler = finish;
sigfillset(&sig_action.sa_mask);
sig_action.sa_flags = SA_NODEFER|SA_RESTART;
sigaction(SIGINT, &sig_action, NULL);
sigaction(SIGHUP, &sig_action, NULL);
sigaction(SIGTERM, &sig_action, NULL);
sigaction(SIGALRM, &sig_action, NULL);
#else /* HAVE_SIGACTION */
signal(SIGINT, finish);
signal(SIGHUP, finish);
signal(SIGTERM, finish);
signal(SIGALRM, finish);
#endif /* HAVE_SIGACTION */
if(debug) printf("Setting alarm timeout to %u seconds\n", timeout);
alarm(timeout);
@ -685,7 +804,11 @@ main(int argc, char **argv)
}
host = list;
table = (struct rta_host**)malloc(sizeof(struct rta_host **) * targets);
table = malloc(sizeof(struct rta_host *) * targets);
if(!table) {
crash("main(): malloc failed for host table");
}
i = 0;
while(host) {
host->id = i*packets;
@ -772,6 +895,7 @@ wait_for_reply(int sock, u_int t)
struct icmp_ping_data data;
struct timeval wait_start, now;
u_int tdiff, i, per_pkt_wait;
double jitter_tmp;
if (!(packet.buf = malloc(icmp_pkt_size))) {
crash("send_icmp_ping(): failed to malloc %d bytes for send buffer",
@ -890,12 +1014,44 @@ wait_for_reply(int sock, u_int t)
tdiff = get_timevaldiff(&data.stime, &now);
if (host->last_tdiff>0) {
/* Calculate jitter */
if (host->last_tdiff > tdiff) {
jitter_tmp = host->last_tdiff - tdiff;
} else {
jitter_tmp = tdiff - host->last_tdiff;
}
if (host->jitter==0) {
host->jitter=jitter_tmp;
host->jitter_max=jitter_tmp;
host->jitter_min=jitter_tmp;
} else {
host->jitter+=jitter_tmp;
if (jitter_tmp < host->jitter_min) {
host->jitter_min=jitter_tmp;
}
if (jitter_tmp > host->jitter_max) {
host->jitter_max=jitter_tmp;
}
}
/* Check if packets in order */
if (host->last_icmp_seq >= packet.icp->icmp_seq)
host->order_status=STATE_CRITICAL;
}
host->last_tdiff=tdiff;
host->last_icmp_seq=packet.icp->icmp_seq;
host->time_waited += tdiff;
host->icmp_recv++;
icmp_recv++;
if (tdiff > host->rtmax)
if (tdiff > (unsigned int)host->rtmax)
host->rtmax = tdiff;
if (tdiff < host->rtmin)
if (tdiff < (unsigned int)host->rtmin)
host->rtmin = tdiff;
if(debug) {
@ -1056,7 +1212,9 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr,
int n, ret;
struct timeval to, then, now;
fd_set rd, wr;
#ifdef HAVE_MSGHDR_MSG_CONTROL
char ans_data[4096];
#endif // HAVE_MSGHDR_MSG_CONTROL
struct msghdr hdr;
struct iovec iov;
#ifdef SO_TIMESTAMP
@ -1094,8 +1252,10 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr,
hdr.msg_namelen = slen;
hdr.msg_iov = &iov;
hdr.msg_iovlen = 1;
#ifdef HAVE_MSGHDR_MSG_CONTROL
hdr.msg_control = ans_data;
hdr.msg_controllen = sizeof(ans_data);
#endif
ret = recvmsg(sock, &hdr, 0);
#ifdef SO_TIMESTAMP
@ -1125,6 +1285,8 @@ finish(int sig)
{"OK", "WARNING", "CRITICAL", "UNKNOWN", "DEPENDENT"};
int hosts_ok = 0;
int hosts_warn = 0;
int this_status;
double R;
alarm(0);
if(debug > 1) printf("finish(%d) called\n", sig);
@ -1140,9 +1302,12 @@ finish(int sig)
}
/* iterate thrice to calculate values, give output, and print perfparse */
status=STATE_OK;
host = list;
while(host) {
this_status = STATE_OK;
if(!host->icmp_recv) {
/* rta 0 is ofcourse not entirely correct, but will still show up
* conspicuously as missing entries in perfparse and cacti */
@ -1151,26 +1316,138 @@ finish(int sig)
status = STATE_CRITICAL;
/* up the down counter if not already counted */
if(!(host->flags & FLAG_LOST_CAUSE) && targets_alive) targets_down++;
}
else {
} else {
pl = ((host->icmp_sent - host->icmp_recv) * 100) / host->icmp_sent;
rta = (double)host->time_waited / host->icmp_recv;
}
if (host->icmp_recv>1) {
/*
* This algorithm is probably pretty much blindly copied from
* locations like this one: https://www.slac.stanford.edu/comp/net/wan-mon/tutorial.html#mos
* It calculates a MOS value (range of 1 to 5, where 1 is bad and 5 really good).
* According to some quick research MOS originates from the Audio/Video transport network area.
* Whether it can and should be computed from ICMP data, I can not say.
*
* Anyway the basic idea is to map a value "R" with a range of 0-100 to the MOS value
*
* MOS stands likely for Mean Opinion Score ( https://en.wikipedia.org/wiki/Mean_Opinion_Score )
*
* More links:
* - https://confluence.slac.stanford.edu/display/IEPM/MOS
*/
host->jitter=(host->jitter / (host->icmp_recv - 1)/1000);
/*
* Take the average round trip latency (in milliseconds), add
* round trip jitter, but double the impact to latency
* then add 10 for protocol latencies (in milliseconds).
*/
host->EffectiveLatency = (rta/1000) + host->jitter * 2 + 10;
if (host->EffectiveLatency < 160) {
R = 93.2 - (host->EffectiveLatency / 40);
} else {
R = 93.2 - ((host->EffectiveLatency - 120) / 10);
}
// Now, let us deduct 2.5 R values per percentage of packet loss (i.e. a
// loss of 5% will be entered as 5).
R = R - (pl * 2.5);
if (R < 0) {
R = 0;
}
host->score = R;
host->mos= 1 + ((0.035) * R) + ((.000007) * R * (R-60) * (100-R));
} else {
host->jitter=0;
host->jitter_min=0;
host->jitter_max=0;
host->mos=0;
}
host->pl = pl;
host->rta = rta;
if(pl >= crit.pl || rta >= crit.rta) {
status = STATE_CRITICAL;
/* if no new mode selected, use old schema */
if (!rta_mode && !pl_mode && !jitter_mode && !score_mode && !mos_mode && !order_mode) {
rta_mode = true;
pl_mode = true;
}
else if(!status && (pl >= warn.pl || rta >= warn.rta)) {
status = STATE_WARNING;
/* Check which mode is on and do the warn / Crit stuff */
if (rta_mode) {
if(rta >= crit.rta) {
this_status = STATE_CRITICAL;
status = STATE_CRITICAL;
host->rta_status=STATE_CRITICAL;
} else if(status!=STATE_CRITICAL && (rta >= warn.rta)) {
this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status);
status = STATE_WARNING;
host->rta_status=STATE_WARNING;
}
}
if (pl_mode) {
if(pl >= crit.pl) {
this_status = STATE_CRITICAL;
status = STATE_CRITICAL;
host->pl_status=STATE_CRITICAL;
} else if(status!=STATE_CRITICAL && (pl >= warn.pl)) {
this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status);
status = STATE_WARNING;
host->pl_status=STATE_WARNING;
}
}
if (jitter_mode) {
if(host->jitter >= crit.jitter) {
this_status = STATE_CRITICAL;
status = STATE_CRITICAL;
host->jitter_status=STATE_CRITICAL;
} else if(status!=STATE_CRITICAL && (host->jitter >= warn.jitter)) {
this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status);
status = STATE_WARNING;
host->jitter_status=STATE_WARNING;
}
}
if (mos_mode) {
if(host->mos <= crit.mos) {
this_status = STATE_CRITICAL;
status = STATE_CRITICAL;
host->mos_status=STATE_CRITICAL;
} else if(status!=STATE_CRITICAL && (host->mos <= warn.mos)) {
this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status);
status = STATE_WARNING;
host->mos_status=STATE_WARNING;
}
}
if (score_mode) {
if(host->score <= crit.score) {
this_status = STATE_CRITICAL;
status = STATE_CRITICAL;
host->score_status=STATE_CRITICAL;
} else if(status!=STATE_CRITICAL && (host->score <= warn.score)) {
this_status = (this_status <= STATE_WARNING ? STATE_WARNING : this_status);
status = STATE_WARNING;
host->score_status=STATE_WARNING;
}
}
if (this_status == STATE_WARNING) {
hosts_warn++;
}
else {
} else if (this_status == STATE_OK) {
hosts_ok++;
}
host = host->next;
}
/* this is inevitable */
if(!targets_alive) status = STATE_CRITICAL;
if(min_hosts_alive > -1) {
@ -1181,6 +1458,7 @@ finish(int sig)
host = list;
while(host) {
if(debug) puts("");
if(i) {
if(i < targets) printf(" :: ");
@ -1189,6 +1467,8 @@ finish(int sig)
i++;
if(!host->icmp_recv) {
status = STATE_CRITICAL;
host->rtmin=0;
host->jitter_min=0;
if(host->flags & FLAG_LOST_CAUSE) {
char address[INET6_ADDRSTRLEN];
parse_address(&host->error_addr, address, sizeof(address));
@ -1197,31 +1477,117 @@ finish(int sig)
get_icmp_error_msg(host->icmp_type, host->icmp_code),
address,
100);
}
else { /* not marked as lost cause, so we have no flags for it */
} else { /* not marked as lost cause, so we have no flags for it */
printf("%s: rta nan, lost 100%%", host->name);
}
} else { /* !icmp_recv */
printf("%s", host->name);
/* rta text output */
if (rta_mode) {
if (status == STATE_OK)
printf(" rta %0.3fms", host->rta / 1000);
else if (status==STATE_WARNING && host->rta_status==status)
printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)warn.rta/1000);
else if (status==STATE_CRITICAL && host->rta_status==status)
printf(" rta %0.3fms > %0.3fms", (float)host->rta / 1000, (float)crit.rta/1000);
}
/* pl text output */
if (pl_mode) {
if (status == STATE_OK)
printf(" lost %u%%", host->pl);
else if (status==STATE_WARNING && host->pl_status==status)
printf(" lost %u%% > %u%%", host->pl, warn.pl);
else if (status==STATE_CRITICAL && host->pl_status==status)
printf(" lost %u%% > %u%%", host->pl, crit.pl);
}
/* jitter text output */
if (jitter_mode) {
if (status == STATE_OK)
printf(" jitter %0.3fms", (float)host->jitter);
else if (status==STATE_WARNING && host->jitter_status==status)
printf(" jitter %0.3fms > %0.3fms", (float)host->jitter, warn.jitter);
else if (status==STATE_CRITICAL && host->jitter_status==status)
printf(" jitter %0.3fms > %0.3fms", (float)host->jitter, crit.jitter);
}
/* mos text output */
if (mos_mode) {
if (status == STATE_OK)
printf(" MOS %0.1f", (float)host->mos);
else if (status==STATE_WARNING && host->mos_status==status)
printf(" MOS %0.1f < %0.1f", (float)host->mos, (float)warn.mos);
else if (status==STATE_CRITICAL && host->mos_status==status)
printf(" MOS %0.1f < %0.1f", (float)host->mos, (float)crit.mos);
}
/* score text output */
if (score_mode) {
if (status == STATE_OK)
printf(" Score %u", (int)host->score);
else if (status==STATE_WARNING && host->score_status==status )
printf(" Score %u < %u", (int)host->score, (int)warn.score);
else if (status==STATE_CRITICAL && host->score_status==status )
printf(" Score %u < %u", (int)host->score, (int)crit.score);
}
/* order statis text output */
if (order_mode) {
if (status == STATE_OK)
printf(" Packets in order");
else if (status==STATE_CRITICAL && host->order_status==status)
printf(" Packets out of order");
}
}
else { /* !icmp_recv */
printf("%s: rta %0.3fms, lost %u%%",
host->name, host->rta / 1000, host->pl);
}
host = host->next;
}
/* iterate once more for pretty perfparse output */
printf("|");
if (!(!rta_mode && !pl_mode && !jitter_mode && !score_mode && !mos_mode && order_mode)) {
printf("|");
}
i = 0;
host = list;
while(host) {
if(debug) puts("");
printf("%srta=%0.3fms;%0.3f;%0.3f;0; %spl=%u%%;%u;%u;; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ",
if (rta_mode && host->pl<100) {
printf("%srta=%0.3fms;%0.3f;%0.3f;0; %srtmax=%0.3fms;;;; %srtmin=%0.3fms;;;; ",
(targets > 1) ? host->name : "",
host->rta / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000,
(targets > 1) ? host->name : "", host->pl, warn.pl, crit.pl,
(targets > 1) ? host->name : "", (float)host->rtmax / 1000,
(targets > 1) ? host->name : "", (host->rtmin < INFINITY) ? (float)host->rtmin / 1000 : (float)0);
}
if (pl_mode) {
printf("%spl=%u%%;%u;%u;0;100 ", (targets > 1) ? host->name : "", host->pl, warn.pl, crit.pl);
}
if (jitter_mode && host->pl<100) {
printf("%sjitter_avg=%0.3fms;%0.3f;%0.3f;0; %sjitter_max=%0.3fms;;;; %sjitter_min=%0.3fms;;;; ",
(targets > 1) ? host->name : "",
(float)host->jitter,
(float)warn.jitter,
(float)crit.jitter,
(targets > 1) ? host->name : "",
(float)host->jitter_max / 1000, (targets > 1) ? host->name : "",
(float)host->jitter_min / 1000
);
}
if (mos_mode && host->pl<100) {
printf("%smos=%0.1f;%0.1f;%0.1f;0;5 ",
(targets > 1) ? host->name : "",
(float)host->mos,
(float)warn.mos,
(float)crit.mos
);
}
if (score_mode && host->pl<100) {
printf("%sscore=%u;%u;%u;0;100 ",
(targets > 1) ? host->name : "",
(int)host->score,
(int)warn.score,
(int)crit.score
);
}
host = host->next;
}
@ -1312,6 +1678,7 @@ add_target_ip(char *arg, struct sockaddr_storage *in)
/* set the values. use calling name for output */
host->name = strdup(arg);
/* fill out the sockaddr_storage struct */
if(address_family == AF_INET) {
host_sin = (struct sockaddr_in *)&host->saddr_in;
@ -1324,7 +1691,22 @@ add_target_ip(char *arg, struct sockaddr_storage *in)
memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr, sizeof host_sin6->sin6_addr.s6_addr);
}
/* fill out the sockaddr_in struct */
host->rtmin = INFINITY;
host->rtmax = 0;
host->jitter=0;
host->jitter_max=0;
host->jitter_min=INFINITY;
host->last_tdiff=0;
host->order_status=STATE_OK;
host->last_icmp_seq=0;
host->rta_status=0;
host->pl_status=0;
host->jitter_status=0;
host->mos_status=0;
host->score_status=0;
host->pl_status=0;
if(!list) list = cursor = host;
else cursor->next = host;
@ -1408,7 +1790,7 @@ add_target(char *arg)
}
break;
}
freeaddrinfo(res);
freeaddrinfo(res);
return 0;
}
@ -1472,7 +1854,7 @@ get_timevar(const char *str)
/* unit might be given as ms|m (millisec),
* us|u (microsec) or just plain s, for seconds */
u = p = '\0';
p = '\0';
u = str[len - 1];
if(len >= 2 && !isdigit((int)str[len - 2])) p = str[len - 2];
if(p && u == 's') u = p;
@ -1530,6 +1912,81 @@ get_threshold(char *str, threshold *th)
return 0;
}
/*
* This functions receives a pointer to a string which should contain a threshold for the
* rta, packet_loss, jitter, mos or score mode in the form number,number[m|%]* assigns the
* parsed number to the corresponding threshold variable.
* @param[in,out] str String containing the given threshold values
* @param[in] length strlen(str)
* @param[out] warn Pointer to the warn threshold struct to which the values should be assigned
* @param[out] crit Pointer to the crit threshold struct to which the values should be assigned
* @param[in] mode Determines whether this a threshold for rta, packet_loss, jitter, mos or score (exclusively)
*/
static bool get_threshold2(char *str, size_t length, threshold *warn, threshold *crit, threshold_mode mode) {
if (!str || !length || !warn || !crit) return false;
// p points to the last char in str
char *p = &str[length - 1];
// first_iteration is bof-stop on stupid libc's
bool first_iteration = true;
while(p != &str[0]) {
if( (*p == 'm') || (*p == '%') ) {
*p = '\0';
} else if(*p == ',' && !first_iteration) {
*p = '\0'; /* reset it so get_timevar(str) works nicely later */
char *start_of_value = p + 1;
if (!parse_threshold2_helper(start_of_value, strlen(start_of_value), crit, mode)){
return false;
}
}
first_iteration = false;
p--;
}
return parse_threshold2_helper(p, strlen(p), warn, mode);
}
static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, threshold_mode mode) {
char *resultChecker = {0};
switch (mode) {
case const_rta_mode:
thr->rta = strtod(s, &resultChecker) * 1000;
break;
case const_packet_loss_mode:
thr->pl = (unsigned char)strtoul(s, &resultChecker, 0);
break;
case const_jitter_mode:
thr->jitter = strtod(s, &resultChecker);
break;
case const_mos_mode:
thr->mos = strtod(s, &resultChecker);
break;
case const_score_mode:
thr->score = strtod(s, &resultChecker);
break;
}
if (resultChecker == s) {
// Failed to parse
return false;
}
if (resultChecker != (s + length)) {
// Trailing symbols
return false;
}
return true;
}
unsigned short
icmp_checksum(uint16_t *p, size_t n)
{
@ -1555,74 +2012,91 @@ icmp_checksum(uint16_t *p, size_t n)
void
print_help(void)
{
/*print_revision (progname);*/ /* FIXME: Why? */
printf ("Copyright (c) 2005 Andreas Ericsson <ae@op5.se>\n");
/*print_revision (progname);*/ /* FIXME: Why? */
printf (COPYRIGHT, copyright, email);
printf ("Copyright (c) 2005 Andreas Ericsson <ae@op5.se>\n");
printf (COPYRIGHT, copyright, email);
printf ("\n\n");
printf ("\n\n");
print_usage ();
print_usage ();
printf (UT_HELP_VRSN);
printf (UT_EXTRA_OPTS);
printf (UT_HELP_VRSN);
printf (UT_EXTRA_OPTS);
printf (" %s\n", "-H");
printf (" %s\n", _("specify a target"));
printf (" %s\n", "[-4|-6]");
printf (" %s\n", _("Use IPv4 (default) or IPv6 to communicate with the targets"));
printf (" %s\n", "-w");
printf (" %s", _("warning threshold (currently "));
printf ("%0.3fms,%u%%)\n", (float)warn.rta / 1000, warn.pl);
printf (" %s\n", "-c");
printf (" %s", _("critical threshold (currently "));
printf ("%0.3fms,%u%%)\n", (float)crit.rta / 1000, crit.pl);
printf (" %s\n", "-H");
printf (" %s\n", _("specify a target"));
printf (" %s\n", "[-4|-6]");
printf (" %s\n", _("Use IPv4 (default) or IPv6 to communicate with the targets"));
printf (" %s\n", "-w");
printf (" %s", _("warning threshold (currently "));
printf ("%0.3fms,%u%%)\n", (float)warn.rta / 1000, warn.pl);
printf (" %s\n", "-c");
printf (" %s", _("critical threshold (currently "));
printf ("%0.3fms,%u%%)\n", (float)crit.rta / 1000, crit.pl);
printf (" %s\n", "-s");
printf (" %s\n", _("specify a source IP address or device name"));
printf (" %s\n", "-n");
printf (" %s", _("number of packets to send (currently "));
printf ("%u)\n",packets);
printf (" %s\n", "-i");
printf (" %s", _("max packet interval (currently "));
printf ("%0.3fms)\n",(float)pkt_interval / 1000);
printf (" %s\n", "-I");
printf (" %s", _("max target interval (currently "));
printf ("%0.3fms)\n", (float)target_interval / 1000);
printf (" %s\n", "-m");
printf (" %s",_("number of alive hosts required for success"));
printf ("\n");
printf (" %s\n", "-l");
printf (" %s", _("TTL on outgoing packets (currently "));
printf ("%u)\n", ttl);
printf (" %s\n", "-t");
printf (" %s",_("timeout value (seconds, currently "));
printf ("%u)\n", timeout);
printf (" %s\n", "-b");
printf (" %s\n", _("Number of icmp data bytes to send"));
printf (" %s %u + %d)\n", _("Packet size will be data bytes + icmp header (currently"),icmp_data_size, ICMP_MINLEN);
printf (" %s\n", "-v");
printf (" %s\n", _("verbose"));
printf (" %s\n", "-R");
printf (" %s\n", _("RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms"));
printf (" %s\n", "-P");
printf (" %s\n", _("packet loss mode, ex. 40%,50% , unit in %"));
printf (" %s\n", "-J");
printf (" %s\n", _("jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms "));
printf (" %s\n", "-M");
printf (" %s\n", _("MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0"));
printf (" %s\n", "-S");
printf (" %s\n", _("score mode, max value 100 warning,critical, ex. 80,70 "));
printf (" %s\n", "-O");
printf (" %s\n", _("detect out of order ICMP packts "));
printf (" %s\n", "-H");
printf (" %s\n", _("specify a target"));
printf (" %s\n", "-s");
printf (" %s\n", _("specify a source IP address or device name"));
printf (" %s\n", "-n");
printf (" %s", _("number of packets to send (currently "));
printf ("%u)\n",packets);
printf (" %s\n", "-p");
printf (" %s", _("number of packets to send (currently "));
printf ("%u)\n",packets);
printf (" %s\n", "-i");
printf (" %s", _("max packet interval (currently "));
printf ("%0.3fms)\n",(float)pkt_interval / 1000);
printf (" %s\n", "-I");
printf (" %s", _("max target interval (currently "));
printf ("%0.3fms)\n", (float)target_interval / 1000);
printf (" %s\n", "-m");
printf (" %s",_("number of alive hosts required for success"));
printf ("\n");
printf (" %s\n", "-l");
printf (" %s", _("TTL on outgoing packets (currently "));
printf ("%u)\n", ttl);
printf (" %s\n", "-t");
printf (" %s",_("timeout value (seconds, currently "));
printf ("%u)\n", timeout);
printf (" %s\n", "-b");
printf (" %s\n", _("Number of icmp data bytes to send"));
printf (" %s %u + %d)\n", _("Packet size will be data bytes + icmp header (currently"),icmp_data_size, ICMP_MINLEN);
printf (" %s\n", "-v");
printf (" %s\n", _("verbose"));
printf ("\n");
printf ("%s\n", _("Notes:"));
printf (" %s\n", _("If none of R,P,J,M,S or O is specified, default behavior is -R -P"));
printf (" %s\n", _("The -H switch is optional. Naming a host (or several) to check is not."));
printf ("\n");
printf (" %s\n", _("Threshold format for -w and -c is 200.25,60% for 200.25 msec RTA and 60%"));
printf (" %s\n", _("packet loss. The default values should work well for most users."));
printf (" %s\n", _("You can specify different RTA factors using the standardized abbreviations"));
printf (" %s\n", _("us (microseconds), ms (milliseconds, default) or just plain s for seconds."));
/* -d not yet implemented */
/* printf ("%s\n", _("Threshold format for -d is warn,crit. 12,14 means WARNING if >= 12 hops"));
printf ("%s\n", _("are spent and CRITICAL if >= 14 hops are spent."));
printf ("%s\n\n", _("NOTE: Some systems decrease TTL when forming ICMP_ECHOREPLY, others do not."));*/
printf ("\n");
printf (" %s\n", _("The -v switch can be specified several times for increased verbosity."));
/* printf ("%s\n", _("Long options are currently unsupported."));
printf ("%s\n", _("Options marked with * require an argument"));
*/
printf ("\n");
printf ("%s\n", _("Notes:"));
printf (" %s\n", _("The -H switch is optional. Naming a host (or several) to check is not."));
printf ("\n");
printf (" %s\n", _("Threshold format for -w and -c is 200.25,60% for 200.25 msec RTA and 60%"));
printf (" %s\n", _("packet loss. The default values should work well for most users."));
printf (" %s\n", _("You can specify different RTA factors using the standardized abbreviations"));
printf (" %s\n", _("us (microseconds), ms (milliseconds, default) or just plain s for seconds."));
/* -d not yet implemented */
/* printf ("%s\n", _("Threshold format for -d is warn,crit. 12,14 means WARNING if >= 12 hops"));
printf ("%s\n", _("are spent and CRITICAL if >= 14 hops are spent."));
printf ("%s\n\n", _("NOTE: Some systems decrease TTL when forming ICMP_ECHOREPLY, others do not."));*/
printf ("\n");
printf (" %s\n", _("The -v switch can be specified several times for increased verbosity."));
/* printf ("%s\n", _("Long options are currently unsupported."));
printf ("%s\n", _("Options marked with * require an argument"));
*/
printf (UT_SUPPORT);
printf (UT_SUPPORT);
}
@ -1630,6 +2104,6 @@ print_help(void)
void
print_usage (void)
{
printf ("%s\n", _("Usage:"));
printf(" %s [options] [-H] host1 host2 hostN\n", progname);
printf ("%s\n", _("Usage:"));
printf(" %s [options] [-H] host1 host2 hostN\n", progname);
}

View file

@ -12,14 +12,14 @@ my $allow_sudo = getTestParameter( "NP_ALLOW_SUDO",
"no" );
if ($allow_sudo eq "yes" or $> == 0) {
plan tests => 20;
plan tests => 39;
} else {
plan skip_all => "Need sudo to test check_icmp";
}
my $sudo = $> == 0 ? '' : 'sudo';
my $successOutput = '/OK - .*?: rta (?:[\d\.]+ms)|(?:nan), lost \d+%/';
my $failureOutput = '/(WARNING|CRITICAL) - .*?: rta [\d\.]+ms, lost \d%/';
my $successOutput = '/OK - .*? rta (?:[\d\.]+ms)|(?:nan), lost \d+%/';
my $failureOutput = '/(WARNING|CRITICAL) - .*? rta (?:[\d\.]+ms > [\d\.]+ms|nan)/';
my $host_responsive = getTestParameter( "NP_HOST_RESPONSIVE",
"The hostname of system responsive to network requests",
@ -54,7 +54,7 @@ is( $res->return_code, 2, "Syntax ok, with forced critical" );
like( $res->output, $failureOutput, "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100%"
"$sudo ./check_icmp -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100% -t 2"
);
is( $res->return_code, 2, "Timeout - host nonresponsive" );
like( $res->output, '/100%/', "Error contains '100%' string (for 100% packet loss)" );
@ -66,13 +66,13 @@ is( $res->return_code, 3, "No hostname" );
like( $res->output, '/No hosts to check/', "Output with appropriate error message");
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100% -n 1 -m 0"
"$sudo ./check_icmp -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100% -n 1 -m 0 -t 2"
);
is( $res->return_code, 0, "One host nonresponsive - zero required" );
like( $res->output, $successOutput, "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100% -n 1 -m 1"
"$sudo ./check_icmp -H $host_responsive -H $host_nonresponsive -w 10000ms,100% -c 10000ms,100% -n 1 -m 1 -t 2"
);
is( $res->return_code, 0, "One of two host nonresponsive - one required" );
like( $res->output, $successOutput, "Output OK" );
@ -94,3 +94,49 @@ $res = NPTest->testCmd(
);
is( $res->return_code, 0, "Try max packet size" );
like( $res->output, $successOutput, "Output OK - Didn't overflow" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -R 100,100 -n 1 -t 2"
);
is( $res->return_code, 0, "rta works" );
like( $res->output, $successOutput, "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -P 80,90 -n 1 -t 2"
);
is( $res->return_code, 0, "pl works" );
like( $res->output, '/lost 0%/', "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -J 80,90 -t 2"
);
is( $res->return_code, 0, "jitter works" );
like( $res->output, '/jitter \d/', "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -M 4,3 -t 2"
);
is( $res->return_code, 0, "mos works" );
like( $res->output, '/MOS \d/', "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -S 80,70 -t 2"
);
is( $res->return_code, 0, "score works" );
like( $res->output, '/Score \d/', "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -O -t 2"
);
is( $res->return_code, 0, "order works" );
like( $res->output, '/Packets in order/', "Output OK" );
$res = NPTest->testCmd(
"$sudo ./check_icmp -H $host_responsive -O -S 80,70 -M 4,3 -J 80,90 -P 80,90 -R 100,100 -t 2"
);
is( $res->return_code, 0, "order works" );
like( $res->output, '/Packets in order/', "Output OK" );
like( $res->output, '/Score \d/', "Output OK" );
like( $res->output, '/MOS \d/', "Output OK" );
like( $res->output, '/jitter \d/', "Output OK" );
like( $res->output, '/lost 0%/', "Output OK" );
like( $res->output, $successOutput, "Output OK" );

View file

@ -226,7 +226,8 @@ if (/\s*(\d*) blocks of size (\d*)\. (\d*) blocks available/) {
my ($total_bytes) = $1 * $2;
my ($occupied_bytes) = $1 * $2 - $avail_bytes;
my ($avail) = $avail_bytes/1024;
my ($capper) = int(($3/$1)*100);
my ($capper);
if ($1!=0) { $capper = int(($3/$1)*100) } else { $capper=100 };
my ($mountpt) = "\\\\$host\\$share";
# TODO : why is the kB the standard unit for args ?

View file

@ -146,7 +146,6 @@ sub bindRemote ($$)
{
my ($in_remotehost, $in_remoteport) = @_;
my $proto = getprotobyname('tcp');
my $sockaddr;
my $that;
my ($name, $aliases,$type,$len,$thataddr) = gethostbyname($in_remotehost);
@ -154,8 +153,7 @@ sub bindRemote ($$)
print "IRCD UNKNOWN: Could not start socket ($!)\n";
exit $ERRORS{"UNKNOWN"};
}
$sockaddr = 'S n a4 x8';
$that = pack($sockaddr, AF_INET, $in_remoteport, $thataddr);
$that = pack_sockaddr_in ($in_remoteport, $thataddr);
if (!connect(ClientSocket, $that)) {
print "IRCD UNKNOWN: Could not connect socket ($!)\n";
exit $ERRORS{"UNKNOWN"};

View file

@ -93,11 +93,11 @@ static int stat_remote_fs = 0;
/* Linked list of filesystem types to omit.
If the list is empty, don't exclude any types. */
static struct name_list *fs_exclude_list;
static struct regex_list *fs_exclude_list = NULL;
/* Linked list of filesystem types to check.
If the list is empty, include all types. */
static struct name_list *fs_include_list;
static struct regex_list *fs_include_list;
static struct name_list *dp_exclude_list;
@ -300,7 +300,7 @@ main (int argc, char **argv)
} else if (me->me_dummy && !show_all_fs) {
continue;
/* Skip excluded fstypes */
} else if (fs_exclude_list && np_find_name (fs_exclude_list, me->me_type)) {
} else if (fs_exclude_list && np_find_regmatch (fs_exclude_list, me->me_type)) {
continue;
/* Skip excluded fs's */
} else if (dp_exclude_list &&
@ -308,7 +308,7 @@ main (int argc, char **argv)
np_find_name (dp_exclude_list, me->me_mountdir))) {
continue;
/* Skip not included fstypes */
} else if (fs_include_list && !np_find_name (fs_include_list, me->me_type)) {
} else if (fs_include_list && !np_find_regmatch(fs_include_list, me->me_type)) {
continue;
}
}
@ -543,7 +543,7 @@ process_arguments (int argc, char **argv)
if (argc < 2)
return ERROR;
np_add_name(&fs_exclude_list, "iso9660");
np_add_regex(&fs_exclude_list, "iso9660", REG_EXTENDED);
for (c = 1; c < argc; c++)
if (strcmp ("-to", argv[c]) == 0)
@ -716,10 +716,18 @@ process_arguments (int argc, char **argv)
np_add_name(&dp_exclude_list, optarg);
break;
case 'X': /* exclude file system type */
np_add_name(&fs_exclude_list, optarg);
err = np_add_regex(&fs_exclude_list, optarg, REG_EXTENDED);
if (err != 0) {
regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
}
break;
case 'N': /* include file system type */
np_add_name(&fs_include_list, optarg);
err = np_add_regex(&fs_include_list, optarg, REG_EXTENDED);
if (err != 0) {
regerror (err, &fs_exclude_list->regex, errbuf, MAX_INPUT_BUFFER);
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"), _("Could not compile regular expression"), errbuf);
}
break;
case 'v': /* verbose */
verbose++;
@ -1003,10 +1011,10 @@ print_help (void)
printf (" %s\n", "-u, --units=STRING");
printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)"));
printf (UT_VERBOSE);
printf (" %s\n", "-X, --exclude-type=TYPE");
printf (" %s\n", _("Ignore all filesystems of indicated type (may be repeated)"));
printf (" %s\n", "-N, --include-type=TYPE");
printf (" %s\n", _("Check only filesystems of indicated type (may be repeated)"));
printf (" %s\n", "-X, --exclude-type=TYPE_REGEX");
printf (" %s\n", _("Ignore all filesystems of types matching given regex(7) (may be repeated)"));
printf (" %s\n", "-N, --include-type=TYPE_REGEX");
printf (" %s\n", _("Check only filesystems where the type matches this given regex(7) (may be repeated)"));
printf ("\n");
printf ("%s\n", _("General usage hints:"));
@ -1037,7 +1045,7 @@ print_usage (void)
printf ("%s\n", _("Usage:"));
printf (" %s {-w absolute_limit |-w percentage_limit%% | -W inode_percentage_limit } {-c absolute_limit|-c percentage_limit%% | -K inode_percentage_limit } {-p path | -x device}\n", progname);
printf ("[-C] [-E] [-e] [-f] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]\n");
printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n");
printf ("[-t timeout] [-u unit] [-v] [-X type_regex] [-N type]\n");
}
bool

View file

@ -60,6 +60,8 @@
# define SIG_ERR ((Sigfunc *)-1)
#endif
#include "../lib/maxfd.h"
/* This variable must be global, since there's no way the caller
* can forcibly slay a dead or ungainly running program otherwise.
* Multithreading apps and plugins can initialize it (via NP_RUNCMD_INIT)

View file

@ -308,6 +308,9 @@ msgstr "UNKNOWN"
msgid "Must set a threshold value before using -p\n"
msgstr ""
msgid "Could not compile regular expression"
msgstr ""
msgid "Must set -E before selecting paths\n"
msgstr ""
@ -319,9 +322,6 @@ msgid ""
"explicitly"
msgstr ""
msgid "Could not compile regular expression"
msgstr ""
msgid ""
"Must set a threshold value before using -r/-R/-A (--ereg-path/--eregi-path/--"
"all)\n"
@ -446,10 +446,13 @@ msgstr ""
msgid "Choose bytes, kB, MB, GB, TB (default: MB)"
msgstr ""
msgid "Ignore all filesystems of indicated type (may be repeated)"
msgid ""
"Ignore all filesystems of types matching given regex(7) (may be repeated)"
msgstr ""
msgid "Check only filesystems of indicated type (may be repeated)"
msgid ""
"Check only filesystems where the type matches this given regex(7) (may be "
"repeated)"
msgstr ""
msgid "General usage hints:"
@ -5080,6 +5083,25 @@ msgstr "Warning threshold Integer sein"
msgid "critical threshold (currently "
msgstr "Critical threshold muss ein Integer sein"
msgid ""
"RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms"
msgstr ""
msgid "packet loss mode, ex. 40%,50% , unit in %"
msgstr ""
msgid "jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms "
msgstr ""
msgid "MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0"
msgstr ""
msgid "score mode, max value 100 warning,critical, ex. 80,70 "
msgstr ""
msgid "detect out of order ICMP packts "
msgstr ""
#, fuzzy
msgid "specify a source IP address or device name"
msgstr "Hostname oder Serveradresse muss angegeben werden"
@ -5111,6 +5133,9 @@ msgstr ""
msgid "verbose"
msgstr ""
msgid "If none of R,P,J,M,S or O is specified, default behavior is -R -P"
msgstr ""
msgid "The -H switch is optional. Naming a host (or several) to check is not."
msgstr ""

View file

@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: devel@monitoring-plugins.org\n"
"POT-Creation-Date: 2023-09-22 15:36+0200\n"
"POT-Creation-Date: 2023-10-01 00:46+0200\n"
"PO-Revision-Date: 2010-04-21 23:38-0400\n"
"Last-Translator: \n"
"Language-Team: Monitoring Plugin Development Team <devel@monitoring-plugins."
@ -307,6 +307,9 @@ msgstr "INCONNU"
msgid "Must set a threshold value before using -p\n"
msgstr ""
msgid "Could not compile regular expression"
msgstr "Impossible de compiler l'expression rationnelle"
msgid "Must set -E before selecting paths\n"
msgstr ""
@ -318,9 +321,6 @@ msgid ""
"explicitly"
msgstr ""
msgid "Could not compile regular expression"
msgstr "Impossible de compiler l'expression rationnelle"
msgid ""
"Must set a threshold value before using -r/-R/-A (--ereg-path/--eregi-path/--"
"all)\n"
@ -461,13 +461,17 @@ msgstr ""
msgid "Choose bytes, kB, MB, GB, TB (default: MB)"
msgstr "Choisissez octets, kb, MB, GB, TB (par défaut: MB)"
msgid "Ignore all filesystems of indicated type (may be repeated)"
#, fuzzy
msgid ""
"Ignore all filesystems of types matching given regex(7) (may be repeated)"
msgstr ""
"Ignorer tout les systèmes de fichiers qui correspondent au type indiqué "
"(peut être utilisé plusieurs fois)"
#, fuzzy
msgid "Check only filesystems of indicated type (may be repeated)"
msgid ""
"Check only filesystems where the type matches this given regex(7) (may be "
"repeated)"
msgstr ""
"Ignorer tout les systèmes de fichiers qui correspondent au type indiqué "
"(peut être utilisé plusieurs fois)"
@ -5280,6 +5284,25 @@ msgstr "Valeurs pour le seuil d'avertissement (actuellement "
msgid "critical threshold (currently "
msgstr "Valeurs pour le seuil critique (actuellement "
msgid ""
"RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms"
msgstr ""
msgid "packet loss mode, ex. 40%,50% , unit in %"
msgstr ""
msgid "jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms "
msgstr ""
msgid "MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0"
msgstr ""
msgid "score mode, max value 100 warning,critical, ex. 80,70 "
msgstr ""
msgid "detect out of order ICMP packts "
msgstr ""
msgid "specify a source IP address or device name"
msgstr "spécifiez une adresse ou un nom d'hôte"
@ -5310,6 +5333,9 @@ msgstr ""
msgid "verbose"
msgstr ""
msgid "If none of R,P,J,M,S or O is specified, default behavior is -R -P"
msgstr ""
msgid "The -H switch is optional. Naming a host (or several) to check is not."
msgstr ""
@ -5331,6 +5357,12 @@ msgstr ""
msgid "The -v switch can be specified several times for increased verbosity."
msgstr ""
#, fuzzy
#~ msgid "Check only filesystems of indicated type (may be repeated)"
#~ msgstr ""
#~ "Ignorer tout les systèmes de fichiers qui correspondent au type indiqué "
#~ "(peut être utilisé plusieurs fois)"
#~ msgid "Path or partition (may be repeated)"
#~ msgstr "Répertoire ou partition (peut être utilisé plusieurs fois)"

View file

@ -291,6 +291,9 @@ msgstr ""
msgid "Must set a threshold value before using -p\n"
msgstr ""
msgid "Could not compile regular expression"
msgstr ""
msgid "Must set -E before selecting paths\n"
msgstr ""
@ -302,9 +305,6 @@ msgid ""
"explicitly"
msgstr ""
msgid "Could not compile regular expression"
msgstr ""
msgid ""
"Must set a threshold value before using -r/-R/-A (--ereg-path/--eregi-path/--"
"all)\n"
@ -423,10 +423,13 @@ msgstr ""
msgid "Choose bytes, kB, MB, GB, TB (default: MB)"
msgstr ""
msgid "Ignore all filesystems of indicated type (may be repeated)"
msgid ""
"Ignore all filesystems of types matching given regex(7) (may be repeated)"
msgstr ""
msgid "Check only filesystems of indicated type (may be repeated)"
msgid ""
"Check only filesystems where the type matches this given regex(7) (may be "
"repeated)"
msgstr ""
msgid "General usage hints:"
@ -4905,6 +4908,25 @@ msgstr ""
msgid "critical threshold (currently "
msgstr ""
msgid ""
"RTA, round trip average, mode warning,critical, ex. 100ms,200ms unit in ms"
msgstr ""
msgid "packet loss mode, ex. 40%,50% , unit in %"
msgstr ""
msgid "jitter mode warning,critical, ex. 40.000ms,50.000ms , unit in ms "
msgstr ""
msgid "MOS mode, between 0 and 4.4 warning,critical, ex. 3.5,3.0"
msgstr ""
msgid "score mode, max value 100 warning,critical, ex. 80,70 "
msgstr ""
msgid "detect out of order ICMP packts "
msgstr ""
msgid "specify a source IP address or device name"
msgstr ""
@ -4935,6 +4957,9 @@ msgstr ""
msgid "verbose"
msgstr ""
msgid "If none of R,P,J,M,S or O is specified, default behavior is -R -P"
msgstr ""
msgid "The -H switch is optional. Naming a host (or several) to check is not."
msgstr ""