RocketLogger  2.0.0
rl_lib.c
Go to the documentation of this file.
1 
32 #include <errno.h>
33 #include <stdbool.h>
34 #include <string.h>
35 
36 #include <signal.h>
37 #include <sys/ipc.h>
38 #include <sys/shm.h>
39 #include <sys/types.h>
40 #include <unistd.h>
41 
42 #include "log.h"
43 #include "rl.h"
44 #include "rl_hw.h"
45 #include "rl_socket.h"
46 #include "util.h"
47 
48 #include "rl_lib.h"
49 
57 static void rl_signal_handler(int signal_number);
58 
59 bool rl_is_sampling(void) {
60  rl_status_t status;
61  rl_status_reset(&status);
62 
63  int res = rl_get_status(&status);
64  if (res < 0) {
65  // if shared memory does not exists, RocketLogger is not sampling
66  if (errno == ENOENT) {
67  return false;
68  }
70  "failed getting status to check sampling state; %d message: %s",
71  errno, strerror(errno));
72  }
73 
74  return status.sampling;
75 }
76 
77 int rl_get_status(rl_status_t *const status) {
78  // get the status from the shared memory
79  int res = rl_status_read(status);
80  if (res < 0) {
81  // on error return reset value
82  rl_status_reset(status);
83  return res;
84  }
85 
86  // get file system state
87  int64_t disk_free = fs_space_free(RL_CONFIG_FILE_DIR_DEFAULT);
88  int64_t disk_total = fs_space_total(RL_CONFIG_FILE_DIR_DEFAULT);
89 
90  status->disk_free = disk_free;
91  if (disk_total > 0) {
92  status->disk_free_permille = (1000 * disk_free) / disk_total;
93  } else {
94  status->disk_free_permille = 0;
95  }
96 
97  return res;
98 }
99 
100 int rl_run(rl_config_t *const config) {
101  if (rl_is_sampling()) {
103  "cannot run measurement, RocketLogger is already running.");
104  return ERROR;
105  }
106 
107  // register signal handler for SIGTERM and SIGINT (for stopping)
108  struct sigaction sigterm_action_backup;
109  struct sigaction sigint_action_backup;
110  struct sigaction signal_action;
111  signal_action.sa_handler = rl_signal_handler;
112  sigemptyset(&signal_action.sa_mask);
113  signal_action.sa_flags = 0;
114 
115  int ret;
116  ret = sigaction(SIGTERM, &signal_action, &sigterm_action_backup);
117  if (ret < 0) {
119  "can't register signal handler for SIGTERM; %d message: %s",
120  errno, strerror(errno));
121  return ERROR;
122  }
123  ret = sigaction(SIGINT, &signal_action, &sigint_action_backup);
124  if (ret < 0) {
126  "can't register signal handler for SIGINT; %d message: %s",
127  errno, strerror(errno));
128  return ERROR;
129  }
130 
131  // INITIATION
132 
133  // init status
135  rl_status.config = config;
136 
137  // init status publishing and publish (to not be received, see zeromq docs)
140 
141  // init hardware
142  hw_init(config);
143 
144  // initialize socket if webserver enabled
145  if (config->web_enable) {
146  rl_socket_init();
147  rl_socket_metadata(config);
148  }
149 
150  // check ambient sensor available
151  if (config->ambient_enable && rl_status.sensor_count == 0) {
152  config->ambient_enable = false;
153  rl_log(RL_LOG_WARNING, "No ambient sensor found. Disabling ambient...");
154  }
155 
156  // SAMPLING
157  rl_log(RL_LOG_INFO, "sampling start");
158  hw_sample(config);
159  rl_log(RL_LOG_INFO, "sampling finished");
160 
161  // FINISH
162  if (config->web_enable) {
164  }
166  hw_deinit(config);
167 
168  // restore signal handlers for SIGTERM and SIGINT
169  ret = sigaction(SIGTERM, &sigterm_action_backup, NULL);
170  if (ret < 0) {
172  "can't restore signal handler for SIGTERM; %d message: %s",
173  errno, strerror(errno));
174  }
175  ret = sigaction(SIGINT, &sigint_action_backup, NULL);
176  if (ret < 0) {
178  "can't restore signal handler for SIGINT; %d message: %s", errno,
179  strerror(errno));
180  }
181 
182  return SUCCESS;
183 }
184 
185 int rl_stop(void) {
186  if (!rl_is_sampling()) {
187  rl_log(RL_LOG_ERROR, "RocketLogger is not running.");
188  return ERROR;
189  }
190 
191  // get pid and send termination signal
192  pid_t pid = rl_pid_get();
193  if (pid < 0) {
194  rl_log(RL_LOG_ERROR, "RocketLogger PID file not found; %d message: %s",
195  errno, strerror(errno));
196  return ERROR;
197  }
198  kill(pid, SIGTERM);
199 
200  return SUCCESS;
201 }
202 
203 static void rl_signal_handler(int signal_number) {
204  // signal generated by stop function
205  if (signal_number == SIGTERM) {
206  // stop sampling
207  rl_status.sampling = false;
208  }
209 
210  // signal generated by interactive user (ctrl+C)
211  if (signal_number == SIGINT) {
212  signal(signal_number, SIG_IGN);
213  rl_status.sampling = false;
214  }
215 }
int rl_log(rl_log_level_t log_level, char const *const format,...)
Definition: log.c:82
@ RL_LOG_ERROR
Error.
Definition: log.h:49
@ RL_LOG_WARNING
Warning.
Definition: log.h:50
@ RL_LOG_INFO
Information.
Definition: log.h:51
void rl_status_reset(rl_status_t *const status)
Definition: rl.c:535
int rl_status_pub_init(void)
Definition: rl.c:539
int rl_status_write(rl_status_t *const status)
Definition: rl.c:641
int rl_status_read(rl_status_t *const status)
Definition: rl.c:602
pid_t rl_pid_get(void)
Definition: rl.c:508
int rl_status_pub_deinit(void)
Definition: rl.c:554
#define RL_CONFIG_FILE_DIR_DEFAULT
Configuration data file directory default.
Definition: rl.h:103
#define ERROR
Function return value for errors (use errno to indicate the error)
Definition: rl.h:46
#define SUCCESS
Function return value for successful completion.
Definition: rl.h:44
void hw_deinit(rl_config_t const *const config)
Definition: rl_hw.c:93
void hw_init(rl_config_t const *const config)
Definition: rl_hw.c:51
int hw_sample(rl_config_t const *const config)
Definition: rl_hw.c:127
int rl_stop(void)
Definition: rl_lib.c:185
bool rl_is_sampling(void)
Definition: rl_lib.c:59
int rl_run(rl_config_t *const config)
Definition: rl_lib.c:100
int rl_get_status(rl_status_t *const status)
Definition: rl_lib.c:77
int rl_socket_init(void)
Definition: rl_socket.c:56
int rl_socket_metadata(rl_config_t const *const config)
Definition: rl_socket.c:82
int rl_socket_deinit(void)
Definition: rl_socket.c:71
Definition: rl.h:154
bool ambient_enable
Enable logging of ambient sensor.
Definition: rl.h:180
bool web_enable
Enable web interface connection.
Definition: rl.h:176
Definition: rl.h:201
uint64_t disk_free
Time stamp of last calibration run.
Definition: rl.h:215
rl_config_t const * config
(local) reference to current config
Definition: rl.h:225
uint16_t disk_free_permille
Time stamp of last calibration run.
Definition: rl.h:217
bool sampling
Sampling state, true: sampling, false: idle.
Definition: rl.h:203
uint16_t sensor_count
Number of sensors found connected to the system.
Definition: rl.h:221
int64_t fs_space_free(char const *const path)
Definition: util.c:125
int64_t fs_space_total(char const *const path)
Definition: util.c:137