You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.7 KiB

10 months ago
import contextlib
import os
from six.moves.urllib.error import URLError
from six.moves.urllib.request import urlopen
from leapp.exceptions import StopActorExecutionError
from leapp.libraries.stdlib import CalledProcessError
@contextlib.contextmanager
def guarded_execution(*guards):
try:
yield
except CalledProcessError as e:
# collect output from guards for possible spurious failure
guard_errors = []
for guard in guards:
err = guard()
if err:
guard_errors.append(err)
details = None
if guard_errors:
details = {
'hint': 'Possible spurious failure: {cause}'.format(cause=' '.join(guard_errors))
}
raise StopActorExecutionError(
message=str(e),
details=details
)
def connection_guard(url='https://example.com'):
def closure():
try:
urlopen(url)
return None
except URLError as e:
cause = '''Failed to open url '{url}' with error: {error}'''.format(url=url, error=e)
return ('There was probably a problem with internet connection ({cause}).'
' Check your connection and try again.'.format(cause=cause))
return closure
def space_guard(path='/', min_free_mb=100):
def closure():
info = os.statvfs(path)
free_mb = (info.f_bavail * info.f_frsize) >> 20
if free_mb >= min_free_mb:
return None
return ('''Not enough free disk space in '{path}', needed: {min} M, available: {avail} M.'''
' Free more disk space and try again.'.format(path=path, min=min_free_mb, avail=free_mb))
return closure