forked from hgarrereyn/frameshift-eval
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.py
More file actions
118 lines (95 loc) · 3.62 KB
/
Copy pathbuild.py
File metadata and controls
118 lines (95 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import argparse
import subprocess
from pathlib import Path
import yaml
import config
import fuzzers
def build_base():
print("Building base image")
subprocess.check_output(
['docker', 'build', '-t', 'fs_base', '-f', 'Dockerfile', '.'],
cwd='./docker/base'
)
def build_benchmark(benchmark):
print(f"Building benchmark: {benchmark}")
subprocess.check_output(
['docker', 'build', '-t', 'fs_' + benchmark, '-f', 'Dockerfile', '.'],
cwd=f'./benchmarks/{benchmark}'
)
def build_fuzzer(fuzzer, benchmark):
print(f"Building fuzzer: {fuzzer} for benchmark: {benchmark}")
subprocess.check_output(
[
'docker', 'build',
'--build-arg', f'parent_image=fs_{benchmark}',
'-t', 'fs_' + fuzzer + '_' + benchmark,
'-f', 'builder.Dockerfile', '.'
],
cwd=f'./fuzzers/{fuzzer}'
)
def build_fuzzer_builder(fuzzer, benchmark, debug=False):
print(f"Building fuzzer builder: {fuzzer} for benchmark: {benchmark}")
cmd = []
cmd += [
'docker', 'build',
'--build-arg', f'parent_image=fs_{fuzzer}_{benchmark}',
'--build-arg', f'benchmark={benchmark}',
'--build-arg', f'fuzzer={fuzzer}',
]
if debug:
cmd += ['--build-arg', 'debug_builder=1']
cmd += [
'-t', 'fs_' + fuzzer + '_' + benchmark + '_builder',
'-f', 'docker/builder/Dockerfile',
'.'
]
subprocess.check_output(cmd)
def export_fuzzer(fuzzer, benchmark, build_dir: Path):
if build_dir.exists():
print('Clearing existing build directory')
for child in build_dir.iterdir():
if child.is_dir():
subprocess.check_output(['rm', '-rf', child])
else:
child.unlink()
build_dir.mkdir(parents=True, exist_ok=True)
print(f"Exporting fuzzer: {fuzzer} for benchmark: {benchmark}")
subprocess.check_output(
[
'docker', 'build',
'--build-arg', f'parent_image=fs_{fuzzer}_{benchmark}_builder',
'-t', 'fs_' + fuzzer + '_' + benchmark + '_export',
'-f', 'docker/exporter/Dockerfile',
'--output=type=local,dest=' + str(build_dir),
'.'
]
)
def main(args):
cfg = config.Config('config.yaml')
fuzzer = args.fuzzer
benchmark = args.benchmark
print(f"Fuzzer: {fuzzer}")
print(f"Benchmark: {benchmark}")
build_base()
build_benchmark(benchmark)
build_fuzzer(fuzzer, benchmark)
build_fuzzer_builder(fuzzer, benchmark, debug=args.debug)
if args.debug:
# run the debug container
subprocess.run(['docker', 'run', '-it', '--rm', 'fs_' + fuzzer + '_' + benchmark + '_builder'])
return
export_fuzzer(fuzzer, benchmark, build_dir=cfg.build_dir(fuzzer, benchmark))
# Check for postprocess.py
if (Path(f'./fuzzers/{fuzzer}/postprocess.py')).exists():
print('Running postprocess.py')
__import__('fuzzers', fromlist=[fuzzer])
postprocess_script = getattr(__import__(f'fuzzers.{fuzzer}', fromlist=['postprocess']), 'postprocess')
binfo = yaml.safe_load(open(f'benchmarks/{benchmark}/benchmark.yaml'))
postprocess_script.run(cfg, cfg.build_dir(fuzzer, benchmark), binfo['fuzz_target'])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--fuzzer', '-f', type=str, required=True, help='Fuzzer name')
parser.add_argument('--benchmark', '-b', type=str, required=True, help='Benchmark name')
parser.add_argument('--debug', '-d', action='store_true', help='Debug builder')
args = parser.parse_args()
main(args)