X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fexec.c;h=20e65df0a2656f5eb4204aef28cad181579f5ff5;hb=54ada5ddddb3692d8ec3493fbf4a5fd7aa39b5d1;hp=e7648bd7f3f66e7be405dd4042e8cf0d839b9b38;hpb=2e8ad93a2f3856644a74fb508d10a9e8e4704293;p=collectd.git diff --git a/src/exec.c b/src/exec.c index e7648bd7..20e65df0 100644 --- a/src/exec.c +++ b/src/exec.c @@ -35,7 +35,6 @@ #define PL_NORMAL 0x01 #define PL_NOTIF_ACTION 0x02 -#define PL_NAGIOS_PLUGIN 0x04 #define PL_RUNNING 0x10 @@ -128,9 +127,7 @@ static int exec_config_exec (oconfig_item_t *ci) /* {{{ */ } memset (pl, '\0', sizeof (program_list_t)); - if (strcasecmp ("NagiosExec", ci->key) == 0) - pl->flags |= PL_NAGIOS_PLUGIN; - else if (strcasecmp ("NotificationExec", ci->key) == 0) + if (strcasecmp ("NotificationExec", ci->key) == 0) pl->flags |= PL_NOTIF_ACTION; else pl->flags |= PL_NORMAL; @@ -253,7 +250,6 @@ static int exec_config (oconfig_item_t *ci) /* {{{ */ { oconfig_item_t *child = ci->children + i; if ((strcasecmp ("Exec", child->key) == 0) - || (strcasecmp ("NagiosExec", child->key) == 0) || (strcasecmp ("NotificationExec", child->key) == 0)) exec_config_exec (child); else @@ -329,6 +325,25 @@ static void exec_child (program_list_t *pl) /* {{{ */ } } /* if (pl->group == NULL) */ +#if HAVE_SETGROUPS + if (getuid () == 0) + { + gid_t glist[2]; + size_t glist_len; + + glist[0] = gid; + glist_len = 1; + + if ((gid != egid) && (egid != -1)) + { + glist[1] = egid; + glist_len = 2; + } + + setgroups (glist_len, glist); + } +#endif /* HAVE_SETGROUPS */ + status = setgid (gid); if (status != 0) { @@ -523,9 +538,6 @@ static void *exec_read_one (void *arg) /* {{{ */ DEBUG ("exec plugin: exec_read_one: buffer = %s", buffer); - if (pl->flags & PL_NAGIOS_PLUGIN) - break; - parse_line (buffer); } /* while (fgets) */ @@ -537,29 +549,6 @@ static void *exec_read_one (void *arg) /* {{{ */ DEBUG ("exec plugin: Child %i exited with status %i.", (int) pl->pid, pl->status); - if (pl->flags & PL_NAGIOS_PLUGIN) - { - notification_t n; - - memset (&n, '\0', sizeof (n)); - - n.severity = NOTIF_FAILURE; - if (pl->status == 0) - n.severity = NOTIF_OKAY; - else if (pl->status == 1) - n.severity = NOTIF_WARNING; - - strncpy (n.message, buffer, sizeof (n.message)); - n.message[sizeof (n.message) - 1] = '\0'; - - n.time = time (NULL); - - strncpy (n.host, hostname_g, sizeof (n.host)); - n.host[sizeof (n.host) - 1] = '\0'; - - plugin_dispatch_notification (&n); - } - pl->pid = 0; pthread_mutex_lock (&pl_lock); @@ -581,8 +570,10 @@ static void *exec_notification_one (void *arg) /* {{{ */ const char *severity; pid = fork_child (pl, &fd, NULL); - if (pid < 0) + if (pid < 0) { + sfree (arg); pthread_exit ((void *) 1); + } fh = fdopen (fd, "w"); if (fh == NULL) @@ -593,6 +584,7 @@ static void *exec_notification_one (void *arg) /* {{{ */ kill (pl->pid, SIGTERM); pl->pid = 0; close (fd); + sfree (arg); pthread_exit ((void *) 1); } @@ -602,10 +594,10 @@ static void *exec_notification_one (void *arg) /* {{{ */ else if (n->severity == NOTIF_OKAY) severity = "OKAY"; - fprintf (fh, "Severity: %s\n" - "Time: %u\n" - "Message: %s\n", - severity, (unsigned int) n->time, n->message); + fprintf (fh, + "Severity: %s\n" + "Time: %u\n", + severity, (unsigned int) n->time); /* Print the optional fields */ if (strlen (n->host) > 0) @@ -619,8 +611,7 @@ static void *exec_notification_one (void *arg) /* {{{ */ if (strlen (n->type_instance) > 0) fprintf (fh, "TypeInstance: %s\n", n->type_instance); - /* Newline signalling end of data */ - fprintf (fh, "\n"); + fprintf (fh, "\n%s\n", n->message); fflush (fh); fclose (fh); @@ -655,8 +646,8 @@ static int exec_read (void) /* {{{ */ pthread_t t; pthread_attr_t attr; - /* Only execute `normal' and `nagios' style executables here. */ - if ((pl->flags & (PL_NAGIOS_PLUGIN | PL_NORMAL)) == 0) + /* Only execute `normal' style executables here. */ + if ((pl->flags & PL_NORMAL) == 0) continue; pthread_mutex_lock (&pl_lock);