From: Florian Forster Date: Sat, 28 Oct 2006 08:16:44 +0000 (+0200) Subject: Merge branch 'master' into ff/dns X-Git-Tag: collectd-3.11.0~42^2~2 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=db71b0fa19cc0217f1460499f891a36ecc8f1c8e;hp=0acab9c5f701246e62b4501d93f82bd3bd9846d2;p=collectd.git Merge branch 'master' into ff/dns --- diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/configure.in b/configure.in index 48eb9015..5956ec58 100644 --- a/configure.in +++ b/configure.in @@ -329,7 +329,7 @@ AC_CHECK_FUNCS(getifaddrs) # For mount interface AC_CHECK_FUNCS(getfsent getvfsent listmntent) -AC_CHECK_FUNCS(getfsstat) +AC_CHECK_FUNCS(getfsstat getvfsstat) # Check for different versions of `getmntent' here.. AC_FUNC_GETMNTENT diff --git a/src/collectd.c b/src/collectd.c index 0d9c90fc..98b9a162 100644 --- a/src/collectd.c +++ b/src/collectd.c @@ -123,6 +123,8 @@ static void exit_usage (char *name) " General:\n" " -C Configuration file.\n" " Default: "CONFIGFILE"\n" + " -P PID-file.\n" + " Default: "PIDFILE"\n" #if COLLECT_DAEMON " -f Don't fork to the background.\n" #endif @@ -281,7 +283,7 @@ int main (int argc, char **argv) char *configfile = CONFIGFILE; #if COLLECT_DAEMON struct sigaction sigChldAction; - char *pidfile = PIDFILE; + char *pidfile = NULL; pid_t pid; int daemonize = 1; #endif @@ -305,7 +307,7 @@ int main (int argc, char **argv) c = getopt (argc, argv, "hC:" #if COLLECT_DAEMON - "f" + "fP:" #endif ); @@ -318,6 +320,9 @@ int main (int argc, char **argv) configfile = optarg; break; #if COLLECT_DAEMON + case 'P': + pidfile = optarg; + break; case 'f': daemonize = 0; break; @@ -368,7 +373,8 @@ int main (int argc, char **argv) sigChldAction.sa_handler = SIG_IGN; sigaction (SIGCHLD, &sigChldAction, NULL); - if ((pidfile = cf_get_option ("PIDFile", PIDFILE)) == NULL) + if ((pidfile == NULL) + && ((pidfile = cf_get_option ("PIDFile", PIDFILE)) == NULL)) { fprintf (stderr, "Cannot obtain pidfile. This shoud not happen. Ever."); return (1); diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index f3e25856..7e4b858e 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -49,7 +49,8 @@ will be mostly useless. The names of the plugins are listed in L. =item B I Sets where to write the PID file to. This file is overwritten when it exists -and deleted when the program ist stopped. Available in B. +and deleted when the program ist stopped. Some init-scripts might override this +setting using the B<-P> commandline option. Available in B. =item B I diff --git a/src/collectd.pod b/src/collectd.pod index fcad4609..0e1adc50 100644 --- a/src/collectd.pod +++ b/src/collectd.pod @@ -110,6 +110,13 @@ Specify an alternative config file. This is the place to go when you wish to change B's behavior. The path may be relative to the current working directory. +=item B<-P> Ipid-fileE> + +Specify an alternative pid file. This overwrites any settings in the config +file. This is thought for init-scripts that require the PID-file in a certain +directory to work correctly. For everyday-usage use the B +config-option. + =item B<-f> Don't fork to the background. I will also B close standard file @@ -124,19 +131,19 @@ Output usage information and exit. =head1 MODES -collectd can operate in three different operating modes. The modes are -described below. +collectd can operate in four different operating modes. The modes are described +below. The simplest mode is the so called B. Data is collected locally and written in RRD files that reside in I. This is the default mode when collectd is linked against C. -The other modes, B and B, are used to send data over -a network and receive it again. +The modes B and B are used to send data over a +network and receive it again. In B the daemon collects the data locally and sends its results -to one or more network addresses. No RRD files are written in this case. This -is the only mode available if collectd is not linked against C. +to one or more network addresses. No RRD files are written locally in this +case. If collectd is not linked against C this is the default mode. If started in B the daemon will listen on one or more interfaces and write the data it receives to RRD files. No data is collected locally. diff --git a/src/ping.c b/src/ping.c index 8e2c50b4..2a2f03eb 100644 --- a/src/ping.c +++ b/src/ping.c @@ -31,7 +31,17 @@ #include #include "liboping/oping.h" +struct hostlist_s +{ + char *host; + int wait_time; + int wait_left; + struct hostlist_s *next; +}; +typedef struct hostlist_s hostlist_t; + static pingobj_t *pingobj = NULL; +static hostlist_t *hosts = NULL; static char *file_template = "ping-%s.rrd"; @@ -50,9 +60,59 @@ static char *config_keys[] = }; static int config_keys_num = 2; +static void add_hosts (void) +{ + hostlist_t *hl_this; + hostlist_t *hl_prev; + + int step = atoi (COLLECTD_STEP); + + hl_this = hosts; + hl_prev = NULL; + while (hl_this != NULL) + { + DBG ("host = %s, wait_left = %i, wait_time = %i, next = %p", + hl_this->host, hl_this->wait_left, hl_this->wait_time, (void *) hl_this->next); + + if (hl_this->wait_left <= 0) + { + if (ping_host_add (pingobj, hl_this->host) == 0) + { + DBG ("Successfully added host %s", hl_this->host); + /* Remove the host from the linked list */ + if (hl_prev != NULL) + hl_prev->next = hl_this->next; + else + hosts = hl_this->next; + free (hl_this->host); + free (hl_this); + hl_this = (hl_prev != NULL) ? hl_prev : hosts; + } + else + { + hl_this->wait_left = hl_this->wait_time; + hl_this->wait_time *= 2; + if (hl_this->wait_time > 86400) + hl_this->wait_time = 86400; + } + } + else + { + hl_this->wait_left -= step; + } + + if (hl_this != NULL) + { + hl_prev = hl_this; + hl_this = hl_this->next; + } + } +} + static void ping_init (void) { - return; + if (hosts != NULL) + add_hosts (); } static int ping_config (char *key, char *value) @@ -69,12 +129,29 @@ static int ping_config (char *key, char *value) if (strcasecmp (key, "host") == 0) { - if (ping_host_add (pingobj, value) < 0) + hostlist_t *hl; + char *host; + int step = atoi (COLLECTD_STEP); + + if ((hl = (hostlist_t *) malloc (sizeof (hostlist_t))) == NULL) { - syslog (LOG_WARNING, "ping: `ping_host_add' failed: %s", - ping_get_error (pingobj)); + syslog (LOG_ERR, "ping plugin: malloc failed: %s", + strerror (errno)); + return (1); + } + if ((host = strdup (value)) == NULL) + { + free (hl); + syslog (LOG_ERR, "ping plugin: strdup failed: %s", + strerror (errno)); return (1); } + + hl->host = host; + hl->wait_time = 2 * step; + hl->wait_left = 0; + hl->next = hosts; + hosts = hl; } else if (strcasecmp (key, "ttl") == 0) { @@ -130,6 +207,9 @@ static void ping_read (void) if (pingobj == NULL) return; + if (hosts != NULL) + add_hosts (); + if (ping_send (pingobj) < 0) { syslog (LOG_ERR, "ping: `ping_send' failed: %s", diff --git a/src/swap.c b/src/swap.c index f906c99d..43275fc1 100644 --- a/src/swap.c +++ b/src/swap.c @@ -250,7 +250,6 @@ static void swap_read (void) size_t mib_len; struct xsw_usage sw_usage; size_t sw_usage_len; - int status; mib_len = 2; mib[0] = CTL_VM; diff --git a/src/utils_mount.c b/src/utils_mount.c index 176714ce..38ec24f0 100644 --- a/src/utils_mount.c +++ b/src/utils_mount.c @@ -33,7 +33,16 @@ #include "utils_debug.h" #include "utils_mount.h" -#if HAVE_GETFSSTAT +#if HAVE_GETVFSSTAT +# if HAVE_SYS_TYPES_H +# include +# endif +# if HAVE_SYS_STATVFS_H +# include +# endif +/* #endif HAVE_GETVFSSTAT */ + +#elif HAVE_GETFSSTAT # if HAVE_SYS_PARAM_H # include # endif @@ -43,7 +52,7 @@ # if HAVE_SYS_MOUNT_H # include # endif -#endif /* HAVE_GETMNTINFO */ +#endif /* HAVE_GETFSSTAT */ #if HAVE_MNTENT_H # include @@ -413,12 +422,23 @@ static cu_mount_t *cu_mount_listmntent (void) } /* cu_mount_t *cu_mount_listmntent(void) */ /* #endif HAVE_LISTMNTENT */ -/* 4.4BSD and Mac OS X */ -#elif HAVE_GETFSSTAT +/* 4.4BSD and Mac OS X (getfsstat) or NetBSD (getvfsstat) */ +#elif HAVE_GETVFSSTAT || HAVE_GETFSSTAT static cu_mount_t *cu_mount_getfsstat (void) { +#if HAVE_GETVFSSTAT +# define STRUCT_STATFS struct statvfs +# define CMD_STATFS getvfsstat +# define FLAGS_STATFS ST_NOWAIT +/* #endif HAVE_GETVFSSTAT */ +#elif HAVE_GETFSSTAT +# define STRUCT_STATFS struct statfs +# define CMD_STATFS getfsstat +# define FLAGS_STATFS MNT_NOWAIT +#endif /* HAVE_GETFSSTAT */ + int bufsize; - struct statfs *buf; + STRUCT_STATFS *buf; int num; int i; @@ -428,22 +448,22 @@ static cu_mount_t *cu_mount_getfsstat (void) cu_mount_t *new = NULL; /* Get the number of mounted file systems */ - if ((bufsize = getfsstat (NULL, 0, MNT_NOWAIT)) < 1) + if ((bufsize = CMD_STATFS (NULL, 0, FLAGS_STATFS)) < 1) { - DBG ("getfsstat failed: %s", strerror (errno)); + DBG ("getv?fsstat failed: %s", strerror (errno)); return (NULL); } - if ((buf = (struct statfs *) malloc (bufsize * sizeof (struct statfs))) + if ((buf = (STRUCT_STATFS *) malloc (bufsize * sizeof (STRUCT_STATFS))) == NULL) return (NULL); - memset (buf, '\0', bufsize * sizeof (struct statfs)); + memset (buf, '\0', bufsize * sizeof (STRUCT_STATFS)); /* The bufsize needs to be passed in bytes. Really. This is not in the * manpage.. -octo */ - if ((num = getfsstat (buf, bufsize * sizeof (struct statfs), MNT_NOWAIT)) < 1) + if ((num = CMD_STATFS (buf, bufsize * sizeof (STRUCT_STATFS), FLAGS_STATFS)) < 1) { - DBG ("getfsstat failed: %s", strerror (errno)); + DBG ("getv?fsstat failed: %s", strerror (errno)); free (buf); return (NULL); } @@ -479,7 +499,7 @@ static cu_mount_t *cu_mount_getfsstat (void) return (first); } -/* #endif HAVE_GETFSSTAT */ +/* #endif HAVE_GETVFSSTAT || HAVE_GETFSSTAT */ /* Solaris (SunOS 10): int getmntent(FILE *fp, struct mnttab *mp); */ #elif HAVE_GEN_GETMNTENT @@ -620,7 +640,7 @@ cu_mount_t *cu_mount_getlist(cu_mount_t **list) #if HAVE_LISTMNTENT && 0 new = cu_mount_listmntent (); -#elif HAVE_GETFSSTAT +#elif HAVE_GETVFSSTAT || HAVE_GETFSSTAT new = cu_mount_getfsstat (); #elif HAVE_GEN_GETMNTENT new = cu_mount_gen_getmntent ();