2022-12-27 23:17:14 +00:00
|
|
|
import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
|
|
|
name = "ulogd";
|
|
|
|
|
2023-04-30 01:17:05 +00:00
|
|
|
meta.maintainers = with lib.maintainers; [ p-h ];
|
2022-12-27 23:17:14 +00:00
|
|
|
|
|
|
|
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}"
|
|
|
|
'';
|
|
|
|
})
|