commit c61c11faea964884aee8fdfbc5030d7df27ce0a9
parent 6563aef02d892af9d9bf068d07010958f22ae49d
Author: Remy Noulin <loader2x@gmail.com>
Date: Sat, 8 Jul 2023 07:30:18 +0200
add basic monitor
heartbeat.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 67 insertions(+), 4 deletions(-)
Diffstat:
| M | heartbeat.c | | | 71 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- |
1 file changed, 67 insertions(+), 4 deletions(-)
diff --git a/heartbeat.c b/heartbeat.c
@@ -49,6 +49,7 @@ int argc; char **argv;
void printHelp(void);
void config(smallJsont *cfg);
void runcommand(void);
+void monitor(void);
void probe(char *cfgfile);
/* process arguments on command line
@@ -85,8 +86,7 @@ int main(int ARGC, char** ARGV) {
goto runProbes;
}
elif (eqG(argv[1], "monitor")) {
- TODO("monitor");
- ret 1;
+ monitor();
}
elif (eqG(argv[1], "config")) {
cleanAllocateSmallJson(cfg);
@@ -256,6 +256,69 @@ void runcommand(void) {
#include <fcntl.h>
#include <arpa/inet.h> // for inet_ntoa
+void monitor(void) {
+ // load config
+ // find logger config
+ // create monitor socket
+ // infinite loop
+
+ cleanAllocateSmallJson(cfg);
+ cleanCharP(p) = expandHome(uHome home "/" cfgFile);
+ smallJsont *r = readFileG(cfg, p);
+ if (!r) {
+ logE("Missing %s", p);
+ XFailure;
+ }
+ delElemG(cfg, "port");
+
+ // find logger config
+ const char *loggerName = null;
+ iter(cfg, D) {
+ cast(smallDictt*, d, D);
+ if (hasG(d, "logger")) {
+ loggerName = iK(cfg);
+ break;
+ }
+ }
+ // create monitor socket
+ cleanFinishSmallDictP(logger) = getG(cfg, rtSmallDictt, loggerName);
+ u16 port = u$(logger, "monitorPort");
+
+ int sock;
+ struct sockaddr_in server;
+ struct sockaddr_in client;
+ char buf[65536];
+
+ sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (sock < 0){
+ logE("Failed to create server socket: %s", strerror(errno));
+ XFailure;
+ }
+
+ server.sin_family = AF_INET;
+ server.sin_addr.s_addr = INADDR_ANY;
+ server.sin_port = htons(port);
+
+ if (bind(sock, (struct sockaddr *) &server, sizeof(server))){
+ logE("bind failed: %s", strerror(errno));
+ XFailure;
+ }
+ // infinite loop
+ cleanAllocateSmallJson(state);
+ forever {
+ pError0(ZEROVAR(buf));
+ socklen_t addr_size = sizeof(client);
+ ssize_t r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &client, &addr_size);
+ if (r == -1) {
+ logE("recvfrom: %s", strerror(errno));
+ continue;
+ }
+ parseG(state, buf);
+ cleanCharP(stateStr) = stringifyG(state, 2);
+ puts(stateStr);
+ }
+}
+
void sendMail(char *cmd);
@@ -624,7 +687,7 @@ void probe(char *cfgfile) {
//lv(completeCfg);
cleanCharP(monitorData) = toStringG(completeCfg);
if (sendto(sock, monitorData, lenG(monitorData)+1, 0, (const struct sockaddr *)&server, sizeof(server)) < 0) {
- logE("send failed: %s", strerror(errno));
+ logE("monitor send failed: %s", strerror(errno));
close(sock);
XFailure;
}
@@ -749,7 +812,7 @@ void probe(char *cfgfile) {
//lv(completeCfg);
cleanCharP(monitorData) = toStringG(completeCfg);
if (sendto(sock, monitorData, lenG(monitorData)+1, 0, (const struct sockaddr *)&server, sizeof(server)) < 0) {
- logE("send failed: %s", strerror(errno));
+ logE("monitor send failed: %s", strerror(errno));
close(sock);
XFailure;
}