Commit 58d10b59 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp Committed by Lasse Karstensen

Go over mgt process's complaining on stderr and syslog and try to

make somewhat more predictable.

Disable syslogging when we're running under varnishtest.
parent fa5727e5
......@@ -29,6 +29,11 @@
* This file contains the heritage passed when mgt forks cache
*/
#ifdef COMMON_PARAMS_H
#error "Multiple includes of common/params.h"
#endif
#define COMMON_PARAMS_H
#include <stdint.h>
#include "vre.h"
......
......@@ -123,6 +123,13 @@ struct choice {
};
const void *pick(const struct choice *cp, const char *which, const char *kind);
extern const char C_ERR[]; // Things are not as they should be
extern const char C_INFO[]; // Normal stuff, keep a record for later
extern const char C_DEBUG[]; // More detail than you'd normally want
extern const char C_SECURITY[]; // Security issues
extern const char C_CLI[]; // CLI traffic between master and child
void MGT_complain(const char *loud, const char *, ...) __v_printflike(2, 3);
/* mgt_param.c */
void MCF_InitParams(struct cli *);
void MCF_CollectParams(void);
......@@ -169,18 +176,20 @@ extern unsigned mgt_vcc_err_unref;
extern unsigned mgt_vcc_allow_inline_c;
extern unsigned mgt_vcc_unsafe_path;
#define REPORT0(pri, fmt) \
do { \
fprintf(stderr, fmt "\n"); \
syslog(pri, fmt); \
} while (0)
#define REPORT(pri, fmt, ...) \
do { \
fprintf(stderr, fmt "\n", __VA_ARGS__); \
syslog(pri, fmt, __VA_ARGS__); \
} while (0)
#if defined(PTHREAD_CANCELED) || defined(PTHREAD_MUTEX_DEFAULT)
#error "Keep pthreads out of in manager process"
#endif
static inline int
MGT_FEATURE(enum feature_bits x)
{
return (mgt_param.feature_bits[(unsigned)x>>3] &
(0x80U >> ((unsigned)x & 7)));
}
static inline int
MGT_DO_DEBUG(enum debug_bits x)
{
return (mgt_param.debug_bits[(unsigned)x>>3] &
(0x80U >> ((unsigned)x & 7)));
}
......@@ -86,20 +86,6 @@ static struct vlu *child_std_vlu;
static struct vsb *child_panic = NULL;
static double mgt_uptime_t0 = 0.;
/* XXX: Doesn't really belong here, but only place we use it */
static inline int
MGT_FEATURE(enum feature_bits x)
{
return (mgt_param.feature_bits[(unsigned)x>>3] &
(0x80U >> ((unsigned)x & 7)));
}
static inline int
MGT_DO_DEBUG(enum debug_bits x)
{
return (mgt_param.debug_bits[(unsigned)x>>3] &
(0x80U >> ((unsigned)x & 7)));
}
static void mgt_reap_child(void);
/*---------------------------------------------------------------------
......@@ -133,7 +119,7 @@ mgt_panic_record(pid_t r)
VSB_quote(child_panic, heritage.panic_str,
strnlen(heritage.panic_str, heritage.panic_str_len), 0);
AZ(VSB_finish(child_panic));
REPORT(LOG_ERR, "Child (%jd) %s",
MGT_complain(C_ERR, "Child (%jd) %s",
(intmax_t)r, VSB_data(child_panic));
}
......@@ -237,7 +223,7 @@ child_line(void *priv, const char *p)
{
(void)priv;
REPORT(LOG_NOTICE, "Child (%jd) said %s", (intmax_t)child_pid, p);
MGT_complain(C_INFO, "Child (%jd) said %s", (intmax_t)child_pid, p);
return (0);
}
......@@ -320,7 +306,7 @@ mgt_launch_child(struct cli *cli)
VCLI_SetResult(cli, CLIS_CANT);
return;
}
REPORT0(LOG_ERR,
MGT_complain(C_ERR,
"Child start failed: could not open sockets");
return;
}
......@@ -394,7 +380,7 @@ mgt_launch_child(struct cli *cli)
exit(0);
}
assert(pid > 1);
REPORT(LOG_NOTICE, "child (%jd) Started", (intmax_t)pid);
MGT_complain(C_DEBUG, "Child (%jd) Started", (intmax_t)pid);
VSC_C_mgt->child_start = ++static_VSC_C_mgt.child_start;
/* Close stuff the child got */
......@@ -432,7 +418,8 @@ mgt_launch_child(struct cli *cli)
mgt_cli_start_child(child_cli_in, child_cli_out);
child_pid = pid;
if (mgt_push_vcls_and_start(&u, &p)) {
REPORT(LOG_ERR, "Pushing vcls failed:\n%s", p);
MGT_complain(C_ERR, "Child (%jd) Pushing vcls failed:\n%s",
(intmax_t)child_pid, p);
free(p);
child_state = CH_RUNNING;
mgt_stop_child();
......@@ -502,7 +489,8 @@ mgt_reap_child(void)
/* Compose obituary */
vsb = VSB_new_auto();
XXXAN(vsb);
VSB_printf(vsb, "Child (%ld) %s", (long)r, status ? "died" : "ended");
VSB_printf(vsb, "Child (%jd) %s", (intmax_t)r,
status ? "died" : "ended");
if (WIFEXITED(status) && WEXITSTATUS(status)) {
VSB_printf(vsb, " status=%d", WEXITSTATUS(status));
exit_status |= 0x20;
......@@ -524,7 +512,7 @@ mgt_reap_child(void)
}
#endif
AZ(VSB_finish(vsb));
REPORT(LOG_INFO, "%s", VSB_data(vsb));
MGT_complain(status ? C_ERR : C_INFO, "%s", VSB_data(vsb));
VSB_delete(vsb);
/* Dispose of shared memory but evacuate panic messages first */
......@@ -548,7 +536,7 @@ mgt_reap_child(void)
child_pid = -1;
REPORT0(LOG_DEBUG, "Child cleanup complete");
MGT_complain(C_DEBUG, "Child cleanup complete");
if (child_state == CH_DIED && mgt_param.auto_restart)
mgt_launch_child(NULL);
......@@ -576,7 +564,7 @@ MGT_Child_Cli_Fail(void)
return;
if (child_pid < 0)
return;
REPORT(LOG_ERR, "Child (%jd) not responding to CLI, killing it.",
MGT_complain(C_ERR, "Child (%jd) not responding to CLI, killing it.",
(intmax_t)child_pid);
if (MGT_FEATURE(FEATURE_NO_COREDUMP))
(void)kill(child_pid, SIGKILL);
......@@ -599,7 +587,7 @@ mgt_stop_child(void)
child_state = CH_STOPPING;
REPORT0(LOG_DEBUG, "Stopping Child");
MGT_complain(C_DEBUG, "Stopping Child");
mgt_reap_child();
}
......@@ -646,7 +634,7 @@ mgt_sigint(const struct vev *e, int what)
(void)e;
(void)what;
REPORT0(LOG_ERR, "Manager got SIGINT");
MGT_complain(C_ERR, "Manager got SIGINT");
(void)fflush(stdout);
if (child_pid >= 0)
mgt_stop_child();
......@@ -716,7 +704,7 @@ MGT_Run(void)
AZ(sigaction(SIGHUP, &sac, NULL));
if (!d_flag && !mgt_has_vcl())
REPORT0(LOG_ERR, "No VCL loaded yet");
MGT_complain(C_ERR, "No VCL loaded yet");
else if (!d_flag) {
mgt_launch_child(NULL);
if (child_state != CH_RUNNING) {
......@@ -730,7 +718,7 @@ MGT_Run(void)
i = vev_schedule(mgt_evb);
if (i != 0)
REPORT(LOG_ERR, "vev_schedule() = %d", i);
MGT_complain(C_ERR, "vev_schedule() = %d", i);
REPORT0(LOG_ERR, "manager dies");
MGT_complain(C_INFO, "manager dies");
}
......@@ -41,7 +41,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include "mgt/mgt.h"
......@@ -58,10 +57,6 @@
#include "mgt_cli.h"
#ifndef LOG_AUTHPRIV
# define LOG_AUTHPRIV 0
#endif
static int cli_i = -1, cli_o = -1;
static struct VCLS *cls;
static const char *secret_file;
......@@ -301,7 +296,7 @@ mcf_auth(struct cli *cli, const char *const *av, void *priv)
VCLI_AuthResponse(fd, cli->challenge, buf);
AZ(close(fd));
if (strcasecmp(buf, av[2])) {
syslog(LOG_WARNING|LOG_AUTHPRIV,
MGT_complain(C_SECURITY,
"CLI Authentication failure from %s", cli->ident);
VCLI_SetResult(cli, CLIS_CLOSE);
return;
......@@ -321,21 +316,20 @@ static struct cli_proto cli_auth[] = {
};
/*--------------------------------------------------------------------*/
static void
mgt_cli_cb_before(const struct cli *cli)
{
if (mgt_param.syslog_cli_traffic)
syslog(LOG_NOTICE, "CLI %s Rd %s", cli->ident, cli->cmd);
MGT_complain(C_CLI, "CLI %s Rd %s", cli->ident, cli->cmd);
}
static void
mgt_cli_cb_after(const struct cli *cli)
{
if (mgt_param.syslog_cli_traffic)
syslog(LOG_NOTICE, "CLI %s Wr %03u %s",
cli->ident, cli->result, VSB_data(cli->sb));
MGT_complain(C_CLI, "CLI %s Wr %03u %s",
cli->ident, cli->result, VSB_data(cli->sb));
}
/*--------------------------------------------------------------------*/
......@@ -610,7 +604,7 @@ Marg_connect(const struct vev *e, int what)
M_fd = VTCP_connected(M_fd);
if (M_fd < 0) {
syslog(LOG_INFO, "Could not connect to CLI-master: %m");
MGT_complain(C_INFO, "Could not connect to CLI-master: %m");
ma = VTAILQ_FIRST(&m_addr_list);
AN(ma);
VTAILQ_REMOVE(&m_addr_list, ma, list);
......
......@@ -210,7 +210,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include "mgt/mgt.h"
......@@ -390,7 +389,7 @@ vjs_setup(enum jail_gen_e jge)
priv_set_t *priv_all;
if (! (priv_all = priv_allocset())) {
REPORT(LOG_ERR,
MGT_complain(C_SECURITY,
"Solaris Jail warning: "
" vjs_setup - priv_allocset failed: errno=%d (%s)",
errno, strerror(errno));
......@@ -423,7 +422,7 @@ vjs_privsep(enum jail_gen_e jge)
if (getuid() != mgt_param.uid)
XXXAZ(setuid(mgt_param.uid));
} else {
REPORT(LOG_INFO,
MGT_complain(C_SECURITY,
"Privilege %s missing, will not change uid/gid",
PRIV_PROC_SETID);
}
......@@ -454,7 +453,7 @@ vjs_waive(enum jail_gen_e jge)
!(inheritable = priv_allocset()) ||
!(permitted = priv_allocset()) ||
!(limited = priv_allocset())) {
REPORT(LOG_ERR,
MGT_complain(C_SECURITY,
"Solaris Jail warning: "
" vjs_waive - priv_allocset failed: errno=%d (%s)",
errno, strerror(errno));
......
......@@ -43,7 +43,6 @@
#include "mgt/mgt.h"
#ifdef __linux__
#include <syslog.h>
#include <sys/prctl.h>
#endif
......@@ -231,7 +230,7 @@ vju_subproc(enum jail_subproc_e jse)
* reenable them again.
*/
if (prctl(PR_SET_DUMPABLE, 1) != 0) {
REPORT0(LOG_INFO,
MGT_complain(C_INFO,
"Could not set dumpable bit. Core dumps turned off\n");
}
#endif
......
......@@ -37,6 +37,7 @@
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
......@@ -120,6 +121,57 @@ build_vident(void)
}
}
/*--------------------------------------------------------------------
* 'Ello, I wish to register a complaint...
*/
#ifndef LOG_AUTHPRIV
# define LOG_AUTHPRIV 0
#endif
const char C_ERR[] = "Error:";
const char C_INFO[] = "Info:";
const char C_DEBUG[] = "Debug:";
const char C_SECURITY[] = "Security:";
const char C_CLI[] = "Cli:";
void
MGT_complain(const char *loud, const char *fmt, ...)
{
va_list ap;
struct vsb *vsb;
int sf;
if (loud == C_CLI && !mgt_param.syslog_cli_traffic)
return;
vsb = VSB_new_auto();
AN(vsb);
va_start(ap, fmt);
VSB_vprintf(vsb, fmt, ap);
va_end(ap);
AZ(VSB_finish(vsb));
if (loud == C_ERR)
sf = LOG_ERR;
else if (loud == C_INFO)
sf = LOG_INFO;
else if (loud == C_DEBUG)
sf = LOG_DEBUG;
else if (loud == C_SECURITY)
sf = LOG_WARNING | LOG_AUTHPRIV;
else if (loud == C_CLI)
sf = LOG_INFO;
else
WRONG("Wrong complaint loudness");
if (loud != C_CLI)
fprintf(stderr, "%s %s\n", loud, VSB_data(vsb));
if (!MGT_DO_DEBUG(DBG_VTC_MODE))
syslog(sf, "%s", VSB_data(vsb));
VSB_delete(vsb);
}
/*--------------------------------------------------------------------*/
const void *
......@@ -755,9 +807,7 @@ main(int argc, char * const *argv)
assert(pfh == NULL || !VPF_Write(pfh));
if (d_flag)
fprintf(stderr, "Platform: %s\n", VSB_data(vident) + 1);
syslog(LOG_NOTICE, "Platform: %s\n", VSB_data(vident) + 1);
MGT_complain(C_DEBUG, "Platform: %s\n", VSB_data(vident) + 1);
mgt_pid = getpid(); /* daemon() changed this */
......
......@@ -54,7 +54,6 @@
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <string.h>
#include <unistd.h>
......@@ -236,7 +235,7 @@ mgt_sandbox_unix(enum sandbox_e who)
* reenable them again.
*/
if (prctl(PR_SET_DUMPABLE, 1) != 0) {
REPORT0(LOG_INFO,
MGT_complain(C_INFO,
"Could not set dumpable bit. Core dumps turned off\n");
}
#endif
......@@ -277,10 +276,10 @@ mgt_sandbox_init(void)
subs = VSUB_run(sb, run_sandbox_test, NULL, "SANDBOX-test", 10);
VSB_delete(sb);
if (subs) {
REPORT0(LOG_INFO, "Warning: init of platform-specific sandbox "
"failed - sandboxing disabled");
REPORT0(LOG_INFO, "Warning: Varnish might run with elevated "
"privileges");
MGT_complain(C_SECURITY,
"Platform-specific sandbox failed - sandboxing disabled");
MGT_complain(C_SECURITY,
"Varnish runs with elevated privileges");
mgt_sandbox = mgt_sandbox_null;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment