RADLib
RADical C++ application framework
RADService.h
Go to the documentation of this file.
1 #ifndef RADSERVICE_H
2 #define RADSERVICE_H
3 
9 #pragma once
10 
11 #include <RADCore/RADCore.h>
12 
13 #include <map>
14 #include <memory>
15 #include <string>
16 #include <vector>
17 
18 namespace RADService {
19 
21  enum class RestartPolicy {
23  No,
25  OnFailure,
27  Always
28  };
29 
31  struct ServiceUnit {
33  std::string name;
35  std::string description;
37  std::string execStart;
39  std::string workingDirectory;
41  std::map<std::string, std::string> environment;
45  int watchdogSec = 0;
47  std::string user;
49  std::string wantedBy = "multi-user.target";
50  };
51 
54  public:
56  explicit SingleInstanceLock(std::string path);
60  bool tryLock();
62  bool isLocked() const;
63 
64  private:
65  std::unique_ptr<RADCore::RADLockFile> lock_;
66  };
67 
70  public:
72  static std::string generateSystemdUnit(const ServiceUnit& unit);
74  static bool writeSystemdUnit(const ServiceUnit& unit, const std::string& directory, std::string* error = nullptr);
76  static bool notify(const std::string& message, std::string* error = nullptr);
78  static bool notifyReady(std::string* error = nullptr);
80  static bool notifyWatchdog(std::string* error = nullptr);
82  static std::string restartPolicyName(RestartPolicy policy);
84  static bool daemonize(std::string* error = nullptr);
85  };
86 
87 } // namespace RADService
88 
89 #endif
Service helper methods.
Definition: RADService.h:69
static bool writeSystemdUnit(const ServiceUnit &unit, const std::string &directory, std::string *error=nullptr)
Writes a systemd unit file to directory.
static std::string generateSystemdUnit(const ServiceUnit &unit)
Serializes a systemd unit file.
static bool daemonize(std::string *error=nullptr)
Performs a Unix double-fork daemonization when supported.
static bool notifyWatchdog(std::string *error=nullptr)
Sends WATCHDOG=1 notification.
static bool notifyReady(std::string *error=nullptr)
Sends READY=1 notification.
static bool notify(const std::string &message, std::string *error=nullptr)
Sends sd_notify-compatible message to NOTIFY_SOCKET without libsystemd.
static std::string restartPolicyName(RestartPolicy policy)
Converts restart policy to systemd text.
Single-instance app lock using RADCore::RADLockFile.
Definition: RADService.h:53
bool tryLock()
Attempts to acquire the lock.
SingleInstanceLock(std::string path)
Creates a lock for path.
~SingleInstanceLock()
Releases the lock.
bool isLocked() const
Returns true when lock is held.
Definition: RADService.h:18
RestartPolicy
Restart policy for generated service units.
Definition: RADService.h:21
@ Always
Always restart.
@ OnFailure
Restart on abnormal failure.
Systemd service unit description.
Definition: RADService.h:31
RestartPolicy restart
Restart policy.
Definition: RADService.h:43
std::string wantedBy
WantedBy target.
Definition: RADService.h:49
std::map< std::string, std::string > environment
Environment key/value pairs.
Definition: RADService.h:41
std::string description
Description text.
Definition: RADService.h:35
int watchdogSec
Watchdog timeout seconds; 0 disables WatchdogSec.
Definition: RADService.h:45
std::string execStart
Executable command.
Definition: RADService.h:37
std::string workingDirectory
Optional working directory.
Definition: RADService.h:39
std::string user
User name for service execution.
Definition: RADService.h:47
std::string name
Unit name without .service.
Definition: RADService.h:33