Aktualizr
C++ SOTA Client
bootloader.cc
1 #include "bootloader.h"
2 #include "utilities/config_utils.h"
3 #include "utilities/exceptions.h"
4 #include "utilities/utils.h"
5 
6 std::ostream& operator<<(std::ostream& os, const RollbackMode mode) {
7  std::string mode_s;
8  switch (mode) {
9  case RollbackMode::kUbootGeneric:
10  mode_s = "uboot_generic";
11  break;
12  case RollbackMode::kUbootMasked:
13  mode_s = "uboot_masked";
14  break;
15  default:
16  mode_s = "none";
17  break;
18  }
19  os << '"' << mode_s << '"';
20  return os;
21 }
22 
23 template <>
24 inline void CopyFromConfig(RollbackMode& dest, const std::string& option_name, const boost::property_tree::ptree& pt) {
25  boost::optional<std::string> value = pt.get_optional<std::string>(option_name);
26  if (value.is_initialized()) {
27  std::string mode{StripQuotesFromStrings(value.get())};
28  if (mode == "uboot_generic") {
29  dest = RollbackMode::kUbootGeneric;
30  } else if (mode == "uboot_masked") {
31  dest = RollbackMode::kUbootMasked;
32  } else {
33  dest = RollbackMode::kBootloaderNone;
34  }
35  }
36 }
37 
38 void BootloaderConfig::updateFromPropertyTree(const boost::property_tree::ptree& pt) {
39  CopyFromConfig(rollback_mode, "rollback_mode", pt);
40 }
41 
42 void BootloaderConfig::writeToStream(std::ostream& out_stream) const {
43  writeOption(out_stream, rollback_mode, "rollback_mode");
44 }
45 
46 void Bootloader::setBootOK() const {
47  std::string sink;
48  switch (config_.rollback_mode) {
49  case RollbackMode::kBootloaderNone:
50  break;
51  case RollbackMode::kUbootGeneric:
52  if (Utils::shell("fw_setenv bootcount 0", &sink) != 0) {
53  LOG_WARNING << "Failed resetting bootcount";
54  }
55  break;
56  case RollbackMode::kUbootMasked:
57  if (Utils::shell("fw_setenv bootcount 0", &sink) != 0) {
58  LOG_WARNING << "Failed resetting bootcount";
59  }
60  if (Utils::shell("fw_setenv upgrade_available 0", &sink) != 0) {
61  LOG_WARNING << "Failed resetting upgrade_available for u-boot";
62  }
63  break;
64  default:
66  }
67 }
68 
69 void Bootloader::updateNotify() const {
70  std::string sink;
71  switch (config_.rollback_mode) {
72  case RollbackMode::kBootloaderNone:
73  break;
74  case RollbackMode::kUbootGeneric:
75  if (Utils::shell("fw_setenv bootcount 0", &sink) != 0) {
76  LOG_WARNING << "Failed resetting bootcount";
77  }
78  if (Utils::shell("fw_setenv rollback 0", &sink) != 0) {
79  LOG_WARNING << "Failed resetting rollback flag";
80  }
81  break;
82  case RollbackMode::kUbootMasked:
83  if (Utils::shell("fw_setenv bootcount 0", &sink) != 0) {
84  LOG_WARNING << "Failed resetting bootcount";
85  }
86  if (Utils::shell("fw_setenv upgrade_available 1", &sink) != 0) {
87  LOG_WARNING << "Failed setting upgrade_available for u-boot";
88  }
89  if (Utils::shell("fw_setenv rollback 0", &sink) != 0) {
90  LOG_WARNING << "Failed resetting rollback flag";
91  }
92  break;
93  default:
95  }
96 }