~aleteoryx/muditaos

0867d1724237dbf8c383d67ee3f460b8df51e0ef — Pawel Olejniczak 3 years ago 0a9846e
[CP-1424] Refactor backup and restore endpoints

Redesign of backup and restore endpoints in the
service-desktop to delegate responsibility for
execution of the actual backup and restore process
onto the Updater.
M module-bsp/board/rt1051/bsp/lpm/RT1051LPMCommon.cpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPMCommon.cpp +7 -1
@@ 36,7 36,7 @@ namespace bsp
    {
        switch (reason) {
        case RebootType::GoToUpdaterUpdate:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToUpdateCode;
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToUpdaterCode;
            break;
        case RebootType::GoToUpdaterRecovery:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToRecoveryCode;


@@ 44,6 44,12 @@ namespace bsp
        case RebootType::GoToUpdaterFactoryReset:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToFactoryRstCode;
            break;
        case RebootType::GoToUpdaterBackup:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToBackupCode;
            break;
        case RebootType::GoToUpdaterRestore:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToRestoreCode;
            break;
        case RebootType::GoToUsbMscMode:
            SNVS->LPGPR[0] = bsp::rebootCode::rebootToUsbMscModeCode;
            break;

M module-bsp/board/rt1051/common/reboot_codes.hpp => module-bsp/board/rt1051/common/reboot_codes.hpp +3 -1
@@ 13,11 13,13 @@ namespace bsp
    enum rebootCode : std::uint32_t
    {
        rebootNormalCode       = std::uint32_t{0},
        rebootToUpdateCode     = std::uint32_t{0xdead0000},
        rebootToUpdaterCode    = std::uint32_t{0xdead0000},
        rebootToRecoveryCode   = std::uint32_t{0xdead0001},
        rebootToFactoryRstCode = std::uint32_t{0xdead0002},
        // 0xdead0003 is reserved for eco_factory_pgm_keys
        rebootToUsbMscModeCode = std::uint32_t{0x00000004},
        rebootToBackupCode     = std::uint32_t{0xdead0005},
        rebootToRestoreCode    = std::uint32_t{0xdead0006},
        rebootFailedToBoot     = std::uint32_t{0xdeadFFFF}
    };
} // namespace bsp

M module-bsp/bsp/lpm/bsp_lpm.hpp => module-bsp/bsp/lpm/bsp_lpm.hpp +8 -5
@@ 26,10 26,13 @@ namespace bsp
        enum class RebootType
        {
            NormalRestart,
            GoToUsbMscMode,             // Reboot into USB MSC mode
            GoToUsbMscMode,          // Reboot into USB MSC mode
            GoToUpdaterUpdate,       //! Goto updater into the update mode
            GoToUpdaterFactoryReset, //! GOto updater into the factory reset mode
            GoToUpdaterRecovery      //! Goto to updater into recovery mode
            GoToUpdaterRecovery,     //! Goto to updater into recovery mode
            GoToUpdaterBackup,       //! Goto to updater into backup mode
            GoToUpdaterRestore       //! Goto to updater into restore mode

        };

        LowPowerMode()          = default;


@@ 41,7 44,7 @@ namespace bsp
        virtual int32_t Reboot(RebootType reason) = 0;

        virtual void SetCpuFrequency(CpuFrequencyMHz freq) = 0;
        virtual void SetHighestCoreVoltage() = 0;
        virtual void SetHighestCoreVoltage()               = 0;
        [[nodiscard]] CpuFrequencyMHz GetCurrentFrequencyLevel() const noexcept;
        [[nodiscard]] virtual uint32_t GetCpuFrequency() const noexcept = 0;



@@ 51,8 54,8 @@ namespace bsp
        virtual void EnableDcdcPowerSaveMode()  = 0;
        virtual void DisableDcdcPowerSaveMode() = 0;

        virtual void DisconnectInternalLoadResistor()  = 0;
        virtual void ConnectInternalLoadResistor() = 0;
        virtual void DisconnectInternalLoadResistor() = 0;
        virtual void ConnectInternalLoadResistor()    = 0;

        virtual void SwitchToRegularModeLDO()  = 0;
        virtual void SwitchToLowPowerModeLDO() = 0;

M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +0 -56
@@ 45,9 45,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
    connectHandler<message::bluetooth::ResponseBondedDevices>();
    connectHandler<message::bluetooth::ResponseVisibleDevices>();
    connectHandler<sdesktop::developerMode::DeveloperModeRequest>();
    connectHandler<sdesktop::BackupMessage>();
    connectHandler<sdesktop::SyncMessage>();
    connectHandler<sdesktop::RestoreMessage>();
    connectHandler<sdesktop::FactoryMessage>();
    connectHandler<sdesktop::usb::USBConfigured>();
    connectHandler<sdesktop::usb::USBDisconnected>();


@@ 113,14 111,6 @@ std::string ServiceDesktop::prepareSyncFilename()
    return std::string(syncFileName.data());
}

void ServiceDesktop::prepareBackupData()
{
    backupSyncRestoreStatus.operation     = BackupSyncRestore::Operation::Backup;
    backupSyncRestoreStatus.taskId        = prepareBackupFilename();
    backupSyncRestoreStatus.state         = BackupSyncRestore::OperationState::Stopped;
    backupSyncRestoreStatus.backupTempDir = purefs::dir::getTemporaryPath() / backupSyncRestoreStatus.taskId;
}

void ServiceDesktop::prepareSyncData()
{
    backupSyncRestoreStatus.operation     = BackupSyncRestore::Operation::Sync;


@@ 129,14 119,6 @@ void ServiceDesktop::prepareSyncData()
    backupSyncRestoreStatus.backupTempDir = purefs::dir::getTemporaryPath() / backupSyncRestoreStatus.taskId;
}

void ServiceDesktop::prepareRestoreData(const std::filesystem::path &restoreLocation)
{
    backupSyncRestoreStatus.operation = BackupSyncRestore::Operation::Restore;
    backupSyncRestoreStatus.taskId    = restoreLocation.filename();
    backupSyncRestoreStatus.state     = BackupSyncRestore::OperationState::Stopped;
    backupSyncRestoreStatus.location  = purefs::dir::getBackupOSPath() / backupSyncRestoreStatus.taskId;
}

auto ServiceDesktop::requestLogsFlush() -> void
{
    int response = 0;


@@ 333,25 315,6 @@ auto ServiceDesktop::handle(sdesktop::developerMode::DeveloperModeRequest *msg) 
    return sys::MessageNone{};
}

auto ServiceDesktop::handle(sdesktop::BackupMessage * /*msg*/) -> std::shared_ptr<sys::Message>
{
    backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Running;
    backupSyncRestoreStatus.completionCode =
        BackupSyncRestore::BackupUserFiles(this, backupSyncRestoreStatus.backupTempDir);
    backupSyncRestoreStatus.location = backupSyncRestoreStatus.taskId;

    if (backupSyncRestoreStatus.completionCode == BackupSyncRestore::CompletionCode::Success) {
        LOG_INFO("Backup finished");
        backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Finished;
    }
    else {
        LOG_ERROR("Backup failed");
        backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Error;
    }

    return sys::MessageNone{};
}

auto ServiceDesktop::handle(sdesktop::SyncMessage * /*msg*/) -> std::shared_ptr<sys::Message>
{
    backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Running;


@@ 371,25 334,6 @@ auto ServiceDesktop::handle(sdesktop::SyncMessage * /*msg*/) -> std::shared_ptr<
    return sys::MessageNone{};
}

auto ServiceDesktop::handle(sdesktop::RestoreMessage * /*msg*/) -> std::shared_ptr<sys::Message>
{
    backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Running;
    backupSyncRestoreStatus.completionCode =
        BackupSyncRestore::RestoreUserFiles(this, backupSyncRestoreStatus.location);

    if (backupSyncRestoreStatus.completionCode == BackupSyncRestore::CompletionCode::Success) {
        LOG_DEBUG("Restore finished");
        backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Finished;
        sys::SystemManagerCommon::Reboot(this);
    }
    else {
        LOG_ERROR("Restore failed");
        backupSyncRestoreStatus.state = BackupSyncRestore::OperationState::Error;
    }

    return sys::MessageNone{};
}

auto ServiceDesktop::handle(sdesktop::FactoryMessage * /*msg*/) -> std::shared_ptr<sys::Message>
{
    LOG_DEBUG("ServiceDesktop: FactoryMessage received");

M module-services/service-desktop/endpoints/backup/BackupHelper.cpp => module-services/service-desktop/endpoints/backup/BackupHelper.cpp +13 -56
@@ 9,9 9,6 @@
#include <service-desktop/ServiceDesktop.hpp>

#include <json11.hpp>
#include <purefs/filesystem_paths.hpp>

#include <filesystem>

namespace sdesktop::endpoints
{


@@ 22,74 19,34 @@ namespace sdesktop::endpoints
        if (context.getBody()[json::messages::category].string_value() == json::messages::categorySync) {
            return checkSyncState(context);
        }
        return checkState(context);
        context.setResponseStatus(http::Code::BadRequest);
        putToSendQueue(context.createSimpleResponse());

        return {sent::yes, std::nullopt};
    }

    auto BackupHelper::processPost(Context &context) -> ProcessResult
    {
        if (context.getBody()[json::messages::category].string_value() == json::messages::categorySync) {
        auto category = context.getBody()[json::messages::category].string_value();
        if (category == json::messages::categorySync) {
            return executeSyncRequest(context);
        }
        return executeRequest(context);
    }

    auto BackupHelper::executeRequest(Context &context) -> ProcessResult
    {
        auto ownerServicePtr = static_cast<ServiceDesktop *>(owner);

        if (ownerServicePtr->getBackupSyncRestoreStatus().state == BackupSyncRestore::OperationState::Running) {
            LOG_DEBUG("Backup already running");
            // a backup is already running, don't start a second task
            context.setResponseStatus(http::Code::NotAcceptable);
        }
        else {
            LOG_DEBUG("Starting backup");
            // initialize new backup information
            ownerServicePtr->prepareBackupData();

            // start the backup process in the background
            ownerServicePtr->bus.sendUnicast(std::make_shared<sdesktop::BackupMessage>(),
                                             service::name::service_desktop);

            // return new generated backup info
            context.setResponseBody(ownerServicePtr->getBackupSyncRestoreStatus());
        else if (category == json::messages::categoryBackup) {
            return executeBackupRequest(context);
        }

        context.setResponseStatus(http::Code::BadRequest);
        putToSendQueue(context.createSimpleResponse());

        return {sent::yes, std::nullopt};
    }

    auto BackupHelper::checkState(Context &context) -> ProcessResult
    auto BackupHelper::executeBackupRequest([[maybe_unused]] Context &context) -> ProcessResult
    {
        auto ownerServicePtr = static_cast<ServiceDesktop *>(owner);

        if (context.getBody()[json::taskId].is_string()) {
            if (ownerServicePtr->getBackupSyncRestoreStatus().taskId ==
                context.getBody()[json::taskId].string_value()) {
                if (ownerServicePtr->getBackupSyncRestoreStatus().state ==
                    BackupSyncRestore::OperationState::Finished) {
                    context.setResponseStatus(http::Code::SeeOther);
                }
                else {
                    context.setResponseStatus(http::Code::OK);
                }

                context.setResponseBody(ownerServicePtr->getBackupSyncRestoreStatus());
            }
            else {
                context.setResponseStatus(http::Code::NotFound);
            }
        }
        else {
            LOG_DEBUG("Backup task not found");
            context.setResponseStatus(http::Code::BadRequest);
        if (sys::SystemManagerCommon::RebootToUpdater(owner, sys::UpdaterReason::Backup)) {
            return {sent::no, ResponseContext{.status = http::Code::NoContent}};
        }

        LOG_DEBUG("Responding");
        putToSendQueue(context.createSimpleResponse());

        return {sent::yes, std::nullopt};
        return {sent::no, ResponseContext{.status = http::Code::InternalServerError}};
    }

    auto BackupHelper::executeSyncRequest(Context &context) -> ProcessResult

M module-services/service-desktop/endpoints/include/endpoints/backup/BackupHelper.hpp => module-services/service-desktop/endpoints/include/endpoints/backup/BackupHelper.hpp +1 -2
@@ 17,8 17,7 @@ namespace sdesktop::endpoints
        auto processGet(Context &context) -> ProcessResult final;

      private:
        auto executeRequest(Context &context) -> ProcessResult;
        auto checkState(Context &context) -> ProcessResult;
        auto executeBackupRequest(Context &context) -> ProcessResult;
        auto executeSyncRequest(Context &context) -> ProcessResult;
        auto checkSyncState(Context &context) -> ProcessResult;
    };

M module-services/service-desktop/endpoints/include/endpoints/restore/RestoreHelper.hpp => module-services/service-desktop/endpoints/include/endpoints/restore/RestoreHelper.hpp +1 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 14,10 14,5 @@ namespace sdesktop::endpoints
        {}

        auto processPost(Context &context) -> ProcessResult final;
        auto processGet(Context &context) -> ProcessResult final;

      private:
        auto executeRequest(Context &context) -> ProcessResult;
        auto checkState(Context &context) -> ProcessResult;
    };
} // namespace sdesktop::endpoints

M module-services/service-desktop/endpoints/restore/RestoreHelper.cpp => module-services/service-desktop/endpoints/restore/RestoreHelper.cpp +4 -92
@@ 3,104 3,16 @@

#include <endpoints/Context.hpp>
#include <endpoints/restore/RestoreHelper.hpp>
#include <endpoints/JsonKeyNames.hpp>
#include <endpoints/message/Sender.hpp>
#include <service-desktop/DesktopMessages.hpp>
#include <service-desktop/ServiceDesktop.hpp>
#include <json11.hpp>
#include <purefs/filesystem_paths.hpp>

#include <filesystem>

namespace sdesktop::endpoints
{
    using sender::putToSendQueue;

    auto RestoreHelper::processGet(Context &context) -> ProcessResult
    {
        return checkState(context);
    }

    auto RestoreHelper::processPost(Context &context) -> ProcessResult
    {
        return executeRequest(context);
    }

    auto RestoreHelper::checkState(Context &context) -> ProcessResult
    {
        auto ownerService = static_cast<ServiceDesktop *>(owner);

        if (context.getBody()[json::taskId].is_string()) {
            if (ownerService->getBackupSyncRestoreStatus().taskId == context.getBody()[json::taskId].string_value()) {
                context.setResponseStatus(http::Code::OK);
                context.setResponseBody(ownerService->getBackupSyncRestoreStatus());
            }
            else {
                return {sent::no, ResponseContext{.status = http::Code::NotFound}};
            }
        }
        else if (context.getBody()[json::request].is_string()) {
            const std::string request(context.getBody()[json::request].string_value());

            if (request.compare(json::fileList)) {

                return {sent::no, ResponseContext{.status = http::Code::BadRequest}};
            }
            auto filesList = json11::Json::object{{json::files, BackupSyncRestore::GetBackupFiles()}};
            context.setResponseBody(filesList);
        }

        LOG_DEBUG("Responding");
        putToSendQueue(context.createSimpleResponse());

        return {sent::yes, std::nullopt};
    }

    auto RestoreHelper::executeRequest(Context &context) -> ProcessResult
    auto RestoreHelper::processPost([[maybe_unused]] Context &context) -> ProcessResult
    {
        auto ownerService = static_cast<ServiceDesktop *>(owner);

        if (context.getBody()[json::restore].is_string()) {
            if (ownerService->getBackupSyncRestoreStatus().state == BackupSyncRestore::OperationState::Running) {
                LOG_WARN("Restore is running, try again later");

                return {sent::no, ResponseContext{.status = http::Code::NotAcceptable}};
            }
            else {
                const std::filesystem::path restorePoint(context.getBody()[json::restore].string_value());
                if (restorePoint.empty()) {
                    LOG_ERROR("no restorePoint in request");
                    context.setResponseBody(json11::Json::object({{json::reason, "No restore point passed"}}));

                    return {sent::no, ResponseContext{.status = http::Code::NotAcceptable}};
                }
                if (!std::filesystem::exists(purefs::dir::getBackupOSPath() / restorePoint)) {
                    LOG_ERROR("Restore point %s does not exist", (restorePoint).c_str());
                    context.setResponseBody(json11::Json::object({{json::reason, "Invalid restore point"}}));

                    return {sent::no, ResponseContext{.status = http::Code::NotFound}};
                }
                // initialize new restore information
                ownerService->prepareRestoreData(restorePoint);

                // start the request process
                ownerService->bus.sendUnicast(std::make_shared<sdesktop::RestoreMessage>(),
                                              service::name::service_desktop);

                // return new generated restore info
                context.setResponseBody(ownerService->getBackupSyncRestoreStatus());
            }
        if (sys::SystemManagerCommon::RebootToUpdater(owner, sys::UpdaterReason::Restore)) {
            return {sent::no, ResponseContext{.status = http::Code::NoContent}};
        }
        else {
            // unknown request for backup endpoint

            return {sent::no, ResponseContext{.status = http::Code::BadRequest}};
        }

        LOG_DEBUG("Responding");
        putToSendQueue(context.createSimpleResponse());

        return {sent::yes, std::nullopt};
        return {sent::no, ResponseContext{.status = http::Code::InternalServerError}};
    }

} // namespace sdesktop::endpoints

M module-services/service-desktop/endpoints/update/UpdateHelper.cpp => module-services/service-desktop/endpoints/update/UpdateHelper.cpp +1 -1
@@ 32,7 32,7 @@ namespace sdesktop::endpoints
            return {sent::no, ResponseContext{.status = http::Code::NotFound}};
        }

        if (sys::SystemManagerCommon::RebootToUpdate(owner, sys::UpdateReason::Update)) {
        if (sys::SystemManagerCommon::RebootToUpdater(owner, sys::UpdaterReason::Update)) {
            return {sent::no, ResponseContext{.status = http::Code::NoContent}};
        }


M module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp => module-services/service-desktop/include/service-desktop/ServiceDesktop.hpp +0 -4
@@ 64,9 64,7 @@ class ServiceDesktop : public sys::Service

    std::string prepareBackupFilename();
    std::string prepareSyncFilename();
    void prepareBackupData();
    void prepareSyncData();
    void prepareRestoreData(const std::filesystem::path &restoreLocation);
    const BackupSyncRestore::OperationStatus getBackupSyncRestoreStatus()
    {
        return backupSyncRestoreStatus;


@@ 121,9 119,7 @@ class ServiceDesktop : public sys::Service
    [[nodiscard]] auto handle(message::bluetooth::ResponseBondedDevices *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(message::bluetooth::ResponseVisibleDevices *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::developerMode::DeveloperModeRequest *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::BackupMessage *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::SyncMessage *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::RestoreMessage *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::FactoryMessage *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::usb::USBConfigured *msg) -> std::shared_ptr<sys::Message>;
    [[nodiscard]] auto handle(sdesktop::usb::USBDisconnected *msg) -> std::shared_ptr<sys::Message>;

M module-sys/SystemManager/PowerManager.cpp => module-sys/SystemManager/PowerManager.cpp +8 -4
@@ 89,15 89,19 @@ namespace sys
        return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUsbMscMode);
    }

    int32_t PowerManager::RebootToUpdate(UpdateReason reason)
    int32_t PowerManager::RebootToUpdater(UpdaterReason reason)
    {
        switch (reason) {
        case UpdateReason::FactoryReset:
        case UpdaterReason::FactoryReset:
            return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUpdaterFactoryReset);
        case UpdateReason::Recovery:
        case UpdaterReason::Recovery:
            return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUpdaterRecovery);
        case UpdateReason::Update:
        case UpdaterReason::Update:
            return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUpdaterUpdate);
        case UpdaterReason::Backup:
            return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUpdaterBackup);
        case UpdaterReason::Restore:
            return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUpdaterRestore);
        default:
            return -1;
        }

M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +14 -13
@@ 139,7 139,7 @@ namespace sys
        case SystemManagerCommon::State::RebootToUsbMscMode:
            LOG_INFO("  ---> REBOOT TO USB MSC Mode <--- ");
            break;
        case SystemManagerCommon::State::RebootToUpdate:
        case SystemManagerCommon::State::RebootToUpdater:
            LOG_INFO("  ---> REBOOT TO UPDATER <--- ");
            break;
        case SystemManagerCommon::State::Running:


@@ 163,8 163,8 @@ namespace sys
        case State::RebootToUsbMscMode:
            powerManager->RebootToUsbMscMode();
            break;
        case State::RebootToUpdate:
            powerManager->RebootToUpdate(updateReason);
        case State::RebootToUpdater:
            powerManager->RebootToUpdater(updaterReason);
            break;
        case SystemManagerCommon::State::Running:
        case SystemManagerCommon::State::Suspend:


@@ 305,10 305,11 @@ namespace sys
        return true;
    }

    bool SystemManagerCommon::RebootToUpdate(Service *s, UpdateReason updateReason)
    bool SystemManagerCommon::RebootToUpdater(Service *s, UpdaterReason updaterReason)
    {
        s->bus.sendUnicast(std::make_shared<SystemManagerCmd>(Code::RebootToUpdate, CloseReason::Reboot, updateReason),
                           service::name::system_manager);
        s->bus.sendUnicast(
            std::make_shared<SystemManagerCmd>(Code::RebootToUpdater, CloseReason::Reboot, updaterReason),
            service::name::system_manager);
        return true;
    }



@@ 575,8 576,8 @@ namespace sys
                case Code::Reboot:
                    RebootHandler();
                    break;
                case Code::RebootToUpdate:
                    RebootToUpdateHandler(data->updateReason);
                case Code::RebootToUpdater:
                    RebootToUpdaterHandler(data->updaterReason);
                    break;
                case Code::RebootToUsbMscMode:
                    RebootToUsbMscModeHandler(State::RebootToUsbMscMode);


@@ 741,9 742,9 @@ namespace sys
            DestroyServices(sys::state::regularClose::whitelist);
            set(State::Reboot);
            break;
        case CloseReason::RebootToUpdate:
        case CloseReason::RebootToUpdater:
            DestroyServices(sys::state::update::whitelist);
            set(State::RebootToUpdate);
            set(State::RebootToUpdater);
            break;
        }
    }


@@ 769,10 770,10 @@ namespace sys
        CloseSystemHandler(CloseReason::Reboot);
    }

    void SystemManagerCommon::RebootToUpdateHandler(UpdateReason updateReason)
    void SystemManagerCommon::RebootToUpdaterHandler(UpdaterReason updaterReason)
    {
        CloseSystemHandler(CloseReason::RebootToUpdate);
        this->updateReason = updateReason;
        CloseSystemHandler(CloseReason::RebootToUpdater);
        this->updaterReason = updaterReason;
    }

    void SystemManagerCommon::RebootToUsbMscModeHandler(State newState)

M module-sys/SystemManager/include/SystemManager/PowerManager.hpp => module-sys/SystemManager/include/SystemManager/PowerManager.hpp +1 -1
@@ 51,7 51,7 @@ namespace sys
        int32_t PowerOff();
        int32_t Reboot();
        int32_t RebootToUsbMscMode();
        int32_t RebootToUpdate(UpdateReason reason);
        int32_t RebootToUpdater(UpdaterReason reason);

        /// called periodically to calculate the CPU requirement
        ///

M module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp => module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp +12 -12
@@ 42,7 42,7 @@ namespace sys
        CloseSystem,
        Restore,
        Reboot,
        RebootToUpdate,
        RebootToUpdater,
        RebootToUsbMscMode,
        FactoryReset,
        None,


@@ 57,16 57,16 @@ namespace sys
    class SystemManagerCmd : public DataMessage
    {
      public:
        explicit SystemManagerCmd(Code type                 = Code::None,
                                  CloseReason closeReason   = CloseReason::RegularPowerDown,
                                  UpdateReason updateReason = UpdateReason::Update)
        explicit SystemManagerCmd(Code type                   = Code::None,
                                  CloseReason closeReason     = CloseReason::RegularPowerDown,
                                  UpdaterReason updaterReason = UpdaterReason::Update)
            : DataMessage(BusChannel::SystemManagerRequests), type(type), closeReason(closeReason),
              updateReason(updateReason)
              updaterReason(updaterReason)
        {}

        Code type;
        CloseReason closeReason;
        UpdateReason updateReason;
        UpdaterReason updaterReason;
    };

    class SystemManagerCommon : public Service


@@ 81,7 81,7 @@ namespace sys
            Shutdown,
            ShutdownReady,
            Reboot,
            RebootToUpdate,
            RebootToUpdater,
            RebootToUsbMscMode
        } state = State::Running;



@@ 102,7 102,7 @@ namespace sys

        static bool RebootToUsbMscMode(Service *s);

        static bool RebootToUpdate(Service *s, UpdateReason updateReason);
        static bool RebootToUpdater(Service *s, UpdaterReason updaterReason);

        static bool SuspendService(const std::string &name, Service *caller);



@@ 184,7 184,7 @@ namespace sys

        void RebootHandler();

        void RebootToUpdateHandler(UpdateReason updateReason);
        void RebootToUpdaterHandler(UpdaterReason updaterReason);

        void RebootToUsbMscModeHandler(State newState);



@@ 197,7 197,7 @@ namespace sys
        bool serviceListReversed{false};

        CloseReason closeReason{CloseReason::RegularPowerDown};
        UpdateReason updateReason{UpdateReason::Update};
        UpdaterReason updaterReason{UpdaterReason::Update};
        std::vector<std::unique_ptr<BaseServiceCreator>> systemServiceCreators;
        sys::TimerHandle freqTimer;
        sys::TimerHandle serviceCloseTimer;


@@ 232,8 232,8 @@ inline const char *c_str(sys::SystemManagerCommon::State state)
        return "Shutdown";
    case sys::SystemManagerCommon::State::Reboot:
        return "Reboot";
    case sys::SystemManagerCommon::State::RebootToUpdate:
        return "RebootToUpdate";
    case sys::SystemManagerCommon::State::RebootToUpdater:
        return "RebootToUpdater";
    case sys::SystemManagerCommon::State::RebootToUsbMscMode:
        return "RebootToUsbMscModeUpdate";
        break;

M module-sys/common/include/system/Common.hpp => module-sys/common/include/system/Common.hpp +5 -3
@@ 49,7 49,7 @@ namespace sys
    {
        RegularPowerDown,
        Reboot,
        RebootToUpdate,
        RebootToUpdater,
        RebootToUsbMscMode,
        FactoryReset,
        SystemBrownout,


@@ 57,11 57,13 @@ namespace sys
    };

    // Updater reason code
    enum class UpdateReason
    enum class UpdaterReason
    {
        Update,
        Recovery,
        FactoryReset
        FactoryReset,
        Backup,
        Restore
    };

} // namespace sys