8 #include "bootstrap/bootstrap.h" 10 #include "utilities/exceptions.h" 11 #include "utilities/utils.h" 13 void NetworkConfig::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
14 CopyFromConfig(ipdiscovery_host,
"ipdiscovery_host", pt);
15 CopyFromConfig(ipdiscovery_port,
"ipdiscovery_port", pt);
16 CopyFromConfig(ipdiscovery_wait_seconds,
"ipdiscovery_wait_seconds", pt);
17 CopyFromConfig(ipuptane_port,
"ipuptane_port", pt);
20 void NetworkConfig::writeToStream(std::ostream& out_stream)
const {
21 writeOption(out_stream, ipdiscovery_host,
"ipdiscovery_host");
22 writeOption(out_stream, ipdiscovery_port,
"ipdiscovery_port");
23 writeOption(out_stream, ipdiscovery_wait_seconds,
"ipdiscovery_wait_seconds");
24 writeOption(out_stream, ipuptane_port,
"ipuptane_port");
27 void TlsConfig::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
28 CopyFromConfig(server,
"server", pt);
29 CopyFromConfig(server_url_path,
"server_url_path", pt);
30 CopyFromConfig(ca_source,
"ca_source", pt);
31 CopyFromConfig(cert_source,
"cert_source", pt);
32 CopyFromConfig(pkey_source,
"pkey_source", pt);
35 void TlsConfig::writeToStream(std::ostream& out_stream)
const {
36 writeOption(out_stream, server,
"server");
37 writeOption(out_stream, server_url_path,
"server_url_path");
38 writeOption(out_stream, ca_source,
"ca_source");
39 writeOption(out_stream, pkey_source,
"pkey_source");
40 writeOption(out_stream, cert_source,
"cert_source");
43 void ProvisionConfig::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
44 CopyFromConfig(server,
"server", pt);
45 CopyFromConfig(p12_password,
"p12_password", pt);
46 CopyFromConfig(expiry_days,
"expiry_days", pt);
47 CopyFromConfig(provision_path,
"provision_path", pt);
48 CopyFromConfig(device_id,
"device_id", pt);
49 CopyFromConfig(primary_ecu_serial,
"primary_ecu_serial", pt);
50 CopyFromConfig(primary_ecu_hardware_id,
"primary_ecu_hardware_id", pt);
51 CopyFromConfig(ecu_registration_endpoint,
"ecu_registration_endpoint", pt);
55 void ProvisionConfig::writeToStream(std::ostream& out_stream)
const {
56 writeOption(out_stream, server,
"server");
57 writeOption(out_stream, p12_password,
"p12_password");
58 writeOption(out_stream, expiry_days,
"expiry_days");
59 writeOption(out_stream, provision_path,
"provision_path");
60 writeOption(out_stream, device_id,
"device_id");
61 writeOption(out_stream, primary_ecu_serial,
"primary_ecu_serial");
62 writeOption(out_stream, primary_ecu_hardware_id,
"primary_ecu_hardware_id");
63 writeOption(out_stream, ecu_registration_endpoint,
"ecu_registration_endpoint");
67 void UptaneConfig::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
68 CopyFromConfig(running_mode,
"running_mode", pt);
69 CopyFromConfig(polling_sec,
"polling_sec", pt);
70 CopyFromConfig(director_server,
"director_server", pt);
71 CopyFromConfig(repo_server,
"repo_server", pt);
72 CopyFromConfig(key_source,
"key_source", pt);
73 CopyFromConfig(key_type,
"key_type", pt);
74 CopyFromConfig(secondary_configs_dir,
"secondary_configs_dir", pt);
78 void UptaneConfig::writeToStream(std::ostream& out_stream)
const {
79 writeOption(out_stream, StringFromRunningMode(running_mode),
"running_mode");
80 writeOption(out_stream, polling_sec,
"polling_sec");
81 writeOption(out_stream, director_server,
"director_server");
82 writeOption(out_stream, repo_server,
"repo_server");
83 writeOption(out_stream, key_source,
"key_source");
84 writeOption(out_stream, key_type,
"key_type");
85 writeOption(out_stream, secondary_configs_dir,
"secondary_configs_dir");
88 void DiscoveryConfig::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
89 CopyFromConfig(ipuptane,
"ipuptane", pt);
92 void DiscoveryConfig::writeToStream(std::ostream& out_stream)
const { writeOption(out_stream, ipuptane,
"ipuptane"); }
99 std::ostream& operator<<(std::ostream& os,
const Config& cfg) {
100 cfg.writeToStream(os);
104 Config::Config() { postUpdateValues(); }
106 Config::Config(
const boost::filesystem::path& filename) {
107 updateFromToml(filename);
111 Config::Config(
const std::vector<boost::filesystem::path>& config_dirs) {
112 checkDirs(config_dirs);
113 updateFromDirs(config_dirs);
117 Config::Config(
const boost::program_options::variables_map& cmd) {
120 if (cmd.count(
"loglevel") != 0) {
121 logger.loglevel = cmd[
"loglevel"].as<
int>();
122 logger_set_threshold(logger);
123 loglevel_from_cmdline =
true;
126 if (cmd.count(
"config") > 0) {
127 const auto configs = cmd[
"config"].as<std::vector<boost::filesystem::path>>();
129 updateFromDirs(configs);
131 updateFromDirs(config_dirs_);
133 updateFromCommandLine(cmd);
138 return KeyManagerConfig{p11, tls.ca_source, tls.pkey_source, tls.cert_source, uptane.key_type, uptane.key_source};
141 void Config::postUpdateValues() {
142 logger_set_threshold(logger);
144 if (provision.provision_path.empty()) {
145 provision.mode = ProvisionMode::kImplicit;
148 if (tls.server.empty()) {
149 if (!tls.server_url_path.empty()) {
151 tls.server = Utils::readFile(tls.server_url_path,
true);
152 }
catch (
const boost::filesystem::filesystem_error& e) {
153 LOG_ERROR <<
"Couldn't read gateway URL: " << e.what();
156 }
else if (!provision.provision_path.empty()) {
157 if (boost::filesystem::exists(provision.provision_path)) {
158 tls.server = Bootstrap::readServerUrl(provision.provision_path);
160 LOG_ERROR <<
"Provided provision archive " << provision.provision_path <<
" does not exist!";
165 if (!tls.server.empty()) {
166 if (provision.server.empty()) {
167 provision.server = tls.server;
170 if (uptane.repo_server.empty()) {
171 uptane.repo_server = tls.server +
"/repo";
174 if (uptane.director_server.empty()) {
175 uptane.director_server = tls.server +
"/director";
178 if (pacman.ostree_server.empty()) {
179 pacman.ostree_server = tls.server +
"/treehub";
183 if (!uptane.director_server.empty()) {
184 if (provision.ecu_registration_endpoint.empty()) {
185 provision.ecu_registration_endpoint = uptane.director_server +
"/ecus";
189 if (!uptane.secondary_configs_dir.empty()) {
190 readSecondaryConfigs(uptane.secondary_configs_dir);
193 LOG_TRACE <<
"Final configuration that will be used: \n" << (*this);
197 void Config::updateFromTomlString(
const std::string& contents) {
198 boost::property_tree::ptree pt;
199 std::stringstream stream(contents);
200 boost::property_tree::ini_parser::read_ini(stream, pt);
201 updateFromPropertyTree(pt);
204 void Config::updateFromPropertyTree(
const boost::property_tree::ptree& pt) {
206 if (!loglevel_from_cmdline) {
207 CopySubtreeFromConfig(logger,
"logger", pt);
210 logger_set_threshold(logger);
212 CopySubtreeFromConfig(network,
"network", pt);
213 CopySubtreeFromConfig(p11,
"p11", pt);
214 CopySubtreeFromConfig(tls,
"tls", pt);
215 CopySubtreeFromConfig(provision,
"provision", pt);
216 CopySubtreeFromConfig(uptane,
"uptane", pt);
217 CopySubtreeFromConfig(discovery,
"discovery", pt);
218 CopySubtreeFromConfig(pacman,
"pacman", pt);
219 CopySubtreeFromConfig(storage,
"storage", pt);
220 CopySubtreeFromConfig(
import,
"import", pt);
221 CopySubtreeFromConfig(telemetry,
"telemetry", pt);
222 CopySubtreeFromConfig(bootloader,
"bootloader", pt);
225 void Config::updateFromCommandLine(
const boost::program_options::variables_map& cmd) {
227 if (cmd.count(
"loglevel") != 0) {
228 logger.loglevel = cmd[
"loglevel"].as<
int>();
230 if (cmd.count(
"running-mode") != 0) {
231 uptane.running_mode = RunningModeFromString(cmd[
"running-mode"].as<std::string>());
233 if (cmd.count(
"tls-server") != 0) {
234 tls.server = cmd[
"tls-server"].as<std::string>();
236 if (cmd.count(
"repo-server") != 0) {
237 uptane.repo_server = cmd[
"repo-server"].as<std::string>();
239 if (cmd.count(
"director-server") != 0) {
240 uptane.director_server = cmd[
"director-server"].as<std::string>();
242 if (cmd.count(
"ostree-server") != 0) {
243 pacman.ostree_server = cmd[
"ostree-server"].as<std::string>();
245 if (cmd.count(
"primary-ecu-serial") != 0) {
246 provision.primary_ecu_serial = cmd[
"primary-ecu-serial"].as<std::string>();
248 if (cmd.count(
"primary-ecu-hardware-id") != 0) {
249 provision.primary_ecu_hardware_id = cmd[
"primary-ecu-hardware-id"].as<std::string>();
251 if (cmd.count(
"secondary-configs-dir") != 0) {
252 uptane.secondary_configs_dir = cmd[
"secondary-configs-dir"].as<boost::filesystem::path>();
256 void Config::readSecondaryConfigs(
const boost::filesystem::path& sconfigs_dir) {
257 if (!boost::filesystem::is_directory(sconfigs_dir)) {
258 LOG_ERROR <<
"Could not read secondary configs from " << sconfigs_dir <<
": not a directory";
261 for (
const auto& config_file : Utils::glob((sconfigs_dir /
"*.json").
string())) {
262 LOG_INFO <<
"Parsing secondary config: " << config_file;
263 uptane.secondary_configs.emplace_back(config_file);
267 void Config::writeToStream(std::ostream& sink)
const {
270 WriteSectionToStream(logger,
"logger", sink);
271 WriteSectionToStream(network,
"network", sink);
272 WriteSectionToStream(p11,
"p11", sink);
273 WriteSectionToStream(tls,
"tls", sink);
274 WriteSectionToStream(provision,
"provision", sink);
275 WriteSectionToStream(uptane,
"uptane", sink);
276 WriteSectionToStream(discovery,
"discovery", sink);
277 WriteSectionToStream(pacman,
"pacman", sink);
278 WriteSectionToStream(storage,
"storage", sink);
279 WriteSectionToStream(
import,
"import", sink);
280 WriteSectionToStream(telemetry,
"telemetry", sink);
281 WriteSectionToStream(bootloader,
"bootloader", sink);
285 ser << asn1::implicit<kAsn1Enum>(
static_cast<const int32_t&
>(
static_cast<int>(cs)));
291 ser << asn1::seq << asn1::implicit<kAsn1Utf8String>(tls_conf.server)
292 << asn1::implicit<kAsn1Utf8String>(tls_conf.server_url_path.string()) << tls_conf.ca_source
293 << tls_conf.pkey_source << tls_conf.cert_source << asn1::endseq;
299 des >> asn1::implicit<kAsn1Enum>(cs_i);
301 if (cs_i < static_cast<int>(CryptoSource::kFile) || cs_i >
static_cast<int>(CryptoSource::kPkcs11)) {
305 cs =
static_cast<CryptoSource
>(cs_i);
311 std::string path_string;
312 des >> asn1::implicit<kAsn1Utf8String>(path_string);
318 des >> asn1::seq >> asn1::implicit<kAsn1Utf8String>(tls_conf.server) >> tls_conf.server_url_path >>
319 tls_conf.ca_source >> tls_conf.pkey_source >> tls_conf.cert_source >> asn1::endseq;
Configuration object for an aktualizr instance running on a primary ECU.