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