mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-31 13:03:02 +02:00
confd: add support for logging to remote syslog servers
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -8,8 +8,14 @@
|
||||
|
||||
#define XPATH_BASE_ "/ietf-syslog:syslog/actions"
|
||||
#define XPATH_FILE_ XPATH_BASE_"/file/log-file/name"
|
||||
#define XPATH_REMOTE_ XPATH_BASE_"/remote/destination/name"
|
||||
#define SYSLOG_D_ "/etc/syslog.d"
|
||||
|
||||
struct addr {
|
||||
char *address;
|
||||
int port;
|
||||
};
|
||||
|
||||
static char *basepath(char *xpath, char *path, size_t len)
|
||||
{
|
||||
char *ptr;
|
||||
@@ -22,7 +28,7 @@ static char *basepath(char *xpath, char *path, size_t len)
|
||||
return path;
|
||||
}
|
||||
|
||||
static char *filename(char *name, char *path, size_t len)
|
||||
static char *filename(char *name, bool remote, char *path, size_t len)
|
||||
{
|
||||
char *ptr, *n;
|
||||
|
||||
@@ -32,7 +38,7 @@ static char *filename(char *name, char *path, size_t len)
|
||||
else
|
||||
n = name;
|
||||
|
||||
snprintf(path, len, "/etc/syslog.d/confd-%s.conf", n);
|
||||
snprintf(path, len, "/etc/syslog.d/confd-%s%s.conf", remote ? "remote-" : "", n);
|
||||
|
||||
return path;
|
||||
}
|
||||
@@ -69,7 +75,7 @@ static const char *sxlate(const char *severity)
|
||||
return severity;
|
||||
}
|
||||
|
||||
static void handle_selector(sr_session_ctx_t *session, char *name, const char *xpath)
|
||||
static void selector(sr_session_ctx_t *session, char *name, struct addr *addr, const char *xpath)
|
||||
{
|
||||
sr_val_t *tuples = NULL;
|
||||
size_t count = 0;
|
||||
@@ -84,7 +90,7 @@ static void handle_selector(sr_session_ctx_t *session, char *name, const char *x
|
||||
return;
|
||||
}
|
||||
|
||||
fp = fopen(filename(name, path, sizeof(path)), "w");
|
||||
fp = fopen(filename(name, addr ? true : false, path, sizeof(path)), "w");
|
||||
if (!fp) {
|
||||
ERRNO("Failed opening %s", path);
|
||||
goto done;
|
||||
@@ -102,9 +108,12 @@ static void handle_selector(sr_session_ctx_t *session, char *name, const char *x
|
||||
free(facility);
|
||||
free(severity);
|
||||
}
|
||||
if (name[0] == '/')
|
||||
|
||||
if (addr)
|
||||
fprintf(fp, "\t@%s:%d\n", addr->address, addr->port);
|
||||
else if (name[0] == '/')
|
||||
fprintf(fp, "\t-%s\n", name);
|
||||
else
|
||||
else /* fall back to use system default log directory */
|
||||
fprintf(fp, "\t-/var/log/%s\n", name);
|
||||
|
||||
fclose(fp);
|
||||
@@ -137,9 +146,51 @@ static int file_change(sr_session_ctx_t *session, uint32_t sub_id, const char *m
|
||||
name = &val->data.string_val[5];
|
||||
|
||||
if (op == SR_OP_DELETED)
|
||||
remove(filename(name, path, sizeof(path)));
|
||||
remove(filename(name, false, path, sizeof(path)));
|
||||
else
|
||||
handle_selector(session, name, basepath(val->xpath, path, sizeof(path)));
|
||||
selector(session, name, NULL, basepath(val->xpath, path, sizeof(path)));
|
||||
|
||||
sr_free_val(new);
|
||||
sr_free_val(old);
|
||||
}
|
||||
sr_free_change_iter(iter);
|
||||
systemf("initctl -nbq touch syslogd");
|
||||
|
||||
return SR_ERR_OK;
|
||||
}
|
||||
|
||||
static int remote_change(sr_session_ctx_t *session, uint32_t sub_id, const char *module,
|
||||
const char *xpath, sr_event_t event, unsigned request_id, void *priv)
|
||||
{
|
||||
sr_change_iter_t *iter;
|
||||
sr_change_oper_t op;
|
||||
sr_val_t *old, *new;
|
||||
sr_error_t err;
|
||||
|
||||
if (SR_EV_DONE != event)
|
||||
return SR_ERR_OK;
|
||||
|
||||
err = sr_get_changes_iter(session, xpath, &iter);
|
||||
if (err)
|
||||
return SR_ERR_OK;
|
||||
|
||||
while (sr_get_change_next(session, iter, &op, &old, &new) == SR_ERR_OK) {
|
||||
sr_val_t *val = new ? new : old;
|
||||
char path[512];
|
||||
char *name;
|
||||
|
||||
name = val->data.string_val;
|
||||
if (op == SR_OP_DELETED) {
|
||||
remove(filename(name, true, path, sizeof(path)));
|
||||
} else {
|
||||
struct addr addr;
|
||||
|
||||
xpath = basepath(val->xpath, path, sizeof(path));
|
||||
addr.address = srx_get_str(session, "%s/udp/address", xpath);
|
||||
srx_get_int(session, &addr.port, SR_UINT16_T, "%s/udp/port", xpath);
|
||||
|
||||
selector(session, name, &addr, xpath);
|
||||
}
|
||||
|
||||
sr_free_val(new);
|
||||
sr_free_val(old);
|
||||
@@ -158,6 +209,7 @@ int ietf_syslog_init(struct confd *confd)
|
||||
goto fail;
|
||||
|
||||
REGISTER_CHANGE(confd->session, "ietf-syslog", XPATH_FILE_, 0, file_change, confd, &confd->sub);
|
||||
REGISTER_CHANGE(confd->session, "ietf-syslog", XPATH_REMOTE_, 0, remote_change, confd, &confd->sub);
|
||||
|
||||
return SR_ERR_OK;
|
||||
fail:
|
||||
|
||||
@@ -19,7 +19,8 @@ MODULES=(
|
||||
"iana-if-type@2023-01-26.yang"
|
||||
# NOTE: ietf-tls-client must be version matched with ietf-tls-server, used by netopeer2!
|
||||
"ietf-tls-client@2023-12-28.yang" # used by ietf-syslog (remote)
|
||||
"ietf-syslog@2024-03-21.yang -e file-action -e file-limit-size"
|
||||
"ietf-syslog@2024-03-21.yang -e file-action -e file-limit-size -e remote-action"
|
||||
"infix-syslog@2024-07-12.yang"
|
||||
"iana-hardware@2018-03-13.yang"
|
||||
"ietf-hardware@2018-03-13.yang -e hardware-state"
|
||||
"infix-hardware@2024-04-25.yang"
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
module infix-syslog {
|
||||
yang-version 1.1;
|
||||
namespace "urn:infix:syslog:ns:yang:1.0";
|
||||
prefix infix-log;
|
||||
|
||||
import ietf-syslog {
|
||||
prefix log;
|
||||
}
|
||||
|
||||
organization "KernelKit";
|
||||
contact "kernelkit@googlegroups.com";
|
||||
description "Infix augments and deviations to ietf-system.";
|
||||
|
||||
revision 2024-07-12 {
|
||||
description "Initial revision, tls transport disabled.";
|
||||
reference "internal";
|
||||
}
|
||||
|
||||
deviation "/log:syslog/log:actions/log:remote/log:destination/log:transport/log:tls" {
|
||||
deviate not-supported;
|
||||
}
|
||||
deviation "/log:syslog/log:actions/log:remote/log:destination/log:facility-override" {
|
||||
deviate not-supported;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user