1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "libsm.h"
4
5#include "proto/services.pb.h"
6#include "proto/services.service.h"
7
8#include <cstdlib>
9#include <iostream>
10#include <librpc/rpc.h>
11#include <memory>
12
13static constexpr auto UNIT_STATE_RECEIVER_SERVICE_SERVERNAME = "mos.service_manager.unit_state_receiver";
14
15static_assert(static_cast<int>(UnitStatus::Failed) == static_cast<int>(RpcUnitStatusEnum_Failed));
16static_assert(static_cast<int>(UnitStatus::Started) == static_cast<int>(RpcUnitStatusEnum_Started));
17// static_assert(static_cast<int>(UnitStatus::Starting) == static_cast<int>(RpcUnitStatusEnum_Starting));
18static_assert(static_cast<int>(UnitStatus::Stopping) == static_cast<int>(RpcUnitStatusEnum_Stopping));
19static_assert(static_cast<int>(UnitStatus::Stopped) == static_cast<int>(RpcUnitStatusEnum_Stopped));
20
21bool ReportServiceState(UnitStatus status, const char *message)
22{
23 static const auto StateReceiver = std::make_unique<UnitStateReceiverStub>(args: UNIT_STATE_RECEIVER_SERVICE_SERVERNAME);
24 static const char *ServiceToken = std::getenv(name: "MOS_SERVICE_TOKEN");
25 if (!ServiceToken)
26 {
27 std::cerr << program_invocation_name << ".libsm: " << "MOS_SERVICE_TOKEN not set" << std::endl;
28 return false;
29 }
30
31 // unset MOS_SERVICE_TOKEN to avoid passing it to the service
32 unsetenv(name: "MOS_SERVICE_TOKEN");
33
34 const auto rpcStatus = static_cast<RpcUnitStatusEnum>(status);
35 const UnitStateNotifyRequest req{
36 .service_id = const_cast<char *>(ServiceToken),
37 .status =
38 RpcUnitStatus{
39 .isActive = rpcStatus != RpcUnitStatusEnum_Stopped,
40 .status = rpcStatus,
41 .statusMessage = const_cast<char *>(message),
42 .timestamp = 0,
43 },
44 };
45
46 UnitStateNotifyResponse resp;
47 const auto ok = StateReceiver->notify(request: &req, response: &resp);
48 if (ok != RPC_RESULT_OK || !resp.success)
49 {
50 std::cerr << program_invocation_name << ".libsm: " << " Failed to notify service state" << std::endl;
51 return false;
52 }
53
54 return resp.success;
55}
56