blob: 8ab6697e8207e9fdf095cc657cfb61d831dd88b5 [file] [log] [blame]
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -07001# Copyright 2016 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Combine os-release.d fragments into /etc/os-release."""
6
7from __future__ import print_function
8
9import os
10
11from chromite.lib import commandline
12from chromite.lib import cros_build_lib
13from chromite.lib import osutils
14
15
Andrey Ulanov2568e172016-05-04 17:25:52 -070016def GenerateOsRelease(root, default_params=None):
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -070017 """Adds contents of /etc/os-release.d into /etc/os-release
18
19 Args:
20 root: path to the root directory where os-release should be genereated.
Andrey Ulanov2568e172016-05-04 17:25:52 -070021 default_params: a dict of os-release parameters that should be added
22 if not already set.
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -070023 """
24 os_release_path = os.path.join(root, 'etc', 'os-release')
25 os_released_path = os.path.join(root, 'etc', 'os-release.d')
26
27 if not os.path.isdir(os_released_path):
28 # /etc/os-release.d does not exist, no need to regenerate /etc/os-release.
29 return
30
31 mapping = {}
32 if os.path.exists(os_release_path):
33 content = osutils.ReadFile(os_release_path)
34
35 for line in content.splitlines():
36 if line.startswith('#'):
37 continue
38
39 key_value = line.split('=', 1)
40 if len(key_value) != 2:
41 cros_build_lib.Die('Malformed line in /etc/os-release')
42
43 mapping[key_value[0]] = key_value[1].strip()
44
45 for filepath in os.listdir(os_released_path):
46 key = os.path.basename(filepath)
47 if key in mapping:
48 cros_build_lib.Die('key %s defined in /etc/os-release.d but already '
49 'defined in /etc/os-release.' % key)
50 mapping[key] = osutils.ReadFile(os.path.join(os_released_path,
51 filepath)).strip('\n')
52
Andrey Ulanov2568e172016-05-04 17:25:52 -070053 if default_params:
54 for key, value in default_params.iteritems():
55 mapping.setdefault(key, value)
56
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -070057 osrelease_content = '\n'.join([k + '=' + mapping[k] for k in mapping])
58 osrelease_content += '\n'
59 osutils.WriteFile(os_release_path, osrelease_content)
60
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -070061def main(argv):
62 parser = commandline.ArgumentParser(description=__doc__)
63 parser.add_argument('--root', type='path', required=True,
64 help='sysroot of the board')
Andrey Ulanov2568e172016-05-04 17:25:52 -070065 parser.add_argument('--version', help='The image version string.')
66 parser.add_argument('--build_id', help='The image build ID string.')
Bertrand SIMONNET83ee6ce2014-10-06 14:20:10 -070067 options = parser.parse_args(argv)
68 options.Freeze()
69
Andrey Ulanov2568e172016-05-04 17:25:52 -070070 default_params = {
71 'NAME': 'Chromium OS',
72 'ID': 'chromiumos',
73 'HOME_URL': 'https://www.chromium.org/chromium-os',
74 'BUG_REPORT_URL': 'https://crbug.com/new',
75 }
76
77 if options.version:
78 default_params['VERSION'] = options.version
79 default_params['VERSION_ID'] = options.version
80 if options.build_id:
81 default_params['BUILD_ID'] = options.build_id
82
83 GenerateOsRelease(options.root, default_params)