liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit ad9bba4f934d2ff51c06d2dc2bc96c74c99201d7
parent 6f559e370079e3d786ae1c2d6e01713c43a9536d
Author: Daniel Barlow <dan@telent.net>
Date:   Sun, 26 Oct 2025 20:34:52 +0000

logtap: add WIP backfill command

Diffstat:
Mpkgs/logtap/Makefile | 7+++++--
Apkgs/logtap/backfill.fnl | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkgs/logtap/default.nix | 6++++++
3 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/pkgs/logtap/Makefile b/pkgs/logtap/Makefile @@ -1,6 +1,9 @@ -TARGETS=logtap +TARGETS=logtap backfill CFLAGS=-Wall default: $(TARGETS) +backfill: backfill.fnl + fennelc $< + install: $(TARGETS) - install -Dt $(PREFIX)/bin/ logtap + install -Dt $(PREFIX)/bin/ $(TARGETS) diff --git a/pkgs/logtap/backfill.fnl b/pkgs/logtap/backfill.fnl @@ -0,0 +1,57 @@ +(local { : file-exists? } (require :anoia)) +(local tai64 (require :anoia.tai64)) +(local { : write &as ll } (require :lualinux)) + +(local O_WRONLY 1) +(local O_RDWR 2) +(local O_CREAT 64) + +(fn send-message [fd message] + (case (write fd message) + n (if (> (# message) n) (send-message (string.sub message n)) true) + (nil code) nil)) + +(fn parse-timestamp [message] + (let [{ : s : n } (tai64.from-timestamp message)] + (+ (* s 1000000000) n))) + +(fn spit [filename body] + (with-open [f (assert (io.open filename :w))] + (f:write body))) + +(fn write-timestamp [file ts] + (spit file (string.format "%d" ts)) + ts) + +(fn slurp [filename] + (with-open [f (assert (io.open filename :r))] + (f:read "a"))) + +(let [[fifo-name stampfile] arg + fifo (ll.open fifo-name O_WRONLY)] + (var backfill? true) + (var next-ts + (if (file-exists? stampfile) + (tonumber (slurp stampfile)) + 0)) + + (each [l (: (io.input) :lines "L")] + (case l + "START SHIPPING" + (set backfill? false) + "STOP SHIPPING" + (set backfill? true) + message + (let [message-ts (parse-timestamp message)] + (when (> message-ts next-ts) + (set next-ts (write-timestamp stampfile message-ts))) + (when (>= message-ts next-ts) + (io.stderr:write (.. "writing " message backfill?)) + (if backfill? + (when (not (send-message fifo message)) + ;; If the fifo write fails, it could be a glitch or it + ;; could be some kind of wider outage. Give up, + ;; and rely on the supervisor to restart us when + ;; conditions are again auspicious + (io.stderr:write "write failed\n") + (os.exit 1)))))))) diff --git a/pkgs/logtap/default.nix b/pkgs/logtap/default.nix @@ -1,8 +1,14 @@ { stdenv, + fennelc, + lualinux, + lua, + anoia }: stdenv.mkDerivation { name = "logtap"; + nativeBuildInputs = [ fennelc ]; + buildInputs = [ lua lualinux anoia ]; makeFlags = [ "PREFIX=${placeholder "out"}" ]; src = ./.; }