On Mon, 2012-01-02 at 19:35 +0300, Alexander Bokovoy wrote:
> On Mon, 02 Jan 2012, Martin Kosek wrote:
> > This is a ipa-2-1 branch fix only. master branch use better and more
> > sophisticated approach to fix logging (ticket 2022).
> > 
> > ----
> > When any log message is emitted before IPA install tools logging is
> > configured, it may break and leave install tools log empty. This
> > happens for example when
> > 
> > ipa-server-install --ip-address=$IP_ADDRESS
> > 
> > is run.
> > 
> > This patch makes sure that logging is right in these cases.
> > 
> > https://fedorahosted.org/freeipa/ticket/2214
> This is a good start. However, we'll still get messages from 
> --ip-address processing lost.
> 
> What about adding a Handler class to buffer LogRecords?
> 
> Set it in the root logger as the very first action in those three 
> tools (ipa-dns-install, ipa-replica-prepare, ipa-server-install) that accept 
> --ip-address option.
> 
> When standard_logging_setup() is called, it would check for existing 
> handlers and first pull in the records, then remove the handler, 
> call basicSetup() and re-issue the LogRecords again?
> 
> This way we'll get all the records recovered and will get around 
> IPACheckedAddress limitations.
> 

That's a good idea! This way we won't miss any log before our logging
setup. Updated patch attached.

Martin
>From 18b2f9577ef8cf2001cfad396ee49a14f08d05ba Mon Sep 17 00:00:00 2001
From: Martin Kosek <mko...@redhat.com>
Date: Mon, 2 Jan 2012 16:49:59 +0100
Subject: [PATCH] Make sure that install tools log

When any log message is emitted before IPA install tools logging is
configured, it may break and leave install tools log empty. This
happens for example when

ipa-server-install --ip-address=$IP_ADDRESS

is run.

This patch makes sure that logging is right in these cases.

https://fedorahosted.org/freeipa/ticket/2214
---
 install/tools/ipa-ca-install      |    1 +
 install/tools/ipa-dns-install     |    1 +
 install/tools/ipa-replica-install |    1 +
 install/tools/ipa-server-install  |    2 +
 ipaserver/install/installutils.py |   43 +++++++++++++++++++++++++++++++++++++
 5 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/install/tools/ipa-ca-install b/install/tools/ipa-ca-install
index 445b0621419b7aa5b4616e154d9f8193a5d517fb..c813659f34f4471132b83fd4159b69b76f5ce487 100755
--- a/install/tools/ipa-ca-install
+++ b/install/tools/ipa-ca-install
@@ -70,6 +70,7 @@ def get_dirman_password():
     return installutils.read_password("Directory Manager (existing master)", confirm=False, validate=False)
 
 def main():
+    installutils.bootstrap_logging()
     safe_options, options, filename = parse_options()
     installutils.standard_logging_setup("/var/log/ipareplica-ca-install.log", options.debug)
     logging.debug('%s was invoked with argument "%s" and options: %s' % (sys.argv[0], filename, safe_options))
diff --git a/install/tools/ipa-dns-install b/install/tools/ipa-dns-install
index d81b6a2e804a815d5bece8426a286e3190f6dee3..25c1bb0cac251d098e3744afd7b7eeab32a3fe6b 100755
--- a/install/tools/ipa-dns-install
+++ b/install/tools/ipa-dns-install
@@ -82,6 +82,7 @@ def parse_options():
     return safe_options, options
 
 def main():
+    bootstrap_logging()
     safe_options, options = parse_options()
 
     if os.getegid() != 0:
diff --git a/install/tools/ipa-replica-install b/install/tools/ipa-replica-install
index dbc736764f38489df15900c4540a381764d0c261..7310d286292f571ef25b57b29d2a213f4bd855a1 100755
--- a/install/tools/ipa-replica-install
+++ b/install/tools/ipa-replica-install
@@ -286,6 +286,7 @@ def check_bind():
         sys.exit(1)
 
 def main():
+    installutils.bootstrap_logging()
     safe_options, options, filename = parse_options()
     installutils.standard_logging_setup("/var/log/ipareplica-install.log", options.debug)
     logging.debug('%s was invoked with argument "%s" and options: %s' % (sys.argv[0], filename, safe_options))
diff --git a/install/tools/ipa-server-install b/install/tools/ipa-server-install
index 8f156e8dde7fbc4cfde00a0f6a2fc8e23403cc73..755f2772780010c62fdc642125107843bef61668 100755
--- a/install/tools/ipa-server-install
+++ b/install/tools/ipa-server-install
@@ -562,6 +562,8 @@ def main():
     global installation_cleanup
     ds = None
 
+    bootstrap_logging()
+
     safe_options, options = parse_options()
 
     if os.getegid() != 0:
diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py
index 0a36c354e1d2f901bfdef51c151d035ba8ee64ca..d0f611c611847d02f3d264d669a2e90689f5a87b 100644
--- a/ipaserver/install/installutils.py
+++ b/ipaserver/install/installutils.py
@@ -314,7 +314,47 @@ def port_available(port):
 
     return rv
 
+class BufferingHandler(logging.Handler):
+    log_queue = []
+
+    def __init__(self):
+        logging.Handler.__init__(self)
+        self.level = logging.DEBUG
+
+    def emit(self, record):
+        self.log_queue.append(record)
+
+    def flush(self):
+        pass
+
+def bootstrap_logging():
+    """
+    Bootstrap logging and create special handler which will buffer any log
+    emitted before standard_logging_setup is called. These will be later
+    processed when the logging is set up.
+    """
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+    root_logger.addHandler(BufferingHandler())
+
 def standard_logging_setup(log_filename, debug=False, filemode='w'):
+    """
+    Set up logging. bootstrap_logging() should be called earlier if there
+    is a chance that a log is emitted before this setup.
+    """
+    root_logger = logging.getLogger()
+    log_queue = []
+
+    if root_logger.handlers:
+        # Remove any handlers that may have been set and which may cause
+        # problems with logging in install utils
+        handler_list = list(logging.getLogger().handlers)
+
+        for handler in handler_list:
+            if isinstance(handler, BufferingHandler):
+                log_queue.extend(handler.log_queue)
+            root_logger.removeHandler(handler)
+
     old_umask = os.umask(077)
     # Always log everything (i.e., DEBUG) to the log
     # file.
@@ -335,6 +375,9 @@ def standard_logging_setup(log_filename, debug=False, filemode='w'):
     console.setFormatter(formatter)
     logging.getLogger('').addHandler(console)
 
+    for log_record in log_queue:
+        root_logger.handle(log_record)
+
 def get_password(prompt):
     if os.isatty(sys.stdin.fileno()):
         return getpass.getpass(prompt)
-- 
1.7.7.4

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to