mirror of
https://github.com/certbot/certbot.git
synced 2026-07-30 16:14:44 +02:00
Merge pull request #562 from bradmw/traceback
Log and hide tracebacks by default
This commit is contained in:
+37
-10
@@ -98,8 +98,8 @@ def _find_domains(args, installer):
|
|||||||
domains = args.domains
|
domains = args.domains
|
||||||
|
|
||||||
if not domains:
|
if not domains:
|
||||||
sys.exit("Please specify --domains, or --installer that will "
|
raise errors.Error("Please specify --domains, or --installer that "
|
||||||
"help in domain names autodiscovery")
|
"will help in domain names autodiscovery")
|
||||||
|
|
||||||
return domains
|
return domains
|
||||||
|
|
||||||
@@ -116,7 +116,8 @@ def _init_acme(config, acc, authenticator, installer):
|
|||||||
acme.register()
|
acme.register()
|
||||||
except errors.LetsEncryptClientError as error:
|
except errors.LetsEncryptClientError as error:
|
||||||
logger.debug(error)
|
logger.debug(error)
|
||||||
sys.exit("Unable to register an account with ACME server")
|
raise errors.Error("Unable to register an account with ACME "
|
||||||
|
"server")
|
||||||
|
|
||||||
return acme
|
return acme
|
||||||
|
|
||||||
@@ -465,6 +466,9 @@ def create_parser(plugins, args):
|
|||||||
"testing", description="The following flags are meant for "
|
"testing", description="The following flags are meant for "
|
||||||
"testing purposes only! Do NOT change them, unless you "
|
"testing purposes only! Do NOT change them, unless you "
|
||||||
"really know what you're doing!")
|
"really know what you're doing!")
|
||||||
|
helpful.add(
|
||||||
|
"testing", "--debug", action="store_true",
|
||||||
|
help="Show tracebacks if the program exits abnormally")
|
||||||
helpful.add(
|
helpful.add(
|
||||||
"testing", "--no-verify-ssl", action="store_true",
|
"testing", "--no-verify-ssl", action="store_true",
|
||||||
help=config_help("no_verify_ssl"),
|
help=config_help("no_verify_ssl"),
|
||||||
@@ -614,13 +618,8 @@ def _setup_logging(args):
|
|||||||
logger.info("Saving debug log to %s", log_file_name)
|
logger.info("Saving debug log to %s", log_file_name)
|
||||||
|
|
||||||
|
|
||||||
def main(cli_args=sys.argv[1:]):
|
def main2(cli_args, args, config, plugins):
|
||||||
"""Command line argument parsing and main script execution."""
|
"""Continued main script execution."""
|
||||||
# note: arg parser internally handles --help (and exits afterwards)
|
|
||||||
plugins = plugins_disco.PluginsRegistry.find_all()
|
|
||||||
args = create_parser(plugins, cli_args).parse_args(cli_args)
|
|
||||||
config = configuration.NamespaceConfig(args)
|
|
||||||
|
|
||||||
# Displayer
|
# Displayer
|
||||||
if args.text_mode:
|
if args.text_mode:
|
||||||
displayer = display_util.FileDisplay(sys.stdout)
|
displayer = display_util.FileDisplay(sys.stdout)
|
||||||
@@ -659,5 +658,33 @@ def main(cli_args=sys.argv[1:]):
|
|||||||
return args.func(args, config, plugins)
|
return args.func(args, config, plugins)
|
||||||
|
|
||||||
|
|
||||||
|
def main(cli_args=sys.argv[1:]):
|
||||||
|
"""Command line argument parsing and main script execution."""
|
||||||
|
# note: arg parser internally handles --help (and exits afterwards)
|
||||||
|
plugins = plugins_disco.PluginsRegistry.find_all()
|
||||||
|
args = create_parser(plugins, cli_args).parse_args(cli_args)
|
||||||
|
config = configuration.NamespaceConfig(args)
|
||||||
|
|
||||||
|
def handle_exception_common():
|
||||||
|
"""Logs the exception and reraises it if in debug mode."""
|
||||||
|
logger.debug("Exiting abnormally", exc_info=True)
|
||||||
|
if args.debug:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
return main2(cli_args, args, config, plugins)
|
||||||
|
except errors.Error as error:
|
||||||
|
handle_exception_common()
|
||||||
|
return error
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
handle_exception_common()
|
||||||
|
# Ensures a new line is printed
|
||||||
|
return ""
|
||||||
|
except: # pylint: disable=bare-except
|
||||||
|
handle_exception_common()
|
||||||
|
return ("An unexpected error occured. Please see the logfiles in {0} "
|
||||||
|
"for more details.".format(args.logs_dir))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
sys.exit(main()) # pragma: no cover
|
sys.exit(main()) # pragma: no cover
|
||||||
|
|||||||
@@ -20,13 +20,16 @@ class CLITest(unittest.TestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
shutil.rmtree(self.tmp_dir)
|
shutil.rmtree(self.tmp_dir)
|
||||||
|
|
||||||
def _call(self, args):
|
def _call(self, args, client_mock_attrs=None):
|
||||||
from letsencrypt import cli
|
from letsencrypt import cli
|
||||||
args = ['--text', '--config-dir', self.config_dir,
|
args = ['--text', '--config-dir', self.config_dir,
|
||||||
'--work-dir', self.work_dir, '--logs-dir', self.logs_dir] + args
|
'--work-dir', self.work_dir, '--logs-dir', self.logs_dir] + args
|
||||||
with mock.patch('letsencrypt.cli.sys.stdout') as stdout:
|
with mock.patch('letsencrypt.cli.sys.stdout') as stdout:
|
||||||
with mock.patch('letsencrypt.cli.sys.stderr') as stderr:
|
with mock.patch('letsencrypt.cli.sys.stderr') as stderr:
|
||||||
with mock.patch('letsencrypt.cli.client') as client:
|
with mock.patch('letsencrypt.cli.client') as client:
|
||||||
|
if client_mock_attrs:
|
||||||
|
# pylint: disable=star-args
|
||||||
|
client.configure_mock(**client_mock_attrs)
|
||||||
ret = cli.main(args)
|
ret = cli.main(args)
|
||||||
return ret, stdout, stderr, client
|
return ret, stdout, stderr, client
|
||||||
|
|
||||||
@@ -55,6 +58,24 @@ class CLITest(unittest.TestCase):
|
|||||||
for r in xrange(len(flags)))):
|
for r in xrange(len(flags)))):
|
||||||
self._call(['plugins',] + list(args))
|
self._call(['plugins',] + list(args))
|
||||||
|
|
||||||
|
def test_exceptions(self):
|
||||||
|
from letsencrypt import errors
|
||||||
|
cmd_arg = ['config_changes']
|
||||||
|
error = [errors.Error('problem')]
|
||||||
|
attrs = {'view_config_changes.side_effect' : error}
|
||||||
|
self.assertRaises(
|
||||||
|
errors.Error, self._call, ['--debug'] + cmd_arg, attrs)
|
||||||
|
self._call(cmd_arg, attrs)
|
||||||
|
|
||||||
|
attrs['view_config_changes.side_effect'] = [KeyboardInterrupt]
|
||||||
|
self.assertRaises(
|
||||||
|
KeyboardInterrupt, self._call, ['--debug'] + cmd_arg, attrs)
|
||||||
|
self._call(cmd_arg, attrs)
|
||||||
|
|
||||||
|
attrs['view_config_changes.side_effect'] = [ValueError]
|
||||||
|
self.assertRaises(
|
||||||
|
ValueError, self._call, ['--debug'] + cmd_arg, attrs)
|
||||||
|
self._call(cmd_arg, attrs)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main() # pragma: no cover
|
unittest.main() # pragma: no cover
|
||||||
|
|||||||
Reference in New Issue
Block a user