jcs
/subtext
/amendments
/585
logger: Add RFC3164 (BSD) syslog support
Log everything at system.notice for now
jcs made amendment 585 9 months ago
--- db.c Wed Jan 24 09:07:37 2024
+++ db.c Mon Feb 12 17:50:36 2024
@@ -69,6 +69,11 @@ struct struct_field config_fields[] = {
offsetof(struct config, ipdb_path),
0, member_size(struct config, ipdb_path),
CONFIG_REQUIRES_IPDB_REINIT },
+
+ { "Syslog Server IP", CONFIG_TYPE_IP,
+ offsetof(struct config, syslog_ip),
+ 0, 1,
+ CONFIG_REQUIRES_SYSLOG_REINIT },
{ "Modem Port", CONFIG_TYPE_SHORT,
offsetof(struct config, modem_port),
@@ -564,6 +569,19 @@ db_migrate(struct db *tdb, short is_new, Str255 fullpa
DB_TEXT_MENU_OPTIONS_ID, 0);
}
+ break;
+ }
+ case 21: {
+ /* 20->21, syslog ip */
+ struct config new_config = { 0 };
+
+ bile_read(tdb->bile, DB_CONFIG_RTYPE, 1, (char *)&new_config,
+ sizeof(new_config));
+
+ new_config.syslog_ip = 0;
+
+ bile_write(tdb->bile, DB_CONFIG_RTYPE, 1, &new_config,
+ sizeof(new_config));
break;
}
}
--- db.h Tue Nov 28 10:43:34 2023
+++ db.h Mon Feb 12 17:38:18 2024
@@ -19,7 +19,7 @@
#include <time.h>
-#define DB_CUR_VERS 21
+#define DB_CUR_VERS 22
#define SUBTEXT_CREATOR 'SUBT'
#define DB_TYPE 'STDB'
@@ -96,6 +96,7 @@ struct config {
short max_sysop_idle_minutes;
char ipdb_path[255];
short modem_rings;
+ unsigned long syslog_ip;
};
extern struct struct_field config_fields[];
--- logger.c Wed Nov 8 22:06:14 2023
+++ logger.c Mon Feb 12 23:21:01 2024
@@ -20,11 +20,20 @@
#include "focusable.h"
#include "logger.h"
#include "subtext.h"
+#include "tcp.h"
#include "user.h"
#include "util.h"
struct logger *logger = NULL;
+static UDPiopb syslog_pb;
+static StreamPtr syslog_stream = 0;
+static char *syslog_rcv_buf = NULL;
+#define SYSLOG_RCV_BUF_SIZE 2048
+static wdsEntry syslog_wds[2];
+static char *syslog_send_buf = NULL;
+#define SYSLOG_SEND_BUF_SIZE 1024
+
void logger_layout(Rect *init_bounds);
void logger_key_down(struct focusable *focusable, EventRecord *event);
void logger_mouse_down(struct focusable *focusable, EventRecord *event);
@@ -35,6 +44,8 @@ void logger_resume(struct focusable *focusable, EventR
bool logger_quit(struct focusable *focusable);
void logger_flush_buffer(bool force);
+void syslog_vprintf(const char *format, va_list ap);
+
void
logger_init(void)
{
@@ -333,6 +344,12 @@ logger_printf(const char *format, ...)
va_start(va, format);
len = logger_vprintf(format, va);
va_end(va);
+
+ if (db->config.syslog_ip) {
+ va_start(va, format);
+ syslog_vprintf(format, va);
+ va_end(va);
+ }
return len;
}
@@ -371,7 +388,7 @@ logger_vprintf(const char *format, va_list ap)
if (logger->autoflush)
logger_flush_buffer(false);
-
+
return len;
}
@@ -466,4 +483,78 @@ no_overflow:
logger->buffered_logs_len = 0;
logger->buffered_logs[0] = '\0';
-}
+}
+
+/* RFC3164 */
+void
+syslog_vprintf(const char *format, va_list ap)
+{
+ size_t len;
+ time_t now = Time;
+
+ if (!db->config.syslog_ip || syslog_send_buf == NULL)
+ return;
+
+ /* system (3) priority, notice (5) severity */
+ len = strftime(syslog_send_buf, SYSLOG_SEND_BUF_SIZE,
+ "<29>%b %d %H:%M:%S", localtime(&now));
+ len += snprintf(syslog_send_buf + len, SYSLOG_SEND_BUF_SIZE - len,
+ " %s subtext: ", db->config.hostname);
+
+ len += vsnprintf(syslog_send_buf + len, SYSLOG_SEND_BUF_SIZE - len,
+ format, ap);
+
+ syslog_wds[0].ptr = (Ptr)syslog_send_buf;
+ syslog_wds[0].length = len;
+ syslog_wds[1].ptr = 0;
+ syslog_wds[1].length = 0;
+
+ _UDPSend(&syslog_pb, syslog_stream, syslog_wds,
+ db->config.syslog_ip, 514, NULL, NULL, false);
+}
+
+void
+syslog_init(void)
+{
+ short error;
+
+ if (!db->config.syslog_ip)
+ return;
+
+ if (_TCPInit() != noErr)
+ panic("Failed initializing MacTCP");
+
+ syslog_rcv_buf = xmalloc(SYSLOG_RCV_BUF_SIZE);
+ if (syslog_rcv_buf == NULL)
+ panic("Failed allocating syslog buf");
+ error = _UDPCreate(&syslog_pb, &syslog_stream,
+ (Ptr)syslog_rcv_buf, SYSLOG_RCV_BUF_SIZE, NULL, NULL,
+ NULL, false);
+ if (error)
+ panic("UDPCreate failed: %d", error);
+
+ syslog_send_buf = xmalloc(SYSLOG_SEND_BUF_SIZE);
+ if (syslog_send_buf == NULL)
+ panic("Failed allocating syslog send buf");
+}
+
+void
+syslog_deinit(void)
+{
+ if (syslog_stream) {
+ _UDPRelease(&syslog_pb, syslog_stream, NULL, NULL, false);
+ syslog_stream = 0;
+ }
+
+ if (syslog_rcv_buf)
+ xfree(&syslog_rcv_buf);
+ if (syslog_send_buf)
+ xfree(&syslog_send_buf);
+}
+
+bool
+syslog_reinit(void)
+{
+ syslog_deinit();
+ syslog_init();
+}
--- logger.h Sat Oct 1 21:29:46 2022
+++ logger.h Mon Feb 12 17:53:25 2024
@@ -42,4 +42,8 @@ size_t logger_vprintf(const char *format, va_list ap);
size_t logger_printf(const char *format, ...);
void logger_update_title(void);
+void syslog_init(void);
+void syslog_deinit(void);
+bool syslog_reinit(void);
+
#endif
--- main.c Tue Jan 10 10:50:01 2023
+++ main.c Mon Feb 12 23:12:08 2024
@@ -107,6 +107,8 @@ main(void)
logger_init();
logger_update_title();
+ if (db->config.syslog_ip)
+ syslog_init();
zone_size = (unsigned long)CurStackBase - (unsigned long)ApplZone;
stack_size = (unsigned long)CurStackBase - (unsigned long)ApplLimit;
@@ -273,6 +275,8 @@ handle_exit(void)
serial_atexit();
if (db->ipdb)
ipdb_close(&db->ipdb);
+ if (db->config.syslog_ip)
+ syslog_deinit();
db_close(db);
}
--- settings.h Mon Nov 27 21:04:22 2023
+++ settings.h Mon Feb 12 17:49:57 2024
@@ -33,7 +33,8 @@ enum {
CONFIG_REQUIRES_SERIAL_REINIT,
CONFIG_REQUIRES_TELNET_REINIT,
CONFIG_REQUIRES_BINKP_REINIT,
- CONFIG_REQUIRES_IPDB_REINIT
+ CONFIG_REQUIRES_IPDB_REINIT,
+ CONFIG_REQUIRES_SYSLOG_REINIT
};
struct struct_field {
--- sysop.c Tue Jan 23 16:30:33 2024
+++ sysop.c Mon Feb 12 21:27:04 2024
@@ -21,6 +21,7 @@
#include "ansi.h"
#include "binkp.h"
#include "board.h"
+#include "logger.h"
#include "serial_local.h"
#include "session.h"
#include "sysop.h"
@@ -268,6 +269,8 @@ next_field:
if (db->config.ipdb_path[0])
db->ipdb = ipdb_open(db->config.ipdb_path);
}
+ if (reinits & (1 << CONFIG_REQUIRES_SYSLOG_REINIT))
+ syslog_reinit();
xfree(&new_config);
--- telnet.c Sat Dec 2 20:26:57 2023
+++ telnet.c Mon Feb 12 23:14:53 2024
@@ -161,9 +161,6 @@ telnet_init(void)
if (!db->config.telnet_port)
return;
- if (!did_initial_log)
- logger_printf("[telnet] Initializing MacTCP");
-
if (_TCPInit() != noErr)
panic("Failed initializing MacTCP");