mirror of
https://github.com/monitoring-plugins/monitoring-plugins.git
synced 2026-04-22 22:56:58 -04:00
Merge branch 'master' into check_dhcp_rogue_detection
This commit is contained in:
commit
b6d3acf5e3
14 changed files with 827 additions and 143 deletions
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
|
|
@ -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
2
.gitignore
vendored
|
|
@ -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
|
||||
|
|
|
|||
16
configure.ac
16
configure.ac
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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" );
|
||||
|
|
|
|||
|
|
@ -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 ?
|
||||
|
|
|
|||
|
|
@ -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"};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
35
po/de.po
35
po/de.po
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
44
po/fr.po
44
po/fr.po
|
|
@ -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)"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue