import ./make-test-python.nix ({ pkgs, lib, ... }: { name = "ulogd"; meta.maintainers = with lib.maintainers; [ p-h ]; nodes.machine = { ... }: { networking.firewall.enable = false; networking.nftables.enable = true; networking.nftables.ruleset = '' table inet filter { chain input { type filter hook input priority 0; log group 2 accept } chain output { type filter hook output priority 0; policy accept; log group 2 accept } chain forward { type filter hook forward priority 0; policy drop; log group 2 accept } } ''; services.ulogd = { enable = true; settings = { global = { logfile = "/var/log/ulogd.log"; stack = "log1:NFLOG,base1:BASE,pcap1:PCAP"; }; log1.group = 2; pcap1 = { file = "/var/log/ulogd.pcap"; sync = 1; }; }; }; environment.systemPackages = with pkgs; [ tcpdump ]; }; testScript = '' start_all() machine.wait_for_unit("ulogd.service") machine.wait_for_unit("network-online.target") with subtest("Ulogd is running"): machine.succeed("pgrep ulogd >&2") # All packets show up twice in the logs with subtest("Logs are collected"): machine.succeed("ping -f 127.0.0.1 -c 5 >&2") machine.succeed("sleep 2") machine.wait_until_succeeds("du /var/log/ulogd.pcap >&2") _, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1") expected, actual = 5*2, len(echo_request_packets.splitlines()) assert expected == actual, f"Expected {expected} packets, got: {actual}" _, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1") expected, actual = 5*2, len(echo_reply_packets.splitlines()) assert expected == actual, f"Expected {expected} packets, got: {actual}" with subtest("Reloading service reopens log file"): machine.succeed("mv /var/log/ulogd.pcap /var/log/old_ulogd.pcap") machine.succeed("systemctl reload ulogd.service") machine.succeed("ping -f 127.0.0.1 -c 5 >&2") machine.succeed("sleep 2") _, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1") expected, actual = 5*2, len(echo_request_packets.splitlines()) assert expected == actual, f"Expected {expected} packets, got: {actual}" _, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1") expected, actual = 5*2, len(echo_reply_packets.splitlines()) assert expected == actual, f"Expected {expected} packets, got: {actual}" ''; })