blob: 250150b0e01bff33218a265b747d8b9bba97054d [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Transforms power_manager prefs/defaults into enforceable schema."""
import argparse
import os
import re
import sys
THIS_DIR = os.path.dirname(__file__)
PREF_DEF_FILE = os.path.join(
THIS_DIR, '../../power_manager/common/power_constants.cc')
PREF_DEFAULTS_DIR = os.path.join(THIS_DIR, '../../power_manager/default_prefs')
def ParseArgs(argv):
"""Parse the available arguments.
Invalid arguments or -h cause this function to print a message and exit.
Args:
argv: List of string arguments (excluding program name / argv[0])
Returns:
argparse.Namespace object containing the attributes.
"""
parser = argparse.ArgumentParser(
description='Generates power_manager prefs jsonschema')
parser.add_argument(
'-o',
'--output',
type=str,
help='Output file that will be generated by the transform')
return parser.parse_args(argv)
def Main(output):
"""Transforms power_manager prefs/defaults into jsonschema.
Args:
output: Output file that will be generated by the transform.
"""
result_lines = ["""powerd_prefs_default: &powerd_prefs_default
description: For details, see https://chromium.googlesource.com/chromiumos/platform2/+/refs/heads/master/power_manager/
type: string
powerd_prefs: &powerd_prefs"""]
with open(PREF_DEF_FILE, 'r') as defs_stream:
defs_content = defs_stream.read()
prefs = re.findall(
r'const char .*Pref.. =[ |\n] *"(.*)";', defs_content, re.MULTILINE)
for pref in prefs:
default_pref_path = os.path.join(PREF_DEFAULTS_DIR, pref)
pref_name = pref.replace('_', '-')
if os.path.exists(default_pref_path):
result_lines.append(' %s:' % pref_name)
result_lines.append(' <<: *powerd_prefs_default')
with open(default_pref_path, 'r') as default_stream:
default = default_stream.read()
result_lines.append(
' default: "%s"' % default.strip().replace('\n', ' '))
else:
result_lines.append(' %s: *powerd_prefs_default' % pref_name)
full_result = '\n'.join(result_lines)
if output:
with open(output, 'w') as output_stream:
print(full_result, file=output_stream)
else:
print(full_result)
def main(argv=None):
"""Main program which parses args and runs
Args:
argv: List of command line arguments, if None uses sys.argv.
"""
if argv is None:
argv = sys.argv[1:]
opts = ParseArgs(argv)
Main(opts.output)
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))