Explorar el Código

syslog: implement the protocol

Sergey Alirzaev hace 4 años
padre
commit
88559dc427
Se han modificado 2 ficheros con 74 adiciones y 0 borrados
  1. 63 0
      modules/syslog.c
  2. 11 0
      modules/syslog.h

+ 63 - 0
modules/syslog.c

@@ -0,0 +1,63 @@
+#pragma GCC diagnostic error "-Wall"
+#pragma GCC diagnostic error "-Wextra"
+#if defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)
+#include "common_config.h"
+#include "syslog.h"
+#include "settings_api.h"
+#include "tcpip.h"
+#include "udp.h"
+#include "rtc.h"
+
+static struct udp_pcb *upcb;
+
+// TODO either lock the buffers against race conditions or raise the task stack sizes, or lower the memory consumption
+static char packet[256];
+static char msg[200];
+
+void openlog(void)
+{
+	upcb = udp_new();
+	udp_bind(upcb, IP_ADDR_ANY, 0);
+}
+
+static void timestamp_rfc3339(char *ts)
+{
+	TM_RTC_t data;
+	uint16_t sys_year;
+
+	TM_RTC_GetDateTime(&data, TM_RTC_Format_BIN);
+	sys_year = 2000 + data.year;
+	uint32_t subseconds = (1024 - data.subseconds) * 999999 / 1024;
+	// TODO timezone?
+	sprintf(ts, "%04i-%02i-%02iT%02i:%02i:%02i.%06luZ", sys_year, data.month, data.date, data.hours, data.minutes, data.seconds, subseconds);
+}
+
+void syslog(char *fmt, ...)
+{
+	//char msg[200]; // arbitrary length; "Any transport receiver MUST be able to accept messages of up to and including 480 octets in length."
+	va_list va;
+	va_start(va, fmt);
+	vsnprintf(msg, sizeof(msg), fmt, va);
+	syslog_str(msg);
+	va_end(va);
+}
+
+void syslog_str(char *msg)
+{
+	uint8_t priority = 13;
+#define SYSLOG_VERSION "1" // as defined in RFC5424
+#define BOM "\xef\xbb\xbf"
+	struct pbuf* psend;
+	// TODO to reduce memory consumption one can use a scatter-gather I/O instead of packet[]
+	//char packet[256]; // arbitrary length; "Any transport receiver MUST be able to accept messages of up to and including 480 octets in length."
+	char timestamp[30] = "-";
+	timestamp_rfc3339(timestamp);
+	unsigned len = snprintf(packet, sizeof(packet), "<%u>" SYSLOG_VERSION " %s - " HW_REV "_" VERSION " - - - " BOM "%s", priority, timestamp, msg);
+	//psend = pbuf_alloc(PBUF_RAW, sizeof(packet), PBUF_REF);
+	psend = pbuf_alloc(PBUF_RAW, len, PBUF_REF);
+	psend->payload = packet;
+	//psend->len = len;
+	udp_sendto(upcb, psend, &sSettings.sSyslog.server_ip, sSettings.sSyslog.server_port);
+	pbuf_free(psend);
+}
+#endif // defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)

+ 11 - 0
modules/syslog.h

@@ -0,0 +1,11 @@
+#ifndef __SYSLOG_H__
+#define __SYSLOG_H__
+#if defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)
+void openlog(void);
+void syslog(char *fmt, ...);
+void syslog_str(char *msg);
+#else // defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)
+#define openlog()
+#define syslog_str(msg)
+#endif // defined(HARDWARE_BT6711) && !defined(BT6702_SERVICE)
+#endif // __SYSLOG_H__