On Thu, 2014-10-23 at 09:20 +0200, Vratislav Podzimek wrote:
On Wed, 2014-10-22 at 18:47 +0200, Martin Kolman wrote:
Add an Initial Setup specific log handling module that forwards nicely formated log messages to the system log and also correctly maps message log levels to system log priorities (in journalctl: info & debug - no highlight, warning - bold, error & critical - red).
This finally makes it possible to report in detail what's going on during the Initial Setup run, with emphasis on providing enough information on problematic areas, such as Kickstart parsing.
BTW, to check for all Initial Setup log messages in Journal you can use the -u flag with the Initial Setup unit name:
journalctl -u initial-setup-graphical
or
journalctl -u initial-setup-text
Resolves: rhbz#1153768 Signed-off-by: Martin Kolman mkolman@redhat.com
initial_setup/__main__.py | 49 ++++++++++++++++++++++++++++++++++--- initial_setup/gui/spokes/eula.py | 9 +++++++ initial_setup/initial_setup_log.py | 50 ++++++++++++++++++++++++++++++++++++++ initial_setup/product.py | 5 +++- initial_setup/tui/spokes/eula.py | 8 ++++++ 5 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 initial_setup/initial_setup_log.py
diff --git a/initial_setup/__main__.py b/initial_setup/__main__.py index 4b07386..f76a600 100644 --- a/initial_setup/__main__.py +++ b/initial_setup/__main__.py @@ -3,22 +3,37 @@ import os import sys import signal import pykickstart +import logging from pyanaconda.users import Users from initial_setup.post_installclass import InstallClass +from initial_setup import initial_setup_log +from pyanaconda import iutil
+INPUT_KICKSTART_PATH = "/root/anaconda-ks.cfg" +OUTPUT_KICKSTART_PATH = "/root/initial-setup-ks.cfg"
+# set root to "/", we are now in the installed system +iutil.setSysroot("/")
signal.signal(signal.SIGINT, signal.SIG_IGN)
+initial_setup_log.init() +log = logging.getLogger("initial-setup")
if "DISPLAY" in os.environ and os.environ["DISPLAY"]: mode="gui" else: mode="tui"
+log.debug("display mode detected: %s", mode)
if mode == "gui": # We need this so we can tell GI to look for overrides objects # also in anaconda source directories import gi.overrides for p in os.environ.get("ANACONDA_WIDGETS_OVERRIDES", "").split(":"): gi.overrides.__path__.insert(0, p)
- log.debug("GI overrides imported")
# set the root path to / so the imported spokes # know where to apply their changes @@ -36,18 +51,24 @@ addon_paths = ["/usr/share/initial-setup/modules", "/usr/share/anaconda/addons"] sys.path.extend(addon_paths)
addon_module_paths = collect_addon_paths(addon_paths, mode) +log.info("found %d addon modules:", len(addon_module_paths)) +for addon_path in addon_module_paths:
- log.debug(addon_path)
# Too bad anaconda does not have modularized logging +log.debug("initializing the Anaconda log") from pyanaconda import anaconda_log anaconda_log.init()
# init threading before Gtk can do anything and before we start using threads # initThreading initializes the threadMgr instance, import it afterwards +log.debug("initializing threading") from pyanaconda.threads import initThreading initThreading()
# initialize network logging (needed by the Network spoke that may be shown) +log.debug("initializing network logging") from pyanaconda.network import setup_ifcfg_log setup_ifcfg_log()
@@ -71,18 +92,23 @@ commandMap = dict((k, kickstart.commandMap[k]) for k in kickstart_commands) # Prepare new data object data = kickstart.AnacondaKSHandler(addon_module_paths["ks"], commandUpdates=commandMap)
+log.info("parsing input kickstart %s", INPUT_KICKSTART_PATH) try: # Read the installed kickstart parser = kickstart.AnacondaKSParser(data)
- parser.readKickstart("/root/anaconda-ks.cfg")
- parser.readKickstart(INPUT_KICKSTART_PATH)
- log.info("kickstart parsing done")
except pykickstart.errors.KickstartError as kserr:
- log.exception("kickstart parsing failed") sys.exit(1)
if mode == "gui": try: # Try to import IS gui specifics
except ImportError:log.debug("trying to import GUI") import gui
log.error("GUI import failed, falling back to TUI") mode = "tui"
if mode == "gui": @@ -92,6 +118,7 @@ if mode == "gui": gui.InitialSetupGraphicalUserInterface.update_paths(addon_module_paths)
# Initialize the UI
- log.debug("initializing GUI") ui = gui.InitialSetupGraphicalUserInterface(None, None, InstallClass())
else: # Import IS gui specifics @@ -101,21 +128,26 @@ else: tui.InitialSetupTextUserInterface.update_paths(addon_module_paths)
# Initialize the UI
- log.debug("initializing TUI") ui = tui.InitialSetupTextUserInterface(None, None, None)
# Pass the data object to user inteface +log.debug("setting up the UI") ui.setup(data)
# Start the application +log.info("starting the UI") ret = ui.run()
# TUI returns False if the app was ended prematurely # all other cases return True or None if ret == False: if data.eula.agreed:
- log.info("EULA accepted, shuttong down") sys.exit(0)
This looks like bad indentation (at least in my Evolution).
Oh, right! Thanks for spotting this, fixing locally! :)
Otherwise this looks good to me.