1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "rpc/UnitStateReceiver.hpp"
4
5#include "common/ConfigurationManager.hpp"
6
7#include <librpc/rpc.h>
8
9rpc_result_code_t UnitStateReceiverServiceImpl::notify(rpc_context_t *, UnitStateNotifyRequest *req, UnitStateNotifyResponse *res)
10{
11 const auto token = req->service_id;
12 const auto state = req->status;
13 res->success = false;
14
15 for (const auto &[unitid, unit] : ConfigurationManager->GetAllUnits())
16 {
17 if (unit->GetType() != UnitType::Service)
18 continue;
19
20 auto service = std::static_pointer_cast<Service>(r: unit);
21 if (service->GetToken() != token)
22 continue;
23
24 UnitStatus newStatus;
25 newStatus.active = state.isActive;
26 newStatus.message = state.statusMessage;
27 switch (state.status)
28 {
29 case RpcUnitStatusEnum_Starting: newStatus.status = UnitStatus::UnitStarting; break;
30 case RpcUnitStatusEnum_Started: newStatus.status = UnitStatus::UnitStarted; break;
31 case RpcUnitStatusEnum_Failed: newStatus.status = UnitStatus::UnitFailed; break;
32 case RpcUnitStatusEnum_Stopping: newStatus.status = UnitStatus::UnitStopping; break;
33 case RpcUnitStatusEnum_Stopped: newStatus.status = UnitStatus::UnitStopped; break;
34 default:
35 {
36 std::cerr << "Unknown status" << std::endl;
37 res->success = false;
38 return RPC_RESULT_OK;
39 }
40 }
41
42 service->ChangeState(status: newStatus);
43 res->success = true;
44 return RPC_RESULT_OK;
45 }
46
47 std::cerr << "Unable to find service with token " << token << std::endl;
48 return RPC_RESULT_OK;
49}
50