[PATCH] Add support for sending logs to a remote host with --remotelog

Brian C. Lane bcl at redhat.com
Fri Jan 9 17:49:44 UTC 2015


Send all the logs to a remote host:port instead of modifying the rsyslog
configuration of the host. This will be useful when running anaconda
from the cmdline or via livemedia-creator

All that's required on the receiving side is netcat listening to the
port.
---
 anaconda                   | 14 ++++++++++++--
 pyanaconda/anaconda_log.py | 11 ++++++++++-
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/anaconda b/anaconda
index 4ded503..d97b682 100755
--- a/anaconda
+++ b/anaconda
@@ -309,6 +309,7 @@ def parseArguments(argv=None, boot_cmdline=None):
     # Obvious
     ap.add_argument("--loglevel", metavar="LEVEL", help=help_parser.help_text("loglevel"))
     ap.add_argument("--syslog", metavar="HOST[:PORT]", help=help_parser.help_text("syslog"))
+    ap.add_argument("--remotelog", metavar="HOST:PORT", help=help_parser.help_text("remotelog"))
 
     from pykickstart.constants import SELINUX_DISABLED, SELINUX_ENFORCING
     from pyanaconda.constants import SELINUX_DEFAULT
@@ -409,8 +410,17 @@ def setupLoggingFromOpts(options):
         packaging_log = logging.getLogger("packaging")
         anaconda_log.setHandlersLevel(packaging_log, level)
 
-    if options.syslog:
-        anaconda_log.logger.updateRemote(options.syslog)
+    if can_touch_runtime_system("syslog setup"):
+        if options.syslog:
+            anaconda_log.logger.updateRemote(options.syslog)
+
+    if options.remotelog:
+        try:
+            host, port = options.remotelog.split(":", 1)
+            port = int(port)
+            anaconda_log.logger.setup_remotelog(host, port)
+        except ValueError:
+            log.error("Could not setup remotelog with %s", options.remotelog)
 
 def gtk_warning(title, reason):
     from gi.repository import Gtk
diff --git a/pyanaconda/anaconda_log.py b/pyanaconda/anaconda_log.py
index 498d64a..b5e525c 100644
--- a/pyanaconda/anaconda_log.py
+++ b/pyanaconda/anaconda_log.py
@@ -23,7 +23,7 @@
 #
 
 import logging
-from logging.handlers import SysLogHandler, SYSLOG_UDP_PORT
+from logging.handlers import SysLogHandler, SocketHandler, SYSLOG_UDP_PORT
 import os
 import sys
 import types
@@ -86,6 +86,10 @@ class AnacondaSyslogHandler(SysLogHandler):
         """Map the priority level to a syslog level """
         return self.levelMap.get(level, SysLogHandler.mapPriority(self, level))
 
+class AnacondaSocketHandler(SocketHandler):
+    def makePickle(self, record):
+        return ENTRY_FORMAT % record.__dict__ + "\n"
+
 class AnacondaLog:
     SYSLOG_CFGFILE  = "/etc/rsyslog.conf"
     VIRTIO_PORT = "/dev/virtio-ports/org.fedoraproject.anaconda.log.0"
@@ -203,6 +207,11 @@ class AnacondaLog:
         self.anaconda_logger.warning("%s", warnings.formatwarning(
                 message, category, filename, lineno, line))
 
+    def setup_remotelog(self, host, port):
+        remotelog = AnacondaSocketHandler(host, port)
+        remotelog.setLevel(logging.DEBUG)
+        logging.getLogger().addHandler(remotelog)
+
     def restartSyslog(self):
         # Import here instead of at the module level to avoid an import loop
         from pyanaconda.iutil import execWithRedirect
-- 
1.9.3



More information about the anaconda-patches mailing list