[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 03/23] HTTP monitoring
[Thread Prev] | [Thread Next]
- Subject: [PATCH 03/23] HTTP monitoring
- From: arf20 <arf20@xxxxxxxxx>
- Reply-to: development@xxxxxxxxx
- Date: Tue, 2 Dec 2025 23:11:11 +0100
- To: development@xxxxxxxxx
- Cc: arf20 <aruizfernandez05@xxxxxxxxx>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
From: arf20 <aruizfernandez05@xxxxxxxxx>
---
Makefile | 2 +-
README.md | 8 ++++++
main.c | 16 ++++++++---
monitor | Bin 29912 -> 52712 bytes
monitor.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
5 files changed, 97 insertions(+), 7 deletions(-)
diff --git a/Makefile b/Makefile
index bc05321..11226e7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
CC = gcc
CFLAGS = -g -Wall -pedantic
-LDFLAGS = -lmicrohttpd
+LDFLAGS = -lmicrohttpd -lcurl
BIN = monitor
SRC = main.c monitor.c
diff --git a/README.md b/README.md
index a373746..19a4a5b 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,14 @@
ARFNET Status Monitor
+## Building
+
+Depends on libmicrohttpd, libcurl
+
+```
+make
+```
+
## Features (TODO)
- Current service status table
diff --git a/main.c b/main.c
index f01d928..15379b3 100644
--- a/main.c
+++ b/main.c
@@ -1,16 +1,18 @@
#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
-
#include <netinet/in.h>
#include <arpa/inet.h>
-#include <microhttpd.h>
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <time.h>
+
+#include <microhttpd.h>
+
+
#include "monitor.h"
@@ -35,7 +37,13 @@ enum MHD_Result answer_to_connection(
(const struct sockaddr_in**)MHD_get_connection_info(
connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS);
- printf("%s - %s %s: ", inet_ntoa((*coninfo)->sin_addr), method, url);
+ time_t time_now = time(NULL);
+ struct tm *tm_now = gmtime(&time_now);
+ static char timestr[256];
+ strftime(timestr, 256, "%Y-%m-%d %H-%M-%S", tm_now);
+
+ printf("[%s] [webserver] %s %s %s: ",
+ timestr, inet_ntoa((*coninfo)->sin_addr), method, url);
struct MHD_Response *response;
int ret;
diff --git a/monitor b/monitor
index 3992ddc45410cd58d6f0d1cdfa37db5b3aa9d44b..9c88a54119a6915b9e3cbe36c7f999cfae49b2af 100755
GIT binary patch
literal 52712
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
literal 29912
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
diff --git a/monitor.c b/monitor.c
index c9903ce..e86154b 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2,6 +2,9 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <time.h>
+
+#include <curl/curl.h>
#include "monitor.h"
@@ -24,9 +27,20 @@ typedef struct {
status_t status;
} target_t;
+
static target_t targets[256];
static size_t target_n = 0;
+static CURL *curl;
+
+static char timestr[256];
+
+static size_t
+write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+ return size * nmemb;
+}
+
int
monitor_init(const char *cfg_file) {
FILE *cfgf = fopen(cfg_file, "r");
@@ -42,6 +56,8 @@ monitor_init(const char *cfg_file) {
if (*line == '#' || *line == '\n')
continue;
+ line[strlen(line) - 1] = '\0'; /* strip \n */
+
char *type = line;
char *target = strchr(line, '=');
if (!target) {
@@ -49,7 +65,6 @@ monitor_init(const char *cfg_file) {
continue;
}
-
*target = '\0';
target++;
@@ -63,7 +78,7 @@ monitor_init(const char *cfg_file) {
targets[target_n].target = strdup(target);
targets[target_n].status = STATUS_DOWN;
- printf("\t%s: %s", type_str[targets[target_n].type],
+ printf("\t%s: %s\n", type_str[targets[target_n].type],
targets[target_n].target);
target_n++;
@@ -71,6 +86,22 @@ monitor_init(const char *cfg_file) {
fclose(cfgf);
+ CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
+ if (res) {
+ fprintf(stderr, "Error initializing cURL: %s\n",
+ curl_easy_strerror(res));
+ return -1;
+ }
+
+ curl = curl_easy_init();
+ if (!curl) {
+ fprintf(stderr, "Error allocating cURL handle\n");
+ return -1;
+ }
+
+ curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+
return 0;
}
@@ -97,9 +128,52 @@ monitor_generate_status_html()
return buff;
}
+static int
+check_reach(const char *endpoint)
+{
+ return STATUS_DOWN;
+}
+
+static int
+check_dns(const char *endpoint)
+{
+ return STATUS_DOWN;
+}
+
+static int
+check_http(const char *endpoint)
+{
+ curl_easy_setopt(curl, CURLOPT_URL, endpoint);
+ CURLcode curl_code = curl_easy_perform(curl);
+ if (curl_code != CURLE_OK) {
+ printf("[%s] [monitor] check http: %s: curl_easy_perform() failed: %s\n",
+ timestr, endpoint, curl_easy_strerror(curl_code));
+ return STATUS_DOWN;
+ }
+
+ long http_code;
+ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
+
+ printf("[%s] [monitor] check http: %s: %ld\n",
+ timestr, endpoint, http_code);
+
+ return STATUS_UP;
+}
+
void
monitor_check()
{
+ time_t time_now = time(NULL);
+ struct tm *tm_now = gmtime(&time_now);
+ strftime(timestr, 256, "%Y-%m-%d %H-%M-%S", tm_now);
+
+ static const int (*check_funcs[])(const char *) = {
+ check_reach,
+ check_dns,
+ check_http
+ };
+ for (size_t i = 0; i < target_n; i++)
+ targets[i].status = check_funcs[targets[i].type](targets[i].target);
}
--
2.47.3
| [arfnet2-status PATCH 00/23] First release | arf20 <arf20@xxxxxxxxx> |