Automatic IOC systemd startup from Power_switch
This commit is contained in:
@@ -64,6 +64,7 @@ set_property(
|
||||
target_link_libraries(
|
||||
power_switch
|
||||
PRIVATE
|
||||
/usr/lib64/libsystemd.so
|
||||
midas::mfe
|
||||
m_epics_ca
|
||||
${LIBS}
|
||||
|
||||
@@ -40,6 +40,10 @@ Start it with specified frontend name and equipment name
|
||||
```bash
|
||||
$ $PWD/build/ePowerSwitchFront <frontendName> <equipmentName>
|
||||
```
|
||||
Start it with also a systemd service
|
||||
```bash
|
||||
$ $PWD/build/ePowerSwitchFront <frontendName> <equipmentName> <serviceName>
|
||||
```
|
||||
|
||||
# Features
|
||||
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
#include "odbxx.h"
|
||||
#include "power_switch_config.h"
|
||||
#include "tmfe.h"
|
||||
#include <string>
|
||||
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* @brief Insert a integer value between two string
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "../device/power_switch.h"
|
||||
#include "power_switch_scfe_config.h"
|
||||
#include "tmfe.h"
|
||||
#include <systemd/sd-bus.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
@@ -13,8 +14,10 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
std::string frontendName;
|
||||
std::string equipmentName;
|
||||
std::string serviceName;
|
||||
|
||||
if (argc == 1) {
|
||||
switch (argc) {
|
||||
case 1:
|
||||
frontendName = DEFAULT_FRONTEND_NAME;
|
||||
TMFE::Instance()->Msg(MINFO, __FUNCTION__,
|
||||
"No frontend name provided; %s will be used",
|
||||
@@ -23,22 +26,37 @@ int main(int argc, char *argv[]) {
|
||||
TMFE::Instance()->Msg(MINFO, __FUNCTION__,
|
||||
"No equipment name provided; %s will be used",
|
||||
DEFAULT_EQUIPMENT_NAME);
|
||||
}
|
||||
if (argc == 2) {
|
||||
break;
|
||||
case 2:
|
||||
frontendName = std::string(argv[1]);
|
||||
argv++;
|
||||
argc--;
|
||||
TMFE::Instance()->Msg(MINFO, __FUNCTION__,
|
||||
"No equipment name provided; %s will be use",
|
||||
DEFAULT_EQUIPMENT_NAME);
|
||||
} else if (argc == 3) {
|
||||
break;
|
||||
case 3:
|
||||
frontendName = std::string(argv[1]);
|
||||
equipmentName = std::string(argv[2]);
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
frontendName = std::string(argv[1]);
|
||||
equipmentName = std::string(argv[2]);
|
||||
serviceName = std::string(argv[3]);
|
||||
argv += 3;
|
||||
argc -= 3;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
auto front = powerSwitchSCFE(frontendName, equipmentName);
|
||||
auto front =
|
||||
(serviceName.empty())
|
||||
? powerSwitchSCFE(frontendName, equipmentName)
|
||||
: powerSwitchSCFE(frontendName, equipmentName, serviceName);
|
||||
|
||||
front.FeMain(argc, argv);
|
||||
}
|
||||
|
||||
@@ -46,4 +64,44 @@ powerSwitchSCFE::powerSwitchSCFE(std::string frontendName,
|
||||
std::string equipmentName) {
|
||||
FeSetName(frontendName.c_str());
|
||||
FeAddEquipment(new powerSwitch(equipmentName.c_str(), __FILE__));
|
||||
}
|
||||
}
|
||||
|
||||
powerSwitchSCFE::powerSwitchSCFE(std::string frontendName,
|
||||
std::string equipmentName,
|
||||
std::string serviceName) {
|
||||
verifySystemdService(serviceName);
|
||||
FeSetName(frontendName.c_str());
|
||||
FeAddEquipment(new powerSwitch(equipmentName.c_str(), __FILE__));
|
||||
}
|
||||
|
||||
void powerSwitchSCFE::verifySystemdService(std::string serviceName) {
|
||||
sd_bus *bus = nullptr;
|
||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
sd_bus_message *reply = nullptr;
|
||||
|
||||
int returnCode = sd_bus_open_system(&bus);
|
||||
if (returnCode < 0) {
|
||||
TMFE::Instance()->Msg(
|
||||
MINFO, __FUNCTION__,
|
||||
"Systemd d-bus cannot be opened, error code %d - Starting "
|
||||
"without verifying service current status\n",
|
||||
returnCode);
|
||||
}
|
||||
|
||||
returnCode = sd_bus_call_method(
|
||||
bus, SystemdPathConfig::DBUS_SYSTEMD_DESTINATION.c_str(),
|
||||
SystemdPathConfig::DBUS_SYSTEMD_PATH.c_str(),
|
||||
SystemdPathConfig::DBUS_SYSTEMD_INTERFACE_MANAGER.c_str(), "StartUnit",
|
||||
&error, &reply, "ss", serviceName.c_str(), "replace");
|
||||
if (returnCode < 0) {
|
||||
TMFE::Instance()->Msg(
|
||||
MERROR, __FUNCTION__,
|
||||
"Couldn't start %s service, error code %d - Aborting\n",
|
||||
serviceName.c_str(), returnCode);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
sd_bus_error_free(&error);
|
||||
sd_bus_message_unref(reply);
|
||||
sd_bus_flush_close_unref(bus);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,13 @@ class powerSwitchSCFE : public TMFrontend {
|
||||
* @param equipmentName name shown on Midas for the equipment
|
||||
*/
|
||||
powerSwitchSCFE(std::string frontendName, std::string equipmentName);
|
||||
powerSwitchSCFE(std::string frontendName, std::string equipmentName,
|
||||
std::string serviceName);
|
||||
|
||||
private:
|
||||
/*
|
||||
*/
|
||||
void verifySystemdService(std::string serviceName);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -3,5 +3,14 @@
|
||||
|
||||
#define DEFAULT_FRONTEND_NAME "powerSwitch"
|
||||
#define DEFAULT_EQUIPMENT_NAME "powerSwitch"
|
||||
#include <string>
|
||||
|
||||
namespace SystemdPathConfig {
|
||||
|
||||
const std::string DBUS_SYSTEMD_DESTINATION = "org.freedesktop.systemd1";
|
||||
const std::string DBUS_SYSTEMD_PATH = "/org/freedesktop/systemd1";
|
||||
const std::string DBUS_SYSTEMD_INTERFACE_MANAGER =
|
||||
"org.freedesktop.systemd1.Manager";
|
||||
}; // namespace SystemdPathConfig
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user