| // Copyright 2016 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. |
| |
| // Library to provide access to the Chrome OS model configuration |
| |
| #ifndef CHROMEOS_CONFIG_LIBCROS_CONFIG_CROS_CONFIG_H_ |
| #define CHROMEOS_CONFIG_LIBCROS_CONFIG_CROS_CONFIG_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include <base/macros.h> |
| #include <brillo/brillo_export.h> |
| #include "chromeos-config/libcros_config/cros_config_interface.h" |
| #include "chromeos-config/libcros_config/identity.h" |
| |
| namespace base { |
| class FilePath; |
| } // namespace base |
| |
| namespace brillo { |
| |
| static const int kDefaultSkuId = -1; |
| |
| class BRILLO_EXPORT CrosConfig : public CrosConfigInterface { |
| public: |
| CrosConfig(); |
| CrosConfig(const CrosConfig&) = delete; |
| CrosConfig& operator=(const CrosConfig&) = delete; |
| |
| ~CrosConfig() override; |
| |
| // Prepare the configuration system for access to the configuration for |
| // the model this is running on. This reads the configuration file into |
| // memory. |
| // @return true if OK, false on error. |
| bool Init(); |
| |
| // Prepare the configuration system for testing. |
| // This reads in the given configuration file and selects the config |
| // based on the supplied identifiers. |
| // @sku_id: SKU ID. |
| // @json_path: Path to configuration file. |
| // @arch: brillo::SystemArchitecture (kX86 or kArm). |
| // @name: Platform name. |
| // @customization_id: VPD customization ID |
| // @return true if OK, false on error. |
| bool InitForTest(const int sku_id, |
| const base::FilePath& json_path, |
| const SystemArchitecture arch, |
| const std::string& name, |
| const std::string& customization_id); |
| |
| // Mount a ConfigFS image. This method can be called before or |
| // instead of Init, and the optimized identity file inside of the |
| // ConfigFS image will be used for initialization instead of the |
| // default JSON file. |
| // @image_path: The path to the ConfigFS image. |
| // @mount_path: The directory to mount ConfigFS at. |
| // @return true on success, false on error. |
| bool MountConfigFS(const base::FilePath& image_path, |
| const base::FilePath& mount_path); |
| |
| // Mount a ConfigFS image using the legacy (non-unibuild) |
| // interface. This method can be called before (but not instead of) |
| // Init, as no runtime probing is needed on non-unibuild boards. |
| // @mount_path: The directory to mount ConfigFS at. |
| // @return true on success, false on error. |
| bool MountFallbackConfigFS(const base::FilePath& mount_path); |
| |
| // Undo a MountConfigFS or MountFallbackConfigFS by unmounting all |
| // associated filesystems. Uses MNT_DETACH (equivalent to umount |
| // --lazy) to prevent blocking if another process has left open a |
| // file descriptor. |
| // @mount_path: The directory which ChromeOS ConfigFS is mounted at. |
| // @return true on success, false on error. |
| bool Unmount(const base::FilePath& mount_path) const; |
| |
| // CrosConfigInterface: |
| bool GetString(const std::string& path, |
| const std::string& property, |
| std::string* val_out) override; |
| |
| bool GetDeviceIndex(int* device_index_out) override; |
| |
| private: |
| // Get the default identity files for the specified architecture. |
| // @arch: The current (or tested) system architecture. |
| // @vpd_file_out: Output file path for whitelabel tag or |
| // customization id. |
| // @product_name_file_out: Output file path for SMBIOS name or |
| // dt-compatible file. |
| // @product_sku_file_out: Output file path for SKU ID file. |
| bool GetDefaultIdentityFiles(const SystemArchitecture arch, |
| base::FilePath* vpd_file_out, |
| base::FilePath* product_name_file_out, |
| base::FilePath* product_sku_file_out); |
| |
| // Internal init function used by Init and InitForTest. |
| // @sku_id: SKU ID. |
| // @json_path: Path to configuration file. |
| // @arch: brillo::SystemArchitecture (kX86 or kArm). |
| // @product_name_file: The file to read product name, or device-tree |
| // compatible name, from |
| // @product_sku_file: The file to read sku id from |
| // @vpd_file: The file to read VPD customization ID from |
| // @return true if OK, false on error. |
| bool InitInternal(const int sku_id, |
| const base::FilePath& json_path, |
| const SystemArchitecture arch, |
| const base::FilePath& product_name_file, |
| const base::FilePath& product_sku_file, |
| const base::FilePath& vpd_file); |
| |
| // When InitForTest is is called, the underlying CrosConfigJson that |
| // is used. |
| std::unique_ptr<CrosConfigInterface> cros_config_; |
| }; |
| |
| } // namespace brillo |
| |
| #endif // CHROMEOS_CONFIG_LIBCROS_CONFIG_CROS_CONFIG_H_ |