" -C <file> Configuration file.\n"
" Default: "CONFIGFILE"\n"
" -t Test config and exit.\n"
+ " -T Test plugin read and exit.\n"
" -P <file> PID-file.\n"
" Default: "PIDFILE"\n"
#if COLLECT_DAEMON
struct sigaction sig_pipe_action;
char *configfile = CONFIGFILE;
int test_config = 0;
+ int test_readall = 0;
const char *basedir;
#if COLLECT_DAEMON
struct sigaction sig_chld_action;
pid_t pid;
int daemonize = 1;
#endif
+ int exit_status = 0;
/* read options */
while (1)
{
int c;
- c = getopt (argc, argv, "htC:"
+ c = getopt (argc, argv, "htTC:"
#if COLLECT_DAEMON
"fP:"
#endif
case 't':
test_config = 1;
break;
+ case 'T':
+ test_readall = 1;
+ global_option_set ("ReadThreads", "-1");
+#if COLLECT_DAEMON
+ daemonize = 0;
+#endif /* COLLECT_DAEMON */
+ break;
#if COLLECT_DAEMON
case 'P':
global_option_set ("PIDFile", optarg);
* run the actual loops
*/
do_init ();
- do_loop ();
+
+ if (test_readall)
+ {
+ if (plugin_read_all_once () != 0)
+ exit_status = 1;
+ }
+ else
+ {
+ INFO ("Initialization complete, entering read-loop.");
+ do_loop ();
+ }
/* close syslog */
- INFO ("Exiting normally");
+ INFO ("Exiting normally.");
do_shutdown ();
pidfile_remove ();
#endif /* COLLECT_DAEMON */
- return (0);
+ return (exit_status);
} /* int main */
Set the directory to store CSV-files under. Per default CSV-files are generated
beneath the daemon's working directory, i.E<nbsp>e. the B<BaseDir>.
+The special strings B<stdout> and B<stderr> can be used to write to the standard
+output and standard error channels, respectively. This, of course, only makes
+much sense when collectd is running in foreground- or non-daemon-mode.
=item B<StoreRates> B<true|false>
#endif
#if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
+# undef strcpy
+# undef strcat
+# undef strtok
# pragma GCC poison strcpy strcat strtok
#endif
*/
#ifndef DONT_POISON_SPRINTF_YET
# if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
+# undef sprintf
# pragma GCC poison sprintf
# endif
#endif
Test the configuration only. The program immediately exits after parsing the
config file. A return code not equal to zero indicates an error.
+=item B<-T>
+
+Test the plugin read callbacks only. The program immediately exits after invoking
+the read callbacks once. A return code not equal to zero indicates an error.
+
=item B<-P> I<E<lt>pid-fileE<gt>>
Specify an alternative pid file. This overwrites any settings in the config
static char *datadir = NULL;
static int store_rates = 0;
+static int use_stdio = 0;
static int value_list_to_string (char *buffer, int buffer_len,
const data_set_t *ds, const value_list_t *vl)
return (-1);
offset += status;
+ if (!use_stdio)
{
time_t now;
struct tm stm;
{
if (datadir != NULL)
free (datadir);
+ if (strcasecmp ("stdout", value) == 0)
+ {
+ use_stdio = 1;
+ return (0);
+ }
+ else if (strcasecmp ("stderr", value) == 0)
+ {
+ use_stdio = 2;
+ return (0);
+ }
datadir = strdup (value);
if (datadir != NULL)
{
if (value_list_to_string (values, sizeof (values), ds, vl) != 0)
return (-1);
+ if (use_stdio)
+ {
+ fprintf (use_stdio == 1 ? stdout : stderr,
+ "%s=%s\n", filename, values);
+ return (0);
+ }
+
if (stat (filename, &statbuf) == -1)
{
if (errno == ENOENT)
{
int i;
+ if (read_threads == NULL)
+ return;
+
pthread_mutex_lock (&read_lock);
read_loop = 0;
DEBUG ("plugin: stop_threads: Signalling `read_cond'");
int num;
rt = global_option_get ("ReadThreads");
num = atoi (rt);
- start_threads ((num > 0) ? num : 5);
+ if (num != -1)
+ start_threads ((num > 0) ? num : 5);
}
} /* void plugin_init_all */
pthread_mutex_unlock (&read_lock);
} /* void plugin_read_all */
+/* Read function called when the `-T' command line argument is given. */
+int plugin_read_all_once (void)
+{
+ llentry_t *le;
+ read_func_t *rf;
+ int status;
+ int return_status = 0;
+
+ if (list_read == NULL)
+ {
+ NOTICE ("No read-functions are registered.");
+ return (0);
+ }
+
+ for (le = llist_head (list_read);
+ le != NULL;
+ le = le->next)
+ {
+ rf = (read_func_t *) le->value;
+ status = rf->callback ();
+ if (status != 0)
+ {
+ NOTICE ("read-function of plugin `%s' failed.",
+ le->key);
+ return_status = -1;
+ }
+ }
+
+ return (return_status);
+} /* int plugin_read_all_once */
+
int plugin_write (const char *plugin, /* {{{ */
const data_set_t *ds, const value_list_t *vl)
{
void plugin_init_all (void);
void plugin_read_all (void);
+int plugin_read_all_once (void);
void plugin_shutdown_all (void);
/*