fix various fd leaks (#8747)

* fix various fd leaks

* use context manager for display provider
This commit is contained in:
alexzorin 2021-04-06 08:50:12 +10:00 committed by GitHub
parent c438a397a0
commit a12d91aef6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 15 deletions

View file

@ -4,6 +4,9 @@
import functools
import logging.handlers
import sys
from contextlib import contextmanager
from typing import Generator
from typing import IO
from typing import Iterable
from typing import List
from typing import Optional
@ -1347,26 +1350,36 @@ def make_or_verify_needed_dirs(config):
util.make_or_verify_dir(hook_dir, strict=config.strict_permissions)
def set_displayer(config):
"""Set the displayer
@contextmanager
def make_displayer(config: configuration.NamespaceConfig
) -> Generator[Union[display_util.NoninteractiveDisplay,
display_util.FileDisplay], None, None]:
"""Creates a display object appropriate to the flags in the supplied config.
:param config: Configuration object
:type config: interfaces.IConfig
:returns: `None`
:rtype: None
:returns: Display object implementing :class:`certbot.interfaces.IDisplay`
"""
displayer: Union[None, display_util.NoninteractiveDisplay,
display_util.FileDisplay] = None
devnull: Optional[IO] = None
if config.quiet:
config.noninteractive_mode = True
displayer: Union[None, display_util.NoninteractiveDisplay, display_util.FileDisplay] =\
display_util.NoninteractiveDisplay(open(os.devnull, "w"))
devnull = open(os.devnull, "w")
displayer = display_util.NoninteractiveDisplay(devnull)
elif config.noninteractive_mode:
displayer = display_util.NoninteractiveDisplay(sys.stdout)
else:
displayer = display_util.FileDisplay(sys.stdout,
config.force_interactive)
zope.component.provideUtility(displayer)
displayer = display_util.FileDisplay(
sys.stdout, config.force_interactive)
try:
yield displayer
finally:
if devnull:
devnull.close()
def main(cli_args=None):
@ -1411,11 +1424,12 @@ def main(cli_args=None):
if config.func != plugins_cmd: # pylint: disable=comparison-with-callable
raise
set_displayer(config)
# Reporter
report = reporter.Reporter(config)
zope.component.provideUtility(report)
util.atexit_register(report.print_messages)
return config.func(config, plugins)
with make_displayer(config) as displayer:
zope.component.provideUtility(displayer)
return config.func(config, plugins)

View file

@ -28,7 +28,8 @@ class PreArgParseSetupTest(unittest.TestCase):
@classmethod
def _call(cls, *args, **kwargs): # pylint: disable=unused-argument
from certbot._internal.log import pre_arg_parse_setup
return pre_arg_parse_setup()
with mock.patch('builtins.open', mock.mock_open()):
return pre_arg_parse_setup()
@mock.patch('certbot._internal.log.sys')
@mock.patch('certbot._internal.log.pre_arg_parse_except_hook')

View file

@ -141,7 +141,8 @@ class AuthenticatorTest(unittest.TestCase):
f.write("thingimy")
filesystem.chmod(self.path, 0o000)
try:
open(permission_canary, "r")
with open(permission_canary, "r"):
pass
print("Warning, running tests as root skips permissions tests...")
except IOError:
# ok, permissions work, test away...