From 1fa7981a7f776583d5e7636c29fdc609dab59abc Mon Sep 17 00:00:00 2001 From: Gavin Hurlbut Date: Fri, 29 Apr 2011 23:42:04 -0700 Subject: [PATCH] Added --syslog command line option for logging The default syslog facility is local7, but can be overridden by this command line option. Setting it to "none" disables syslog use, as does any invalid facility name. Facility names are treated as case insensitive. --- mythtv/libs/libmyth/mythcommandlineparser.cpp | 12 +++++++++++ mythtv/libs/libmyth/mythcommandlineparser.h | 1 + mythtv/libs/libmythbase/mythlogging.cpp | 21 +++++++++++++++++-- mythtv/libs/libmythbase/mythlogging.h | 4 +++- mythtv/programs/mythavtest/main.cpp | 5 ++++- mythtv/programs/mythbackend/main.cpp | 4 +++- mythtv/programs/mythcommflag/main.cpp | 4 +++- mythtv/programs/mythfilldatabase/main.cpp | 4 +++- mythtv/programs/mythfrontend/main.cpp | 3 ++- mythtv/programs/mythjobqueue/main.cpp | 4 +++- mythtv/programs/mythlcdserver/main.cpp | 4 +++- mythtv/programs/mythpreviewgen/main.cpp | 4 +++- mythtv/programs/mythshutdown/main.cpp | 4 +++- mythtv/programs/mythtranscode/main.cpp | 4 +++- mythtv/programs/mythtv-setup/main.cpp | 4 +++- mythtv/programs/mythwelcome/main.cpp | 4 +++- 16 files changed, 71 insertions(+), 15 deletions(-) diff --git a/mythtv/libs/libmyth/mythcommandlineparser.cpp b/mythtv/libs/libmyth/mythcommandlineparser.cpp index 3f11079812c..c4a27ec3d85 100644 --- a/mythtv/libs/libmyth/mythcommandlineparser.cpp +++ b/mythtv/libs/libmyth/mythcommandlineparser.cpp @@ -821,6 +821,9 @@ void MythCommandLineParser::addLogging(void) "file (currently disabled).\n", ""); add(QStringList( QStringList() << "-q" << "--quiet"), "quiet", 0, "Don't log to the console (-q). Don't log anywhere (-q -q)\n", ""); + add("--syslog", "syslog", "local7", + "Set the syslog logging facility. Set to \"none\" to disable\n" + "Defaults to local7\n", ""); } void MythCommandLineParser::addPIDFile(void) @@ -1408,3 +1411,12 @@ QString MythCommandLineParser::GetLogFilePath(void) return toString("filepath"); } +int MythCommandLineParser::GetSyslogFacility(void) +{ + QString setting = toString("syslog").toLower(); + if (setting == "none") + return 0; + + return syslogGetFacility(setting); +} + diff --git a/mythtv/libs/libmyth/mythcommandlineparser.h b/mythtv/libs/libmyth/mythcommandlineparser.h index 004f46160ba..66b72b3c9b0 100644 --- a/mythtv/libs/libmyth/mythcommandlineparser.h +++ b/mythtv/libs/libmyth/mythcommandlineparser.h @@ -130,6 +130,7 @@ class MPUBLIC MythCommandLineParser QStringList GetArgs(void) const { return m_remainingArgs; } QMap GetSettingsOverride(void); QString GetLogFilePath(void); + int GetSyslogFacility(void); bool toBool(QString key) const; int toInt(QString key) const; diff --git a/mythtv/libs/libmythbase/mythlogging.cpp b/mythtv/libs/libmythbase/mythlogging.cpp index f0790844f94..c50f64b9560 100644 --- a/mythtv/libs/libmythbase/mythlogging.cpp +++ b/mythtv/libs/libmythbase/mythlogging.cpp @@ -456,7 +456,7 @@ void LogPrintLineNoArg( uint32_t mask, LogLevel_t level, char *file, int line, logQueue.enqueue(item); } -void logStart(QString logfile, int quiet) +void logStart(QString logfile, int quiet, int facility) { LoggerBase *logger; @@ -471,7 +471,12 @@ void logStart(QString logfile, int quiet) logger = new FileLogger((char *)logfile.toLocal8Bit().constData()); /* Syslog */ - logger = new SyslogLogger(LOG_LOCAL7); + if( facility < 0 ) + LogPrintNoArg(VB_IMPORTANT, LOG_CRIT, + "Syslogging facility unknown, disabling syslog " + "output"); + else if( facility > 0 ) + logger = new SyslogLogger(facility); /* Database */ logger = new DatabaseLogger((char *)"logging"); @@ -539,6 +544,18 @@ void threadDeregister(void) logQueue.enqueue(item); } +int syslogGetFacility(QString facility) +{ + CODE *name; + int i; + char *string = (char *)facility.toLocal8Bit().constData(); + + for( i = 0, name = &facilitynames[0]; + name->c_name && strcmp(name->c_name, string); i++, name++ ); + + return( name->c_val ); +} + /* * vim:ts=4:sw=4:ai:et:si:sts=4 */ diff --git a/mythtv/libs/libmythbase/mythlogging.h b/mythtv/libs/libmythbase/mythlogging.h index c891fd113dc..ee417d14c1a 100644 --- a/mythtv/libs/libmythbase/mythlogging.h +++ b/mythtv/libs/libmythbase/mythlogging.h @@ -87,10 +87,12 @@ MBASE_PUBLIC void LogPrintLineNoArg( uint32_t mask, LogLevel_t level, #ifdef __cplusplus } -MBASE_PUBLIC void logStart(QString logfile, int quiet = 0); +MBASE_PUBLIC void logStart(QString logfile, int quiet = 0, int facility = 0); MBASE_PUBLIC void logStop(void); MBASE_PUBLIC void threadRegister(QString name); MBASE_PUBLIC void threadDeregister(void); +MBASE_PUBLIC int syslogGetFacility(QString facility); + void LogTimeStamp( time_t *epoch, uint32_t *usec ); typedef union { diff --git a/mythtv/programs/mythavtest/main.cpp b/mythtv/programs/mythavtest/main.cpp index 8c803561357..65b66894d84 100644 --- a/mythtv/programs/mythavtest/main.cpp +++ b/mythtv/programs/mythavtest/main.cpp @@ -29,6 +29,7 @@ using namespace std; int main(int argc, char *argv[]) { int quiet = 0; + int facility = 0; MythAVTestCommandLineParser cmdline; if (!cmdline.Parse(argc, argv)) @@ -70,8 +71,10 @@ int main(int argc, char *argv[]) } } + facility = cmdline.GetSyslogFacility(); + QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); if (!cmdline.toString("display").isEmpty()) { diff --git a/mythtv/programs/mythbackend/main.cpp b/mythtv/programs/mythbackend/main.cpp index 8e92b33945d..7166ea12628 100644 --- a/mythtv/programs/mythbackend/main.cpp +++ b/mythtv/programs/mythbackend/main.cpp @@ -101,6 +101,8 @@ int main(int argc, char **argv) if (cmdline.toBool("daemon") && !quiet) quiet = 1; + int facility = cmdline.GetSyslogFacility(); + /////////////////////////////////////////////////////////////////////// // Don't listen to console input close(0); @@ -121,7 +123,7 @@ int main(int argc, char **argv) gContext = new MythContext(MYTH_BINARY_VERSION); logfile = cmdline.GetLogFilePath(); - logStart(logfile); + logStart(logfile, quiet, facility); if (cmdline.toBool("event") || cmdline.toBool("systemevent") || cmdline.toBool("setverbose") || cmdline.toBool("printsched") || diff --git a/mythtv/programs/mythcommflag/main.cpp b/mythtv/programs/mythcommflag/main.cpp index 49722d3de55..f02fedfe070 100644 --- a/mythtv/programs/mythcommflag/main.cpp +++ b/mythtv/programs/mythcommflag/main.cpp @@ -1076,6 +1076,8 @@ int main(int argc, char *argv[]) } } + int facility = cmdline.GetSyslogFacility(); + if (cmdline.toBool("queue")) queueJobInstead = true; if (cmdline.toBool("nopercent")) @@ -1100,7 +1102,7 @@ int main(int argc, char *argv[]) CleanupGuard callCleanup(cleanup); QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); gContext = new MythContext(MYTH_BINARY_VERSION); if (!gContext->Init( diff --git a/mythtv/programs/mythfilldatabase/main.cpp b/mythtv/programs/mythfilldatabase/main.cpp index a83cb28d963..4a4ddbe0fbc 100644 --- a/mythtv/programs/mythfilldatabase/main.cpp +++ b/mythtv/programs/mythfilldatabase/main.cpp @@ -259,6 +259,8 @@ int main(int argc, char *argv[]) } } + int facility = cmdline.GetSyslogFacility(); + mark_repeats = cmdline.toBool("markrepeats"); if (cmdline.toBool("exporticonmap")) export_icon_data_filename = cmdline.toString("exporticonmap"); @@ -280,7 +282,7 @@ int main(int argc, char *argv[]) CleanupGuard callCleanup(cleanup); QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); gContext = new MythContext(MYTH_BINARY_VERSION); if (!gContext->Init(false)) diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp index a1572debab2..d800f72f17a 100644 --- a/mythtv/programs/mythfrontend/main.cpp +++ b/mythtv/programs/mythfrontend/main.cpp @@ -1076,6 +1076,7 @@ int main(int argc, char **argv) } } + int facility = cmdline.GetSyslogFacility(); VERBOSE(VB_IMPORTANT, QString("%1 version: %2 [%3] www.mythtv.org") .arg(MYTH_APPNAME_MYTHFRONTEND) @@ -1110,7 +1111,7 @@ int main(int argc, char **argv) gContext = new MythContext(MYTH_BINARY_VERSION); logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); if (!cmdline.toBool("noupnp")) { diff --git a/mythtv/programs/mythjobqueue/main.cpp b/mythtv/programs/mythjobqueue/main.cpp index 4f983aff526..e7c753c9a84 100644 --- a/mythtv/programs/mythjobqueue/main.cpp +++ b/mythtv/programs/mythjobqueue/main.cpp @@ -122,6 +122,8 @@ int main(int argc, char *argv[]) } } + int facility = cmdline.GetSyslogFacility(); + if (cmdline.toBool("pidfile")) pidfile = cmdline.toString("pidfile"); if (cmdline.toBool("daemon")) @@ -130,7 +132,7 @@ int main(int argc, char *argv[]) CleanupGuard callCleanup(cleanup); logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); ofstream pidfs; if (pidfile.size()) diff --git a/mythtv/programs/mythlcdserver/main.cpp b/mythtv/programs/mythlcdserver/main.cpp index 68eb30c1cbf..675bf33581e 100644 --- a/mythtv/programs/mythlcdserver/main.cpp +++ b/mythtv/programs/mythlcdserver/main.cpp @@ -77,8 +77,10 @@ int main(int argc, char **argv) quiet = 1; } + int facility = cmdline.GetSyslogFacility(); + logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); if (cmdline.toBool("port")) diff --git a/mythtv/programs/mythpreviewgen/main.cpp b/mythtv/programs/mythpreviewgen/main.cpp index a5b759451d3..f6065e3e8f6 100644 --- a/mythtv/programs/mythpreviewgen/main.cpp +++ b/mythtv/programs/mythpreviewgen/main.cpp @@ -206,6 +206,8 @@ int main(int argc, char **argv) } } + int facility = cmdline.GetSyslogFacility(); + /////////////////////////////////////////////////////////////////////// // Don't listen to console input @@ -214,7 +216,7 @@ int main(int argc, char **argv) CleanupGuard callCleanup(cleanup); QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) VERBOSE(VB_IMPORTANT, LOC_WARN + "Unable to ignore SIGPIPE"); diff --git a/mythtv/programs/mythshutdown/main.cpp b/mythtv/programs/mythshutdown/main.cpp index 0457b0be6f0..0997c5a6790 100644 --- a/mythtv/programs/mythshutdown/main.cpp +++ b/mythtv/programs/mythshutdown/main.cpp @@ -788,6 +788,8 @@ int main(int argc, char **argv) } } + int facility = cmdline.GetSyslogFacility(); + if (cmdline.toBool("lock")) bLockShutdown = true; if (cmdline.toBool("unlock")) @@ -824,7 +826,7 @@ int main(int argc, char **argv) QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); int res = 0; diff --git a/mythtv/programs/mythtranscode/main.cpp b/mythtv/programs/mythtranscode/main.cpp index c3e54071a38..839c734e725 100644 --- a/mythtv/programs/mythtranscode/main.cpp +++ b/mythtv/programs/mythtranscode/main.cpp @@ -292,8 +292,10 @@ int main(int argc, char *argv[]) } } + int facility = cmdline.GetSyslogFacility(); + QString logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); // Load the context gContext = new MythContext(MYTH_BINARY_VERSION); diff --git a/mythtv/programs/mythtv-setup/main.cpp b/mythtv/programs/mythtv-setup/main.cpp index b093c737d0e..d76998c9ea9 100644 --- a/mythtv/programs/mythtv-setup/main.cpp +++ b/mythtv/programs/mythtv-setup/main.cpp @@ -269,6 +269,8 @@ int main(int argc, char *argv[]) } } + int facility = cmdline.GetSyslogFacility(); + if (cmdline.toBool("overridesettings")) settingsOverride = cmdline.GetSettingsOverride(); if (cmdline.toBool("expert")) @@ -309,7 +311,7 @@ int main(int argc, char *argv[]) scanInputName = cmdline.toString("inputname"); logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); if (!display.isEmpty()) { diff --git a/mythtv/programs/mythwelcome/main.cpp b/mythtv/programs/mythwelcome/main.cpp index 0189fb1e8db..1d5757871ac 100644 --- a/mythtv/programs/mythwelcome/main.cpp +++ b/mythtv/programs/mythwelcome/main.cpp @@ -90,8 +90,10 @@ int main(int argc, char **argv) } } + int facility = cmdline.GetSyslogFacility(); + logfile = cmdline.GetLogFilePath(); - logStart(logfile, quiet); + logStart(logfile, quiet, facility); gContext = new MythContext(MYTH_BINARY_VERSION); if (!gContext->Init())