#!/usr/bin/env python # Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """generate_params.py processes input .sb seatbelt files and extracts parameter definitions of the form (define "sandbox-param-name") And generates C++ constants of the form kParamSandboxParamName Usage: generate_sandbox_params.py path/to/params policy1.sb policy2.sb... Where |path/to/params| specifies the file prefix for the generated .h and .cc files. """ from __future__ import print_function import re import sys def generate_sandbox_params(argv): if len(argv) < 3: print('Usage: {} output_file_prefix file1.sb...'.format(argv[0]), file=sys.stderr) return 1 h_contents = '' cc_contents = '' for (name, value) in _process_policy_files(argv[2:]): variable_name = 'kParam' + name.title().replace('-', '') h_contents += 'SANDBOX_POLICY_EXPORT extern const char {}[];\n'.format( variable_name) cc_contents += 'const char {}[] = "{}";\n'.format(variable_name, value) with open(argv[1] + '.h', 'w') as f: f.write( FILE_TEMPLATE.format(includes='#include "sandbox/policy/export.h"', contents=h_contents)) with open(argv[1] + '.cc', 'w') as f: f.write( FILE_TEMPLATE.format( includes='#include "sandbox/policy/mac/params.h"', contents=cc_contents)) return 0 def _process_policy_files(files): """Iterates the files in |files|, parsing out parameter definitions, and yields the name-value pair. """ for sb_file in files: with open(sb_file, 'r') as f: for line in f: comment_start = line.find(';') if comment_start != -1: line = line[:comment_start] match = DEFINE_RE.match(line) if match: groups = match.groups() yield (groups[0], groups[1]) DEFINE_RE = re.compile(r'^\(define\s+([a-zA-Z0-9\-]+).*"(\w+)"\)') FILE_TEMPLATE = """// Generated by generate_params.py. Do not edit!!! {includes} namespace sandbox {{ namespace policy {{ {contents} }} // namespace policy }} // namespace sandbox """ if __name__ == '__main__': sys.exit(generate_sandbox_params(sys.argv))