aboutsummaryrefslogtreecommitdiff
path: root/infra
diff options
context:
space:
mode:
authorjonathanmetzman <31354670+jonathanmetzman@users.noreply.github.com>2021-08-03 09:25:15 -0700
committerGitHub <noreply@github.com>2021-08-03 09:25:15 -0700
commit88698dbf2f4b3e99f2b3d680fc1cd9e07d6b9bed (patch)
tree33368c3bb8550b887c7fab7d94ed50ffb6442899 /infra
parent997b73c34cff58be745b686f5041e8edeeb68e54 (diff)
downloadoss-fuzz-88698dbf2f4b3e99f2b3d680fc1cd9e07d6b9bed.tar.gz
[helper] Switch from print to log (#6149)
Diffstat (limited to 'infra')
-rwxr-xr-xinfra/helper.py99
1 files changed, 47 insertions, 52 deletions
diff --git a/infra/helper.py b/infra/helper.py
index 171ab42fb..9ae49954b 100755
--- a/infra/helper.py
+++ b/infra/helper.py
@@ -22,6 +22,7 @@ from multiprocessing.dummy import Pool as ThreadPool
import argparse
import datetime
import errno
+import logging
import os
import pipes
import re
@@ -72,6 +73,8 @@ def main(): # pylint: disable=too-many-branches,too-many-return-statements
if not os.path.exists(BUILD_DIR):
os.mkdir(BUILD_DIR)
+ logging.basicConfig(level=logging.INFO)
+
parser = get_parser()
args = parse_args(parser)
@@ -267,7 +270,7 @@ def is_base_image(image_name):
def check_project_exists(project_name):
"""Checks if a project exists."""
if not os.path.exists(_get_project_dir(project_name)):
- print(project_name, 'does not exist', file=sys.stderr)
+ logging.error('%s does not exist.', project_name)
return False
return True
@@ -284,9 +287,8 @@ def _check_fuzzer_exists(project_name, fuzzer_name):
try:
subprocess.check_call(command)
except subprocess.CalledProcessError:
- print(fuzzer_name,
- 'does not seem to exist. Please run build_fuzzers first.',
- file=sys.stderr)
+ logging.error('%s does not seem to exist. Please run build_fuzzers first.',
+ fuzzer_name)
return False
return True
@@ -450,7 +452,7 @@ def docker_run(run_args, print_output=True):
command.extend(run_args)
- print('Running:', _get_command_string(command))
+ logging.info('Running: %s.', _get_command_string(command))
stdout = None
if not print_output:
stdout = open(os.devnull, 'w')
@@ -467,12 +469,12 @@ def docker_build(build_args):
"""Calls `docker build`."""
command = ['docker', 'build']
command.extend(build_args)
- print('Running:', _get_command_string(command))
+ logging.info('Running: %s.', _get_command_string(command))
try:
subprocess.check_call(command)
except subprocess.CalledProcessError:
- print('docker build failed.', file=sys.stderr)
+ logging.error('Docker build failed.')
return False
return True
@@ -481,12 +483,12 @@ def docker_build(build_args):
def docker_pull(image):
"""Call `docker pull`."""
command = ['docker', 'pull', image]
- print('Running:', _get_command_string(command))
+ logging.info('Running: %s', _get_command_string(command))
try:
subprocess.check_call(command)
except subprocess.CalledProcessError:
- print('docker pull failed.', file=sys.stderr)
+ logging.error('Docker pull failed.')
return False
return True
@@ -495,7 +497,7 @@ def docker_pull(image):
def build_image(args):
"""Builds docker image."""
if args.pull and args.no_pull:
- print('Incompatible arguments --pull and --no-pull.')
+ logging.error('Incompatible arguments --pull and --no-pull.')
return False
if args.pull:
@@ -507,9 +509,9 @@ def build_image(args):
pull = y_or_n.lower() == 'y'
if pull:
- print('Pulling latest base images...')
+ logging.error('Pulling latest base images...')
else:
- print('Using cached base images...')
+ logging.error('Using cached base images...')
# If build_image is called explicitly, don't use cache.
if build_image_impl(args.project_name, cache=args.cache, pull=pull):
@@ -535,10 +537,10 @@ def build_fuzzers_impl( # pylint: disable=too-many-arguments,too-many-locals,to
project_work_dir = _get_work_dir(project_name)
project_language = _get_project_language(project_name)
if not project_language:
- print('WARNING: language not specified in project.yaml. Build may fail.')
+ logging.warning('Language not specified in project.yaml. Build may fail.')
if clean:
- print('Cleaning existing build artifacts.')
+ logging.info('Cleaning existing build artifacts.')
# Clean old and possibly conflicting artifacts in project's out directory.
docker_run([
@@ -554,7 +556,7 @@ def build_fuzzers_impl( # pylint: disable=too-many-arguments,too-many-locals,to
])
else:
- print('Keeping existing build artifacts as-is (if any).')
+ logging.info('Keeping existing build artifacts as-is (if any).')
env = [
'FUZZING_ENGINE=' + engine,
'SANITIZER=' + sanitizer,
@@ -588,8 +590,7 @@ def build_fuzzers_impl( # pylint: disable=too-many-arguments,too-many-locals,to
]
else:
if workdir == '/src':
- print('Cannot use local checkout with "WORKDIR: /src".',
- file=sys.stderr)
+ logging.error('Cannot use local checkout with "WORKDIR: /src".')
return False
command += [
@@ -606,7 +607,7 @@ def build_fuzzers_impl( # pylint: disable=too-many-arguments,too-many-locals,to
result = docker_run(command)
if not result:
- print('Building fuzzers failed.', file=sys.stderr)
+ logging.error('Building fuzzers failed.')
return False
# Patch MSan builds to use instrumented shared libraries.
@@ -653,7 +654,8 @@ def check_build(args):
fuzzing_language = _get_project_language(args.project_name)
if fuzzing_language is None:
- print('WARNING: language not specified in project.yaml. Defaulting to C++.')
+ logging.warning(
+ 'Language not specified in project.yaml. Defaulting to C++.')
fuzzing_language = 'c++'
env = [
@@ -679,9 +681,9 @@ def check_build(args):
result = docker_run(run_args)
if result:
- print('Check build passed.')
+ logging.info('Check build passed.')
else:
- print('Check build failed.')
+ logging.error('Check build failed.')
return result
@@ -726,8 +728,7 @@ def _get_latest_corpus(project_name, fuzz_target, base_corpus_dir):
# Some fuzz targets (e.g. new ones) may not have corpus yet, just skip those.
if corpus_listing.returncode:
- print('WARNING: corpus for {0} not found:\n'.format(fuzz_target),
- file=sys.stderr)
+ logging.warning('Corpus for %s not found:\n', fuzz_target)
return
if output:
@@ -756,10 +757,8 @@ def download_corpora(args):
with open(os.devnull, 'w') as stdout:
subprocess.check_call(['gsutil', '--version'], stdout=stdout)
except OSError:
- print(
- 'ERROR: gsutil not found. Please install it from '
- 'https://cloud.google.com/storage/docs/gsutil_install',
- file=sys.stderr)
+ logging.error('gsutil not found. Please install it from '
+ 'https://cloud.google.com/storage/docs/gsutil_install')
return False
if args.fuzz_target:
@@ -776,13 +775,12 @@ def download_corpora(args):
_get_latest_corpus(args.project_name, fuzz_target, corpus_dir)
return True
except Exception as error: # pylint:disable=broad-except
- print('ERROR: corpus download for %s failed: %s' %
- (fuzz_target, str(error)),
- file=sys.stderr)
+ logging.error('Corpus download for %s failed: %s.', fuzz_target,
+ str(error))
return False
- print('Downloading corpora for %s project to %s' %
- (args.project_name, corpus_dir))
+ logging.info('Downloading corpora for %s project to %s.', args.project_name,
+ corpus_dir)
thread_pool = ThreadPool()
return all(thread_pool.map(_download_for_single_target, fuzz_targets))
@@ -790,10 +788,9 @@ def download_corpora(args):
def coverage(args):
"""Generates code coverage using clang source based code coverage."""
if args.corpus_dir and not args.fuzz_target:
- print(
- 'ERROR: --corpus-dir requires specifying a particular fuzz target '
- 'using --fuzz-target',
- file=sys.stderr)
+ logging.error(
+ '--corpus-dir requires specifying a particular fuzz target using '
+ '--fuzz-target')
return False
if not check_project_exists(args.project_name):
@@ -801,10 +798,9 @@ def coverage(args):
project_language = _get_project_language(args.project_name)
if project_language not in LANGUAGES_WITH_COVERAGE_SUPPORT:
- print(
- 'ERROR: Project is written in %s, coverage for it is not supported yet.'
- % project_language,
- file=sys.stderr)
+ logging.error(
+ 'Project is written in %s, coverage for it is not supported yet.',
+ project_language)
return False
if not args.no_corpus_download and not args.corpus_dir:
@@ -830,8 +826,8 @@ def coverage(args):
if args.corpus_dir:
if not os.path.exists(args.corpus_dir):
- print('ERROR: the path provided in --corpus-dir argument does not exist',
- file=sys.stderr)
+ logging.error('The path provided in --corpus-dir argument does not '
+ 'exist.')
return False
corpus_dir = os.path.realpath(args.corpus_dir)
run_args.extend(['-v', '%s:/corpus/%s' % (corpus_dir, args.fuzz_target)])
@@ -851,9 +847,9 @@ def coverage(args):
result = docker_run(run_args)
if result:
- print('Successfully generated clang code coverage report.')
+ logging.info('Successfully generated clang code coverage report.')
else:
- print('Failed to generate clang code coverage report.')
+ logging.error('Failed to generate clang code coverage report.')
return result
@@ -879,8 +875,7 @@ def run_fuzzer(args):
if args.corpus_dir:
if not os.path.exists(args.corpus_dir):
- print('ERROR: the path provided in --corpus-dir argument does not exist',
- file=sys.stderr)
+ logging.error('The path provided in --corpus-dir argument does not exist')
return False
corpus_dir = os.path.realpath(args.corpus_dir)
run_args.extend([
@@ -955,13 +950,13 @@ def reproduce_impl( # pylint: disable=too-many-arguments
def generate(args):
"""Generates empty project files."""
if len(args.project_name) > MAX_PROJECT_NAME_LENGTH:
- print('Project name needs to be less than or equal to %d characters.' %
- MAX_PROJECT_NAME_LENGTH,
- file=sys.stderr)
+ logging.error(
+ 'Project name needs to be less than or equal to %d characters.',
+ MAX_PROJECT_NAME_LENGTH)
return False
if not VALID_PROJECT_NAME_REGEX.match(args.project_name):
- print('Invalid project name.', file=sys.stderr)
+ logging.error('Invalid project name.')
return False
directory = os.path.join('projects', args.project_name)
@@ -971,10 +966,10 @@ def generate(args):
except OSError as error:
if error.errno != errno.EEXIST:
raise
- print(directory, 'already exists.', file=sys.stderr)
+ logging.error('%s already exists.', directory)
return False
- print('Writing new files to', directory)
+ logging.info('Writing new files to %s.', directory)
template_args = {
'project_name': args.project_name,