diff --git a/src/confd/src/ietf-syslog.c b/src/confd/src/ietf-syslog.c index 76cf0ad9..aaa29bb8 100644 --- a/src/confd/src/ietf-syslog.c +++ b/src/confd/src/ietf-syslog.c @@ -6,9 +6,10 @@ #include "core.h" -#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 XPATH_BASE_ "/ietf-syslog:syslog" +#define XPATH_FILE_ XPATH_BASE_"/actions/file/log-file/name" +#define XPATH_REMOTE_ XPATH_BASE_"/actions/remote/destination/name" +#define XPATH_ROTATE_ XPATH_BASE_"/infix-syslog:file-rotation" #define SYSLOG_D_ "/etc/syslog.d" struct addr { @@ -123,6 +124,8 @@ static void action(sr_session_ctx_t *session, const char *name, const char *xpat .xpath = xpath, .addr = addr, }; + char opts[80] = ""; + char *sz, *cnt; act.fp = fopen(filename(name, addr ? true : false, act.path, sizeof(act.path)), "w"); if (!act.fp) { @@ -132,6 +135,22 @@ static void action(sr_session_ctx_t *session, const char *name, const char *xpat selector(session, &act); + sz = srx_get_str(session, "%s/file-rotation/max-file-size", xpath); + cnt = srx_get_str(session, "%s/file-rotation/number-of-files", xpath); + if (sz || cnt) { + strlcat(opts, ";rotate=", sizeof(opts)); + if (sz) { + strlcat(opts, sz, sizeof(opts)); + strlcat(opts, "k", sizeof(opts)); + free(sz); + } + if (cnt) { + strlcat(opts, ":", sizeof(opts)); + strlcat(opts, cnt, sizeof(opts)); + free(cnt); + } + } + /* * The [] syntax is for IPv6, but the sysklogd parser handles * them separately from the address conversion, so this works. @@ -139,9 +158,9 @@ static void action(sr_session_ctx_t *session, const char *name, const char *xpat if (addr) fprintf(act.fp, "\t@[%s]:%d\n", addr->address, addr->port); else if (name[0] == '/') - fprintf(act.fp, "\t-%s\n", name); + fprintf(act.fp, "\t-%s\t%s\n", name, opts); else /* fall back to use system default log directory */ - fprintf(act.fp, "\t-/var/log/%s\n", name); + fprintf(act.fp, "\t-/var/log/%s\t%s\n", name, opts); fclose(act.fp); } @@ -170,16 +189,20 @@ static int file_change(sr_session_ctx_t *session, uint32_t sub_id, const char *m continue; name = &val->data.string_val[5]; - if (op == SR_OP_DELETED) + if (op == SR_OP_DELETED) { remove(filename(name, false, path, sizeof(path))); - else - action(session, name, basepath(val->xpath, path, sizeof(path)), NULL); + } else { + xpath = basepath(val->xpath, path, sizeof(path)); + + + action(session, name, xpath, NULL); + } sr_free_val(new); sr_free_val(old); } sr_free_change_iter(iter); - systemf("initctl -nbq touch syslogd"); + systemf("initctl -nbq touch sysklogd"); return SR_ERR_OK; } @@ -221,7 +244,41 @@ static int remote_change(sr_session_ctx_t *session, uint32_t sub_id, const char sr_free_val(old); } sr_free_change_iter(iter); - systemf("initctl -nbq touch syslogd"); + systemf("initctl -nbq touch sysklogd"); + + return SR_ERR_OK; +} + +static int rotate_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) +{ + const char *path = "/etc/syslog.d/confd-rotate.conf"; + char *sz, *cnt; + FILE *fp; + + if (SR_EV_DONE != event) + return SR_ERR_OK; + + fp = fopen(path, "w"); + if (!fp) { + ERRNO("Failed opening %s", path); + return SR_ERR_SYS; + } + + sz = srx_get_str(session, "%s/max-file-size", xpath); + if (sz) { + fprintf(fp, "rotate_size %sk\n", sz); + free(sz); + } + + cnt = srx_get_str(session, "%s/number-of-files", xpath); + if (cnt) { + fprintf(fp, "rotate_count %s\n", cnt); + free(cnt); + } + + fclose(fp); + systemf("initctl -nbq touch sysklogd"); return SR_ERR_OK; } @@ -235,6 +292,7 @@ int ietf_syslog_init(struct confd *confd) 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); + REGISTER_CHANGE(confd->session, "ietf-syslog", XPATH_ROTATE_, 0, rotate_change, confd, &confd->sub); return SR_ERR_OK; fail: diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index e1336dbd..a139926b 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -20,7 +20,7 @@ MODULES=( # 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 -e remote-action" - "infix-syslog@2024-07-12.yang" + "infix-syslog@2024-07-13.yang" "iana-hardware@2018-03-13.yang" "ietf-hardware@2018-03-13.yang -e hardware-state" "infix-hardware@2024-04-25.yang" diff --git a/src/confd/yang/infix-syslog@2024-07-12.yang b/src/confd/yang/infix-syslog@2024-07-12.yang deleted file mode 100644 index 6ad023d1..00000000 --- a/src/confd/yang/infix-syslog@2024-07-12.yang +++ /dev/null @@ -1,25 +0,0 @@ -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; - } -} diff --git a/src/confd/yang/infix-syslog@2024-07-13.yang b/src/confd/yang/infix-syslog@2024-07-13.yang new file mode 100644 index 00000000..dd41012a --- /dev/null +++ b/src/confd/yang/infix-syslog@2024-07-13.yang @@ -0,0 +1,70 @@ +module infix-syslog { + yang-version 1.1; + namespace "urn:infix:syslog:ns:yang:1.0"; + prefix infix-syslog; + + + import ietf-inet-types { + prefix inet; + reference "RFC 6991: Common YANG Data Types"; + } + import ietf-syslog { + prefix syslog; + } + + organization "KernelKit"; + contact "kernelkit@googlegroups.com"; + description "Infix augments and deviations to ietf-system."; + + revision 2024-07-13 { + description "Support for global log rotation and drop defaults + unit."; + reference "internal"; + } + revision 2024-07-12 { + description "Initial revision, tls transport disabled."; + reference "internal"; + } + + augment "/syslog:syslog" { + container file-rotation { + description "Global configuration parameters for log file rotation. + + By default the last 10 rotated files are kept. From + the second rotation the files are gzipped. + + Example: syslog -> syslog.0 -> syslog.1.gz ..."; + + leaf number-of-files { + type uint32; + default 10; + description "Maximum number of log files retained."; + } + + leaf max-file-size { + type uint32; + default 1024; + units "kilobytes"; + description "Maximum log file size (kiB), before rotation."; + } + } + } + + deviation "/syslog:syslog/syslog:actions/syslog:file/syslog:log-file/syslog:file-rotation/syslog:number-of-files" { + deviate delete { + default 1; + } + } + deviation "/syslog:syslog/syslog:actions/syslog:file/syslog:log-file/syslog:file-rotation/syslog:max-file-size" { + deviate replace { + type uint32; + units "kilobytes"; + } + } + + deviation "/syslog:syslog/syslog:actions/syslog:remote/syslog:destination/syslog:transport/syslog:tls" { + deviate not-supported; + } + deviation "/syslog:syslog/syslog:actions/syslog:remote/syslog:destination/syslog:facility-override" { + deviate not-supported; + } +}