heartbeat

Simple server monitor system using encrypted messages over udp
git clone https://noulin.net/git/heartbeat.git
Log | Files | Refs | README

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:
Mheartbeat.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; }