Add a new --syslog option for tincd.

This commit adds a new command line option for tincd which allows to
use tincd in non-detached mode with log messages still going to
syslog.  The motivation for this change is to ease use of tincd
in Docker containers.
This commit is contained in:
Jochen Voss 2015-03-13 11:05:22 +00:00 committed by Jochen Voss (voss@sushi)
parent 058473dc8d
commit 19d16e40cc
3 changed files with 21 additions and 5 deletions

View file

@ -8,7 +8,7 @@
.Nd tinc VPN daemon .Nd tinc VPN daemon
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl cdDKnoLRU .Op Fl cdDKnsoLRU
.Op Fl -config Ns = Ns Ar DIR .Op Fl -config Ns = Ns Ar DIR
.Op Fl -no-detach .Op Fl -no-detach
.Op Fl -debug Ns Op = Ns Ar LEVEL .Op Fl -debug Ns Op = Ns Ar LEVEL
@ -16,6 +16,7 @@
.Op Fl -option Ns = Ns Ar [HOST.]KEY=VALUE .Op Fl -option Ns = Ns Ar [HOST.]KEY=VALUE
.Op Fl -mlock .Op Fl -mlock
.Op Fl -logfile Ns Op = Ns Ar FILE .Op Fl -logfile Ns Op = Ns Ar FILE
.Op Fl -syslog
.Op Fl -bypass-security .Op Fl -bypass-security
.Op Fl -chroot .Op Fl -chroot
.Op Fl -user Ns = Ns Ar USER .Op Fl -user Ns = Ns Ar USER
@ -88,6 +89,8 @@ If
.Ar FILE .Ar FILE
is omitted, the default is is omitted, the default is
.Pa @localstatedir@/log/tinc. Ns Ar NETNAME Ns Pa .log. .Pa @localstatedir@/log/tinc. Ns Ar NETNAME Ns Pa .log.
.It Fl s, -syslog
When this option is is set, tinc uses syslog instead of stderr in --no-detach mode.
.It Fl -pidfile Ns = Ns Ar FILENAME .It Fl -pidfile Ns = Ns Ar FILENAME
Store a cookie in Store a cookie in
.Ar FILENAME .Ar FILENAME

View file

@ -41,6 +41,7 @@ bool sigalrm = false;
extern char **g_argv; extern char **g_argv;
extern bool use_logfile; extern bool use_logfile;
extern bool use_syslog;
/* Some functions the less gifted operating systems might lack... */ /* Some functions the less gifted operating systems might lack... */
@ -185,6 +186,8 @@ bool init_service(void) {
Detach from current terminal Detach from current terminal
*/ */
bool detach(void) { bool detach(void) {
logmode_t logmode;
#ifndef HAVE_MINGW #ifndef HAVE_MINGW
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1, SIG_IGN); signal(SIGUSR1, SIG_IGN);
@ -206,12 +209,13 @@ bool detach(void) {
#endif #endif
} }
openlogger(identname, use_logfile?LOGMODE_FILE:(do_detach?LOGMODE_SYSLOG:LOGMODE_STDERR)); logmode = use_logfile?LOGMODE_FILE:LOGMODE_SYSLOG;
if(do_detach && !use_syslog)
logmode = LOGMODE_STDERR;
openlogger(identname, logmode);
logger(DEBUG_ALWAYS, LOG_NOTICE, "tincd %s (%s %s) starting, debug level %d", logger(DEBUG_ALWAYS, LOG_NOTICE, "tincd %s (%s %s) starting, debug level %d",
VERSION, __DATE__, __TIME__, debug_level); VERSION, __DATE__, __TIME__, debug_level);
return true; return true;
} }

View file

@ -83,6 +83,9 @@ static const char *switchuser = NULL;
/* If nonzero, write log entries to a separate file. */ /* If nonzero, write log entries to a separate file. */
bool use_logfile = false; bool use_logfile = false;
/* If nonzero, use syslog instead of stderr in no-detach mode. */
bool use_syslog = false;
char **g_argv; /* a copy of the cmdline arguments */ char **g_argv; /* a copy of the cmdline arguments */
static int status = 1; static int status = 1;
@ -99,6 +102,7 @@ static struct option const long_options[] = {
{"chroot", no_argument, NULL, 'R'}, {"chroot", no_argument, NULL, 'R'},
{"user", required_argument, NULL, 'U'}, {"user", required_argument, NULL, 'U'},
{"logfile", optional_argument, NULL, 4}, {"logfile", optional_argument, NULL, 4},
{"syslog", no_argument, NULL, 's'},
{"pidfile", required_argument, NULL, 5}, {"pidfile", required_argument, NULL, 5},
{"option", required_argument, NULL, 'o'}, {"option", required_argument, NULL, 'o'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
@ -124,6 +128,7 @@ static void usage(bool status) {
" -L, --mlock Lock tinc into main memory.\n" " -L, --mlock Lock tinc into main memory.\n"
#endif #endif
" --logfile[=FILENAME] Write log entries to a logfile.\n" " --logfile[=FILENAME] Write log entries to a logfile.\n"
" -s --syslog Use syslog instead of stderr with --no-detach.\n"
" --pidfile=FILENAME Write PID and control socket cookie to FILENAME.\n" " --pidfile=FILENAME Write PID and control socket cookie to FILENAME.\n"
" --bypass-security Disables meta protocol security, for debugging.\n" " --bypass-security Disables meta protocol security, for debugging.\n"
" -o, --option[HOST.]KEY=VALUE Set global/host configuration value.\n" " -o, --option[HOST.]KEY=VALUE Set global/host configuration value.\n"
@ -145,7 +150,7 @@ static bool parse_options(int argc, char **argv) {
cmdline_conf = list_alloc((list_action_t)free_config); cmdline_conf = list_alloc((list_action_t)free_config);
while((r = getopt_long(argc, argv, "c:DLd::n:o:RU:", long_options, &option_index)) != EOF) { while((r = getopt_long(argc, argv, "c:DLd::n:so:RU:", long_options, &option_index)) != EOF) {
switch (r) { switch (r) {
case 0: /* long option */ case 0: /* long option */
break; break;
@ -180,6 +185,10 @@ static bool parse_options(int argc, char **argv) {
netname = xstrdup(optarg); netname = xstrdup(optarg);
break; break;
case 's': /* syslog */
use_syslog = true;
break;
case 'o': /* option */ case 'o': /* option */
cfg = parse_config_line(optarg, NULL, ++lineno); cfg = parse_config_line(optarg, NULL, ++lineno);
if (!cfg) if (!cfg)