diff --git a/lib/daemon.py b/lib/daemon.py index ba5f17504134e6148e22506cf9ec85a74bd1a179..302097a19a518c60921e35560d7709c4fedab521 100644 --- a/lib/daemon.py +++ b/lib/daemon.py @@ -491,8 +491,8 @@ class Mainloop(object): def _VerifyDaemonUser(daemon_name): """Verifies the process uid matches the configured uid. - This method verifies that a daemon is started as the user it is intended to be - run + This method verifies that a daemon is started as the user it is + intended to be run @param daemon_name: The name of daemon to be started @return: A tuple with the first item indicating success or not, @@ -512,6 +512,33 @@ def _VerifyDaemonUser(daemon_name): daemon_uids[daemon_name]) +def _BeautifyError(err): + """Try to format an error better. + + Since we're dealing with daemon startup errors, in many cases this + will be due to socket error and such, so we try to format these cases better. + + @param err: an exception object + @rtype: string + @return: the formatted error description + + """ + try: + if isinstance(err, socket.error): + return "Socket-related error: %s (errno=%s)" % (err.args[1], err.args[0]) + elif isinstance(err, EnvironmentError): + if err.filename is None: + return "%s (errno=%s)" % (err.strerror, err.errno) + else: + return "%s (file %s) (errno=%s)" % (err.strerror, err.filename, + err.errno) + else: + return str(err) + except Exception: # pylint: disable-msg=W0703 + logging.exception("Error while handling existing error %s", err) + return "%s" % str(err) + + def GenericMain(daemon_name, optionparser, check_fn, prepare_fn, exec_fn, multithreaded=False, console_logging=False, @@ -645,7 +672,7 @@ def GenericMain(daemon_name, optionparser, logging.info("%s daemon startup", daemon_name) except Exception, err: if wpipe is not None: - os.write(wpipe, str(err)) + os.write(wpipe, _BeautifyError(err)) raise if wpipe is not None: